|
|
|
@ -3,8 +3,8 @@
|
|
|
|
|
/*
|
|
|
|
|
+-----------------------------------------------------------------------+
|
|
|
|
|
| This file is part of the Roundcube Webmail client |
|
|
|
|
|
| Copyright (C) 2005-2012, The Roundcube Dev Team |
|
|
|
|
|
| Copyright (C) 2011-2012, Kolab Systems AG |
|
|
|
|
|
| Copyright (C) 2005-2014, The Roundcube Dev Team |
|
|
|
|
|
| Copyright (C) 2011-2014, Kolab Systems AG |
|
|
|
|
|
| |
|
|
|
|
|
| Licensed under the GNU General Public License version 3 or |
|
|
|
|
|
| any later version with exceptions for skins & plugins. |
|
|
|
|
@ -39,7 +39,6 @@ class rcube_mime
|
|
|
|
|
self::$default_charset = $default_charset;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Returns message/object character set name
|
|
|
|
|
*
|
|
|
|
@ -58,7 +57,6 @@ class rcube_mime
|
|
|
|
|
return RCUBE_CHARSET;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse the given raw message source and return a structure
|
|
|
|
|
* of rcube_message_part objects.
|
|
|
|
@ -75,7 +73,6 @@ class rcube_mime
|
|
|
|
|
return self::structure_part($struct);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Recursive method to convert a Mail_mimeDecode part into a rcube_message_part object
|
|
|
|
|
*
|
|
|
|
@ -88,27 +85,29 @@ class rcube_mime
|
|
|
|
|
private static function structure_part($part, $count=0, $parent='')
|
|
|
|
|
{
|
|
|
|
|
$struct = new rcube_message_part;
|
|
|
|
|
$struct->mime_id = $part->mime_id ? $part->mime_id : (empty($parent) ? (string)$count : "$parent.$count");
|
|
|
|
|
$struct->mime_id = $part->mime_id ?: (empty($parent) ? (string)$count : "$parent.$count");
|
|
|
|
|
$struct->headers = $part->headers;
|
|
|
|
|
$struct->mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
|
|
|
|
|
$struct->ctype_primary = $part->ctype_primary;
|
|
|
|
|
$struct->ctype_secondary = $part->ctype_secondary;
|
|
|
|
|
$struct->mimetype = $part->ctype_primary . '/' . $part->ctype_secondary;
|
|
|
|
|
$struct->ctype_parameters = $part->ctype_parameters;
|
|
|
|
|
|
|
|
|
|
if ($part->headers['content-transfer-encoding'])
|
|
|
|
|
if ($part->headers['content-transfer-encoding']) {
|
|
|
|
|
$struct->encoding = $part->headers['content-transfer-encoding'];
|
|
|
|
|
if ($part->ctype_parameters['charset'])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($part->ctype_parameters['charset']) {
|
|
|
|
|
$struct->charset = $part->ctype_parameters['charset'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$part_charset = $struct->charset ? $struct->charset : self::get_charset();
|
|
|
|
|
$part_charset = $struct->charset ?: self::get_charset();
|
|
|
|
|
|
|
|
|
|
// determine filename
|
|
|
|
|
if (($filename = $part->d_parameters['filename']) || ($filename = $part->ctype_parameters['name'])) {
|
|
|
|
|
$struct->filename = rcube_mime::decode_mime_string($filename, $part_charset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// copy part body and convert it to UTF-8 if necessary
|
|
|
|
|
$struct->body = $part->ctype_primary == 'text' || !$part->ctype_parameters['charset'] ? rcube_charset::convert($part->body, $part_charset) : $part->body;
|
|
|
|
|
$struct->body = $part->body;
|
|
|
|
|
$struct->size = strlen($part->body);
|
|
|
|
|
$struct->disposition = $part->disposition;
|
|
|
|
|
|
|
|
|
@ -119,7 +118,6 @@ class rcube_mime
|
|
|
|
|
return $struct;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Split an address list into a structured array list
|
|
|
|
|
*
|
|
|
|
@ -169,7 +167,6 @@ class rcube_mime
|
|
|
|
|
return $out;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Decode a message header value
|
|
|
|
|
*
|
|
|
|
@ -185,7 +182,6 @@ class rcube_mime
|
|
|
|
|
return $str;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Decode a mime-encoded string to internal charset
|
|
|
|
|
*
|
|
|
|
@ -282,12 +278,12 @@ class rcube_mime
|
|
|
|
|
return rcube_charset::convert($input, $default_charset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Decode a mime part
|
|
|
|
|
*
|
|
|
|
|
* @param string $input Input string
|
|
|
|
|
* @param string $encoding Part encoding
|
|
|
|
|
*
|
|
|
|
|
* @return string Decoded string
|
|
|
|
|
*/
|
|
|
|
|
public static function decode($input, $encoding = '7bit')
|
|
|
|
@ -308,10 +304,8 @@ class rcube_mime
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Split RFC822 header string into an associative array
|
|
|
|
|
* @access private
|
|
|
|
|
*/
|
|
|
|
|
public static function parse_headers($headers)
|
|
|
|
|
{
|
|
|
|
@ -332,7 +326,6 @@ class rcube_mime
|
|
|
|
|
return $a_headers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @access private
|
|
|
|
|
*/
|
|
|
|
@ -402,7 +395,6 @@ class rcube_mime
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Explodes header (e.g. address-list) string into array of strings
|
|
|
|
|
* using specified separator characters with proper handling
|
|
|
|
@ -477,7 +469,6 @@ class rcube_mime
|
|
|
|
|
return $result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Interpret a format=flowed message body according to RFC 2646
|
|
|
|
|
*
|
|
|
|
@ -558,7 +549,6 @@ class rcube_mime
|
|
|
|
|
return implode("\r\n", $text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Wrap the given text to comply with RFC 2646
|
|
|
|
|
*
|
|
|
|
@ -596,7 +586,6 @@ class rcube_mime
|
|
|
|
|
return implode("\r\n", $text);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Improved wordwrap function with multibyte support.
|
|
|
|
|
* The code is based on Zend_Text_MultiByte::wordWrap().
|
|
|
|
@ -716,7 +705,6 @@ class rcube_mime
|
|
|
|
|
return implode($break, $result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* A method to guess the mime_type of an attachment.
|
|
|
|
|
*
|
|
|
|
@ -790,12 +778,13 @@ class rcube_mime
|
|
|
|
|
return $mime_type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get mimetype => file extension mapping
|
|
|
|
|
*
|
|
|
|
|
* @param string Mime-Type to get extensions for
|
|
|
|
|
* @return array List of extensions matching the given mimetype or a hash array with ext -> mimetype mappings if $mimetype is not given
|
|
|
|
|
*
|
|
|
|
|
* @return array List of extensions matching the given mimetype or a hash array
|
|
|
|
|
* with ext -> mimetype mappings if $mimetype is not given
|
|
|
|
|
*/
|
|
|
|
|
public static function get_mime_extensions($mimetype = null)
|
|
|
|
|
{
|
|
|
|
@ -888,7 +877,6 @@ class rcube_mime
|
|
|
|
|
return $mimetype ? $mime_types[$mimetype] : $mime_extensions;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Detect image type of the given binary data by checking magic numbers.
|
|
|
|
|
*
|
|
|
|
|