diff --git a/bootstrap.php b/bootstrap.php index 565b797..ad2684c 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -264,7 +264,7 @@ function imap_reopen($imap, $mailbox, $flags = 0, $retries = 0) if (!function_exists('imap2_reopen')) { function imap2_reopen($imap, $mailbox, $flags = 0, $retries = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_reopen($imap, $mailbox, $flags, $retries); } @@ -285,7 +285,7 @@ function imap_ping($imap) if (!function_exists('imap2_ping')) { function imap2_ping($imap) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_ping($imap); } @@ -306,7 +306,7 @@ function imap_close($imap, $flags = 0) if (!function_exists('imap2_close')) { function imap2_close($imap, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_close($imap, $flags); } @@ -363,7 +363,7 @@ function imap_status($imap, $mailbox, $flags) if (!function_exists('imap2_status')) { function imap2_status($imap, $mailbox, $flags) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_status($imap, $mailbox, $flags); } @@ -384,7 +384,7 @@ function imap_num_msg($imap) if (!function_exists('imap2_num_msg')) { function imap2_num_msg($imap) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_num_msg($imap); } @@ -404,7 +404,7 @@ function imap_num_recent($imap) if (!function_exists('imap2_num_recent')) { function imap2_num_recent($imap) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_num_recent($imap); } @@ -510,7 +510,7 @@ function imap_getmailboxes($imap, $reference, $pattern) if (!function_exists('imap2_getmailboxes')) { function imap2_getmailboxes($imap, $reference, $pattern) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_getmailboxes($imap, $reference, $pattern); } @@ -614,7 +614,7 @@ function imap_createmailbox($imap, $mailbox) if (!function_exists('imap2_createmailbox')) { function imap2_createmailbox($imap, $mailbox) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_createmailbox($imap, $mailbox); } @@ -634,7 +634,7 @@ function imap_create($imap, $mailbox) if (!function_exists('imap2_create')) { function imap2_create($imap, $mailbox) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_create($imap, $mailbox); } @@ -654,7 +654,7 @@ function imap_deletemailbox($imap, $mailbox) if (!function_exists('imap2_deletemailbox')) { function imap2_deletemailbox($imap, $mailbox) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_deletemailbox($imap, $mailbox); } @@ -706,7 +706,7 @@ function imap_mailboxmsginfo($imap) if (!function_exists('imap2_mailboxmsginfo')) { function imap2_mailboxmsginfo($imap) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_mailboxmsginfo($imap); } @@ -726,14 +726,14 @@ function imap_search($imap, $criteria, $flags = SE_FREE, $charset = "") if (!function_exists('imap2_search')) { function imap2_search($imap, $criteria, $flags = SE_FREE, $charset = "") { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { if (empty($charset)) { return imap_search($imap, $criteria, $flags); } else { return imap_search($imap, $criteria, $flags, $charset); } } - + return Message::search($imap, $criteria, $flags, $charset); } } @@ -750,7 +750,7 @@ function imap_headers($imap) if (!function_exists('imap2_headers')) { function imap2_headers($imap) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_headers($imap); } @@ -770,7 +770,7 @@ function imap_msgno($imap, $messageUid) if (!function_exists('imap2_msgno')) { function imap2_msgno($imap, $messageUid) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_msgno($imap, $messageUid); } @@ -790,7 +790,7 @@ function imap_uid($imap, $messageNum) if (!function_exists('imap2_uid')) { function imap2_uid($imap, $messageNum) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_uid($imap, $messageNum); } @@ -810,14 +810,14 @@ function imap_sort($imap, $criteria, $reverse, $flags = 0, $searchCriteria = nul if (!function_exists('imap2_sort')) { function imap2_sort($imap, $criteria, $reverse, $flags = 0, $searchCriteria = null, $charset = null) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { if (empty($charset)) { return imap_sort($imap, $criteria, $reverse, $flags, $searchCriteria); } else { return imap_sort($imap, $criteria, $reverse, $flags, $searchCriteria, $charset); } } - + return Message::sort($imap, $criteria, $reverse, $flags, $searchCriteria, $charset); } } @@ -834,7 +834,7 @@ function imap_append($imap, $folder, $message, $options = null, $internalDate = if (!function_exists('imap2_append')) { function imap2_append($imap, $folder, $message, $options = null, $internalDate = null) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_append($imap, $folder, $message, $options, $internalDate); } @@ -854,8 +854,8 @@ function imap_headerinfo($imap, $messageNum, $fromLength = 0, $subjectLength = 0 if (!function_exists('imap2_headerinfo')) { function imap2_headerinfo($imap, $messageNum, $fromLength = 0, $subjectLength = 0, $defaultHost = null) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { - return imap_headerinfo($imap, $messageNum, $fromLength, $subjectLength, $defaultHost); + if (Functions::isRetrofitConnection($imap)) { + return imap_headerinfo($imap, $messageNum, $fromLength, $subjectLength); } return Message::headerInfo($imap, $messageNum, $fromLength, $subjectLength, $defaultHost); @@ -890,7 +890,7 @@ function imap_body($imap, $messageNum, $flags = 0) if (!function_exists('imap2_body')) { function imap2_body($imap, $messageNum, $flags = 0) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_body($imap, $messageNum, $flags); } @@ -910,7 +910,7 @@ function imap_fetchtext($imap, $messageNum, $flags = 0) if (!function_exists('imap2_fetchtext')) { function imap2_fetchtext($imap, $messageNum, $flags = 0) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_fetchtext($imap, $messageNum, $flags); } @@ -930,7 +930,7 @@ function imap_fetchbody($imap, $messageNum, $section, $flags = 0) if (!function_exists('imap2_fetchbody')) { function imap2_fetchbody($imap, $messageNum, $section, $flags = 0) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_fetchbody($imap, $messageNum, $section, $flags); } @@ -950,7 +950,7 @@ function imap_bodystruct($imap, $messageNum, $section) if (!function_exists('imap2_bodystruct')) { function imap2_bodystruct($imap, $messageNum, $section) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_bodystruct($imap, $messageNum, $section); } @@ -970,7 +970,7 @@ function imap_savebody($imap, $file, $messageNum, $section = "", $flags = 0) if (!function_exists('imap2_savebody')) { function imap2_savebody($imap, $file, $messageNum, $section = "", $flags = 0) { - if (IMAP2_RETROFIT_MODE && Functions::isRetrofitResource($imap)) { + if (Functions::isRetrofitConnection($imap)) { return imap_savebody($imap, $file, $messageNum, $section, $flags); } @@ -990,7 +990,7 @@ function imap_fetchstructure($imap, $messageNum, $flags = 0) if (!function_exists('imap2_fetchstructure')) { function imap2_fetchstructure($imap, $messageNum, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_fetchstructure($imap, $messageNum, $flags); } @@ -1010,7 +1010,7 @@ function imap_fetchheader($imap, $messageNum, $flags = 0) if (!function_exists('imap2_fetchheader')) { function imap2_fetchheader($imap, $messageNum, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_fetchheader($imap, $messageNum, $flags); } @@ -1030,7 +1030,7 @@ function imap_fetch_overview($imap, $sequence, $flags = 0) if (!function_exists('imap2_fetch_overview')) { function imap2_fetch_overview($imap, $sequence, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_fetch_overview($imap, $sequence, $flags); } @@ -1050,7 +1050,7 @@ function imap_fetchmime($imap, $messageNum, $section, $flags = 0) if (!function_exists('imap2_fetchmime')) { function imap2_fetchmime($imap, $messageNum, $section, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_fetchmime($imap, $messageNum, $section, $flags); } @@ -1070,7 +1070,7 @@ function imap_delete($imap, $messageNums, $flags = 0) if (!function_exists('imap2_delete')) { function imap2_delete($imap, $messageNums, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_delete($imap, $messageNums, $flags); } @@ -1090,7 +1090,7 @@ function imap_undelete($imap, $messageNums, $flags = 0) if (!function_exists('imap2_undelete')) { function imap2_undelete($imap, $messageNums, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_undelete($imap, $messageNums, $flags); } @@ -1110,7 +1110,7 @@ function imap_clearflag_full($imap, $sequence, $flag, $options = 0) if (!function_exists('imap2_clearflag_full')) { function imap2_clearflag_full($imap, $sequence, $flag, $options = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_clearflag_full($imap, $sequence, $flag, $options); } @@ -1130,7 +1130,7 @@ function imap_setflag_full($imap, $sequence, $flag, $options = 0) if (!function_exists('imap2_setflag_full')) { function imap2_setflag_full($imap, $sequence, $flag, $options = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_setflag_full($imap, $sequence, $flag, $options); } @@ -1166,7 +1166,7 @@ function imap_mail_copy($imap, $messageNums, $mailbox, $flags = 0) if (!function_exists('imap2_mail_copy')) { function imap2_mail_copy($imap, $messageNums, $mailbox, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_mail_copy($imap, $messageNums, $mailbox, $flags); } @@ -1186,7 +1186,7 @@ function imap_mail_move($imap, $messageNums, $mailbox, $flags = 0) if (!function_exists('imap2_mail_move')) { function imap2_mail_move($imap, $messageNums, $mailbox, $flags = 0) { - if (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + if (Functions::isRetrofitConnection($imap)) { return imap_mail_move($imap, $messageNums, $mailbox, $flags); } diff --git a/src/Connection.php b/src/Connection.php index 1a5f874..6b05a5b 100644 --- a/src/Connection.php +++ b/src/Connection.php @@ -143,6 +143,11 @@ protected function connect() if (empty($this->currentMailbox)) { $mailboxes = $this->client->listMailboxes('', '*'); + + if ($mailboxes === false) { + return false; + } + if (in_array('INBOX', $mailboxes)) { $this->currentMailbox = 'INBOX'; $this->mailbox .= 'INBOX'; diff --git a/src/Functions.php b/src/Functions.php index 458dd73..0069536 100644 --- a/src/Functions.php +++ b/src/Functions.php @@ -105,7 +105,7 @@ public static function writeAddressFromEnvelope($addressList) $sanitizedAddress = []; foreach ($addressList as $addressEntry) { - $parsedAddressEntry = imap_rfc822_write_address($addressEntry[2], $addressEntry[3], $addressEntry[0]); + $parsedAddressEntry = imap_rfc822_write_address($addressEntry[2], $addressEntry[3], $addressEntry[0] ?? ''); if (substr($parsedAddressEntry, -3) == '@""') { $parsedAddressEntry = substr($parsedAddressEntry, 0, strlen($parsedAddressEntry) - 3).': '; } @@ -151,9 +151,8 @@ public static function getListAttributesValue($attributes) return $attributesValue; } - public static function isValidImap1Connection($imap) - { - return is_resource($imap) && get_resource_type($imap) == 'imap'; + public static function isValidImap1Connection($imap) { + return (is_resource($imap) && get_resource_type($imap) == 'imap') || is_a($imap, 'IMAP\Connection'); } public static function isValidImap2Connection($imap) @@ -191,8 +190,7 @@ public static function isBackportCall($backtrace, $depth) && substr($backtrace[$depth + 1]['function'], 4) == substr($backtrace[$depth]['function'], 5); } - public static function isRetrofitResource($imap) - { - return is_resource($imap) && get_resource_type($imap) == 'imap'; + public static function isRetrofitConnection($imap) { + return IMAP2_RETROFIT_MODE && self::isValidImap1Connection($imap); } } diff --git a/src/HeaderInfo.php b/src/HeaderInfo.php index 7784cf4..29b69d9 100644 --- a/src/HeaderInfo.php +++ b/src/HeaderInfo.php @@ -87,7 +87,7 @@ public static function fromMessage($message, $defaultHost) protected static function parseAddressList($address, $defaultHost) { - $addressList = imap_rfc822_parse_adrlist($address, $defaultHost); + $addressList = imap_rfc822_parse_adrlist($address ?? '', $defaultHost ?? ''); $customAddressList = []; foreach ($addressList as $objectEntry) { diff --git a/src/Mailbox.php b/src/Mailbox.php index c72f110..7ee072f 100644 --- a/src/Mailbox.php +++ b/src/Mailbox.php @@ -31,7 +31,7 @@ public static function check($imap) 'Recent' => intval($status['RECENT']), ]; - } elseif (IMAP2_RETROFIT_MODE && is_resource($imap) && get_resource_type($imap) == 'imap') { + } elseif (Functions::isRetrofitConnection($imap)) { return imap_check($imap); } diff --git a/src/Polyfill.php b/src/Polyfill.php index 949e279..932918a 100644 --- a/src/Polyfill.php +++ b/src/Polyfill.php @@ -23,7 +23,7 @@ public static function convert8bit($string) public static function mimeHeaderDecode($string) { - return $string; + return mb_decode_mimeheader($string); } public static function mutf7ToUtf8($string) @@ -80,8 +80,13 @@ public static function rfc822ParseHeaders($headers, $defaultHost = 'UNKNOWN') ]; } - public static function rfc822WriteHeaders($string) - { + public static function rfc822WriteHeaders($mailbox, $hostname, $personal) { + $string = $mailbox . '@' . $hostname; + + if ($personal) { + $string = $personal . ' <' . $string . '>'; + } + return $string; } diff --git a/src/Roundcube/ImapClient.php b/src/Roundcube/ImapClient.php index 6d61885..e29e413 100644 --- a/src/Roundcube/ImapClient.php +++ b/src/Roundcube/ImapClient.php @@ -61,6 +61,7 @@ class ImapClient protected $fp; protected $host; + protected $user; protected $cmd_tag; protected $cmd_num = 0; protected $resourceid; @@ -439,8 +440,10 @@ protected function eof() */ protected function closeSocket() { - @fclose($this->fp); - $this->fp = null; + if ($this->fp !== null) { + @fclose($this->fp); + $this->fp = null; + } } /** diff --git a/src/Roundcube/MessageHeader.php b/src/Roundcube/MessageHeader.php index 0c1201d..4276bf7 100644 --- a/src/Roundcube/MessageHeader.php +++ b/src/Roundcube/MessageHeader.php @@ -189,6 +189,11 @@ class MessageHeader */ public $flags = array(); + public $body; + public $modseq; + public $envelope; + public $bodypart; + // map header to rcube_message_header object property private $obj_headers = array( 'date' => 'date',