alecpl
2008-05-30 e16938eac8832cda72b58d955f9d6b8d13758256
- Support " and \ in folder names


2 files modified
70 ■■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/lib/imap.inc 69 ●●●●● patch | view | raw | blame | history
CHANGELOG
@@ -5,6 +5,7 @@
----------
- Support for subfolders in default/protected folders (#1484665)
- Disallowed delimiter in folder name (#1484803)
- Support " and \ in folder names
2008/05/29 (alec)
----------
program/lib/imap.inc
@@ -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_Escape($string)
{
    return strtr($string, array('"'=>'\\"', '\\' => '\\\\'));
}
function iil_C_Authenticate(&$conn, $user, $pass, $encChallenge) {
    
    $ipad = '';
@@ -298,7 +304,7 @@
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 @@
    $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 @@
    
    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 @@
    $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 @@
    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 @@
    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 @@
    $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 @@
            $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 @@
            }
            
            // 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 @@
    $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 @@
            
            // 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 @@
            }
            
            // 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_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_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_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_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_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 @@
    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 @@
    }
    
    //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 @@
    }
    return (iil_C_Expunge($conn, $folder) >= 0);
}
?>