|
|
|
@ -20,11 +20,11 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
const PGP_SIGNED = 1;
|
|
|
|
|
const PGP_ENCRYPTED = 2;
|
|
|
|
|
|
|
|
|
|
protected $_type;
|
|
|
|
|
protected $_message;
|
|
|
|
|
protected $_body;
|
|
|
|
|
protected $_signature;
|
|
|
|
|
protected $_encrypted;
|
|
|
|
|
protected $type;
|
|
|
|
|
protected $message;
|
|
|
|
|
protected $body;
|
|
|
|
|
protected $signature;
|
|
|
|
|
protected $encrypted;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -35,17 +35,16 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*/
|
|
|
|
|
function __construct($message, $type)
|
|
|
|
|
{
|
|
|
|
|
$this->_message = $message;
|
|
|
|
|
$this->_type = $type;
|
|
|
|
|
$this->message = $message;
|
|
|
|
|
$this->type = $type;
|
|
|
|
|
|
|
|
|
|
// clone parameters
|
|
|
|
|
foreach (array_keys($this->_build_params) as $param) {
|
|
|
|
|
$this->_build_params[$param] = $message->getParam($param);
|
|
|
|
|
foreach (array_keys($this->build_params) as $param) {
|
|
|
|
|
$this->build_params[$param] = $message->getParam($param);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// clone headers
|
|
|
|
|
$this->_headers = $message->_headers;
|
|
|
|
|
|
|
|
|
|
$this->headers = $message->headers();
|
|
|
|
|
/*
|
|
|
|
|
if ($message->getParam('delay_file_io')) {
|
|
|
|
|
// use common temp dir
|
|
|
|
@ -66,7 +65,7 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
else {
|
|
|
|
|
*/
|
|
|
|
|
// \r\n is must-have here
|
|
|
|
|
$this->_body = $message->get() . "\r\n";
|
|
|
|
|
$this->body = $message->get() . "\r\n";
|
|
|
|
|
/*
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
@ -77,10 +76,10 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*
|
|
|
|
|
* @return bool True if it is multipart, otherwise False
|
|
|
|
|
*/
|
|
|
|
|
function isMultipart()
|
|
|
|
|
public function isMultipart()
|
|
|
|
|
{
|
|
|
|
|
return $this->_message instanceof enigma_mime_message
|
|
|
|
|
|| !empty($this->_message->_parts) || $this->_message->getHTMLBody();
|
|
|
|
|
return $this->message instanceof enigma_mime_message
|
|
|
|
|
|| $this->message->isMultipart() || $this->message->getHTMLBody();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -88,10 +87,10 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*
|
|
|
|
|
* @return string Sender address
|
|
|
|
|
*/
|
|
|
|
|
function getFromAddress()
|
|
|
|
|
public function getFromAddress()
|
|
|
|
|
{
|
|
|
|
|
// get sender address
|
|
|
|
|
$headers = $this->_message->headers();
|
|
|
|
|
$headers = $this->message->headers();
|
|
|
|
|
$from = rcube_mime::decode_address_list($headers['From'], 1, false, null, true);
|
|
|
|
|
$from = $from[1];
|
|
|
|
|
|
|
|
|
@ -103,10 +102,10 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*
|
|
|
|
|
* @return array Recipients' addresses
|
|
|
|
|
*/
|
|
|
|
|
function getRecipients()
|
|
|
|
|
public function getRecipients()
|
|
|
|
|
{
|
|
|
|
|
// get sender address
|
|
|
|
|
$headers = $this->_message->headers();
|
|
|
|
|
$headers = $this->message->headers();
|
|
|
|
|
$to = rcube_mime::decode_address_list($headers['To'], null, false, null, true);
|
|
|
|
|
$cc = rcube_mime::decode_address_list($headers['Cc'], null, false, null, true);
|
|
|
|
|
$bcc = rcube_mime::decode_address_list($headers['Bcc'], null, false, null, true);
|
|
|
|
@ -122,9 +121,9 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*
|
|
|
|
|
* @return string Message body
|
|
|
|
|
*/
|
|
|
|
|
function getOrigBody()
|
|
|
|
|
public function getOrigBody()
|
|
|
|
|
{
|
|
|
|
|
$_headers = $this->_message->headers();
|
|
|
|
|
$_headers = $this->message->headers();
|
|
|
|
|
$headers = array();
|
|
|
|
|
|
|
|
|
|
if ($_headers['Content-Transfer-Encoding']) {
|
|
|
|
@ -132,7 +131,7 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
}
|
|
|
|
|
$headers[] = 'Content-Type: ' . $_headers['Content-Type'];
|
|
|
|
|
|
|
|
|
|
return implode("\r\n", $headers) . "\r\n\r\n" . $this->_body;
|
|
|
|
|
return implode("\r\n", $headers) . "\r\n\r\n" . $this->body;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -140,9 +139,9 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*
|
|
|
|
|
* @param string Signature body
|
|
|
|
|
*/
|
|
|
|
|
function addPGPSignature($body)
|
|
|
|
|
public function addPGPSignature($body)
|
|
|
|
|
{
|
|
|
|
|
$this->_signature = $body;
|
|
|
|
|
$this->signature = $body;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -150,9 +149,9 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
*
|
|
|
|
|
* @param string Encrypted body
|
|
|
|
|
*/
|
|
|
|
|
function setPGPEncryptedBody($body)
|
|
|
|
|
public function setPGPEncryptedBody($body)
|
|
|
|
|
{
|
|
|
|
|
$this->_encrypted = $body;
|
|
|
|
|
$this->encrypted = $body;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -166,40 +165,39 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
* without headers
|
|
|
|
|
*
|
|
|
|
|
* @return mixed The MIME message content string, null or PEAR error object
|
|
|
|
|
* @access public
|
|
|
|
|
*/
|
|
|
|
|
function get($params = null, $filename = null, $skip_head = false)
|
|
|
|
|
public function get($params = null, $filename = null, $skip_head = false)
|
|
|
|
|
{
|
|
|
|
|
if (isset($params)) {
|
|
|
|
|
while (list($key, $value) = each($params)) {
|
|
|
|
|
$this->_build_params[$key] = $value;
|
|
|
|
|
$this->build_params[$key] = $value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->_checkParams();
|
|
|
|
|
$this->checkParams();
|
|
|
|
|
|
|
|
|
|
if ($this->_type == self::PGP_SIGNED) {
|
|
|
|
|
if ($this->type == self::PGP_SIGNED) {
|
|
|
|
|
$body = "This is an OpenPGP/MIME signed message (RFC 4880 and 3156)";
|
|
|
|
|
$params = array(
|
|
|
|
|
'content_type' => "multipart/signed; micalg=pgp-sha1; protocol=\"application/pgp-signature\"",
|
|
|
|
|
'eol' => $this->_build_params['eol'],
|
|
|
|
|
'eol' => $this->build_params['eol'],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$message = new Mail_mimePart($body, $params);
|
|
|
|
|
|
|
|
|
|
if (!empty($this->_body)) {
|
|
|
|
|
$headers = $this->_message->headers();
|
|
|
|
|
if (!empty($this->body)) {
|
|
|
|
|
$headers = $this->message->headers();
|
|
|
|
|
$params = array('content_type' => $headers['Content-Type']);
|
|
|
|
|
|
|
|
|
|
if ($headers['Content-Transfer-Encoding']) {
|
|
|
|
|
$params['encoding'] = $headers['Content-Transfer-Encoding'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$message->addSubpart($this->_body, $params);
|
|
|
|
|
$message->addSubpart($this->body, $params);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!empty($this->_signature)) {
|
|
|
|
|
$message->addSubpart($this->_signature, array(
|
|
|
|
|
if (!empty($this->signature)) {
|
|
|
|
|
$message->addSubpart($this->signature, array(
|
|
|
|
|
'filename' => 'signature.asc',
|
|
|
|
|
'content_type' => 'application/pgp-signature',
|
|
|
|
|
'disposition' => 'attachment',
|
|
|
|
@ -207,11 +205,11 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ($this->_type == self::PGP_ENCRYPTED) {
|
|
|
|
|
else if ($this->type == self::PGP_ENCRYPTED) {
|
|
|
|
|
$body = "This is an OpenPGP/MIME encrypted message (RFC 4880 and 3156)";
|
|
|
|
|
$params = array(
|
|
|
|
|
'content_type' => "multipart/encrypted; protocol=\"application/pgp-encrypted\"",
|
|
|
|
|
'eol' => $this->_build_params['eol'],
|
|
|
|
|
'eol' => $this->build_params['eol'],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$message = new Mail_mimePart($body, $params);
|
|
|
|
@ -221,7 +219,7 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
'description' => 'PGP/MIME version identification',
|
|
|
|
|
));
|
|
|
|
|
|
|
|
|
|
$message->addSubpart($this->_encrypted, array(
|
|
|
|
|
$message->addSubpart($this->encrypted, array(
|
|
|
|
|
'content_type' => 'application/octet-stream',
|
|
|
|
|
'description' => 'PGP/MIME encrypted message',
|
|
|
|
|
'disposition' => 'inline',
|
|
|
|
@ -230,8 +228,8 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Use saved boundary
|
|
|
|
|
if (!empty($this->_build_params['boundary'])) {
|
|
|
|
|
$boundary = $this->_build_params['boundary'];
|
|
|
|
|
if (!empty($this->build_params['boundary'])) {
|
|
|
|
|
$boundary = $this->build_params['boundary'];
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$boundary = null;
|
|
|
|
@ -241,18 +239,18 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
if ($filename) {
|
|
|
|
|
// Append mimePart message headers and body into file
|
|
|
|
|
$headers = $message->encodeToFile($filename, $boundary, $skip_head);
|
|
|
|
|
if ($this->_isError($headers)) {
|
|
|
|
|
if ($this->isError($headers)) {
|
|
|
|
|
return $headers;
|
|
|
|
|
}
|
|
|
|
|
$this->_headers = array_merge($this->_headers, $headers);
|
|
|
|
|
$this->headers = array_merge($this->headers, $headers);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
$output = $message->encode($boundary, $skip_head);
|
|
|
|
|
if ($this->_isError($output)) {
|
|
|
|
|
if ($this->isError($output)) {
|
|
|
|
|
return $output;
|
|
|
|
|
}
|
|
|
|
|
$this->_headers = array_merge($this->_headers, $output['headers']);
|
|
|
|
|
$this->headers = array_merge($this->headers, $output['headers']);
|
|
|
|
|
return $output['body'];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -261,20 +259,19 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
* Get Content-Type and Content-Transfer-Encoding headers of the message
|
|
|
|
|
*
|
|
|
|
|
* @return array Headers array
|
|
|
|
|
* @access private
|
|
|
|
|
*/
|
|
|
|
|
function _contentHeaders()
|
|
|
|
|
protected function contentHeaders()
|
|
|
|
|
{
|
|
|
|
|
$this->_checkParams();
|
|
|
|
|
$this->checkParams();
|
|
|
|
|
|
|
|
|
|
$eol = !empty($this->_build_params['eol']) ? $this->_build_params['eol'] : "\r\n";
|
|
|
|
|
$eol = !empty($this->build_params['eol']) ? $this->build_params['eol'] : "\r\n";
|
|
|
|
|
|
|
|
|
|
// multipart message: and boundary
|
|
|
|
|
if (!empty($this->_build_params['boundary'])) {
|
|
|
|
|
$boundary = $this->_build_params['boundary'];
|
|
|
|
|
if (!empty($this->build_params['boundary'])) {
|
|
|
|
|
$boundary = $this->build_params['boundary'];
|
|
|
|
|
}
|
|
|
|
|
else if (!empty($this->_headers['Content-Type'])
|
|
|
|
|
&& preg_match('/boundary="([^"]+)"/', $this->_headers['Content-Type'], $m)
|
|
|
|
|
else if (!empty($this->headers['Content-Type'])
|
|
|
|
|
&& preg_match('/boundary="([^"]+)"/', $this->headers['Content-Type'], $m)
|
|
|
|
|
) {
|
|
|
|
|
$boundary = $m[1];
|
|
|
|
|
}
|
|
|
|
@ -282,14 +279,14 @@ class enigma_mime_message extends Mail_mime
|
|
|
|
|
$boundary = '=_' . md5(rand() . microtime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->_build_params['boundary'] = $boundary;
|
|
|
|
|
$this->build_params['boundary'] = $boundary;
|
|
|
|
|
|
|
|
|
|
if ($this->_type == self::PGP_SIGNED) {
|
|
|
|
|
if ($this->type == self::PGP_SIGNED) {
|
|
|
|
|
$headers['Content-Type'] = "multipart/signed; micalg=pgp-sha1;$eol"
|
|
|
|
|
." protocol=\"application/pgp-signature\";$eol"
|
|
|
|
|
." boundary=\"$boundary\"";
|
|
|
|
|
}
|
|
|
|
|
else if ($this->_type == self::PGP_ENCRYPTED) {
|
|
|
|
|
else if ($this->type == self::PGP_ENCRYPTED) {
|
|
|
|
|
$headers['Content-Type'] = "multipart/encrypted;$eol"
|
|
|
|
|
." protocol=\"application/pgp-encrypted\";$eol"
|
|
|
|
|
." boundary=\"$boundary\"";
|
|
|
|
|