alecpl
2008-06-05 49e5f7232893667d4a5b9d9b6f3454eef56ece45
- added iil_PutLine() wrapper for fputs()
- code cleanup and identation fixes


1 files modified
164 ■■■■ changed files
program/lib/imap.inc 164 ●●●● patch | view | raw | blame | history
program/lib/imap.inc
@@ -60,6 +60,8 @@
        - fixed iil_MultLine(): use iil_ReadBytes() instead of iil_ReadLine()
        - fixed iil_C_FetchStructureString() to handle many literal strings in response
        - removed hardcoded data size in iil_ReadLine() 
        - added iil_PutLine() wrapper for fputs()
        - code cleanup and identation fixes
********************************************************/
@@ -159,7 +161,6 @@
    var $mid;
}
function iil_xor($string, $string2) {
    $result = '';
    $size = strlen($string);
@@ -169,8 +170,14 @@
    return $result;
}
function iil_PutLine($fp, $string, $endln=true) {
//    console('C: '. $string);
    return fputs($fp, $string . ($endln ? "\r\n" : ''));
}
function iil_ReadLine($fp, $size) {
    $line = '';
    if (!$fp) {
        return $line;
    }
@@ -184,8 +191,10 @@
        if ($buffer === false) {
            break;
        }
//        console('S: '. chop($buffer));
        $line .= $buffer;
    } while ($buffer[strlen($buffer)-1] != "\n");
    return $line;
}
@@ -201,6 +210,7 @@
            $out .= $line;
        }
        $line = $a[1][0] . "\"$out\"";
//        console('[...] '. $out);
    }
    return $line;
}
@@ -215,6 +225,7 @@
        }
        $len = strlen($data);
    } while ($len < $bytes);
    return $data;
}
@@ -263,7 +274,6 @@
    return false;
}
function iil_Escape($string)
{
    return strtr($string, array('"'=>'\\"', '\\' => '\\\\')); 
@@ -279,6 +289,7 @@
        $ipad .= chr(0x36);
        $opad .= chr(0x5C);
    }
    // pad $pass so it's 64 bytes
    $padLen = 64 - strlen($pass);
    for ($i=0;$i<$padLen;$i++) {
@@ -294,7 +305,7 @@
    $reply = base64_encode('"' . $user . '" "' . $hash . '"');
    
    // send result, get reply
    fputs($conn->fp, $reply . "\r\n");
    iil_PutLine($conn->fp, $reply);
    $line = iil_ReadLine($conn->fp, 1024);
    
    // process result
@@ -311,7 +322,7 @@
function iil_C_Login(&$conn, $user, $password) {
    fputs($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password)."\"\r\n");
    iil_PutLine($conn->fp, 'a001 LOGIN "'.iil_Escape($user).'" "'.iil_Escape($password).'"');
    do {
        $line = iil_ReadReply($conn->fp);
@@ -382,7 +393,7 @@
        return true;
    }
    
    fputs($conn->fp, "ns1 NAMESPACE\r\n");
    iil_PutLine($conn->fp, "ns1 NAMESPACE");
    do {
        $line = iil_ReadLine($conn->fp, 1024);
        if (iil_StartsWith($line, '* NAMESPACE')) {
@@ -410,7 +421,6 @@
    $my_prefs["rootdir"] = substr($conn->rootdir, 0, -1);
    
    return true;
}
function iil_Connect($host, $user, $password) {    
@@ -497,9 +507,9 @@
//    if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
//        $conn->capability = explode(' ', $matches[1]);
//    } else {
        fputs($conn->fp, "cp01 CAPABILITY\r\n");
        iil_PutLine($conn->fp, "cp01 CAPABILITY");
        do {
            $line = trim(iil_ReadLine($conn->fp, 100));
            $line = trim(iil_ReadLine($conn->fp, 1024));
            $conn->message .= "$line\n";
@@ -532,7 +542,7 @@
        $conn->message .= "Trying CRAM-MD5\n";
        //do CRAM-MD5 authentication
        fputs($conn->fp, "a000 AUTHENTICATE CRAM-MD5\r\n");
        iil_PutLine($conn->fp, "a000 AUTHENTICATE CRAM-MD5");
        $line = trim(iil_ReadLine($conn->fp, 1024));
        
        $conn->message .= "$line\n";
@@ -546,7 +556,6 @@
            $conn->message .= "Tried CRAM-MD5: $result \n";
        } else {
            $conn->message .='No challenge ('.htmlspecialchars($line)."), try plain\n";
            $auth = 'plain';            
        }
    }
@@ -571,7 +580,7 @@
function iil_Close(&$conn) {
    iil_C_WriteCache($conn);
    if (fputs($conn->fp, "I LOGOUT\r\n")) {
    if (iil_PutLine($conn->fp, "I LOGOUT")) {
        fgets($conn->fp, 1024);
        fclose($conn->fp);
        $conn->fp = false;
@@ -580,7 +589,6 @@
function iil_ClearCache($user, $host) {
}
function iil_C_WriteCache(&$conn) {
    //echo "<!-- doing iil_C_WriteCache //-->\n";
@@ -684,7 +692,7 @@
    $conn = iil_Connect($host, $user, $password, 'plain');
    $fp   = $conn->fp;
    if ($fp) {
        fputs($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"\r\n");
        iil_PutLine($fp, "a002 EXAMINE \"".iil_Escape($mailbox)."\"");
        do {
            $line=chop(iil_ReadLine($fp, 300));
            $a=explode(' ', $line);
@@ -693,7 +701,7 @@
            }
        } while (!iil_StartsWith($a[0], 'a002'));
        fputs($fp, "a003 LOGOUT\r\n");
        iil_PutLine($fp, "a003 LOGOUT");
        fclose($fp);
    } else {
        $result = -2;
@@ -703,7 +711,6 @@
}
function iil_C_Select(&$conn, $mailbox) {
    $fp = $conn->fp;
    
    if (empty($mailbox)) {
        return false;
@@ -714,9 +721,9 @@
    
    iil_C_LoadCache($conn, $mailbox);
    
    if (fputs($fp, "sel1 SELECT \"".iil_Escape($mailbox)."\"\r\n")) {
    if (iil_PutLine($conn->fp, "sel1 SELECT \"".iil_Escape($mailbox).'"')) {
        do {
            $line=chop(iil_ReadLine($fp, 300));
            $line = chop(iil_ReadLine($conn->fp, 300));
            $a=explode(' ', $line);
            if (count($a) == 3) {
                if (strcasecmp($a[2], 'EXISTS') == 0) {
@@ -754,6 +761,7 @@
    if ($refresh) {
        $conn->selected= '';
    }
    iil_C_Select($conn, $mailbox);
    if ($conn->selected == $mailbox) {
        return $conn->exists;
@@ -823,6 +831,7 @@
    if ($field == 'INTERNALDATE') {
        $field = 'ARRIVAL';
    }
    $fields = array('ARRIVAL' => 1,'CC' => 1,'DATE' => 1,
        'FROM' => 1, 'SIZE' => 1, 'SUBJECT' => 1, 'TO' => 1);
    
@@ -838,10 +847,10 @@
    $fp       = $conn->fp;
    $command  = 's ' . $is_uid . 'SORT (' . $field . ') ';
    $command .= $encoding . ' ALL' . "$add\r\n";
    $command .= $encoding . ' ALL' . $add;
    $line     = $data = '';
    
    if (!fputs($fp, $command)) {
    if (!iil_PutLine($fp, $command)) {
        return false;
    }
    do {
@@ -906,8 +915,8 @@
    /* FETCH date,from,subject headers */
    if ($mode == 1) {
        $key     = 'fhi' . ($c++);
        $request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])\r\n";
        if (!fputs($fp, $request)) {
        $request = $key . " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)])";
        if (!iil_PutLine($fp, $request)) {
            return false;
        }
        do {
@@ -976,8 +985,8 @@
    }else if ($mode == 6) {
        $key     = 'fhi' . ($c++);
        $request = $key . " FETCH $message_set (INTERNALDATE)\r\n";
        if (!fputs($fp, $request)) {
        $request = $key . " FETCH $message_set (INTERNALDATE)";
        if (!iil_PutLine($fp, $request)) {
            return false;
        }
        do {
@@ -1014,9 +1023,9 @@
        
        /*             FETCH uid, size, flags        */
        $key     = 'fhi' .($c++);
        $request = $key . " FETCH $message_set ($field_name)\r\n";
        $request = $key . " FETCH $message_set ($field_name)";
        if (!fputs($fp, $request)) {
        if (!iil_PutLine($fp, $request)) {
            return false;
        }
        do {
@@ -1098,6 +1107,7 @@
        }
        $prev = $id;
    }
    //handle the last sequence/id
    if ($start==$prev) {
        $result[] = $prev;
@@ -1234,9 +1244,9 @@
        $key        = 'fh';
        $fp         = $conn->fp;
        $request    = $key . " FETCH $message_set ";
        $request   .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])\r\n";
            $request   .= "(BODY.PEEK[HEADER.FIELDS (SUBJECT MESSAGE-ID IN-REPLY-TO)])";
        $mid_to_id  = array();
        if (!fputs($fp, $request)) {
        if (!iil_PutLine($fp, $request)) {
            return false;
        }
        do {
@@ -1417,7 +1427,6 @@
                echo $new['MESSAGE-ID'] . "\t" . $sbj . "\n";
            }
        }
    }
    
    //now that we've gone through all the messages,
@@ -1440,10 +1449,9 @@
    if ($debug) {
        print_r($roots);
    }
    //print_r($result);
    return $result;
}
function iil_SortThreads(&$tree, $index, $sort_order = 'ASC') {
    if (!is_array($tree) || !is_array($index)) {
@@ -1485,7 +1493,6 @@
        }
    }
    
    //sort by key, this basically sorts all threads
    ksort($itree);
    $i   = 0;
@@ -1495,7 +1502,6 @@
        $i++;
    }
    
    //return
    return $out;
}
@@ -1563,9 +1569,9 @@
    $request .= " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ";
    $request .= "(DATE FROM TO SUBJECT REPLY-TO IN-REPLY-TO CC BCC ";
    $request .= "CONTENT-TRANSFER-ENCODING CONTENT-TYPE MESSAGE-ID ";
    $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])\r\n";
    $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY)])";
    if (!fputs($fp, $request)) {
    if (!iil_PutLine($fp, $request)) {
        return false;
    }
    do {
@@ -1696,9 +1702,9 @@
    */
    $command_key = 'fh' . ($c++);
    $request     = $command_key . $prefix;
    $request    .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)\r\n";
    $request    .= " FETCH $message_set (UID RFC822.SIZE FLAGS INTERNALDATE)";
    
    if (!fputs($fp, $request)) {
    if (!iil_PutLine($fp, $request)) {
        return false;
    }
    do {
@@ -1812,7 +1818,6 @@
    return false;
}
function iil_SortHeaders($a, $field, $flag) {
    if (empty($field)) {
        $field = 'uid';
@@ -1877,12 +1882,12 @@
}
function iil_C_Expunge(&$conn, $mailbox) {
    $fp = $conn->fp;
    if (iil_C_Select($conn, $mailbox)) {
        $c = 0;
        fputs($fp, "exp1 EXPUNGE\r\n");
        iil_PutLine($conn->fp, "exp1 EXPUNGE");
        do {
            $line=chop(iil_ReadLine($fp, 100));
            $line=chop(iil_ReadLine($conn->fp, 100));
            if ($line[0] == '*') {
                $c++;
            }
@@ -1919,7 +1924,7 @@
    
    if (iil_C_Select($conn, $mailbox)) {
        $c = 0;
        fputs($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")\r\n");
        iil_PutLine($fp, "flg STORE $messages " . $mod . "FLAGS (" . $flag . ")");
        do {
            $line=chop(iil_ReadLine($fp, 100));
            if ($line[0] == '*') {
@@ -1958,7 +1963,6 @@
    return iil_C_ModFlag($conn, $mailbox, $messages, 'SEEN', '-');
}
function iil_C_Copy(&$conn, $messages, $from, $to) {
    $fp = $conn->fp;
@@ -1969,7 +1973,7 @@
    if (iil_C_Select($conn, $from)) {
        $c=0;
        
        fputs($fp, "cpy1 COPY $messages \"".iil_Escape($to)."\"\r\n");
        iil_PutLine($fp, "cpy1 COPY $messages \"".iil_Escape($to)."\"");
        $line=iil_ReadReply($fp);
        return iil_ParseResult($line);
    } else {
@@ -2017,7 +2021,7 @@
    $result = -1;
    if (iil_C_Select($conn, $folder)) {
        $key = 'FUID';
        if (fputs($fp, "$key FETCH $id (UID)\r\n")) {
        if (iil_PutLine($fp, "$key FETCH $id (UID)")) {
            do {
                $line=chop(iil_ReadLine($fp, 1024));
                if (eregi("^\* $id FETCH \(UID (.*)\)", $line, $r)) {
@@ -2034,8 +2038,8 @@
    if (iil_C_Select($conn, $folder)) {
        $c = 0;
        
        $query = 'srch1 SEARCH ' . chop($criteria) . "\r\n";
        fputs($fp, $query);
        $query = 'srch1 SEARCH ' . chop($criteria);
        iil_PutLine($fp, $query);
        do {
            $line=trim(iil_ReadLine($fp, 10000));
            if (eregi("^\* SEARCH", $line)) {
@@ -2050,7 +2054,6 @@
        }
        $conn->error = 'iil_C_Search: ' . $line . "\n";
        return false;
    }
    $conn->error = "iil_C_Search: Couldn't select \"$folder\"\n";
    return false;
@@ -2088,7 +2091,7 @@
    $delimiter = false;
    
    //try (LIST "" ""), should return delimiter (RFC2060 Sec 6.3.8)
    if (!fputs($fp, 'ghd LIST "" ""' . "\r\n")) {
    if (!iil_PutLine($fp, 'ghd LIST "" ""')) {
        return false;
    }
    
@@ -2109,7 +2112,7 @@
    
    //if that fails, try namespace extension
    //try to fetch namespace data
    fputs($conn->fp, "ns1 NAMESPACE\r\n");
    iil_PutLine($conn->fp, "ns1 NAMESPACE");
    do {
        $line = iil_ReadLine($conn->fp, 1024);
        if (iil_StartsWith($line, '* NAMESPACE')) {
@@ -2156,7 +2159,7 @@
    }
    
    // send command
    if (!fputs($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"\r\n")) {
    if (!iil_PutLine($fp, "lmb LIST \"".$ref."\" \"".iil_Escape($mailbox)."\"")) {
        return false;
    }
    
@@ -2204,7 +2207,6 @@
    }
}
function iil_C_ListSubscribed(&$conn, $ref, $mailbox) {
    global $IGNORE_FOLDERS;
    
@@ -2220,7 +2222,7 @@
    $folders = array();
    // send command
    if (!fputs($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"' . "\r\n")) {
    if (!iil_PutLine($fp, 'lsb LSUB "' . $ref . '" "' . iil_Escape($mailbox).'"')) {
        $conn->error = "Couldn't send LSUB command\n";
        return false;
    }
@@ -2273,28 +2275,25 @@
    return false;
}
function iil_C_Subscribe(&$conn, $folder) {
    $fp = $conn->fp;
    $query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"' . "\r\n";
    fputs($fp, $query);
    $query = 'sub1 SUBSCRIBE "' . iil_Escape($folder). '"';
    iil_PutLine($fp, $query);
    $line = trim(iil_ReadLine($fp, 10000));
    return iil_ParseResult($line);
}
function iil_C_UnSubscribe(&$conn, $folder) {
    $fp = $conn->fp;
    $query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"' . "\r\n";
    fputs($fp, $query);
    $query = 'usub1 UNSUBSCRIBE "' . iil_Escape($folder) . '"';
    iil_PutLine($fp, $query);
    
    $line = trim(iil_ReadLine($fp, 10000));
    return iil_ParseResult($line);
}
function iil_C_FetchPartHeader(&$conn, $mailbox, $id, $part) {
    $fp     = $conn->fp;
@@ -2307,8 +2306,8 @@
    
    if (iil_C_Select($conn, $mailbox)) {
        $key     = 'fh' . ($c++);
        $request = $key . " FETCH $id (BODY.PEEK[$part])\r\n";
        if (!fputs($fp, $request)) return false;
        $request = $key . " FETCH $id (BODY.PEEK[$part])";
        if (!iil_PutLine($fp, $request)) return false;
        do {
            $line = chop(iil_ReadLine($fp, 200));
            $a    = explode(' ', $line);
@@ -2326,13 +2325,13 @@
    return $result;
}
function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part, $mode) {
    /* modes:
        1: return string
        2: print
        3: base64 and print
    */
    $fp     = $conn->fp;
    $result = false;
    if (($part == 0) || empty($part)) {
@@ -2344,9 +2343,9 @@
        
        // format request
        $key     = 'ftch' . ($c++) . ' ';
        $request = $key . "FETCH $id (BODY.PEEK[$part])\r\n";
        $request = $key . "FETCH $id (BODY.PEEK[$part])";
        // send request
        if (!fputs($fp, $request)) {
        if (!iil_PutLine($fp, $request)) {
            return false;
        }
        
@@ -2356,6 +2355,7 @@
            $a    = explode(' ', $line);
        } while ($a[2] != 'FETCH');
        $len = strlen($line);
        if ($line[$len-1] == ')') {
            //one line response, get everything between first and last quotes
        if (substr($line, -4, 3) == 'NIL') {
@@ -2381,6 +2381,7 @@
            $sizeStr  = substr($line, $from, $len);
            $bytes    = (int)$sizeStr;
            $received = 0;
            while ($received < $bytes) {
                $remaining = $bytes - $received;
                $line      = iil_ReadLine($fp, 1024);
@@ -2408,6 +2409,7 @@
        $result = rtrim($result, "\t\r\n\0\x0B");
            return $result; // substr($result, 0, strlen($result)-1);
        }
        return false;
    } else {
        echo 'Select failed.';
@@ -2433,7 +2435,7 @@
function iil_C_CreateFolder(&$conn, $folder) {
    $fp = $conn->fp;
    if (fputs($fp, 'c CREATE "' . iil_Escape($folder) . '"' . "\r\n")) {
    if (iil_PutLine($fp, 'c CREATE "' . iil_Escape($folder) . '"')) {
        do {
            $line=iil_ReadLine($fp, 300);
        } while ($line[0] != 'c');
@@ -2445,7 +2447,7 @@
function iil_C_RenameFolder(&$conn, $from, $to) {
    $fp = $conn->fp;
    if (fputs($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"' . "\r\n")) {
    if (iil_PutLine($fp, 'r RENAME "' . iil_Escape($from) . '" "' . iil_Escape($to) . '"')) {
        do {
            $line = iil_ReadLine($fp, 300);
        } while ($line[0] != 'r');
@@ -2456,7 +2458,7 @@
function iil_C_DeleteFolder(&$conn, $folder) {
    $fp = $conn->fp;
    if (fputs($fp, 'd DELETE "' . iil_Escape($folder). '"' . "\r\n")) {
    if (iil_PutLine($fp, 'd DELETE "' . iil_Escape($folder). '"')) {
        do {
            $line=iil_ReadLine($fp, 300);
        } while ($line[0] != 'd');
@@ -2479,9 +2481,10 @@
    if (!$len) {
        return false;
    }
    $request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . "}\r\n";
    
    if (fputs($fp, $request)) {
    $request = 'A APPEND "' . iil_Escape($folder) .'" (\\Seen) {' . $len . '}';
    if (iil_PutLine($fp, $request)) {
        $line=iil_ReadLine($fp, 100);        
        $sent = fwrite($fp, $message."\r\n");
        do {
@@ -2493,12 +2496,11 @@
            $conn->error .= $line . "\n";
        }
        return $result;
    }
    $conn->error .= "Couldn't send command \"$request\"\n";
    return false;
}
function iil_C_AppendFromFile(&$conn, $folder, $path) {
    if (!$folder) {
@@ -2522,20 +2524,20 @@
    }
    
    //send APPEND command
    $request    = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . "}\r\n";
    $request    = 'A APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
    $bytes_sent = 0;
    if (fputs($fp, $request)) {
    if (iil_PutLine($fp, $request)) {
        $line = iil_ReadLine($fp, 100);
                
        //send file
        while (!feof($in_fp)) {
            $buffer      = fgets($in_fp, 4096);
            $bytes_sent += strlen($buffer);
            fputs($fp, $buffer);
            iil_PutLine($fp, $buffer, false);
        }
        fclose($in_fp);
        fputs($fp, "\r\n");
        iil_PutLine($fp, '');
        //read response
        do {
@@ -2546,13 +2548,13 @@
        if (!$result) {
            $conn->error .= $line . "\n";
        }
        return $result;
    
        return $result;
    }
    $conn->error .= "Couldn't send command \"$request\"\n";
    return false;
}
function iil_C_FetchStructureString(&$conn, $folder, $id) {
    $fp     = $conn->fp;
@@ -2561,14 +2563,15 @@
    if (iil_C_Select($conn, $folder)) {
        $key = 'F1247';
        
        if (fputs($fp, "$key FETCH $id (BODYSTRUCTURE)\r\n")) {
        if (iil_PutLine($fp, "$key FETCH $id (BODYSTRUCTURE)")) {
            do {
                $line = iil_ReadLine($fp, 5000);
                $line = iil_MultLine($fp, $line);
                $result .= $line;
            } while (!preg_match("/^$key/", $line));
            $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13, -(strlen($result)-strrpos($result, $key)-2)));
            $result = trim(substr($result, strpos($result, 'BODYSTRUCTURE')+13,
                    -(strlen($result)-strrpos($result, $key)-2)));
        }
    }
    return $result;
@@ -2593,7 +2596,7 @@
    $quota_line = '';
    
    //get line containing quota info
    if (fputs($fp, 'QUOT1 GETQUOTAROOT "INBOX"' . "\r\n")) {
    if (iil_PutLine($fp, 'QUOT1 GETQUOTAROOT "INBOX"')) {
        do {
            $line=chop(iil_ReadLine($fp, 5000));
            if (iil_StartsWith($line, '* QUOTA ')) {
@@ -2620,7 +2623,6 @@
    }
    return $result;
}
function iil_C_ClearFolder(&$conn, $folder) {
    $num_in_trash = iil_C_CountMessages($conn, $folder);