X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=functions%2Fimap.php;h=7d6eb9a4e36b2c37a8814580835e28d5762acf4e;hp=4f11ed9072d7f43691a5f7232e6204fa280d4137;hb=23fc64b344f7a063ace1dbe877cae9052ede79d6;hpb=aceb0d5c925965586360e1a9560b09e6173d49d6 diff --git a/functions/imap.php b/functions/imap.php index 4f11ed90..7d6eb9a4 100644 --- a/functions/imap.php +++ b/functions/imap.php @@ -7,33 +7,99 @@ **/ /** Read from the connection until we get either an OK or BAD message. **/ - function imapReadData($connection) { + function imapReadData($connection, $pre, $handle_errors, &$response, &$message) { + require ("../config/config.php"); + $read = fgets($connection, 1024); $counter = 0; - while ((substr($read, strpos($read, " ") + 1, 2) != "OK") && (substr($read, strpos($read, " ") + 1, 3) != "BAD")) { + while ((substr($read, 0, strlen("$pre OK")) != "$pre OK") && + (substr($read, 0, strlen("$pre BAD")) != "$pre BAD") && + (substr($read, 0, strlen("$pre NO")) != "$pre NO")) { $data[$counter] = $read; $read = fgets($connection, 1024); $counter++; } + if (substr($read, 0, strlen("$pre OK")) == "$pre OK") { + $response = "OK"; + $message = trim(substr($read, strlen("$pre OK"), strlen($read))); + } else if (substr($read, 0, strlen("$pre BAD")) == "$pre BAD") { + $response = "BAD"; + $message = trim(substr($read, strlen("$pre BAD"), strlen($read))); + } else { + $response = "NO"; + $message = trim(substr($read, strlen("$pre NO"), strlen($read))); + } + + if ($handle_errors == true) { + if ($response == "NO") { + echo "
ERROR: Could not complete request.
  Reason given: $message

"; + exit; + } else if ($response == "BAD") { + echo "
ERROR: Bad or malformed request.
  Server responded: $message

"; + exit; + } + } + return $data; } /** Parse the incoming mailbox name and return a string that is the FOLDER.MAILBOX **/ function findMailboxName($mailbox) { - // start at -2 so that we skip the initial quote at the end of the mailbox name - $i = -2; - $char = substr($mailbox, $i, 1); - while ($char != "\"") { - $i--; - $temp .= $char; - $char = substr($mailbox, $i, 1); - } - echo $tmp; - return strrev($temp); + $mailbox = trim($mailbox); + if (substr($mailbox, strlen($mailbox)-1, strlen($mailbox)) == "\"") { + $mailbox = substr($mailbox, 0, strlen($mailbox) - 1); + $pos = strrpos($mailbox, "\"") + 1; + $box = substr($mailbox, $pos, strlen($mailbox)); + } else { + $box = substr($mailbox, strrpos($mailbox, " ")+1, strlen($mailbox)); + } + return $box; + } + + /** Finds the delimeter between mailboxes **/ + function findMailboxDelimeter($imapConnection) { + fputs($imapConnection, ". list \"\" \"\"\n"); + $read = fgets($imapConnection, 1024); + + if (strrpos($read, "\"") == strlen($read)) { + $pos = strrpos($read, "\""); + $read = substr($read, 0, $pos); + + $pos = strrpos($read, "\""); + $read = substr($read, 0, $pos); + } else { + $pos = strrpos($read, " "); + $read = substr($read, 0, $pos); + } + + $pos = strrpos($read, "\""); + $read = substr($read, 0, $pos); + + $pos = strrpos($read, "\""); + $read = substr($read, $pos+1, strlen($read)); + + $tmp = fgets($imapConnection, 1024); + return $read; + } + + function getMailboxFlags($imapConnection, $mailbox) { + $name = findMailboxName($mailbox); + fputs ($imapConnection, "1 LIST \"$name\" *\n"); + $data = imapReadData($imapConnection, "1", true, $response, $message); + $mailbox = $data[0]; + $mailbox = trim($mailbox); + $mailbox = substr($mailbox, strpos($mailbox, "(")+1, strlen($mailbox)); + $mailbox = substr($mailbox, 0, strpos($mailbox, ")")); + $mailbox = str_replace("\\", "", $mailbox); + $mailbox = strtolower($mailbox); + $mailbox = explode(" ", $mailbox); + return $mailbox; } // handles logging onto an imap server. - function loginToImapServer($username, $key, $imapServerAddress) { + function loginToImapServer($username, $key, $imapServerAddress, $hide) { + require("../config/config.php"); + $imapConnection = fsockopen($imapServerAddress, 143, &$errorNumber, &$errorString); if (!$imapConnection) { echo "Error connecting to IMAP Server.
"; @@ -43,56 +109,217 @@ $serverInfo = fgets($imapConnection, 256); // login - fputs($imapConnection, "1 login $username $key\n"); + fputs($imapConnection, "a001 LOGIN \"$username\" \"$key\"\n"); $read = fgets($imapConnection, 1024); - - if (strpos($read, "NO")) { - error_username_password_incorrect(); - exit; + if ($debug_login == true) { + echo "SERVER SAYS: $read
"; } - + + /** If the login attempt was UNsuccessful, lets see why **/ + if (substr($read, 0, 7) != "a001 OK") { + if (!$hide) { + if (substr($read, 0, 8) == "a001 BAD") { + echo "Bad request: $read
"; + exit; + } + else if (substr($read, 0, 7) == "a001 NO") { + echo "
"; + echo ""; + echo " "; + echo " "; + echo "
"; + echo "
ERROR
"; + echo "
"; + echo "

Unknown user or password incorrect.
Click here to try again.
"; + echo "
"; + echo ""; + exit; + } + else { + echo "Unknown error: $read
"; + exit; + } + } else { + exit; + } + } + return $imapConnection; } /** must be sent in the form: user.. **/ - function createFolder($imapConnection, $folder) { + function createFolder($imapConnection, $folder, $type) { + require ("../config/config.php"); + + if (strtolower($type) == "noselect") { + $dm = findMailboxDelimeter($imapConnection); + $folder = "$folder$dm"; + } else { + $folder = "$folder"; + } fputs($imapConnection, "1 create \"$folder\"\n"); + $data = imapReadData($imapConnection, "1", false, $response, $message); + + if ($response == "NO") { + echo "
ERROR: Could not complete request.
  Reason given: $message

"; + echo "Possible solutions:
  • You may need to specify that the folder is a subfolder of INBOX
  • "; + echo "
  • Try renaming the folder to something different.
  • "; + exit; + } else if ($response == "BAD") { + echo "ERROR: Bad or malformed request.
      Server responded: $message

    "; + exit; + } + fputs($imapConnection, "1 SUBSCRIBE \"$folder\"\n"); + $data = imapReadData($imapConnection, "1", true, $response, $message); } - /** must be sent in the form: user.. **/ function removeFolder($imapConnection, $folder) { + fputs ($imapConnection, "1 unsubscribe \"$folder\"\n"); + $data = imapReadData($imapConnection, "1", true, $response, $message); + echo $data[0] . "
    "; fputs($imapConnection, "1 delete \"$folder\"\n"); + $data = imapReadData($imapConnection, "1", false, $response, $message); + if ($response == "NO") { + echo "ERROR: Could not delete the folder $folder.
    "; + echo "Probable causes:
    "; + echo "
  • This folder may contain subfolders. Delete all subfolders first
  • "; + echo "

    The actual message returned from the server was:
    $message
    "; + echo ""; + exit; + } else if ($response == "BAD") { + echo "ERROR: Bad or malformed request.
      Server responded: $message

    "; + echo ""; + exit; + } } /** Sends back two arrays, boxesFormatted and boxesUnformatted **/ - function getFolderList($imapConnection, &$boxesFormatted, &$boxesUnformatted) { - fputs($imapConnection, "1 list \"\" *\n"); - $str = imapReadData($imapConnection); + function getFolderList($imapConnection, &$boxes) { + require ("../config/config.php"); + if (!function_exists("ary_sort")) + include("../functions/array.php"); + /** First we get the inbox **/ + fputs($imapConnection, "1 LIST \"\" INBOX\n"); + $str = imapReadData($imapConnection, "1", true, $response, $message); + $dm = findMailboxDelimeter($imapConnection); + $g = 0; for ($i = 0;$i < count($str); $i++) { $mailbox = chop($str[$i]); - $mailbox = findMailboxName($mailbox); - $periodCount = countCharInString($mailbox, "."); + if (substr(findMailboxName($mailbox), 0, 1) != ".") { + $boxes[$g]["RAW"] = $mailbox; - // indent the correct number of spaces. - for ($j = 0;$j < $periodCount;$j++) - $boxesFormatted[$i] = "$boxesFormatted[$i]  "; + $mailbox = findMailboxName($mailbox); + $periodCount = countCharInString($mailbox, $dm); + if (substr($mailbox, -1) == $dm) + $periodCount--; - $boxesFormatted[$i] = $boxesFormatted[$i] . readShortMailboxName($mailbox, "."); - $boxesUnformatted[$i] = $mailbox; + // indent the correct number of spaces. + for ($j = 0;$j < $periodCount;$j++) + $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . "  "; + + $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . readShortMailboxName($mailbox, $dm); + $boxes[$g]["UNFORMATTED"] = $mailbox; + $boxes[$g]["ID"] = $g; + $g++; + } } + + /** Next, we get all subscribed folders **/ + fputs($imapConnection, "1 LSUB \"\" *\n"); + $str = imapReadData($imapConnection, "1", true, $response, $message); + $dm = findMailboxDelimeter($imapConnection); + for ($i = 0;$i < count($str); $i++) { + $mailbox = chop($str[$i]); + if (substr(findMailboxName($mailbox), 0, 1) != ".") { + $boxes[$g]["RAW"] = $mailbox; + + // Get the mailbox name and format it. If there is a $dm at the end of it, remove it. + $mailbox = findMailboxName($mailbox); + $periodCount = countCharInString($mailbox, $dm); + if (substr($mailbox, -1) == $dm) + $periodCount = $periodCount - 1; + + // indent the correct number of spaces. + for ($j = 0;$j < $periodCount;$j++) + $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . "  "; + + $boxes[$g]["FORMATTED"] = $boxes[$g]["FORMATTED"] . readShortMailboxName($mailbox, $dm); + $boxes[$g]["UNFORMATTED"] = $mailbox; + $boxes[$g]["ID"] = $g; + $g++; + } + } + + $original = $boxes; + + for ($i = 0; $i < count($original); $i++) { + $boxes[$i]["UNFORMATTED"] = strtolower($boxes[$i]["UNFORMATTED"]); + } + + $boxes = ary_sort($boxes, "UNFORMATTED", 1); + + for ($i = 0; $i < count($original); $i++) { + for ($j = 0; $j < count($original); $j++) { + if ($boxes[$i]["ID"] == $original[$j]["ID"]) { + $boxes[$i]["UNFORMATTED"] = $original[$j]["UNFORMATTED"]; + $boxes[$i]["FORMATTED"] = $original[$j]["FORMATTED"]; + $boxes[$i]["RAW"] = $original[$j]["RAW"]; + } + } + } + + for ($i = 0; $i < count($boxes); $i++) { + if ($boxes[$i]["UNFORMATTED"] == $special_folders[0]) { + $boxesnew[0]["FORMATTED"] = $boxes[$i]["FORMATTED"]; + $boxesnew[0]["UNFORMATTED"] = trim($boxes[$i]["UNFORMATTED"]); + $boxesnew[0]["RAW"] = trim($boxes[$i]["RAW"]); + $boxes[$i]["USED"] = true; + } + } + if ($list_special_folders_first == true) { + for ($i = 0; $i < count($boxes); $i++) { + for ($j = 1; $j < count($special_folders); $j++) { + if (substr($boxes[$i]["UNFORMATTED"], 0, strlen($special_folders[$j])) == $special_folders[$j]) { + $pos = count($boxesnew); + $boxesnew[$pos]["FORMATTED"] = $boxes[$i]["FORMATTED"]; + $boxesnew[$pos]["RAW"] = trim($boxes[$i]["RAW"]); + $boxesnew[$pos]["UNFORMATTED"] = trim($boxes[$i]["UNFORMATTED"]); + $boxes[$i]["USED"] = true; + } + } + } + } + for ($i = 0; $i < count($boxes); $i++) { + if (($boxes[$i]["UNFORMATTED"] != $special_folders[0]) && + ($boxes[$i]["UNFORMATTED"] != ".mailboxlist") && + ($boxes[$i]["USED"] == false)) { + $pos = count($boxesnew); + $boxesnew[$pos]["FORMATTED"] = $boxes[$i]["FORMATTED"]; + $boxesnew[$pos]["RAW"] = trim($boxes[$i]["RAW"]); + $boxesnew[$pos]["UNFORMATTED"] = trim($boxes[$i]["UNFORMATTED"]); + $boxes[$i]["USED"] = true; + } + } + + $boxes = $boxesnew; } function deleteMessages($imapConnection, $a, $b, $numMessages, $trash_folder, $move_to_trash, $auto_expunge, $mailbox) { /** check if they would like to move it to the trash folder or not */ - if ($move_to_trash == true) { + if (($move_to_trash == true) && (folderExists($imapConnection, $trash_folder))) { $success = copyMessages($imapConnection, $a, $b, $trash_folder); if ($success == true) setMessageFlag($imapConnection, $a, $b, "Deleted"); + else + echo "There was an error moving the messages.
    Messages NOT deleted."; } else { setMessageFlag($imapConnection, $a, $b, "Deleted"); } + if ($auto_expunge == true) + expungeBox($imapConnection, $mailbox); } + function stripComments($line) { if (strpos($line, ";")) { $line = substr($line, 0, strpos($line, ";")); @@ -106,4 +333,14 @@ } return $full_line; } + + function folderExists($imapConnection, $folderName) { + getFolderList($imapConnection, $folders); + $found = false; + for ($i = 0; ($i < count($folders)) && (!$found); $i++) { + if ($folders[$i]["UNFORMATTED"] == $folderName) + $found = true; + } + return $found; + } ?>