From f8911c2a7f9d41e2197d0c3e1aa49aea62e320fa Mon Sep 17 00:00:00 2001 From: Francis Russell <francis@unchartedbackwaters.co.uk> Date: Thu, 14 Jan 2016 06:47:49 -0500 Subject: [PATCH] Enable use of TLSv1.1 and TLSv1.2 for IMAP. --- program/lib/Roundcube/rcube_imap_generic.php | 95 +++++++++++++++++++++++++++++------------------ 1 files changed, 59 insertions(+), 36 deletions(-) diff --git a/program/lib/Roundcube/rcube_imap_generic.php b/program/lib/Roundcube/rcube_imap_generic.php index 1a55fad..86a1fcf 100644 --- a/program/lib/Roundcube/rcube_imap_generic.php +++ b/program/lib/Roundcube/rcube_imap_generic.php @@ -910,7 +910,13 @@ return false; } - if (!stream_socket_enable_crypto($this->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { + // There is no flag to enable all TLS methods. Net_SMTP + // handles enabling TLS similarly. + $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT + | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT + | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; + + if (!stream_socket_enable_crypto($this->fp, true, $crypto_method)) { $this->setError(self::ERROR_BAD, "Unable to negotiate TLS"); $this->closeConnection(); return false; @@ -2438,7 +2444,16 @@ return false; } - function sortHeaders($a, $field, $flag) + /** + * Sort messages by specified header field + * + * @param array $messages Array of rcube_message_header objects + * @param string $field Name of the property to sort by + * @param string $flag Sorting order (ASC|DESC) + * + * @return array Sorted input array + */ + public static function sortHeaders($messages, $field, $flag) { if (empty($field)) { $field = 'uid'; @@ -2447,57 +2462,65 @@ $field = strtolower($field); } - if ($field == 'date' || $field == 'internaldate') { - $field = 'timestamp'; - } - if (empty($flag)) { $flag = 'ASC'; - } else { + } + else { $flag = strtoupper($flag); } - $c = count($a); - if ($c > 0) { - // Strategy: - // First, we'll create an "index" array. - // Then, we'll use sort() on that array, - // and use that to sort the main array. + // Strategy: First, we'll create an "index" array. + // Then, we'll use sort() on that array, and use that to sort the main array. - // create "index" array - $index = array(); - reset($a); - while (list($key, $val) = each($a)) { - if ($field == 'timestamp') { - $data = $this->strToTime($val->date); - if (!$data) { - $data = $val->timestamp; - } - } else { - $data = $val->$field; - if (is_string($data)) { - $data = str_replace('"', '', $data); - if ($field == 'subject') { - $data = preg_replace('/^(Re: \s*|Fwd:\s*|Fw:\s*)+/i', '', $data); - } - $data = strtoupper($data); - } + $index = array(); + $result = array(); + + reset($messages); + + while (list($key, $headers) = each($messages)) { + $value = null; + + switch ($field) { + case 'arrival': + $field = 'internaldate'; + case 'date': + case 'internaldate': + case 'timestamp': + $value = self::strToTime($headers->$field); + if (!$value && $field != 'timestamp') { + $value = $headers->timestamp; } - $index[$key] = $data; + + break; + + default: + // @TODO: decode header value, convert to UTF-8 + $value = $headers->$field; + if (is_string($value)) { + $value = str_replace('"', '', $value); + if ($field == 'subject') { + $value = preg_replace('/^(Re:\s*|Fwd:\s*|Fw:\s*)+/i', '', $value); + } + + $data = strtoupper($value); + } } + $index[$key] = $value; + } + + if (!empty($index)) { // sort index if ($flag == 'ASC') { asort($index); - } else { + } + else { arsort($index); } // form new array based on index - $result = array(); - reset($index); while (list($key, $val) = each($index)) { - $result[$key] = $a[$key]; + $result[$key] = $messages[$key]; } } -- Gitblit v1.9.1