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
---
plugins/enigma/lib/enigma_engine.php | 23 +++++++++++++----------
1 files changed, 13 insertions(+), 10 deletions(-)
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
--
Gitblit v1.9.1