[Rt-commit] r7654 - in rt/branches/3.7-EXPERIMENTAL-TUNIS: . etc html/Elements html/Ticket/Elements lib/RT lib/RT/Crypt lib/RT/I18N lib/t/data/crypt-gnupg sbin

ruz at bestpractical.com ruz at bestpractical.com
Tue Apr 24 00:39:19 EDT 2007


Author: ruz
Date: Tue Apr 24 00:39:18 2007
New Revision: 7654

Removed:
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/t/data/crypt-gnupg/random_seed
Modified:
   rt/branches/3.7-EXPERIMENTAL-TUNIS/   (props changed)
   rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/initialdata
   rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Elements/ShowCustomFields
   rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Ticket/Elements/EditCustomFields
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Config.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Crypt/GnuPG.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/CustomFields_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/I18N/de.po
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/GnuPGNG.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/MailFrom.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/ObjectCustomField_Overlay.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Record.pm
   rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/t/data/crypt-gnupg/   (props changed)
   rt/branches/3.7-EXPERIMENTAL-TUNIS/sbin/rt-setup-database.in

Log:
sync from head

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/initialdata
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/initialdata	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/initialdata	Tue Apr 24 00:39:18 2007
@@ -414,8 +414,19 @@
         $res .= "* ". $e->{'Message'} ."\n";
     }
     $res
-}
-}
+}}
+    },
+    {  Queue       => 0,
+       Name        => "Error: no private key",    # loc
+       Description =>
+         "Inform user that we received an encrypted email and we have no private keys to decrypt", # loc
+       Content => q{Subject: we received message we cannot decrypt
+
+You sent an encrypted message with subject '{ $Message->head->get('Subject') }',
+but we have no private key it's encrypted to.
+
+Please, check that you encrypt messages with correct keys
+or contact the system administrator.}
     },
 );
 # }}}

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Elements/ShowCustomFields
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Elements/ShowCustomFields	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Elements/ShowCustomFields	Tue Apr 24 00:39:18 2007
@@ -67,8 +67,7 @@
 </table>
 <%INIT>
 my $CustomFields = $Object->CustomFields;
-$m->comp('/Elements/Callback', _CallbackName => 'MassageCustomFields',
-                                CustomFields => $CustomFields);
+$m->callback( CallbackName => 'MassageCustomFields', CustomFields => $CustomFields );
 
 my $print_value = sub {
     my ($cf, $value) = @_;
@@ -77,11 +76,11 @@
         $m->out('<a href="'. $value->LinkValueTo .'" target="_new">');
     }
     my $comp = "ShowCustomField". $cf->Type;
-    $m->comp('/Elements/Callback',
-        _CallbackName => 'ShowComponentName',
-        Name          => \$comp,
-        CustomField   => $cf,
-        Object        => $Object
+    $m->callback(
+        CallbackName => 'ShowComponentName',
+        Name         => \$comp,
+        CustomField  => $cf,
+        Object       => $Object,
     );
     if ( $m->comp_exists( $comp ) ) {
         $m->comp( $comp, Object => $value );

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Ticket/Elements/EditCustomFields
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Ticket/Elements/EditCustomFields	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/html/Ticket/Elements/EditCustomFields	Tue Apr 24 00:39:18 2007
@@ -95,8 +95,7 @@
     $NamePrefix = "Object-RT::Ticket--CustomField-";
 }
 
-$m->comp('/Elements/Callback', _CallbackName => 'MassageCustomFields',  
-                               CustomFields => $CustomFields);
+$m->callback( CallbackName => 'MassageCustomFields', CustomFields => $CustomFields );
 
 </%INIT>
 <%ARGS>

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Config.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Config.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Config.pm	Tue Apr 24 00:39:18 2007
@@ -321,17 +321,8 @@
 
 =cut
 
-sub Get
-{
-    my $self = shift;
-    my $name = shift;
-    my $user = shift;
-    unless ( exists $OPTIONS{ $name } ) {
-        # if don't know anything about option
-        # return empty list, but undef in scalar
-        # context
-        return wantarray? (): undef;
-    }
+sub Get {
+    my ($self, $name, $user) = @_;
 
     my $res;
     if ( $user && $META{ $name }->{'Overridable'} ) {
@@ -340,20 +331,13 @@
         $res = $prefs->{ $name } if $prefs;
     }
     $res = $OPTIONS{ $name } unless defined $res;
-    return $res unless wantarray;
-
-    my $type = $META{ $name }->{'Type'} || 'SCALAR';
-    if( $type eq 'ARRAY' ) {
-        return @{ $res };
-    } elsif( $type eq 'HASH' ) {
-        return %{ $res };
-    }
-    return $res;
+    return $self->_ReturnValue($res, $META{ $name }->{'Type'} || 'SCALAR');
 }
 
 =head2 Set
 
 Set option's value to new value. Takes name of the option and new value.
+Returns old value.
 
 The new value should scalar, array or hash depending on type of the option.
 If the option is not defined in meta or the default RT config then it is of
@@ -361,16 +345,15 @@
 
 =cut
 
-sub Set
-{
-    my $self = shift;
-    my $name = shift;
-
-    my $type = $META{$name}->{'Type'} || 'SCALAR';
-    if( $type eq 'ARRAY' ) {
+sub Set {
+    my ($self, $name) = (shift, shift);
+    
+    my $old = $OPTIONS{ $name };
+    my $type = $META{ $name }->{'Type'} || 'SCALAR';
+    if ( $type eq 'ARRAY' ) {
         $OPTIONS{$name} = [ @_ ];
         { no strict 'refs';  @{"RT::$name"} = (@_); }
-    } elsif( $type eq 'HASH' ) {
+    } elsif ( $type eq 'HASH' ) {
         $OPTIONS{$name} = { @_ };
         { no strict 'refs';  %{"RT::$name"} = (@_); }
     } else {
@@ -378,9 +361,19 @@
         { no strict 'refs';  ${"RT::$name"} = $OPTIONS{$name}; }
     }
     $META{$name}->{'Type'} = $type;
+    return $self->_ReturnValue($old, $type);
+}
 
+sub _ReturnValue {
+    my ($self, $res, $type) = @_;
+    return $res unless wantarray;
 
-    return 1;
+    if( $type eq 'ARRAY' ) {
+        return @{ $res };
+    } elsif( $type eq 'HASH' ) {
+        return %{ $res };
+    }
+    return $res;
 }
 
 sub SetFromConfig

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Crypt/GnuPG.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Crypt/GnuPG.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Crypt/GnuPG.pm	Tue Apr 24 00:39:18 2007
@@ -1122,8 +1122,16 @@
                 Status    => 'MISSING',
                 Message   => ucfirst( $type ) ." key '0x$key' is not available",
                 Key       => $key,
+                KeyType   => $type,
             );
             $res{'User'} = ( $user_hint{ $key } ||= {} );
+            if ( $type eq 'secret' ) {
+                foreach ( reverse @res ) {
+                    next unless $_->{'Keyword'} eq 'ENC_TO' && $_->{'Key'} eq $key;
+                    $_->{'KeyMissing'} = 1;
+                    last;
+                }
+            }
             push @res, \%res;
         }
         # GOODSIG, BADSIG, VALIDSIG, TRUST_*

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/CustomFields_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/CustomFields_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/CustomFields_Overlay.pm	Tue Apr 24 00:39:18 2007
@@ -245,7 +245,7 @@
                  ENTRYAGGREGATOR => 'OR' ) unless $global_only;
 
     $self->OrderByCols(
-	{ ALIAS => $self->_OCFAlias, FIELD => 'ObjectId' },
+	{ ALIAS => $self->_OCFAlias, FIELD => 'ObjectId', ORDER => 'DESC' },
 	{ ALIAS => $self->_OCFAlias, FIELD => 'SortOrder' },
     );
     

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/I18N/de.po
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/I18N/de.po	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/I18N/de.po	Tue Apr 24 00:39:18 2007
@@ -4152,7 +4152,7 @@
 
 #: html/Widgets/SelectionBox:209
 msgid "Selections modified. Please save your changes"
-msgstr "Auswahl wurde geändert. Bitte speichere Deine Änderungen"
+msgstr "Auswahl wurde geändert. Bitte speichere Deine Änderungen"
 
 #: etc/initialdata:121
 msgid "Send mail to all watchers"

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/GnuPGNG.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/GnuPGNG.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/GnuPGNG.pm	Tue Apr 24 00:39:18 2007
@@ -11,7 +11,7 @@
 you care about and specify the following in your SiteConfig.pm
 
 Set(%GnuPGOptions, homedir => '/opt/rt3/var/data/GnuPG');
-Set(@MailPlugins, 'Auth::GnuPGNG', ...other filter...);
+Set(@MailPlugins, 'Auth::MailFrom', 'Auth::GnuPGNG', ...other filter...);
 
 =cut
 
@@ -29,20 +29,96 @@
         @_
     );
 
-    $args{'Message'}->head->delete('X-RT-GnuPG-Status');
+    $args{'Message'}->head->delete($_)
+        for qw(X-RT-GnuPG-Status X-RT-Incoming-Encrypton
+               X-RT-Incoming-Signature X-RT-Privacy);
 
     my ($status, @res) = VerifyDecrypt( Entity => $args{'Message'} );
-    return @args{qw(CurrentUser AuthLevel)} if $status && !@res;
+    if ( $status && !@res ) {
+        $args{'Message'}
+            ->head->add( 'X-RT-Incoming-Encryption' => 'Not encrypted' );
 
-    $RT::Logger->error("Had a problem during decrypting and verifying")
-        unless $status;
+        return @args{qw(CurrentUser AuthLevel)};
+    }
+
+    unless ( $status ) {
+        $RT::Logger->error("Had a problem during decrypting and verifying");
+        my $reject = HandleErrors( Message => $args{'Message'}, Result => \@res );
+        return $args{'CurrentUser'}, -2;
+    }
 
     $args{'Message'}->head->add( 'X-RT-GnuPG-Status' => $_->{'status'} )
         foreach @res;
+    $args{'Message'}->head->add( 'X-RT-Privacy' => 'PGP' );
+
+    # XXX: first entity only for now
+    if (@res) {
+        my $decrypted;
+        my @status = RT::Crypt::GnuPG::ParseStatus( $res[0]->{'status'} );
+        for (@status) {
+            if ( $_->{Operation} eq 'Decrypt' && $_->{Status} eq 'DONE' ) {
+                $decrypted = 1;
+            }
+            if ( $_->{Operation} eq 'Verify' && $_->{Status} eq 'DONE' ) {
+                $args{'Message'}->head->add(
+                    'X-RT-Incoming-Signature' => $_->{UserString} );
+            }
+        }
+        $args{'Message'}->head->add( 'X-RT-Incoming-Encryption' => $decrypted
+            ? 'Success'
+            : 'Not encrypted' );
+    }
 
     return @args{qw(CurrentUser AuthLevel)};
 }
 
+sub HandleErrors {
+    my %args = (
+        Message => undef,
+        Result => [],
+        @_
+    );
+
+    my $reject = 0;
+
+    my %sent_once = ();
+    foreach my $run ( @{ $args{'Result'} } ) {
+        my @status = RT::Crypt::GnuPG::ParseStatus( $run->{'status'} );
+        unless ( $sent_once{'NoPrivateKey'} ) {
+            unless ( CheckNoPrivateKey( Message => $args{'Message'}, Status => \@status ) ) {
+                $sent_once{'NoPrivateKey'}++;
+                $reject = 1;
+            }
+        }
+    }
+    return $reject;
+}
+
+sub CheckNoPrivateKey {
+    my %args = (Message => undef, Status => [], @_ );
+    my @status = @{ $args{'Status'} };
+
+    my @encrypted_to = grep $_->{'Keyword'} eq 'ENC_TO', @status;
+    return 1 unless @encrypted_to;
+    return 1 if grep !$_->{'KeyMissing'}, @encrypted_to;
+
+    $RT::Logger->error("Couldn't decrypt a message: have no private key");
+
+    my $address = (RT::Interface::Email::ParseSenderAddressFromHead( $args{'Message'}->head ))[0];
+    my $status = RT::Interface::Email::SendEmailUsingTemplate(
+        To        => $address,
+        Template  => 'Error: no private key',
+        Arguments => {
+            Message   => $args{'Message'},
+            TicketObj => $args{'Ticket'},
+        },
+    );
+    unless ( $status ) {
+        $RT::Logger->error("Couldn't send 'Error: no private key'");
+    }
+    return 0;
+}
+
 sub VerifyDecrypt {
     my %args = (
         Entity => undef,

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/MailFrom.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/MailFrom.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email/Auth/MailFrom.pm	Tue Apr 24 00:39:18 2007
@@ -69,7 +69,7 @@
     $CurrentUser->LoadByEmail( $Address );
     $CurrentUser->LoadByName( $Address ) unless $CurrentUser->Id;
     if ( $CurrentUser->Id ) {
-        $RT::Logger->error("Mail from user #". $CurrentUser->Id ." ($Address)" );
+        $RT::Logger->debug("Mail from user #". $CurrentUser->Id ." ($Address)" );
         return ( $CurrentUser, 1 );
     }
 

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/ObjectCustomField_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/ObjectCustomField_Overlay.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/ObjectCustomField_Overlay.pm	Tue Apr 24 00:39:18 2007
@@ -50,26 +50,47 @@
 
 sub Create {
     my $self = shift;
-    my %args = ( 
-                CustomField => '0',
-                ObjectId => '0',
-                SortOrder => undef,
-                  @_);
-
-    if (!defined $args{SortOrder}) {
-        my $CF = $self->CustomFieldObj($args{'CustomField'});
-        my $ObjectCFs = RT::ObjectCustomFields->new($self->CurrentUser);
-        $ObjectCFs->LimitToObjectId($args{'ObjectId'});
-        $ObjectCFs->LimitToLookupType($CF->LookupType);
+    my %args = (
+        CustomField => 0,
+        ObjectId    => 0,
+        SortOrder   => undef,
+        @_
+    );
+
+    my $cf = $self->CustomFieldObj( $args{'CustomField'} );
+    unless ( $cf->id ) {
+        $RT::Logger->error("Couldn't load '$args{'CustomField'}' custom field");
+        return 0;
+    }
+
+    #XXX: Where is ACL check for 'AssignCustomFields'?
+
+    my $ObjectCFs = RT::ObjectCustomFields->new($self->CurrentUser);
+    $ObjectCFs->LimitToObjectId( $args{'ObjectId'} );
+    $ObjectCFs->LimitToCustomField( $cf->id );
+    $ObjectCFs->LimitToLookupType( $cf->LookupType );
+    if ( my $first = $ObjectCFs->First ) {
+        $self->Load( $first->id );
+        return $first->id;
+    }
 
-        $args{SortOrder} = $ObjectCFs->Count + 1;
+    unless ( defined $args{'SortOrder'} ) {
+        my $ObjectCFs = RT::ObjectCustomFields->new( $RT::SystemUser );
+        $ObjectCFs->LimitToObjectId( $args{'ObjectId'} );
+        $ObjectCFs->LimitToLookupType( $cf->LookupType );
+        $ObjectCFs->OrderBy( FIELD => 'SortOrder', ORDER => 'DESC' );
+        if ( my $first = $ObjectCFs->First ) {
+            $args{'SortOrder'} = $first->SortOrder + 1;
+        } else {
+            $args{'SortOrder'}   = 0;
+        }
     }
 
-    $self->SUPER::Create(
-                         CustomField => $args{'CustomField'},
-                         ObjectId => $args{'ObjectId'},
-                         SortOrder => $args{'SortOrder'},
-                     );
+    return $self->SUPER::Create(
+        CustomField => $args{'CustomField'},
+        ObjectId    => $args{'ObjectId'},
+        SortOrder   => $args{'SortOrder'},
+    );
 }
 
 sub Delete {
@@ -93,8 +114,8 @@
 sub CustomFieldObj {
     my $self = shift;
     my $id = shift || $self->CustomField;
-    my $CF = RT::CustomField->new($self->CurrentUser);
-    $CF->Load($id) or die "Cannot load CustomField $id";
+    my $CF = RT::CustomField->new( $self->CurrentUser );
+    $CF->Load( $id );
     return $CF;
 }
 

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Record.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Record.pm	(original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Record.pm	Tue Apr 24 00:39:18 2007
@@ -1730,6 +1730,7 @@
 
         # we were asked to search on a custom field we couldn't find
         unless ( $cf->id ) {
+            $RT::Logger->warning("Couldn't load custom field by '$field' identifier");
             return RT::ObjectCustomFieldValues->new( $self->CurrentUser );
         }
         return ( $cf->ValuesForObject($self) );

Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/sbin/rt-setup-database.in
==============================================================================


More information about the Rt-commit mailing list