diff options
author | Thomas Bruederli <thomas@roundcube.net> | 2012-06-11 10:20:53 +0200 |
---|---|---|
committer | Thomas Bruederli <thomas@roundcube.net> | 2012-06-11 10:20:53 +0200 |
commit | 2950ce49eff42eb08cd4363975a3292692cbccd8 (patch) | |
tree | 2ac6b3b9a4daa1a484281b8021ea5c66333b0e34 /program/lib | |
parent | d447a4f2296e5e9afc9d79cede0e49b2d6210f9f (diff) | |
parent | 7ac99af37b3b761b4daf2f0d9340c17e7855c234 (diff) |
Merge branch 'master' of github.com:roundcube/roundcubemail
Diffstat (limited to 'program/lib')
-rw-r--r-- | program/lib/Mail/mime.php | 7 | ||||
-rw-r--r-- | program/lib/Mail/mimePart.php | 49 | ||||
-rw-r--r-- | program/lib/html2text.php | 37 | ||||
-rw-r--r-- | program/lib/washtml.php | 2 |
4 files changed, 63 insertions, 32 deletions
diff --git a/program/lib/Mail/mime.php b/program/lib/Mail/mime.php index a7dfa6d0c..76c6ec2ff 100644 --- a/program/lib/Mail/mime.php +++ b/program/lib/Mail/mime.php @@ -48,7 +48,7 @@ * @author Aleksander Machniak <alec@php.net> * @copyright 2003-2006 PEAR <pear-group@php.net> * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version 1.8.4 + * @version 1.8.5 * @link http://pear.php.net/package/Mail_mime * * This class is based on HTML Mime Mail class from @@ -89,7 +89,7 @@ require_once 'Mail/mimePart.php'; * @author Sean Coates <sean@php.net> * @copyright 2003-2006 PEAR <pear-group@php.net> * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version Release: 1.8.4 + * @version Release: 1.8.5 * @link http://pear.php.net/package/Mail_mime */ class Mail_mime @@ -387,7 +387,8 @@ class Mail_mime * @param string $description Content-Description header * @param string $h_charset The character set of the headers e.g. filename * If not specified, $charset will be used - * @param array $add_headers Additional part headers + * @param array $add_headers Additional part headers. Array keys can be in form + * of <header_name>:<parameter_name> * * @return mixed True on success or PEAR_Error object * @access public diff --git a/program/lib/Mail/mimePart.php b/program/lib/Mail/mimePart.php index f3cd98e6d..4e4170d8e 100644 --- a/program/lib/Mail/mimePart.php +++ b/program/lib/Mail/mimePart.php @@ -48,7 +48,7 @@ * @author Aleksander Machniak <alec@php.net> * @copyright 2003-2006 PEAR <pear-group@php.net> * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version 1.8.4 + * @version 1.8.5 * @link http://pear.php.net/package/Mail_mime */ @@ -70,7 +70,7 @@ * @author Aleksander Machniak <alec@php.net> * @copyright 2003-2006 PEAR <pear-group@php.net> * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version Release: 1.8.4 + * @version Release: 1.8.5 * @link http://pear.php.net/package/Mail_mime */ class Mail_mimePart @@ -156,7 +156,8 @@ class Mail_mimePart * headers_charset - Charset of the headers e.g. filename, description. * If not set, 'charset' will be used * eol - End of line sequence. Default: "\r\n" - * headers - Hash array with additional part headers + * headers - Hash array with additional part headers. Array keys can be + * in form of <header_name>:<parameter_name> * body_file - Location of file with part's body (instead of $body) * * @access public @@ -222,13 +223,17 @@ class Mail_mimePart $params['headers_charset'] = $params['charset']; } } + + // header values encoding parameters + $h_charset = !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII'; + $h_language = !empty($params['language']) ? $params['language'] : null; + $h_encoding = !empty($params['name_encoding']) ? $params['name_encoding'] : null; + + if (!empty($params['filename'])) { $headers['Content-Type'] .= ';' . $this->_eol; $headers['Content-Type'] .= $this->_buildHeaderParam( - 'name', $params['filename'], - !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII', - !empty($params['language']) ? $params['language'] : null, - !empty($params['name_encoding']) ? $params['name_encoding'] : null + 'name', $params['filename'], $h_charset, $h_language, $h_encoding ); } @@ -238,23 +243,41 @@ class Mail_mimePart if (!empty($params['filename'])) { $headers['Content-Disposition'] .= ';' . $this->_eol; $headers['Content-Disposition'] .= $this->_buildHeaderParam( - 'filename', $params['filename'], - !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII', - !empty($params['language']) ? $params['language'] : null, + 'filename', $params['filename'], $h_charset, $h_language, !empty($params['filename_encoding']) ? $params['filename_encoding'] : null ); } + + // add attachment size + $size = $this->_body_file ? filesize($this->_body_file) : strlen($body); + if ($size) { + $headers['Content-Disposition'] .= ';' . $this->_eol . ' size=' . $size; + } } if (!empty($params['description'])) { $headers['Content-Description'] = $this->encodeHeader( - 'Content-Description', $params['description'], - !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII', - !empty($params['name_encoding']) ? $params['name_encoding'] : 'quoted-printable', + 'Content-Description', $params['description'], $h_charset, $h_encoding, $this->_eol ); } + // Search and add existing headers' parameters + foreach ($headers as $key => $value) { + $items = explode(':', $key); + if (count($items) == 2) { + $header = $items[0]; + $param = $items[1]; + if (isset($headers[$header])) { + $headers[$header] .= ';' . $this->_eol; + } + $headers[$header] .= $this->_buildHeaderParam( + $param, $value, $h_charset, $h_language, $h_encoding + ); + unset($headers[$key]); + } + } + // Default encoding if (!isset($this->_encoding)) { $this->_encoding = '7bit'; diff --git a/program/lib/html2text.php b/program/lib/html2text.php index 84a7374b3..9de2e961e 100644 --- a/program/lib/html2text.php +++ b/program/lib/html2text.php @@ -249,12 +249,11 @@ class html2text * @access public */ var $callback_search = array( - '/<(a) [^>]*href=("|\')([^"\']+)\2[^>]*>(.*?)<\/a>/i', - // <a href=""> - '/<(h)[123456][^>]*>(.*?)<\/h[123456]>/i', // H1 - H3 - '/<(b)[^>]*>(.*?)<\/b>/i', // <b> - '/<(strong)[^>]*>(.*?)<\/strong>/i', // <strong> - '/<(th)[^>]*>(.*?)<\/th>/i', // <th> and </th> + '/<(a) [^>]*href=("|\')([^"\']+)\2[^>]*>(.*?)<\/a>/i', // <a href=""> + '/<(h)[123456]( [^>]*)?>(.*?)<\/h[123456]>/i', // h1 - h6 + '/<(b)( [^>]*)?>(.*?)<\/b>/i', // <b> + '/<(strong)( [^>]*)?>(.*?)<\/strong>/i', // <strong> + '/<(th)( [^>]*)?>(.*?)<\/th>/i', // <th> and </th> ); /** @@ -368,7 +367,7 @@ class html2text function set_html( $source, $from_file = false ) { if ( $from_file && file_exists($source) ) { - $this->html = file_get_contents($source); + $this->html = file_get_contents($source); } else $this->html = $source; @@ -560,11 +559,11 @@ class html2text } // Ignored link types - if (preg_match('!^(javascript|mailto|#):!i', $link)) { + if (preg_match('!^(javascript:|mailto:|#)!i', $link)) { return $display; } - if (preg_match('!^(https?://)!i', $link)) { + if (preg_match('!^([a-z][a-z0-9.+-]+:)!i', $link)) { $url = $link; } else { @@ -576,8 +575,8 @@ class html2text } if (($index = array_search($url, $this->_link_list)) === false) { - $this->_link_list[] = $url; $index = count($this->_link_list); + $this->_link_list[] = $url; } return $display . ' [' . ($index+1) . ']'; @@ -593,12 +592,20 @@ class html2text { // get the content of PRE element while (preg_match('/<pre[^>]*>(.*)<\/pre>/ismU', $text, $matches)) { + $this->pre_content = $matches[1]; + + // Run our defined tags search-and-replace with callback + $this->pre_content = preg_replace_callback($this->callback_search, + array('html2text', '_preg_callback'), $this->pre_content); + // convert the content $this->pre_content = sprintf('<div><br>%s<br></div>', - preg_replace($this->pre_search, $this->pre_replace, $matches[1])); + preg_replace($this->pre_search, $this->pre_replace, $this->pre_content)); + // replace the content (use callback because content can contain $0 variable) - $text = preg_replace_callback('/<pre[^>]*>.*<\/pre>/ismU', + $text = preg_replace_callback('/<pre[^>]*>.*<\/pre>/ismU', array('html2text', '_preg_pre_callback'), $text, 1); + // free memory $this->pre_content = ''; } @@ -671,11 +678,11 @@ class html2text switch (strtolower($matches[1])) { case 'b': case 'strong': - return $this->_toupper($matches[2]); + return $this->_toupper($matches[3]); case 'th': - return $this->_toupper("\t\t". $matches[2] ."\n"); + return $this->_toupper("\t\t". $matches[3] ."\n"); case 'h': - return $this->_toupper("\n\n". $matches[2] ."\n\n"); + return $this->_toupper("\n\n". $matches[3] ."\n\n"); case 'a': // Remove spaces in URL (#1487805) $url = str_replace(' ', '', $matches[3]); diff --git a/program/lib/washtml.php b/program/lib/washtml.php index 4221abdef..6ea59f03f 100644 --- a/program/lib/washtml.php +++ b/program/lib/washtml.php @@ -202,7 +202,7 @@ class washtml $key = strtolower($key); $value = $node->getAttribute($key); if (isset($this->_html_attribs[$key]) || - ($key == 'href' && preg_match('!^(http:|https:|ftp:|mailto:|//|#).+!i', $value))) + ($key == 'href' && preg_match('!^([a-z][a-z0-9.+-]+:|//|#).+!i', $value))) $t .= ' ' . $key . '="' . htmlspecialchars($value, ENT_QUOTES) . '"'; else if ($key == 'style' && ($style = $this->wash_style($value))) { $quot = strpos($style, '"') !== false ? "'" : '"'; |