| | |
| | | /** |
| | | +-----------------------------------------------------------------------+ |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2014, The Roundcube Dev Team | |
| | | | Copyright (C) 2011-2014, Kolab Systems AG | |
| | | | Copyright (C) 2005-2016, The Roundcube Dev Team | |
| | | | Copyright (C) 2011-2016, Kolab Systems AG | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | |
| | | // Special chars as defined by RFC 822 need to in quoted string (or escaped). |
| | | $special_chars = '[\(\)\<\>\\\.\[\]@,;:"]'; |
| | | |
| | | if (!is_array($a)) |
| | | if (!is_array($a)) { |
| | | return $out; |
| | | } |
| | | |
| | | foreach ($a as $val) { |
| | | $j++; |
| | |
| | | /** |
| | | * Decode a message header value |
| | | * |
| | | * @param string $input Header value |
| | | * @param string $fallback Fallback charset if none specified |
| | | * @param string $input Header value |
| | | * @param string $fallback Fallback charset if none specified |
| | | * |
| | | * @return string Decoded string |
| | | */ |
| | |
| | | */ |
| | | public static function decode_mime_string($input, $fallback = null) |
| | | { |
| | | $default_charset = !empty($fallback) ? $fallback : self::get_charset(); |
| | | $default_charset = $fallback ?: self::get_charset(); |
| | | |
| | | // rfc: all line breaks or other characters not found |
| | | // in the Base64 Alphabet must be ignored by decoding software |
| | |
| | | public static function parse_headers($headers) |
| | | { |
| | | $a_headers = array(); |
| | | $headers = preg_replace('/\r?\n(\t| )+/', ' ', $headers); |
| | | $lines = explode("\n", $headers); |
| | | $c = count($lines); |
| | | $headers = preg_replace('/\r?\n(\t| )+/', ' ', $headers); |
| | | $lines = explode("\n", $headers); |
| | | $count = count($lines); |
| | | |
| | | for ($i=0; $i<$c; $i++) { |
| | | for ($i=0; $i<$count; $i++) { |
| | | if ($p = strpos($lines[$i], ': ')) { |
| | | $field = strtolower(substr($lines[$i], 0, $p)); |
| | | $value = trim(substr($lines[$i], $p+1)); |
| | | if (!empty($value)) |
| | | if (!empty($value)) { |
| | | $a_headers[$field] = $value; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * @access private |
| | | * E-mail address list parser |
| | | */ |
| | | private static function parse_address_list($str, $decode = true, $fallback = null) |
| | | { |
| | |
| | | $marks = array(); |
| | | |
| | | foreach ($text as $idx => $line) { |
| | | if (preg_match('/^(>+)/', $line, $m)) { |
| | | if ($q = strspn($line, '>')) { |
| | | // remove quote chars |
| | | $q = strlen($m[1]); |
| | | $line = preg_replace('/^>+/', '', $line); |
| | | $line = substr($line, $q); |
| | | // remove (optional) space-staffing |
| | | $line = preg_replace('/^ /', '', $line); |
| | | if ($line[0] === ' ') $line = substr($line, 1); |
| | | |
| | | // The same paragraph (We join current line with the previous one) when: |
| | | // - the same level of quoting |
| | |
| | | } |
| | | } |
| | | else { |
| | | $q = 0; |
| | | if ($line == '-- ') { |
| | | $last = $idx; |
| | | } |
| | | else { |
| | | // remove space-stuffing |
| | | $line = preg_replace('/^ /', '', $line); |
| | | if ($line[0] === ' ') $line = substr($line, 1); |
| | | |
| | | if (isset($text[$last]) && $line && !$q_level |
| | | && $text[$last] != '-- ' |
| | |
| | | |
| | | foreach ($text as $idx => $line) { |
| | | if ($line != '-- ') { |
| | | if (preg_match('/^(>+)/', $line, $m)) { |
| | | if ($level = strspn($line, '>')) { |
| | | // remove quote chars |
| | | $level = strlen($m[1]); |
| | | $line = preg_replace('/^>+/', '', $line); |
| | | $line = substr($line, $level); |
| | | // remove (optional) space-staffing and spaces before the line end |
| | | $line = preg_replace('/(^ | +$)/', '', $line); |
| | | $line = rtrim($line, ' '); |
| | | if ($line[0] === ' ') $line = substr($line, 1); |
| | | |
| | | $prefix = str_repeat('>', $level) . ' '; |
| | | $line = $prefix . self::wordwrap($line, $length - $level - 2, " \r\n$prefix", false, $charset); |
| | | } |
| | |
| | | // Note: Never try to use iconv instead of mbstring functions here |
| | | // Iconv's substr/strlen are 100x slower (#1489113) |
| | | |
| | | if ($charset && $charset != RCUBE_CHARSET && function_exists('mb_internal_encoding')) { |
| | | if ($charset && $charset != RCUBE_CHARSET) { |
| | | mb_internal_encoding($charset); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | if ($charset && $charset != RCUBE_CHARSET && function_exists('mb_internal_encoding')) { |
| | | if ($charset && $charset != RCUBE_CHARSET) { |
| | | mb_internal_encoding(RCUBE_CHARSET); |
| | | } |
| | | |
| | |
| | | /** |
| | | * A method to guess the mime_type of an attachment. |
| | | * |
| | | * @param string $path Path to the file or file contents |
| | | * @param string $name File name (with suffix) |
| | | * @param string $failover Mime type supplied for failover |
| | | * @param string $path Path to the file or file contents |
| | | * @param string $name File name (with suffix) |
| | | * @param string $failover Mime type supplied for failover |
| | | * @param boolean $is_stream Set to True if $path contains file contents |
| | | * @param boolean $skip_suffix Set to True if the config/mimetypes.php mappig should be ignored |
| | | * |