From ad2f0b546afcb978ee67ef25332cf4f12c363892 Mon Sep 17 00:00:00 2001 From: pdontthink Date: Sun, 1 Apr 2012 19:50:49 +0000 Subject: [PATCH] Fall back to using LIST if NAMESPACE answer is malformed or otherwise problematic. This still doesn't account for situations where the NAMESPACE or LIST answer can't be parsed correctly. git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@14302 7612ce4b-ef26-0410-bec9-ea0150e637f0 --- class/deliver/Deliver.class.php | 8 ++-- functions/abook_ldap_server.php | 2 +- functions/imap_general.php | 30 +++++++------- functions/mime.php | 7 +++- functions/strings.php | 42 ++++++++++++++++++++ templates/default/options_highlight_list.tpl | 2 +- 6 files changed, 68 insertions(+), 23 deletions(-) diff --git a/class/deliver/Deliver.class.php b/class/deliver/Deliver.class.php index 5fbba83b..32070807 100644 --- a/class/deliver/Deliver.class.php +++ b/class/deliver/Deliver.class.php @@ -545,7 +545,7 @@ class Deliver { $cnt = count($header); $hdr_s = ''; for ($i = 0 ; $i < $cnt ; $i++) { - $hdr_s .= $this->foldLine($header[$i], 78); + $hdr_s .= $this->foldLine($header[$i]); } $header = $hdr_s; $header .= $rn; /* One blank line to separate mimeheader and body-entity */ @@ -779,7 +779,7 @@ class Deliver { case 'From': $hdr_s .= $header[$i]; break; - default: $hdr_s .= $this->foldLine($header[$i], 78); break; + default: $hdr_s .= $this->foldLine($header[$i]); break; } } $header = $hdr_s; @@ -961,7 +961,7 @@ class Deliver { // if we found the beginning of an encoded word, // we want to break BEFORE the token // - if (preg_match('/^(=\?([^?]*)\?(Q|B)\?([^?]*)\?=)/Ui', + if (preg_match('/^(=\?([^?]*)\?(Q|B)\?([^?]*)\?=)/i', substr($header, $pos))) { $pos--; } @@ -982,7 +982,7 @@ class Deliver { // else if (strlen($header) > $hard_wrap && ($end_pos = strpos(substr($header, $hard_wrap), '?=')) !== FALSE - && preg_match('/(=\?([^?]*)\?(Q|B)\?([^?]*)\?=)$/Ui', + && preg_match('/(=\?([^?]*)\?(Q|B)\?([^?]*)\?=)$/i', substr($header, 0, $hard_wrap + $end_pos + 2), $matches)) { diff --git a/functions/abook_ldap_server.php b/functions/abook_ldap_server.php index 8d80dee3..0171685e 100644 --- a/functions/abook_ldap_server.php +++ b/functions/abook_ldap_server.php @@ -772,7 +772,7 @@ class abook_ldap_server extends addressbook_backend { function lookup($value, $field=SM_ABOOK_FIELD_NICKNAME) { - $attr = get_attr_name($field); + $attr = $this->get_attr_name($field); if ($attr == 'ERROR') { return $this->set_error(sprintf(_("Unknown field name: %s"), $field)); } diff --git a/functions/imap_general.php b/functions/imap_general.php index f39956d6..4341df2e 100755 --- a/functions/imap_general.php +++ b/functions/imap_general.php @@ -1064,7 +1064,7 @@ function sqimap_get_delimiter ($imap_stream = false) { /* Do some caching here */ if (!$sqimap_delimiter) { - if (sqimap_capability($imap_stream, 'NAMESPACE')) { + if (sqimap_capability($imap_stream, 'NAMESPACE') /* * According to something that I can't find, this is supposed to work on all systems * OS: This won't work in Courier IMAP. @@ -1074,23 +1074,21 @@ function sqimap_get_delimiter ($imap_stream = false) { * * TODO: remove this in favour of the information from sqimap_get_namespace() */ - $read = sqimap_run_command($imap_stream, 'NAMESPACE', true, $a, $b); - if (preg_match('/\* NAMESPACE +(\( *\(.+\) *\)|NIL) +(\( *\(.+\) *\)|NIL) +(\( *\(.+\) *\)|NIL)/i', $read[0], $data)) { - if (preg_match('/^\( *\((.*)\) *\)/', $data[1], $data2)) { - $pn = $data2[1]; - $pna = explode(')(', $pn); - $delnew = array(); - while (list($k, $v) = each($pna)) { - $lst = explode('"', $v); - if (isset($lst[3])) { - $delnew[$lst[1]] = $lst[3]; - } else { - $delnew[$lst[1]] = ''; - } - } - $sqimap_delimiter = array_shift($delnew); + && ($read = sqimap_run_command($imap_stream, 'NAMESPACE', true, $a, $b)) + && preg_match('/\* NAMESPACE +(\( *\(.+\) *\)|NIL) +(\( *\(.+\) *\)|NIL) +(\( *\(.+\) *\)|NIL)/i', $read[0], $data) + && preg_match('/^\( *\((.*)\) *\)/', $data[1], $data2)) { + $pn = $data2[1]; + $pna = explode(')(', $pn); + $delnew = array(); + while (list($k, $v) = each($pna)) { + $lst = explode('"', $v); + if (isset($lst[3])) { + $delnew[$lst[1]] = $lst[3]; + } else { + $delnew[$lst[1]] = ''; } } + $sqimap_delimiter = array_shift($delnew); } else { fputs ($imap_stream, ". LIST \"INBOX\" \"\"\r\n"); $read = sqimap_read_data($imap_stream, '.', true, $a, $b); diff --git a/functions/mime.php b/functions/mime.php index 33a87747..9d479dca 100644 --- a/functions/mime.php +++ b/functions/mime.php @@ -2011,7 +2011,12 @@ function sq_fix_url($attname, &$attvalue, $message, $id, $mailbox,$sQuote = '"') break; } } else { - if (!(isset($aUrl['path']) && $aUrl['path'] == $secremoveimg)) { + // anchors are OK + // FIXME: can there be abuse of anchors here? + // FIXME: stop anchors from opening in another window + if (!isset($aUrl['path']) && !empty($aUrl['fragment'])) { + } + else if (!isset($aUrl['path']) || $aUrl['path'] != $secremoveimg) { // parse_url did not lead to satisfying result $attvalue = $sQuote . SM_PATH . 'images/blank.png' . $sQuote; } diff --git a/functions/strings.php b/functions/strings.php index b8166754..3ea6ea3d 100644 --- a/functions/strings.php +++ b/functions/strings.php @@ -914,6 +914,48 @@ function sq_is8bit($string,$charset='') { * stores control symbols in those charsets. * Use preg_match instead of ereg in order to avoid problems * with mbstring overloading +NOTES: +NOTES: + 37 (base 8) = 31 (base 10) (LAST CONTROL CHAR) + 40 (base 8) = 32 (base 10) (FIRST PRINTABLE ASCII) + 176 (base 8) = 126 (base 10) (LAST PRINTABLE ASCII) + 177 (base 8) = 127 (base 10) (DEL) + 200 (base 8) = 128 (base 10) + 237 (base 8) = 159 (base 10) + 240 (base 8) = 160 (base 10) (FIRST EXTRA PRINTABLE) + 377 (base 8) = 255 (base 10) (LAST EXTRA PRINTABLE) + 400 (base 8) = 256 (base 10) + + Traditional ASCII 0 - 127 (octal 0 - 177) + Printable ASCII 32 - 126 (octal 40 - 176) + Additional Printables for ISO Latin 1 160 - 255 (octal 240 - 377) + + 240 (160) is the first character of the extra 7-bit printable characer + range, sometimes used as the no-break space, but the regular expression + ranges are broken up at 240 only because RH 7.2 PHP seemed to have + problems otherwise - this is a PHP/preg issue, NOT a charset issue + + So supposedly printable chars in an 8859 charset are 32-126 (octal 40-176) + and 160/161-255 (octal 240/241-377)) + + So checking for the range between the two makes sense (128-159 or octal 200-237) + (wait, no, to skip DEL too, it's 127-159 (octal 177-237)) + + But why not for 0-31 (octal 0-37) and DEL (127 or 177 octal)???? + (or do we need a new fxn that detects *printable* 7-bit chars?) + (if we do, note that some control characters are "printable", + notably the CR, LF and TAB characters) + + And why is 241-377 octal considered 8-bit for iso 8859??? Isn't it + the opposite for iso 8859???? aren't these 7 bit characters? + see http://www.cs.tut.fi/~jkorpela/chars.html#latin1 + Uh, well, anything more than 127 (octal 177) takes 8 bits to represent + but errrrr, these are simple non-multibyte characters, right? but + maybe this "is 8-bit" business is NOT the same as "is multibyte"???? + + That begs the question how this fxn is actually used - what's its purpose? + (is it being misused in some places?) + */ if (preg_match("/^iso-8859/i",$charset)) { $needle='/\240|[\241-\377]/'; diff --git a/templates/default/options_highlight_list.tpl b/templates/default/options_highlight_list.tpl index f077dc80..4bf28424 100644 --- a/templates/default/options_highlight_list.tpl +++ b/templates/default/options_highlight_list.tpl @@ -107,4 +107,4 @@ extract($t); - \ No newline at end of file + -- 2.25.1