- Support " and \ in folder names

release-0.6
alecpl 17 years ago
parent 134eafd5b8
commit e16938eac8

@ -5,6 +5,7 @@ CHANGELOG RoundCube Webmail
----------
- Support for subfolders in default/protected folders (#1484665)
- Disallowed delimiter in folder name (#1484803)
- Support " and \ in folder names
2008/05/29 (alec)
----------

@ -55,6 +55,7 @@
- RFC3501 [7.1] don't call CAPABILITY if was returned in server
optional resposne in iil_Connect()
- trim(chop()) replaced by trim()
- added iil_Escape() with support for " and \ in folder names
********************************************************/
@ -256,6 +257,11 @@ function iil_StartsWithI($string, $match) {
}
function iil_Escape($string)
{
return strtr($string, array('"'=>'\\"', '\\' => '\\\\'));
}
function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
$ipad = '';
@ -298,7 +304,7 @@ function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
function iil_C_Login(&$conn, $user, $password) {
$password = strtr($password, array('"'=>'\\"', '\\' => '\\\\'));
$password = iil_Escape($password);
fputs($conn->fp, "a001 LOGIN $user \"$password\"\r\n");
do {
@ -672,7 +678,7 @@ function iil_CheckForRecent($host, $user, $password, $mailbox) {
$conn = iil_Connect($host, $user, $password, 'plain');
$fp = $conn->fp;
if ($fp) {
fputs($fp, "a002 EXAMINE \"$mailbox\"\r\n");
fputs($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"\r\n");
do {
$line=chop(iil_ReadLine($fp, 300));
$a=explode(' ', $line);
@ -702,7 +708,7 @@ function iil_C_Select(&$conn, $mailbox) {
iil_C_LoadCache($conn, $mailbox);
if (fputs($fp, "sel1 SELECT \"$mailbox\"\r\n")) {
if (fputs($fp, "sel1 SELECT \"".iil_Escape($mailbox)."\"\r\n")) {
do {
$line=chop(iil_ReadLine($fp, 300));
$a=explode(' ', $line);
@ -826,12 +832,12 @@ function iil_C_Sort(&$conn, $mailbox, $field, $add='', $is_uid=FALSE,
$fp = $conn->fp;
$command = 's ' . $is_uid . 'SORT (' . $field . ') ';
$command .= $encoding . ' ALL' . "$add\r\n";
$command .= $encoding . ' ALL' . "$add\r\n";
$line = $data = '';
if (!fputs($fp, $command)) {
return false;
}
}
do {
$line = chop(iil_ReadLine($fp, 1024));
if (iil_StartsWith($line, '* SORT')) {
@ -1942,7 +1948,6 @@ function iil_C_Undelete(&$conn, $mailbox, $messages) {
return iil_C_ModFlag($conn, $mailbox, $messages, 'DELETED', '-');
}
function iil_C_Unseen(&$conn, $mailbox, $messages) {
return iil_C_ModFlag($conn, $mailbox, $messages, 'SEEN', '-');
}
@ -1958,7 +1963,7 @@ function iil_C_Copy(&$conn, $messages, $from, $to) {
if (iil_C_Select($conn, $from)) {
$c=0;
fputs($fp, "cpy1 COPY $messages \"$to\"\r\n");
fputs($fp, "cpy1 COPY $messages \"".iil_Escape($to)."\"\r\n");
$line=iil_ReadReply($fp);
return iil_ParseResult($line);
} else {
@ -2135,20 +2140,22 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
$ignore = $IGNORE_FOLDERS[strtolower($conn->host)];
$fp = $conn->fp;
if (empty($mailbox)) {
$mailbox = '*';
}
}
if (empty($ref) && $conn->rootdir) {
$ref = $conn->rootdir;
}
// send command
if (!fputs($fp, "lmb LIST \"".$ref."\" \"$mailbox\"\r\n")) {
// send command
if (!fputs($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"\r\n")) {
return false;
}
}
$i = 0;
// get folder list
// get folder list
do {
$line = iil_ReadLine($fp, 500);
$line = iil_MultLine($fp, $line);
@ -2158,9 +2165,8 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
$line = rtrim($line);
// split one line
$a = iil_ExplodeQuotedString(' ', $line);
// last string is folder name
$folder = str_replace('"', '', $a[count($a)-1]);
$folder = trim($a[count($a)-1], '"');
if (empty($ignore) || (!empty($ignore)
&& !eregi($ignore, $folder))) {
@ -2168,20 +2174,22 @@ function iil_C_ListMailboxes(&$conn, $ref, $mailbox) {
}
// second from last is delimiter
$delim = str_replace('"', '', $a[count($a)-2]);
$delim = trim($a[count($a)-2], '"');
// is it a container?
$i++;
}
} while (!iil_StartsWith($line, 'lmb'));
if (is_array($folders)) {
if (!empty($ref)) {
if (!empty($ref)) {
// if rootdir was specified, make sure it's the first element
// some IMAP servers (i.e. Courier) won't return it
if ($ref[strlen($ref)-1]==$delim) $ref = substr($ref, 0, strlen($ref)-1);
if ($folders[0]!=$ref) array_unshift($folders, $ref);
}
return $folders;
if ($ref[strlen($ref)-1]==$delim)
$ref = substr($ref, 0, strlen($ref)-1);
if ($folders[0]!=$ref)
array_unshift($folders, $ref);
}
return $folders;
}else if (iil_ParseResult($line) == 0) {
return array('INBOX');
} else {
@ -2206,7 +2214,7 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
$folders = array();
// send command
if (!fputs($fp, 'lsb LSUB "' . $ref . '" "' . $mailbox.'"' . "\r\n")) {
if (!fputs($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"' . "\r\n")) {
$conn->error = "Couldn't send LSUB command\n";
return false;
}
@ -2227,7 +2235,7 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
// last string is folder name
//$folder = UTF7DecodeString(str_replace('"', '', $a[count($a)-1]));
$folder = str_replace('"', '', $a[count($a)-1]);
$folder = trim($a[count($a)-1], '"');
if ((!in_array($folder, $folders)) && (empty($ignore)
|| (!empty($ignore) && !eregi($ignore, $folder)))) {
@ -2235,7 +2243,7 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
}
// second from last is delimiter
$delim = str_replace('"', '', $a[count($a)-2]);
$delim = trim($a[count($a)-2], '"');
// is it a container?
$i++;
@ -2263,7 +2271,7 @@ function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
function iil_C_Subscribe(&$conn, $folder) {
$fp = $conn->fp;
$query = 'sub1 SUBSCRIBE "' . $folder. '"' . "\r\n";
$query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"' . "\r\n";
fputs($fp, $query);
$line = trim(iil_ReadLine($fp, 10000));
@ -2274,7 +2282,7 @@ function iil_C_Subscribe(&$conn, $folder) {
function iil_C_UnSubscribe(&$conn, $folder) {
$fp = $conn->fp;
$query = 'usub1 UNSUBSCRIBE "' . $folder . '"' . "\r\n";
$query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"' . "\r\n";
fputs($fp, $query);
$line = trim(iil_ReadLine($fp, 10000));
@ -2419,7 +2427,7 @@ function iil_C_PrintBase64Body(&$conn, $mailbox, $id, $part) {
function iil_C_CreateFolder(&$conn, $folder) {
$fp = $conn->fp;
if (fputs($fp, 'c CREATE "' . $folder . '"' . "\r\n")) {
if (fputs($fp, 'c CREATE "' . iil_Escape($folder) . '"' . "\r\n")) {
do {
$line=iil_ReadLine($fp, 300);
} while ($line[0] != 'c');
@ -2431,7 +2439,7 @@ function iil_C_CreateFolder(&$conn, $folder) {
function iil_C_RenameFolder(&$conn, $from, $to) {
$fp = $conn->fp;
if (fputs($fp, 'r RENAME "' . $from . '" "' . $to . '"' . "\r\n")) {
if (fputs($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"' . "\r\n")) {
do {
$line = iil_ReadLine($fp, 300);
} while ($line[0] != 'r');
@ -2442,7 +2450,7 @@ function iil_C_RenameFolder(&$conn, $from, $to) {
function iil_C_DeleteFolder(&$conn, $folder) {
$fp = $conn->fp;
if (fputs($fp, 'd DELETE "' . $folder. '"' . "\r\n")) {
if (fputs($fp, 'd DELETE "' . iil_Escape($folder). '"' . "\r\n")) {
do {
$line=iil_ReadLine($fp, 300);
} while ($line[0] != 'd');
@ -2465,7 +2473,7 @@ function iil_C_Append(&$conn, $folder, &$message) {
if (!$len) {
return false;
}
$request = 'A APPEND "' . $folder .'" (\\Seen) {' . $len . "}\r\n";
$request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . "}\r\n";
if (fputs($fp, $request)) {
$line=iil_ReadLine($fp, 100);
@ -2508,7 +2516,7 @@ function iil_C_AppendFromFile(&$conn, $folder, $path) {
}
//send APPEND command
$request = 'A APPEND "' . $folder . '" (\\Seen) {' . $len . "}\r\n";
$request = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . "}\r\n";
$bytes_sent = 0;
if (fputs($fp, $request)) {
$line = iil_ReadLine($fp, 100);
@ -2630,4 +2638,5 @@ function iil_C_ClearFolder(&$conn, $folder) {
}
return (iil_C_Expunge($conn, $folder) >= 0);
}
?>

Loading…
Cancel
Save