| | |
| | | - 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 twice if possible in iil_Connect() |
| | | |
| | | |
| | | ********************************************************/ |
| | | |
| | |
| | | } |
| | | |
| | | $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 |
| | |
| | | $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) { |
| | |
| | | $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, '}'); |
| | |
| | | } |
| | | $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(); |
| | | } |
| | |
| | | } 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; |