Ich hatte ja bereits vor längerer Zeit angemerkt, dass SquirrelMail mit konfiguriertem Suhosin-Patch nicht richtig läuft. Und da seit einem Jahr, wo der Bugreport nun Upstream bekannt ist, immer noch nichts passiert ist, gibt es hier für alle geplagten nun ein Diff-File zum Ersparen der ganzen Tipparbeit (Ja, der Patch ist grundlegend REINES Copy&Paste). Zumal ja durchaus schon die Grundlagen für eine Lösung ohne /e vorhanden sind.
Aber gut, heute einmal ein Post von mir ohne große Worte und nur dem zugehörigen Patch:
Im Verzeichnis decode anzuwenden:
--- iso_8859_1.php 2010-01-05 16:59:48.000000000 +0100 +++ iso_8859_1.php 2010-05-13 14:05:40.000000000 +0200 @@ -23,12 +23,11 @@ if (! sq_is8bit($string,'iso-8859-1')) return $string; - $string = preg_replace("/([\201-\237])/e","'&#' . ord('\\1') . ';'",$string); + $string = preg_replace_callback("/([\201-\377])/",'charset_decode_iso_8859_1_helper',$string); - /* I don't want to use 0xA0 (\240) in any ranges. RH73 may dislike it */ - $string = str_replace("\240", ' ', $string); - - $string = preg_replace("/([\241-\377])/e","'&#' . ord('\\1') . ';'",$string); return $string; } +function charset_decode_iso_8859_1_helper ($m) { + return '&#' . ord($m[1]) . ';'; +} --- us_ascii.php 2010-01-05 16:59:48.000000000 +0100 +++ us_ascii.php 2010-05-13 14:00:36.000000000 +0200 @@ -26,11 +26,7 @@ if (! sq_is8bit($string,'us-ascii')) return $string; - $string = preg_replace("/([\201-\237])/e","'?'",$string); + $string = preg_replace("/([\201-\377])/","?",$string); - /* I don't want to use 0xA0 (\240) in any ranges. RH73 may dislike it */ - $string = str_replace("\240", '?', $string); - - $string = preg_replace("/([\241-\377])/e","'?'",$string); return $string; } |
Zuzüglich meinem Patch aus dem vorhergehenden Beitrag zum Thema.
Und für das Verzeichnis encode anzuwenden:
--- cp1251.php 2010-01-05 16:59:48.000000000 +0100 +++ cp1251.php 2010-05-13 14:17:58.000000000 +0200 @@ -19,10 +19,10 @@ * @return string cp1251 encoded text */ function charset_encode_cp1251 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetocp1251('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetocp1251",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetocp1251(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetocp1251($var) { + if(is_array($var)) { + $var=$var[1]; + } + $cp1251chars=array('160' => "\xA0", '164' => "\xA4", '166' => "\xA6", --- cp1255.php 2010-01-05 16:59:48.000000000 +0100 +++ cp1255.php 2010-05-13 14:17:49.000000000 +0200 @@ -19,10 +19,10 @@ * @return string cp1255 encoded text */ function charset_encode_cp1255 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetocp1255('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetocp1255",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetocp1255(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetocp1255($var) { + if(is_array($var)) { + $var=$var[1]; + } + $cp1255chars=array('160' => "\xA0", '161' => "\xA1", '162' => "\xA2", --- cp1256.php 2010-01-05 16:59:48.000000000 +0100 +++ cp1256.php 2010-05-13 14:17:40.000000000 +0200 @@ -19,10 +19,10 @@ * @return string cp1256 encoded text */ function charset_encode_cp1256 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetocp1256('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetocp1256",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetocp1256(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetocp1256($var) { + if(is_array($var)) { + $var=$var[1]; + } + $cp1256chars=array('160' => "\xA0", '162' => "\xA2", '163' => "\xA3", --- iso_8859_1.php 2010-01-05 16:59:48.000000000 +0100 +++ iso_8859_1.php 2010-05-13 14:17:08.000000000 +0200 @@ -19,10 +19,10 @@ * @return string iso-8859-1 encoded text */ function charset_encode_iso_8859_1 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetoiso88591('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetoiso88591",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetoiso88591(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetoiso88591($var) { + if(is_array($var)) { + $var=$var[1]; + } + if ($var < 256) { $ret = chr ($var); } else { --- iso_8859_15.php 2010-01-05 16:59:48.000000000 +0100 +++ iso_8859_15.php 2010-05-13 14:16:54.000000000 +0200 @@ -19,10 +19,10 @@ * @return string iso-8859-15 encoded text */ function charset_encode_iso_8859_15 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetoiso885915('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetoiso885915",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetoiso885915(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetoiso885915($var) { + if(is_array($var)) { + $var=$var[1]; + } + $iso885915chars=array('160' => "\xA0", '161' => "\xA1", '162' => "\xA2", --- iso_8859_2.php 2010-01-05 16:59:48.000000000 +0100 +++ iso_8859_2.php 2010-05-13 14:17:21.000000000 +0200 @@ -19,10 +19,10 @@ * @return string iso-8859-2 encoded text */ function charset_encode_iso_8859_2 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetoiso88592('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetoiso88592",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetoiso88592(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetoiso88592($var) { + if(is_array($var)) { + $var=$var[1]; + } + $iso88592chars=array('160' => "\xA0", '164' => "\xA4", '167' => "\xA7", --- iso_8859_7.php 2010-01-05 16:59:48.000000000 +0100 +++ iso_8859_7.php 2010-05-13 14:18:39.000000000 +0200 @@ -19,10 +19,10 @@ * @return string iso-8859-7 encoded text */ function charset_encode_iso_8859_7 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetoiso88597('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetoiso88597",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetoiso88597(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetoiso88597($var) { + if(is_array($var)) { + $var=$var[1]; + } + $iso88597chars=array('160' => "\xA0", '163' => "\xA3", '166' => "\xA6", --- iso_8859_9.php 2010-01-05 16:59:48.000000000 +0100 +++ iso_8859_9.php 2010-05-13 14:19:15.000000000 +0200 @@ -19,10 +19,10 @@ * @return string iso-8859-9 encoded text */ function charset_encode_iso_8859_9 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetoiso88599('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetoiso88599",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetoiso88599(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetoiso88599($var) { + if(is_array($var)) { + $var=$var[1]; + } + $iso88599chars=array('160' => "\xA0", '161' => "\xA1", '162' => "\xA2", --- koi8_r.php 2010-01-05 16:59:48.000000000 +0100 +++ koi8_r.php 2010-05-13 14:20:19.000000000 +0200 @@ -19,10 +19,10 @@ * @return string koi8-r encoded text */ function charset_encode_koi8_r ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetokoi8r('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetokoi8r",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetokoi8r(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetokoi8r($var) { + if(is_array($var)) { + $var=$var[1]; + } + $koi8rchars=array('160' => "\x9A", '169' => "\xBF", '176' => "\x9C", --- koi8_u.php 2010-01-05 16:59:48.000000000 +0100 +++ koi8_u.php 2010-05-13 14:20:59.000000000 +0200 @@ -19,10 +19,10 @@ * @return string koi8-u encoded text */ function charset_encode_koi8_u ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetokoi8u('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetokoi8u",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetokoi8u(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetokoi8u($var) { + if(is_array($var)) { + $var=$var[1]; + } + $koi8uchars=array('160' => "\x9A", '169' => "\xBF", '176' => "\x9C", --- tis_620.php 2010-01-05 16:59:48.000000000 +0100 +++ tis_620.php 2010-05-13 14:21:33.000000000 +0200 @@ -19,10 +19,10 @@ * @return string tis-620 encoded text */ function charset_encode_tis_620 ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetotis620('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetotis620",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetotis620(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetotis620($var) { + if(is_array($var)) { + $var=$var[1]; + } + $tis620chars=array('3585' => "\xA1", '3586' => "\xA2", '3587' => "\xA3", --- us_ascii.php 2010-01-05 16:59:48.000000000 +0100 +++ us_ascii.php 2010-05-13 14:22:17.000000000 +0200 @@ -19,10 +19,10 @@ * @return string us-ascii encoded text */ function charset_encode_us_ascii ($string) { - // don't run encoding function, if there is no encoded characters - if (! preg_match("'&#[0-9]+;'",$string) ) return $string; + // don't run encoding function, if there is no encoded characters + if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetousascii('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/","unicodetousascii",$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetousascii(hexdec('\\1'))",$string); return $string; @@ -41,6 +41,10 @@ */ function unicodetousascii($var) { + if(is_array($var)) { + $var=$var[1]; + } + if ($var < 128) { $ret = chr ($var); } else { --- utf_8.php 2010-01-05 16:58:30.000000000 +0100 +++ utf_8.php 2010-05-12 20:20:33.000000000 +0200 @@ -26,7 +26,7 @@ // don't run encoding function, if there is no encoded characters if (! preg_match("'&#[0-9]+;'",$string) ) return $string; - $string=preg_replace("/&#([0-9]+);/e","unicodetoutf8('\\1')",$string); + $string=preg_replace_callback("/&#([0-9]+);/",'unicodetoutf8',$string); // $string=preg_replace("/&#[xX]([0-9A-F]+);/e","unicodetoutf8(hexdec('\\1'))",$string); return $string; @@ -44,9 +44,6 @@ * @return string utf8 character */ function unicodetoutf8($var) { + if(is_array($var)) { + $var = $var[1]; + } + if ($var < 128) { $ret = chr ($var); |
Bei Fragen, oder falls sich ein Fehler eingeschlichen haben sollte, bitte kurz in den Kommentaren melden, dann korrigier ich die Patches.