| | |
| | | - added \* flag support |
| | | - use PREG instead of EREG |
| | | - removed caching functions |
| | | - handling connection startup response |
| | | - added UID EXPUNGE support |
| | | - fixed problem with double quotes and spaces in folder names in LIST and LSUB |
| | | |
| | | ********************************************************/ |
| | | |
| | |
| | | * @todo Refactor code. |
| | | * @todo Replace echo-debugging (make it adhere to config setting and log) |
| | | */ |
| | | |
| | | // changed path to work within roundcube webmail |
| | | include_once 'lib/icl_commons.inc'; |
| | | |
| | | |
| | | if (!isset($IMAP_USE_HEADER_DATE) || !$IMAP_USE_HEADER_DATE) { |
| | |
| | | return $res; |
| | | } |
| | | |
| | | function iil_ReadLine($fp, $size) { |
| | | function iil_ReadLine($fp, $size=1024) { |
| | | $line = ''; |
| | | |
| | | if (!$fp) { |
| | |
| | | return $line; |
| | | } |
| | | |
| | | function iil_MultLine($fp, $line) { |
| | | function iil_MultLine($fp, $line, $escape=false) { |
| | | $line = chop($line); |
| | | if (preg_match('/\{[0-9]+\}$/', $line)) { |
| | | $out = ''; |
| | |
| | | $line = iil_ReadBytes($fp, $bytes); |
| | | $out .= $line; |
| | | } |
| | | $line = $a[1][0] . "\"$out\""; |
| | | |
| | | $line = $a[1][0] . '"' . ($escape ? iil_Escape($out) : $out) . '"'; |
| | | // console('[...] '. $out); |
| | | } |
| | | return $line; |
| | |
| | | return false; |
| | | } |
| | | |
| | | $iil_error .= "Socket connection established\r\n"; |
| | | $line = iil_ReadLine($conn->fp, 4096); |
| | | stream_set_timeout($conn->fp, 10); |
| | | $line = stream_get_line($conn->fp, 8192, "\r\n"); |
| | | |
| | | // Connected to wrong port or connection error? |
| | | if (!preg_match('/^\* (OK|PREAUTH)/i', $line)) { |
| | | if ($line) |
| | | $iil_error = "Wrong startup greeting ($host:$ICL_PORT): $line"; |
| | | else |
| | | $iil_error = "Empty startup greeting ($host:$ICL_PORT)"; |
| | | $iil_errornum = -2; |
| | | return false; |
| | | } |
| | | |
| | | // RFC3501 [7.1] optional CAPABILITY response |
| | | if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) { |
| | | $conn->capability = explode(' ', strtoupper($matches[1])); |
| | |
| | | } |
| | | |
| | | function iil_ExplodeQuotedString($delimiter, $string) { |
| | | $quotes = explode('"', $string); |
| | | while ( list($key, $val) = each($quotes)) { |
| | | if (($key % 2) == 1) { |
| | | $quotes[$key] = str_replace($delimiter, "_!@!_", $quotes[$key]); |
| | | } |
| | | $result = array(); |
| | | $strlen = strlen($string); |
| | | |
| | | for ($q=$p=$i=0; $i < $strlen; $i++) { |
| | | if ($string[$i] == "\"" && $string[$i-1] != "\\") { |
| | | $q = $q ? false : true; |
| | | } |
| | | else if (!$q && preg_match("/$delimiter/", $string[$i])) { |
| | | $result[] = substr($string, $p, $i - $p); |
| | | $p = $i + 1; |
| | | } |
| | | } |
| | | $string = implode('"', $quotes); |
| | | |
| | | $result = explode($delimiter, $string); |
| | | while ( list($key, $val) = each($result) ) { |
| | | $result[$key] = str_replace('_!@!_', $delimiter, $result[$key]); |
| | | } |
| | | |
| | | |
| | | $result[] = substr($string, $p); |
| | | return $result; |
| | | } |
| | | |
| | |
| | | $conn->error = "Couldn't select $mailbox"; |
| | | return false; |
| | | } |
| | | |
| | | |
| | | if ($add) |
| | | $add = ' '.strtoupper(trim($add)); |
| | | |
| | |
| | | return $result; |
| | | } |
| | | |
| | | function iil_C_Expunge(&$conn, $mailbox) { |
| | | function iil_C_Expunge(&$conn, $mailbox, $messages=NULL) { |
| | | |
| | | if (iil_C_Select($conn, $mailbox)) { |
| | | $c = 0; |
| | | iil_PutLine($conn->fp, "exp1 EXPUNGE"); |
| | | $command = $messages ? "UID EXPUNGE $messages" : "EXPUNGE"; |
| | | |
| | | iil_PutLine($conn->fp, "exp1 $command"); |
| | | do { |
| | | $line=chop(iil_ReadLine($conn->fp, 100)); |
| | | if ($line[0] == '*') { |
| | |
| | | } |
| | | |
| | | function iil_C_Move(&$conn, $messages, $from, $to) { |
| | | $fp = $conn->fp; |
| | | |
| | | if (!$from || !$to) { |
| | | return -1; |
| | | } |
| | | $r = iil_C_Copy($conn, $messages, $from,$to); |
| | | |
| | | $r = iil_C_Copy($conn, $messages, $from, $to); |
| | | |
| | | if ($r==0) { |
| | | return iil_C_Delete($conn, $from, $messages); |
| | | } |
| | |
| | | // get folder list |
| | | do { |
| | | $line = iil_ReadLine($fp, 500); |
| | | $line = iil_MultLine($fp, $line); |
| | | $line = iil_MultLine($fp, $line, true); |
| | | |
| | | $a = explode(' ', $line); |
| | | if (($line[0] == '*') && ($a[1] == 'LIST')) { |
| | |
| | | // split one line |
| | | $a = iil_ExplodeQuotedString(' ', $line); |
| | | // last string is folder name |
| | | $folder = trim($a[count($a)-1], '"'); |
| | | $folder = preg_replace(array('/^"/', '/"$/'), '', iil_UnEscape($a[count($a)-1])); |
| | | |
| | | if (empty($ignore) || (!empty($ignore) |
| | | && !preg_match('/'.preg_quote(ignore, '/').'/i', $folder))) { |
| | |
| | | // get folder list |
| | | do { |
| | | $line = iil_ReadLine($fp, 500); |
| | | $line = iil_MultLine($fp, $line); |
| | | $line = iil_MultLine($fp, $line, true); |
| | | $a = explode(' ', $line); |
| | | |
| | | if (($line[0] == '*') && ($a[1] == 'LSUB' || $a[1] == 'LIST')) { |
| | |
| | | |
| | | // split one line |
| | | $a = iil_ExplodeQuotedString(' ', $line); |
| | | |
| | | // last string is folder name |
| | | //$folder = UTF7DecodeString(str_replace('"', '', $a[count($a)-1])); |
| | | $folder = trim($a[count($a)-1], '"'); |
| | | |
| | | $folder = preg_replace(array('/^"/', '/"$/'), '', iil_UnEscape($a[count($a)-1])); |
| | | |
| | | if ((!in_array($folder, $folders)) && (empty($ignore) |
| | | || (!empty($ignore) && !preg_match('/'.preg_quote(ignore, '/').'/i', $folder)))) { |
| | | $folders[$i] = $folder; |
| | |
| | | } |
| | | $bytes -= strlen($line); |
| | | |
| | | $line = rtrim($line, "\t\r\n\0\x0B"); |
| | | |
| | | if ($mode == 1) { |
| | | $line = rtrim($line, "\t\r\n\0\x0B"); |
| | | // create chunks with proper length for base64 decoding |
| | | $line = $prev.$line; |
| | | $length = strlen($line); |
| | |
| | | else |
| | | $result .= base64_decode($line); |
| | | } else if ($mode == 2) { |
| | | $line .= $line[sizeof($line)-1] != '=' ? "\n" : ''; |
| | | $line = rtrim($line, "\t\r\0\x0B"); |
| | | if ($file) |
| | | fwrite($file, quoted_printable_decode($line)); |
| | | else if ($print) |
| | |
| | | else |
| | | $result .= quoted_printable_decode($line); |
| | | } else if ($mode == 3) { |
| | | $line = rtrim($line, "\t\r\n\0\x0B"); |
| | | if ($line == 'end' || preg_match('/^begin\s+[0-7]+\s+.+$/', $line)) |
| | | continue; |
| | | if ($file) |
| | | fwrite($file, convert_uudecode($line)); |
| | | else if ($print) |
| | |
| | | else |
| | | $result .= convert_uudecode($line); |
| | | } else { |
| | | $line = rtrim($line, "\t\r\n\0\x0B"); |
| | | if ($file) |
| | | fwrite($file, $line . "\n"); |
| | | else if ($print) |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | // read in anything up until last line |
| | | if (!$end) |
| | | do { |