[Rt-commit] rt branch, 4.4/gpg-exchange-mangled-mime, created. rt-4.4.3-53-g3e08d5839

? sunnavy sunnavy at bestpractical.com
Thu Oct 4 13:15:16 EDT 2018


The branch, 4.4/gpg-exchange-mangled-mime has been created
        at  3e08d58391bbbe30951b5700dec19640b103ecc4 (commit)

- Log -----------------------------------------------------------------
commit 38b36198fc2385eb8afe87d07928968fde5c7030
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Oct 5 00:48:56 2018 +0800

    Revert exchange mangled gpg encrypted MIME structure back
    
    Exchange mangles MIME structure from
    
       multipart/encrypted; protocol="application/pgp-encrypted"
           application/pgp-encrypted
           application/octet-stream; name="encrypted.acs"
    
    to
    
       multipart/mixed
            text/plain
            application/pgp-encrypted; name="ATT00001"
            application/octet-stream; name="encrypted.acs"
    
    This commit reverts this mangled structure back.

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index 540a2482b..40a36938d 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -698,6 +698,8 @@ sub CheckIfProtected {
     # we check inline PGP block later in another sub
     return () unless $entity->is_multipart;
 
+    $self->CanonicalizeMIMEEntity( $entity );
+
     # RFC3156, multipart/{signed,encrypted}
     my $type = $entity->effective_type;
     return () unless $type =~ /^multipart\/(?:encrypted|signed)$/;
@@ -1914,6 +1916,41 @@ sub _make_gpg_handles {
     return ($handles, \%handle_map);
 }
 
+# Exchange mangles MIME structure from
+#
+#    multipart/encrypted; protocol="application/pgp-encrypted"
+#        application/pgp-encrypted
+#        application/octet-stream; name="encrypted.acs"
+#
+# to
+#
+#    multipart/mixed
+#         text/plain
+#         application/pgp-encrypted; name="ATT00001"
+#         application/octet-stream; name="encrypted.acs"
+#
+# This method reverts this mangled structure back
+
+sub CanonicalizeMIMEEntity {
+    my $self   = shift;
+    my $entity = shift;
+
+    return unless $entity->effective_type eq 'multipart/mixed';
+    my @parts = $entity->parts;
+    return unless scalar @parts == 3;
+    return unless $parts[0]->effective_type eq 'text/plain';
+    return unless $parts[0]->stringify_body eq '';
+    return unless $parts[1]->effective_type eq 'application/pgp-encrypted';
+    return unless $parts[2]->effective_type eq 'application/octet-stream';
+
+    $entity->head->replace( 'Content-type', 'multipart/encrypted; protocol="application/pgp-encrypted"' );
+    $entity->parts( 1 )->head->delete( 'Content-Disposition' );
+    $entity->parts( 2 )->head->delete( 'Content-Disposition' );
+    $entity->parts( [ $parts[1], $parts[2] ] );
+    return 1;
+}
+
+
 RT::Base->_ImportOverlays();
 
 1;

commit 3e08d58391bbbe30951b5700dec19640b103ecc4
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Oct 5 01:01:42 2018 +0800

    Test exchange mangled MIME structure

diff --git a/t/data/gnupg/emails/special/exchange-mangled.txt b/t/data/gnupg/emails/special/exchange-mangled.txt
new file mode 100644
index 000000000..5eb11567d
--- /dev/null
+++ b/t/data/gnupg/emails/special/exchange-mangled.txt
@@ -0,0 +1,41 @@
+From: rt-test at example.com
+Subject: test exchange mangled encrypted mime
+Content-Type: multipart/mixed; boundary="_003_153777490744752camelnkomno_"
+
+
+--_003_153777490744752camelnkomno_
+Content-Type: text/plain; charset="iso-8859-1"
+Content-Transfer-Encoding: quoted-printable
+
+
+--_003_153777490744752camelnkomno_
+Content-Type: application/pgp-encrypted; name="ATT00001"
+Content-Description: ATT00001
+Content-Disposition: attachment; filename="ATT00001";
+Content-Transfer-Encoding: base64
+
+VmVyc2lvbjogMQ0K
+
+--_003_153777490744752camelnkomno_
+Content-Type: application/octet-stream; name="encrypted.asc"
+Content-Description: This is a digitally encrypted message part.asc
+Content-Disposition: attachment; filename="encrypted.asc";
+Content-Transfer-Encoding: base64
+
+LS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tCgpoUUlPQTA3Nmc1T3V3ZklPRUFmOERTMWhLN2RX
+c2YvWkZGTnFkMGJqL1gyUm56ek5ydGc1ekFkKy9ycXFUMk5VCk1pcXE2dHRTaFQwa1krMCthdk5Y
+VW9MYXpJWUJOcUVyUEw2djFjOWhmMmxONnlNQ3ZlR2pmZjFEdVcwZVBkMVIKblQ3WE12YXNGc1FK
+TU1rKzdjd3Q3aS9aM1JSSzBocEJjMkNEN1hUT204bmdlUXFvYmU3WEVOS05BSGxLOXorVwpqaVoy
+S3llVEduVllYOEt5RkxzbEZ3UTU4THozMzRHajYxeHhpNVQ2SUZxNW1oUHdJYmV6aUZXME5BM3Fh
+NmduCmZIUTFHRU5zNHpURERvTW0xL1Y0K1ZXTmVMNS9CaEpGWlAzNVNlNUM1cTlWUGY1aUtBK24v
+WmE0SnNVKzlwSEcKYUJLeXh4NzUyd2RCa2tmeS9YYWVSYkxpQ3oxWFFzOFpER2lyTzltWXJnZi9j
+RnlJc1BjWDhtY2wvS2pZbDh6ZApyajkzUklrc2kybFNIM2s1dVJ2VEJBeFMzNW1ZY05YY0lCSlVZ
+MnQ1aG5rVElQajFLWG9HNXg0b01JTUVxODJzCmh2RGs0Z1g2cFNCMVhKRlRMalFmSldDcjJ2NHdK
+ZGFWeW1nSld4ZGtPQkp6MHI3SytZWFlEQ3JtTFFiUEdlTGQKS1E5dm5qNXRKYnpyKzh1VmExcXJo
+aG4vcjRTUEZvZFV4UVRJS3dVYUYrK3RsRko2dkxsaUg3dzBmN1Y5dWVuZQpRMmFIYktGdmFHVEhy
+c0tUcEY0ZUVFTW1DYkp4eGt0Qk0rMFA5eU03LzZxZ0R6cXY1MjdQcm9IQ3VBTXBLQVpaCkdtNUk5
+QTRpUFY4dFc1S1h5eE5rbktIRDFoSE0zME5vMGUvckd5UUZINjY4eUJ5dmxDaUFpczA2UHV3VlJ5
+MVQKNGRKc0FXeGhMM2ZubUU1TUVJTk5hZUhTK29MeGhCUlQzbWNscnVwV2hHZm1wdld2MTR3ZnVL
+ejZ3RCtsc3Bjego1Z28xNWUxZlpJWTk0TU1hcFNHUlN3cS91Mi9vc0gxYnRyaFJwNFBhdVMwT3lM
+ejNzdUVKbTFlRWRmb2ppSGJtClBiblFsV1VUaGlXQWhBbVJvWjBTCj1kWURKCi0tLS0tRU5EIFBH
+UCBNRVNTQUdFLS0tLS0K
diff --git a/t/mail/gnupg-special.t b/t/mail/gnupg-special.t
index 15aad3489..bc1e241df 100644
--- a/t/mail/gnupg-special.t
+++ b/t/mail/gnupg-special.t
@@ -1,12 +1,13 @@
 use strict;
 use warnings;
 
-use RT::Test::GnuPG tests => 25, gnupg_options => { passphrase => 'rt-test' };
+use RT::Test::GnuPG tests => undef, gnupg_options => { passphrase => 'rt-test' };
 
 use Digest::MD5 qw(md5_hex);
 
 RT::Test->import_gnupg_key('rt-recipient at example.com');
 RT::Test->import_gnupg_key('rt-test at example.com', 'public');
+RT::Test->trust_gnupg_key('rt-test at example.com');
 
 my ($baseurl, $m) = RT::Test->started_ok;
 
@@ -66,6 +67,20 @@ $user->SetEmailAddress('recipient at example.com');
     is(md5_hex($bin->Content), '1e35f1aa90c98ca2bab85c26ae3e1ba7', "correct png");
 }
 
+{
+    my $id = send_via_mailgate('exchange-mangled.txt');
+
+    my $tick = RT::Ticket->new( RT->SystemUser );
+    $tick->Load( $id );
+    ok ($tick->id, "loaded ticket #$id");
+
+    my $txn = $tick->Transactions->First;
+    my $parts = $txn->Attachments->ItemsArrayRef;
+
+    is (scalar @$parts, 3, 'mixed, text and original');
+    is( $parts->[1]->Content, "This is decrypted plain content\n", 'decrypted content' );
+}
+
 {
     my $id = send_via_mailgate('inline-binary-attachment-with-wrap.txt');
 
@@ -99,3 +114,4 @@ sub send_via_mailgate {
     return $id;
 }
 
+done_testing;

-----------------------------------------------------------------------


More information about the rt-commit mailing list