[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