alecpl
2008-05-09 ad6958979248a9abfeba0acd1353c17204498431
program/lib/imap.inc
@@ -51,6 +51,10 @@
      - Abort do-loop on socket errors (fgets returns false)
      - $ICL_SSL is not boolean anymore but contains the connection schema (ssl or tls)
      - Removed some debuggers (echo ...)
      File altered by Aleksander Machniak <alec@alec.pl>
      - RFC3501 [7.1] don't call CAPABILITY if was returned in server
        optional resposne in iil_Connect()
********************************************************/
@@ -66,8 +70,8 @@
include_once 'lib/icl_commons.inc';
if (!$IMAP_USE_HEADER_DATE) {
   $IMAP_USE_INTERNAL_DATE = true;
if (!isset($IMAP_USE_HEADER_DATE) || !$IMAP_USE_HEADER_DATE) {
    $IMAP_USE_INTERNAL_DATE = true;
}
/**
@@ -161,18 +165,19 @@
}
function iil_ReadLine($fp, $size) {
   $line = '';
   if ($fp) {
      do {
          // FIXME: hardcode size?
         $buffer = fgets($fp, 2048);
         if ($buffer === false) {
            break;
            }
         $line .= $buffer;
      } while ($buffer[strlen($buffer)-1]!="\n");
   }
   return $line;
    $line = '';
    if (!$fp) {
        return $line;
    }
    do {
   // FIXME: hardcode size?
        $buffer = fgets($fp, 2048);
        if ($buffer === false) {
            break;
        }
        $line .= $buffer;
    } while ($buffer[strlen($buffer)-1] != "\n");
    return $line;
}
function iil_MultLine($fp, $line) {
@@ -192,13 +197,16 @@
}
function iil_ReadBytes($fp, $bytes) {
   $data = '';
   $len  = 0;
   do {
      $data.=fread($fp, $bytes-$len);
      $len = strlen($data);
   } while ($len<$bytes);
   return $data;
    $data = '';
    $len  = 0;
    do {
        $data .= fread($fp, $bytes-$len);
        if ($len == strlen($data)) {
            break; //nothing was read -> exit to avoid apache lockups
        }
        $len = strlen($data);
    } while ($len < $bytes);
    return $data;
}
function iil_ReadReply($fp) {
@@ -469,7 +477,27 @@
   }
   $iil_error .= "Socket connection established\r\n";
   $line       = iil_ReadLine($conn->fp, 300);
   $line       = iil_ReadLine($conn->fp, 1024);
   // RFC3501 [7.1] optional CAPABILITY response
   if (preg_match('/\[CAPABILITY ([^]]+)\]/i', $line, $matches)) {
      $conn->capability = explode(' ', $matches[1]);
   } else {
      fputs($conn->fp, "cp01 CAPABILITY\r\n");
      do {
         $line = trim(chop(iil_ReadLine($conn->fp, 100)));
         $conn->message .= "$line\n";
         $a = explode(' ', $line);
         if ($line[0] == '*') {
            while (list($k, $w) = each($a)) {
               if ($w != '*' && $w != 'CAPABILITY')
                   $conn->capability[] = $w;
            }
         }
      } while ($a[0] != 'cp01');
   }
   if (strcasecmp($auth_method, "check") == 0) {
      //check for supported auth methods
@@ -478,25 +506,12 @@
      $auth_method = 'plain';
         
      //check for CRAM-MD5
      fputs($conn->fp, "cp01 CAPABILITY\r\n");
      do {
          $line = trim(chop(iil_ReadLine($conn->fp, 100)));
          $conn->message .= "$line\n";
         $a = explode(' ', $line);
         if ($line[0] == '*') {
            while (list($k, $w) = each($a)) {
                if ($w != '*' && $w != 'CAPABILITY') {
                   $conn->capability[] = $w;
                    }
               if ((strcasecmp($w, "AUTH=CRAM_MD5") == 0)||
                  (strcasecmp($w, "AUTH=CRAM-MD5") == 0)) {
                   $auth_method = "auth";
               }
            }
      foreach ($conn->capability as $c)
         if (strcasecmp($c, 'AUTH=CRAM_MD5') == 0 ||
            strcasecmp($c, 'AUTH=CRAM-MD5') == 0) {
            $auth_method = 'auth';
            break;
         }
      } while ($a[0] != 'cp01');
   }
   if (strcasecmp($auth_method, 'auth') == 0) {
@@ -1596,7 +1611,8 @@
            while ( list($lines_key, $str) = each($lines) ) {
               list($field, $string) = iil_SplitHeaderLine($str);
               
               $field = strtolower($field);
               $field  = strtolower($field);
                                        $string = ereg_replace("\n[[:space:]]*"," ",$string);
               
               switch ($field) {
               case 'date';
@@ -1607,22 +1623,22 @@
                  $result[$id]->from = $string;
                  break;
               case 'to':
                  $result[$id]->to = str_replace("\n", " ", $string);
                  $result[$id]->to = $string;
                  break;
               case 'subject':
                  $result[$id]->subject = str_replace("\n", '', $string);
                  $result[$id]->subject = $string;
                  break;
               case 'reply-to':
                  $result[$id]->replyto = str_replace("\n", " ", $string);
                  $result[$id]->replyto = $string;
                  break;
               case 'cc':
                  $result[$id]->cc = str_replace("\n", " ", $string);
                  $result[$id]->cc = $string;
                  break;
               case 'bcc':
                  $result[$id]->bcc = str_replace("\n", " ", $string);
                  $result[$id]->bcc = $string;
                  break;
               case 'content-transfer-encoding':
                  $result[$id]->encoding = str_replace("\n", " ", $string);
                  $result[$id]->encoding = $string;
                  break;
               case 'content-type':
                  $ctype_parts = explode(";", $string);
@@ -1643,7 +1659,7 @@
               case 'return-receipt-to':
               case 'disposition-notification-to':
               case 'x-confirm-reading-to':
                  $result[$id]->mdn_to = str_replace("\n", " ", $string);
                  $result[$id]->mdn_to = $string;
                  break;
               case 'message-id':
                  $result[$id]->messageID = $string;
@@ -2327,17 +2343,22 @@
        $len = strlen($line);
        if ($line[$len-1] == ')') {
            //one line response, get everything between first and last quotes
            $from = strpos($line, '"') + 1;
            $to   = strrpos($line, '"');
            $len  = $to - $from;
            if ($mode == 1) {
                $result = substr($line, $from, $len);
            } else if ($mode == 2) {
                echo substr($line, $from, $len);
       if (substr($line, -4, 3) == 'NIL') {
      // NIL response
      $result = '';
       } else {
           $from = strpos($line, '"') + 1;
           $to   = strrpos($line, '"');
           $len  = $to - $from;
      $result = substr($line, $from, $len);
       }
            if ($mode == 2) {
                echo $result;
            } else if ($mode == 3) {
                echo base64_decode(substr($line, $from, $len));
                echo base64_decode($result);
            }
        }else if ($line[$len-1] == '}') {
        } else if ($line[$len-1] == '}') {
            //multi-line request, find sizes of content and receive that many bytes
            $from     = strpos($line, '{') + 1;
            $to       = strrpos($line, '}');
@@ -2355,9 +2376,9 @@
                }
                $received += strlen($line);
                if ($mode == 1) {
                    $result .= chop($line) . "\n";
                    $result .= rtrim($line, "\t\r\n\0\x0B") . "\n";
                } else if ($mode == 2) {
                    echo chop($line) . "\n"; flush();
                    echo rtrim($line, "\t\r\n\0\x0B") . "\n"; flush();
                } else if ($mode == 3) {
                    echo base64_decode($line); flush();
                }
@@ -2369,7 +2390,7 @@
      } while (!iil_StartsWith($line, $key));
        
        if ($result) {
         $result = chop($result);
       $result = rtrim($result, "\t\r\n\0\x0B");
            return $result; // substr($result, 0, strlen($result)-1);
        }
        return false;
@@ -2448,7 +2469,6 @@
   if (fputs($fp, $request)) {
      $line=iil_ReadLine($fp, 100);      
      $sent = fwrite($fp, $message."\r\n");
      flush();
      do {
         $line=iil_ReadLine($fp, 1000);
      } while ($line[0] != 'A');
@@ -2609,4 +2629,4 @@
    }
   return (iil_C_Expunge($conn, $folder) >= 0);
}
?>
?>