From 4e6f3019f5bf4d322c288b161a781d7d7147b4f0 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Fri, 25 Mar 2016 08:25:44 -0400 Subject: [PATCH] Enigma: Handle encrypted/signed content inside message/rfc822 attachments --- CHANGELOG | 1 + program/include/rcmail.php | 10 +++++----- plugins/enigma/lib/enigma_engine.php | 23 +++++++++++++---------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0b16657..3da1c49 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Enigma: Handle encrypted/signed content inside message/rfc822 attachments - Enigma: Fix missing html/plain switch on multipart/signed messages (#1490649) - Enigma: Disable format=flowed for signed plain text messages (#1490646) - Enigma: Fix handling of encrypted + signed messages (#1490632) diff --git a/plugins/enigma/lib/enigma_engine.php b/plugins/enigma/lib/enigma_engine.php index 584a5b2..9ce1761 100644 --- a/plugins/enigma/lib/enigma_engine.php +++ b/plugins/enigma/lib/enigma_engine.php @@ -416,8 +416,7 @@ // including a set of appropriate content headers describing the data. // The second body MUST contain the PGP digital signature. It MUST be // labeled with a content type of "application/pgp-signature". - else if ($struct->ctype_parameters['protocol'] == 'application/pgp-signature' - && count($struct->parts) == 2 + else if (count($struct->parts) == 2 && $struct->parts[1] && $struct->parts[1]->mimetype == 'application/pgp-signature' ) { $this->parse_pgp_signed($p, $body); @@ -434,7 +433,7 @@ $struct = $p['structure']; // S/MIME - if ($struct->mimetype == 'application/pkcs7-mime') { + if ($p['mimetype'] == 'application/pkcs7-mime') { $this->parse_smime_encrypted($p); } // PGP/MIME: RFC3156 @@ -443,8 +442,7 @@ // This body contains the control information. // The second MIME body part MUST contain the actual encrypted data. It // must be labeled with a content type of "application/octet-stream". - else if ($struct->ctype_parameters['protocol'] == 'application/pgp-encrypted' - && count($struct->parts) == 2 + else if (count($struct->parts) == 2 && $struct->parts[0] && $struct->parts[0]->mimetype == 'application/pgp-encrypted' && $struct->parts[1] && $struct->parts[1]->mimetype == 'application/octet-stream' ) { @@ -676,7 +674,7 @@ $struct = $this->parse_body($body); // Modify original message structure - $this->modify_structure($p, $struct); + $this->modify_structure($p, $struct, strlen($body)); // Parse the structure (there may be encrypted/signed parts inside $this->part_structure(array( @@ -1143,10 +1141,11 @@ /** * Replace message encrypted structure with decrypted message structure * - * @param array - * @param rcube_message_part + * @param array Hook arguments + * @param rcube_message_part Part structure + * @param int Part size */ - private function modify_structure(&$p, $struct) + private function modify_structure(&$p, $struct, $size = 0) { // modify mime_parts property of the message object $old_id = $p['structure']->mime_id; @@ -1156,6 +1155,11 @@ unset($p['object']->mime_parts[$idx]); } } + + // set some part params used by Roundcube core + $struct->headers = array_merge($p['structure']->headers, $struct->headers); + $struct->size = $size; + $struct->filename = $p['structure']->filename; // modify the new structure to be correctly handled by Roundcube $this->modify_structure_part($struct, $p['object'], $old_id); @@ -1184,7 +1188,6 @@ // Cache the fact it was decrypted $this->encrypted_parts[] = $part->mime_id; - $msg->mime_parts[$part->mime_id] = $part; // modify sub-parts diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 0294392..1ff42b4 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -2245,12 +2245,12 @@ $size = $this->show_bytes((int)$part->d_parameters['size']); } else { - $size = $part->size; - if ($part->encoding == 'base64') { - $size = $size / 1.33; - } + $size = $part->size; + if ($part->encoding == 'base64') { + $size = $size / 1.33; + } - $size = '~' . $this->show_bytes($size); + $size = '~' . $this->show_bytes($size); } return $size; -- Gitblit v1.9.1