[Rt-commit] rt branch, 3.8-trunk, updated. rt-3.8.6-155-g019e19a

Ruslan Zakirov ruz at bestpractical.com
Wed Dec 9 16:15:13 EST 2009


The branch, 3.8-trunk has been updated
       via  019e19a791d0b4f8d42a262cf7cf7b27d8cfb39a (commit)
      from  8232b1d4b253f3c5f0c772cfca442f9a6dfd2071 (commit)

Summary of changes:
 lib/RT/Crypt/GnuPG.pm                |   44 +++++++++++++++++++++++----------
 lib/RT/Interface/Email/Auth/GnuPG.pm |   13 +++++++---
 2 files changed, 39 insertions(+), 18 deletions(-)

- Log -----------------------------------------------------------------
commit 019e19a791d0b4f8d42a262cf7cf7b27d8cfb39a
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Thu Dec 10 00:12:38 2009 +0300

    * don't overwrite gpg status, importat for nested inline signatures

diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index b8e2cb2..f9f6337 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -1026,46 +1026,62 @@ sub FindProtectedParts {
 =cut
 
 sub VerifyDecrypt {
-    my %args = ( Entity => undef, Detach => 1, SetStatus => 1, @_ );
+    my %args = (
+        Entity    => undef,
+        Detach    => 1,
+        SetStatus => 1,
+        AddStatus => 0,
+        @_
+    );
     my @protected = FindProtectedParts( Entity => $args{'Entity'} );
     my @res;
     # XXX: detaching may brake nested signatures
     foreach my $item( grep $_->{'Type'} eq 'signed', @protected ) {
+        my $status_on;
         if ( $item->{'Format'} eq 'RFC3156' ) {
             push @res, { VerifyRFC3156( %$item, SetStatus => $args{'SetStatus'} ) };
             if ( $args{'Detach'} ) {
                 $item->{'Top'}->parts( [ $item->{'Data'} ] );
                 $item->{'Top'}->make_singlepart;
             }
-            $item->{'Top'}->head->set( 'X-RT-GnuPG-Status' => $res[-1]->{'status'} )
-                if $args{'SetStatus'};
+            $status_on = $item->{'Top'};
         } elsif ( $item->{'Format'} eq 'Inline' ) {
             push @res, { VerifyInline( %$item ) };
-            $item->{'Data'}->head->set( 'X-RT-GnuPG-Status' => $res[-1]->{'status'} )
-                if $args{'SetStatus'};
+            $status_on = $item->{'Data'};
         } elsif ( $item->{'Format'} eq 'Attachment' ) {
             push @res, { VerifyAttachment( %$item ) };
             if ( $args{'Detach'} ) {
-                $item->{'Top'}->parts( [ grep "$_" ne $item->{'Signature'}, $item->{'Top'}->parts ] );
+                $item->{'Top'}->parts( [
+                    grep "$_" ne $item->{'Signature'}, $item->{'Top'}->parts
+                ] );
                 $item->{'Top'}->make_singlepart;
             }
-            $item->{'Data'}->head->set( 'X-RT-GnuPG-Status' => $res[-1]->{'status'} )
-                if $args{'SetStatus'};
+            $status_on = $item->{'Data'};
+        }
+        if ( $args{'SetStatus'} || $args{'AddStatus'} ) {
+            my $method = $args{'AddStatus'} ? 'add' : 'set';
+            $status_on->head->$method(
+                'X-RT-GnuPG-Status' => $res[-1]->{'status'}
+            );
         }
     }
     foreach my $item( grep $_->{'Type'} eq 'encrypted', @protected ) {
+        my $status_on;
         if ( $item->{'Format'} eq 'RFC3156' ) {
             push @res, { DecryptRFC3156( %$item ) };
-            $item->{'Top'}->head->set( 'X-RT-GnuPG-Status' => $res[-1]->{'status'} )
-                if $args{'SetStatus'};
+            $status_on = $item->{'Top'};
         } elsif ( $item->{'Format'} eq 'Inline' ) {
             push @res, { DecryptInline( %$item ) };
-            $item->{'Data'}->head->set( 'X-RT-GnuPG-Status' => $res[-1]->{'status'} )
-                if $args{'SetStatus'};
+            $status_on = $item->{'Data'};
         } elsif ( $item->{'Format'} eq 'Attachment' ) {
             push @res, { DecryptAttachment( %$item ) };
-            $item->{'Data'}->head->set( 'X-RT-GnuPG-Status' => $res[-1]->{'status'} )
-                if $args{'SetStatus'};
+            $status_on = $item->{'Data'};
+        }
+        if ( $args{'SetStatus'} || $args{'AddStatus'} ) {
+            my $method = $args{'AddStatus'} ? 'add' : 'set';
+            $status_on->head->$method(
+                'X-RT-GnuPG-Status' => $res[-1]->{'status'}
+            );
         }
     }
     return @res;
diff --git a/lib/RT/Interface/Email/Auth/GnuPG.pm b/lib/RT/Interface/Email/Auth/GnuPG.pm
index df987d8..f0fe2c9 100644
--- a/lib/RT/Interface/Email/Auth/GnuPG.pm
+++ b/lib/RT/Interface/Email/Auth/GnuPG.pm
@@ -75,13 +75,18 @@ sub GetCurrentUser {
         @_
     );
 
-    $args{'Message'}->head->delete($_)
-        for qw(X-RT-GnuPG-Status X-RT-Incoming-Encrypton
-               X-RT-Incoming-Signature X-RT-Privacy);
+    foreach my $p ( $args{'Message'}->parts_DFS ) {
+        $p->head->delete($_) for qw(
+            X-RT-GnuPG-Status X-RT-Incoming-Encrypton
+            X-RT-Incoming-Signature X-RT-Privacy
+        );
+    }
 
     my $msg = $args{'Message'}->dup;
 
-    my ($status, @res) = VerifyDecrypt( Entity => $args{'Message'} );
+    my ($status, @res) = VerifyDecrypt(
+        Entity => $args{'Message'}, AddStatus => 1,
+    );
     if ( $status && !@res ) {
         $args{'Message'}->head->add(
             'X-RT-Incoming-Encryption' => 'Not encrypted'

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


More information about the Rt-commit mailing list