alecpl
2010-03-05 2d08c50fd78e8ae74f27a2418f7909b18ae2bf42
program/lib/imap.inc
@@ -647,7 +647,7 @@
      $conn->capability = explode(' ', strtoupper($matches[1]));
   }
   $conn->message .= $line . "\n";
   $conn->message .= $line;
   // TLS connection
   if ($ICL_SSL == 'tls' && iil_C_GetCapability($conn, 'STARTTLS')) {
@@ -672,46 +672,47 @@
           }
   }
   $orig_method = $auth_method;
   if ($auth_method == 'CHECK') {
      //check for supported auth methods
      // check for supported auth methods
      if (iil_C_GetCapability($conn, 'AUTH=CRAM-MD5') || iil_C_GetCapability($conn, 'AUTH=CRAM_MD5')) {
         $auth_method = 'AUTH';
      }
      else {
         //default to plain text auth
         // default to plain text auth
         $auth_method = 'PLAIN';
      }
   }
   if ($auth_method == 'AUTH') {
      //do CRAM-MD5 authentication
      // do CRAM-MD5 authentication
      iil_PutLine($conn->fp, "a000 AUTHENTICATE CRAM-MD5");
      $line = trim(iil_ReadLine($conn->fp, 1024));
      if ($line[0] == '+') {
         //got a challenge string, try CRAM-5
         // got a challenge string, try CRAM-MD5
         $result = iil_C_Authenticate($conn, $user, $password, substr($line,2));
              
         // stop if server sent BYE response
         if($result == -3) {
         if ($result == -3) {
                     $iil_error = $conn->error;
                     $iil_errornum = $conn->errorNum;
            return false;
         }
         $conn->message .= "AUTH CRAM-MD5: $result\n";
      } else {
         $conn->message .= "AUTH CRAM-MD5: failed\n";
      }
      if (!is_resource($result) && $orig_method == 'CHECK') {
         $auth_method = 'PLAIN';
      }
   }
      
   if (!$result || $auth_method == 'PLAIN') {
      //do plain text auth
   if ($auth_method == 'PLAIN') {
      // do plain text auth
      $result = iil_C_Login($conn, $user, $password);
      $conn->message .= "AUTH PLAIN: $result\n";
   }
   if (!is_int($result)) {
   if (is_resource($result)) {
      iil_C_Namespace($conn);
      return $conn;
   } else {
@@ -914,7 +915,7 @@
   return preg_split('/\s+/', $data, -1, PREG_SPLIT_NO_EMPTY);
}
function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true) {
function iil_C_FetchHeaderIndex(&$conn, $mailbox, $message_set, $index_field='', $skip_deleted=true, $uidfetch=false) {
   list($from_idx, $to_idx) = explode(':', $message_set);
   if (empty($message_set) ||
@@ -948,19 +949,22 @@
   
   // build FETCH command string
   $key     = 'fhi0';
   $cmd     = $uidfetch ? 'UID FETCH' : 'FETCH';
   $deleted = $skip_deleted ? ' FLAGS' : '';
   if ($mode == 1)
      $request = " FETCH $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)";
   if ($mode == 1 && $index_field == 'DATE')
      $request = " $cmd $message_set (INTERNALDATE BODY.PEEK[HEADER.FIELDS (DATE)]$deleted)";
   else if ($mode == 1)
      $request = " $cmd $message_set (BODY.PEEK[HEADER.FIELDS ($index_field)]$deleted)";
   else if ($mode == 2) {
      if ($index_field == 'SIZE')
         $request = " FETCH $message_set (RFC822.SIZE$deleted)";
         $request = " $cmd $message_set (RFC822.SIZE$deleted)";
      else
         $request = " FETCH $message_set ($index_field$deleted)";
         $request = " $cmd $message_set ($index_field$deleted)";
   } else if ($mode == 3)
      $request = " FETCH $message_set (FLAGS)";
      $request = " $cmd $message_set (FLAGS)";
   else // 4
      $request = " FETCH $message_set (INTERNALDATE$deleted)";
      $request = " $cmd $message_set (INTERNALDATE$deleted)";
   $request = $key . $request;
@@ -986,15 +990,23 @@
            }
         }
         if ($mode == 1) {
            if (preg_match('/BODY\[HEADER\.FIELDS \("?(DATE|FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
               $value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
         if ($mode == 1 && $index_field == 'DATE') {
            if (preg_match('/BODY\[HEADER\.FIELDS \("*DATE"*\)\] (.*)/', $line, $matches)) {
               $value = preg_replace(array('/^"*[a-z]+:/i'), '', $matches[1]);
               $value = trim($value);
               if ($index_field == 'DATE') {
                  $result[$id] = iil_StrToTime($value);
               } else {
                  $result[$id] = $value;
               }
               $result[$id] = iil_StrToTime($value);
            }
            // non-existent/empty Date: header, use INTERNALDATE
            if (empty($result[$id])) {
               if (preg_match('/INTERNALDATE "([^"]+)"/', $line, $matches))
                  $result[$id] = iil_StrToTime($matches[1]);
               else
                  $result[$id] = 0;
            }
         } else if ($mode == 1) {
            if (preg_match('/BODY\[HEADER\.FIELDS \("?(FROM|REPLY-TO|SENDER|TO|SUBJECT)"?\)\] (.*)/', $line, $matches)) {
               $value = preg_replace(array('/^"*[a-z]+:/i', '/\s+$/sm'), array('', ''), $matches[2]);
               $result[$id] = trim($value);
            } else {
               $result[$id] = '';
            }
@@ -1438,7 +1450,8 @@
   $request .= "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".$add.")])";
   $request .= "REFERENCES DISPOSITION-NOTIFICATION-TO X-PRIORITY ";
   $request .= "X-REPLY-UID X-FORWARD-UID".$add.")])";
   if (!iil_PutLine($fp, $request)) {
      return false;
@@ -2407,7 +2420,7 @@
   return false;
}
function iil_C_AppendFromFile(&$conn, $folder, $path) {
function iil_C_AppendFromFile(&$conn, $folder, $path, $headers=null, $separator="\n\n") {
   if (!$folder) {
       return false;
   }
@@ -2427,7 +2440,12 @@
   if (!$len) {
      return false;
   }
        if ($headers) {
                $headers = preg_replace('/[\r\n]+$/', '', $headers);
                $len += strlen($headers) + strlen($separator);
        }
   //send APPEND command
   $request    = 'a APPEND "' . iil_Escape($folder) . '" (\\Seen) {' . $len . '}';
   if (iil_PutLine($fp, $request)) {
@@ -2439,16 +2457,21 @@
         return false;
      }
      //send file
                // send headers with body separator
                if ($headers) {
         iil_PutLine($fp, $headers . $separator, false);
                }
      // send file
      while (!feof($in_fp)) {
         $buffer      = fgets($in_fp, 4096);
         $buffer = fgets($in_fp, 4096);
         iil_PutLine($fp, $buffer, false);
      }
      fclose($in_fp);
      iil_PutLine($fp, ''); // \r\n
      //read response
      // read response
      do {
         $line = iil_ReadLine($fp);
      } while (!iil_StartsWith($line, 'a ', true));