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