Browse Source

Merge branch 'trunk' into master

Andy 4 years ago
parent
commit
97b3205313
5 changed files with 77 additions and 29 deletions
  1. 1 0
      doc/ChangeLog
  2. 10 4
      functions/decode/iso_8859_1.php
  3. 15 6
      functions/decode/utf_8.php
  4. 46 17
      functions/imap_messages.php
  5. 5 2
      functions/mime.php

+ 1 - 0
doc/ChangeLog

@@ -445,6 +445,7 @@ Version 1.5.2 - SVN
     attachments (when reading a message)
   - Added fixes for PHP version 8 compatibility (thanks to Marcel Pol for
     bringing this to our attention)
+  - Migrate away from create_function() as long as we have PHP 5.3+
 
 Version 1.5.1 (branched on 2006-02-12)
 --------------------------------------

+ 10 - 4
functions/decode/iso_8859_1.php

@@ -24,14 +24,20 @@ function charset_decode_iso_8859_1 ($string) {
         return $string;
 
     $string = preg_replace_callback("/([\201-\237])/",
-    create_function ('$matches', 'return \'&#\' . ord($matches[1]) . \';\';'),
-    $string);
+                                    (check_php_version(5, 3, 0)
+                                     ? function($matches) { return '&#' . ord($matches[1]) . ';'; }
+                                     : create_function ('$matches', 'return \'&#\' . ord($matches[1]) . \';\';')
+                                    ),
+                                    $string);
 
     /* I don't want to use 0xA0 (\240) in any ranges. RH73 may dislike it */
     $string = str_replace("\240", ' ', $string);
 
     $string = preg_replace_callback("/([\241-\377])/",
-    create_function ('$matches', 'return \'&#\' . ord($matches[1]) . \';\';'),
-    $string);
+                                    (check_php_version(5, 3, 0)
+                                     ? function($matches) { return '&#' . ord($matches[1]) . ';'; }
+                                     : create_function ('$matches', 'return \'&#\' . ord($matches[1]) . \';\';')
+                                    ),
+                                    $string);
     return $string;
 }

+ 15 - 6
functions/decode/utf_8.php

@@ -74,18 +74,27 @@ function charset_decode_utf_8 ($string) {
     
     // decode four byte unicode characters
     $string = preg_replace_callback("/([\360-\367])([\200-\277])([\200-\277])([\200-\277])/",
-    function ($matches){ return '&#'.((ord($matches[1])-240)*262144+(ord($matches[2])-128)*4096+(ord($matches[3])-128)*64+(ord($matches[4])-128)).';';},
-    $string);
+                                    (check_php_version(5, 3, 0)
+                                     ? function($matches) { return '&#'.((ord($matches[1])-240)*262144+(ord($matches[2])-128)*4096+(ord($matches[3])-128)*64+(ord($matches[4])-128)).';'; }
+                                     : create_function ('$matches', 'return \'&#\'.((ord($matches[1])-240)*262144+(ord($matches[2])-128)*4096+(ord($matches[3])-128)*64+(ord($matches[4])-128)).\';\';')
+                                    ),
+                                    $string);
 
     // decode three byte unicode characters
     $string = preg_replace_callback("/([\340-\357])([\200-\277])([\200-\277])/",
-    function ($matches) {return '&#'.((ord($matches[1])-224)*4096+(ord($matches[2])-128)*64+(ord($matches[3])-128)).';';},
-    $string);
+                                    (check_php_version(5, 3, 0)
+                                     ? function($matches) { return '&#'.((ord($matches[1])-224)*4096+(ord($matches[2])-128)*64+(ord($matches[3])-128)).';'; }
+                                     : create_function ('$matches', 'return \'&#\'.((ord($matches[1])-224)*4096+(ord($matches[2])-128)*64+(ord($matches[3])-128)).\';\';')
+                                    ),
+                                    $string);
 
     // decode two byte unicode characters
     $string = preg_replace_callback("/([\300-\337])([\200-\277])/",
-    function ($matches) {return '&#'.((ord($matches[1])-192)*64+(ord($matches[2])-128)).';';},
-    $string);
+                                    (check_php_version(5, 3, 0)
+                                     ? function($matches) { return '&#'.((ord($matches[1])-192)*64+(ord($matches[2])-128)).';'; }
+                                     : create_function ('$matches', 'return \'&#\'.((ord($matches[1])-192)*64+(ord($matches[2])-128)).\';\';')
+                                    ),
+                                    $string);
 
     // remove broken unicode
     $string = preg_replace("/[\200-\237]|\240|[\241-\377]/",'?',$string);

+ 46 - 17
functions/imap_messages.php

@@ -246,25 +246,47 @@ function get_squirrel_sort($imap_stream, $sSortField, $reverse = false, $aUid =
       case 'TO':
       case 'CC':
         if(!$walk) {
-            array_walk($msgs, function(&$v,&$k,$f){
-                 $v[$f] = (isset($v[$f])) ? $v[$f] : "";
-                 $addr = reset(parseRFC822Address($v[$f],1));
-                 $sPersonal = (isset($addr[SQM_ADDR_PERSONAL]) && $addr[SQM_ADDR_PERSONAL]) ?
-                   $addr[SQM_ADDR_PERSONAL] : "";
-                 $sEmail = ($addr[SQM_ADDR_HOST]) ?
-                      $addr[SQM_ADDR_MAILBOX] . "@".$addr[SQM_ADDR_HOST] :
-                      $addr[SQM_ADDR_HOST];
-                 $v[$f] = ($sPersonal) ? decodeHeader($sPersonal, true, false):$sEmail;},$sSortField);
+            if (check_php_version(5, 3, 0))
+                $walk_function = function(&$v,&$k,$f) {
+                    $v[$f] = (isset($v[$f])) ? $v[$f] : "";
+                    $addr = reset(parseRFC822Address($v[$f],1));
+                    $sPersonal = (isset($addr[SQM_ADDR_PERSONAL]) && $addr[SQM_ADDR_PERSONAL]) ?
+                       $addr[SQM_ADDR_PERSONAL] : "";
+                    $sEmail = ($addr[SQM_ADDR_HOST]) ?
+                          $addr[SQM_ADDR_MAILBOX] . "@".$addr[SQM_ADDR_HOST] :
+                          $addr[SQM_ADDR_HOST];
+                    $v[$f] = ($sPersonal) ? decodeHeader($sPersonal, true, false):$sEmail;
+                };
+            else
+                $walk_function = create_function('&$v,&$k,$f',
+                    '$v[$f] = (isset($v[$f])) ? $v[$f] : "";
+                     $addr = reset(parseRFC822Address($v[$f],1));
+                     $sPersonal = (isset($addr[SQM_ADDR_PERSONAL]) && $addr[SQM_ADDR_PERSONAL]) ?
+                       $addr[SQM_ADDR_PERSONAL] : "";
+                     $sEmail = ($addr[SQM_ADDR_HOST]) ?
+                          $addr[SQM_ADDR_MAILBOX] . "@".$addr[SQM_ADDR_HOST] :
+                          $addr[SQM_ADDR_HOST];
+                     $v[$f] = ($sPersonal) ? decodeHeader($sPersonal, true, false):$sEmail;');
+            array_walk($msgs, $walk_function, $sSortField);
             $walk = true;
         }
         // nobreak
       case 'SUBJECT':
         if(!$walk) {
-            array_walk($msgs, function(&$v,&$k,$f) {
-                 $v[$f] = (isset($v[$f])) ? $v[$f] : "";
-                 $v[$f] = strtolower(decodeHeader(trim($v[$f]), true, false));
-                 $v[$f] = (preg_match("/^(?:(?:vedr|sv|re|aw|fw|fwd|\[\w\]):\s*)*\s*(.*)$/si", $v[$f], $matches)) ?
-                 $matches[1] : $v[$f];},$sSortField);
+            if (check_php_version(5, 3, 0))
+                $walk_function = function(&$v,&$k,$f) {
+                    $v[$f] = (isset($v[$f])) ? $v[$f] : "";
+                    $v[$f] = strtolower(decodeHeader(trim($v[$f]), true, false));
+                    $v[$f] = (preg_match("/^(?:(?:vedr|sv|re|aw|fw|fwd|\[\w\]):\s*)*\s*(.*)$/si", $v[$f], $matches)) ?
+                                       $matches[1] : $v[$f];
+                };
+            else
+                $walk_function = create_function('&$v,&$k,$f',
+                    '$v[$f] = (isset($v[$f])) ? $v[$f] : "";
+                     $v[$f] = strtolower(decodeHeader(trim($v[$f]), true, false));
+                     $v[$f] = (preg_match("/^(?:(?:vedr|sv|re|aw|fw|fwd|\[\w\]):\s*)*\s*(.*)$/si", $v[$f], $matches)) ?
+                                        $matches[1] : $v[$f];');
+            array_walk($msgs, $walk_function, $sSortField);
             $walk = true;
         }
         foreach ($msgs as $item) {
@@ -281,9 +303,16 @@ function get_squirrel_sort($imap_stream, $sSortField, $reverse = false, $aUid =
       case 'DATE':
       case 'INTERNALDATE':
         if(!$walk) {
-            array_walk($msgs, function(&$v,$k,$f) {
-                 $v[$f] = (isset($v[$f])) ? $v[$f] : "";
-                 $v[$f] = getTimeStamp(explode(" ",$v[$f]));},$sSortField);
+            if (check_php_version(5, 3, 0))
+                $walk_function = function(&$v,$k,$f) {
+                    $v[$f] = (isset($v[$f])) ? $v[$f] : "";
+                    $v[$f] = getTimeStamp(explode(" ",$v[$f]));
+                };
+            else
+                $walk_function = create_function('&$v,$k,$f',
+                    '$v[$f] = (isset($v[$f])) ? $v[$f] : "";
+                     $v[$f] = getTimeStamp(explode(" ",$v[$f]));');
+            array_walk($msgs, $walk_function, $sSortField);
             $walk = true;
         }
         // nobreak;

+ 5 - 2
functions/mime.php

@@ -907,8 +907,11 @@ function decodeHeader ($string, $utfencode=true,$htmlsafe=true,$decide=false) {
                 case 'Q':
                     $replace = str_replace('_', ' ', $res[4]);
                     $replace = preg_replace_callback('/=([0-9a-f]{2})/i',
-                            function ($matches) {return chr(hexdec($matches[1]));},
-                            $replace);
+                                             (check_php_version(5, 3, 0)
+                                              ? function($matches) { return chr(hexdec($matches[1])); }
+                                              : create_function ('$matches', 'return chr(hexdec($matches[1]));')
+                                             ),
+                                             $replace);
                     if ($utfencode) {
                         if ($can_be_encoded) {
                             /* convert string to different charset,