Source for file imap_utf7_local.php

Documentation is available at imap_utf7_local.php

  1. <?php
  2.  
  3. /**
  4.  * functions/imap_utf7_local.php - utf7-imap functions
  5.  *
  6.  * This implements all functions that do imap UTF7 conversions.
  7.  * Before 1.3.2 functions were stored in imap_utf7_decode_local.php and
  8.  * imap_utf7_encode_local.php files.
  9.  *
  10.  * @copyright 1999-2020 The SquirrelMail Project Team
  11.  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
  12.  * @version $Id: imap_utf7_local.php 14845 2020-01-07 08:09:34Z pdontthink $
  13.  * @package squirrelmail
  14.  * @subpackage imap
  15.  * @since 1.3.2
  16.  */
  17.  
  18. /**
  19.  * Function that uses php mbstring functions to convert from and to utf7-imap charset
  20.  *
  21.  * Since 1.5.1 list of supported charsets depends sq_mb_list_encoding function.
  22.  * Before that it was hardcoded to iso-8859-x, utf-8 and iso-2022-jp.
  23.  * @param string $str folder name
  24.  * @param string $to_encoding name of resulting charset
  25.  * @param string $from_encoding name of original charset
  26.  * @param string $default_charset default charset used by translation.
  27.  * @return string encoded folder name or ''
  28.  * @since 1.4.2
  29.  */
  30. function sqimap_mb_convert_encoding($str$to_encoding$from_encoding$default_charset{
  31.     $supported_encodings=sq_mb_list_encodings();
  32.     if in_array(strtolower($default_charset),$supported_encodings&&
  33.          function_exists('mb_convert_encoding')) {
  34.         return mb_convert_encoding($str$to_encoding$from_encoding);
  35.     }
  36.     return '';
  37. }
  38.  
  39. /**
  40.  * encode folder name to utf7-imap
  41.  *
  42.  * If mbstring functions do not support charset used by translation, falls back to iso-8859-1
  43.  * @param string $s folder name
  44.  * @return string utf7-imap encoded folder name
  45.  * @since 1.2.7
  46.  */
  47. function imap_utf7_encode_local($s{
  48.     global $languages$squirrelmail_language;
  49.  
  50.     if (isset($languages[$squirrelmail_language]['XTRA_CODE']&&
  51.             function_exists($languages[$squirrelmail_language]['XTRA_CODE'].'_utf7_imap_encode')) {
  52.         return call_user_func($languages[$squirrelmail_language]['XTRA_CODE''_utf7_imap_encode'$s);
  53.     }
  54.  
  55.     if ($s == '')    //If empty, don't bother
  56.         return '';
  57.  
  58.     global $default_charset;
  59.     set_my_charset();    //must be called before using $default_charset
  60.     if ((strtolower($default_charset!= 'iso-8859-1'&& ($default_charset != '')) {
  61.         $utf7_s sqimap_mb_convert_encoding($s'UTF7-IMAP'$default_charset$default_charset);
  62.         if ($utf7_s != '')
  63.             return $utf7_s;
  64.     }
  65.  
  66.     // Later code works only for ISO-8859-1
  67.  
  68.     $b64_s '';     // buffer for substring to be base64-encoded
  69.     $utf7_s '';    // imap-utf7-encoded string
  70.     for ($i 0$i strlen($s)$i++{
  71.         $c $s[$i];
  72.         $ord_c ord($c);
  73.         if ((($ord_c >= 0x20and ($ord_c <= 0x25)) or
  74.                 (($ord_c >= 0x27and ($ord_c <= 0x7e))) {
  75.             if ($b64_s{
  76.                 $utf7_s $utf7_s '&' encodeBASE64($b64_s.'-';
  77.                 $b64_s '';
  78.             }
  79.             $utf7_s $utf7_s $c;
  80.         elseif ($ord_c == 0x26{
  81.             if ($b64_s{
  82.                 $utf7_s $utf7_s '&' encodeBASE64($b64_s'-';
  83.                 $b64_s '';
  84.             }
  85.             $utf7_s $utf7_s '&-';
  86.         else {
  87.             $b64_s $b64_s chr(0$c;
  88.         }
  89.     }
  90.     //
  91.     // flush buffer
  92.     //
  93.     if ($b64_s{
  94.         $utf7_s $utf7_s '&' encodeBASE64($b64_s'-';
  95.         $b64_s '';
  96.     }
  97.     return $utf7_s;
  98. }
  99.  
  100. /**
  101.  * converts folder name from utf7-imap to charset used by translation
  102.  *
  103.  * If mbstring functions do not support charset used by translation, falls back to iso-8859-1
  104.  * @param string $s folder name in utf7-imap
  105.  * @return string folder name in charset used by translation
  106.  * @since 1.2.7
  107.  */
  108. function imap_utf7_decode_local($s{
  109.     global $languages$squirrelmail_language;
  110.  
  111.     if (isset($languages[$squirrelmail_language]['XTRA_CODE']&&
  112.             function_exists($languages[$squirrelmail_language]['XTRA_CODE''_utf7_imap_decode')) {
  113.         return call_user_func($languages[$squirrelmail_language]['XTRA_CODE''_utf7_imap_decode'$s);
  114.     }
  115.  
  116.     if ($s == '')    //If empty, don't bother
  117.         return '';
  118.  
  119.     global $default_charset;
  120.     set_my_charset();    //must be called before using $default_charset
  121.     if ((strtolower($default_charset!= 'iso-8859-1'&& ($default_charset != '')) {
  122.         $utf7_s sqimap_mb_convert_encoding($s$default_charset'UTF7-IMAP'$default_charset);
  123.         if ($utf7_s != '')
  124.             return $utf7_s;
  125.     }
  126.  
  127.     // Later code works only for ISO-8859-1
  128.  
  129.     $b64_s '';
  130.     $iso_8859_1_s '';
  131.     for ($i 0$len strlen($s)$i $len$i++{
  132.         $c $s[$i];
  133.         if (strlen($b64_s0{
  134.             if ($c == '-'{
  135.                 if ($b64_s == '&'{
  136.                     $iso_8859_1_s $iso_8859_1_s '&';
  137.                 else {
  138.                     $iso_8859_1_s $iso_8859_1_s .
  139.                         decodeBASE64(substr($b64_s1));
  140.                 }
  141.                 $b64_s '';
  142.             else {
  143.                 $b64_s $b64_s $c;
  144.             }
  145.         else {
  146.             if ($c == '&'{
  147.                 $b64_s '&';
  148.             else {
  149.                 $iso_8859_1_s $iso_8859_1_s $c;
  150.             }
  151.         }
  152.     }
  153.     return $iso_8859_1_s;
  154. }
  155. /**
  156.  * Converts string to base64
  157.  * @param string $s string
  158.  * @return string base64 encoded string
  159.  * @since 1.2.7
  160.  */
  161. function encodeBASE64($s{
  162.     $B64Chars 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+,';
  163.     $p 0;     // phase: 1 / 2 / 3 / 1 / 2 / 3...
  164.     $e '';    // base64-encoded string
  165.     //foreach($s as $c) {
  166.     for ($i 0$i strlen($s)$i++{
  167.         $c $s[$i];
  168.         if ($p == 0{
  169.             $e $e substr($B64Chars((ord($c252>> 2)1);
  170.             $t (ord($c3);
  171.             $p 1;
  172.         elseif ($p == 1{
  173.             $e $e $B64Chars[($t << 4((ord($c240>> 4)];
  174.             $t (ord($c15);
  175.             $p 2;
  176.         elseif ($p == 2{
  177.             $e $e $B64Chars[($t << 2((ord($c192>> 6)];
  178.             $e $e $B64Chars[ord($c63];
  179.             $p 0;
  180.         }
  181.     }
  182.     //
  183.     // flush buffer
  184.     //
  185.     if ($p == 1{
  186.         $e $e $B64Chars[$t << 4];
  187.     elseif ($p == 2{
  188.         $e $e $B64Chars[$t << 2];
  189.     }
  190.     return $e;
  191. }
  192.  
  193. /**
  194.  * Converts string from base64
  195.  * @param string $s base64 encoded string
  196.  * @return string decoded string
  197.  * @since 1.2.7
  198.  */
  199. function decodeBASE64($s{
  200.     $B64Values array(
  201.             'A' =>  0'B' =>  1'C' =>  2'D' =>  3'E' =>  4'F' =>  5,
  202.             'G' =>  6'H' =>  7'I' =>  8'J' =>  9'K' => 10'L' => 11,
  203.             'M' => 12'N' => 13'O' => 14'P' => 15'Q' => 16'R' => 17,
  204.             'S' => 18'T' => 19'U' => 20'V' => 21'W' => 22'X' => 23,
  205.             'Y' => 24'Z' => 25,
  206.             'a' => 26'b' => 27'c' => 28'd' => 29'e' => 30'f' => 31,
  207.             'g' => 32'h' => 33'i' => 34'j' => 35'k' => 36'l' => 37,
  208.             'm' => 38'n' => 39'o' => 40'p' => 41'q' => 42'r' => 43,
  209.             's' => 44't' => 45'u' => 46'v' => 47'w' => 48'x' => 49,
  210.             'y' => 50'z' => 51,
  211.             '0' => 52'1' => 53'2' => 54'3' => 55'4' => 56'5' => 57,
  212.             '6' => 58'7' => 59'8' => 60'9' => 61'+' => 62',' => 63
  213.             );
  214.     $p 0;
  215.     $d '';
  216.     $unicodeNullByteToggle 0;
  217.     for ($i 0$len strlen($s)$i $len$i++{
  218.         $c $s[$i];
  219.         if ($p == 0{
  220.             $t $B64Values[$c];
  221.             $p 1;
  222.         elseif ($p == 1{
  223.             if ($unicodeNullByteToggle{
  224.                 $d $d chr(($t << 2(($B64Values[$c48>> 4));
  225.                 $unicodeNullByteToggle 0;
  226.             else {
  227.                 $unicodeNullByteToggle 1;
  228.             }
  229.             $t ($B64Values[$c15);
  230.             $p 2;
  231.         elseif ($p == 2{
  232.             if ($unicodeNullByteToggle{
  233.                 $d $d chr(($t << 4(($B64Values[$c60>> 2));
  234.                 $unicodeNullByteToggle 0;
  235.             else {
  236.                 $unicodeNullByteToggle 1;
  237.             }
  238.             $t ($B64Values[$c3);
  239.             $p 3;
  240.         elseif ($p == 3{
  241.             if ($unicodeNullByteToggle{
  242.                 $d $d chr(($t << 6$B64Values[$c]);
  243.                 $unicodeNullByteToggle 0;
  244.             else {
  245.                 $unicodeNullByteToggle 1;
  246.             }
  247.             $t ($B64Values[$c3);
  248.             $p 0;
  249.         }
  250.     }
  251.     return $d;
  252. }

Documentation generated on Mon, 13 Jan 2020 04:22:50 +0100 by phpDocumentor 1.4.3