[Rt-commit] r7608 - in rt/branches/3.7-EXPERIMENTAL-TUNIS: . etc
lib/RT lib/RT/Crypt lib/RT/Interface sbin
clkao at bestpractical.com
clkao at bestpractical.com
Sun Apr 22 09:53:57 EDT 2007
Author: clkao
Date: Sun Apr 22 09:53:35 2007
New Revision: 7608
Modified:
rt/branches/3.7-EXPERIMENTAL-TUNIS/ (props changed)
rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/RT_SiteConfig.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Action/SendEmail.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Crypt/GnuPG.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Web.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Principal_Overlay.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Record.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Ticket_Overlay.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Transaction_Overlay.pm
rt/branches/3.7-EXPERIMENTAL-TUNIS/sbin/rt-test-dependencies.in
Log:
Merge down to tunis.
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/RT_SiteConfig.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/RT_SiteConfig.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/etc/RT_SiteConfig.pm Sun Apr 22 09:53:35 2007
@@ -1,22 +1,18 @@
+# Any configuration directives you include here will override
+# RT's default configuration file, RT_Config.pm
+#
+# To include a directive here, just copy the equivalent statement
+# from RT_Config.pm and change the value. We've included a single
+# sample value below.
+#
+# This file is actually a perl module, so you can include valid
+# perl code, as well.
+#
+# The converse is also true, if this file isn't valid perl, you're
+# going to run into trouble. To check your SiteConfig file, use
+# this comamnd:
+#
+# perl -c /path/to/your/etc/RT_SiteConfig.pm
Set( $rtname, 'example.com');
-Set( $WebPort , 11235);
-Set( $WebBaseURL , "http://localhost:$WebPort");
-
- $RTIR_CONFIG_FILE = $RT::LocalEtcPath."/IR/RTIR_Config.pm";
-
- require $RTIR_CONFIG_FILE
- || die ("Couldn't load RTIR config file '$RTIR_CONFIG_FILE'\n$@");
-
-Set( %GnuPG,
- Enable => 1,
- OutgoingMessagesFormat => 'RFC', # Inline
-);
-
-
-Set(%GnuPGOptions, homedir => '/home/clkao/.gnupg');
-Set(@MailPlugins, 'Auth::GnuPGNG');
-
-
1;
-
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Action/SendEmail.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Action/SendEmail.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Action/SendEmail.pm Sun Apr 22 09:53:35 2007
@@ -240,20 +240,12 @@
. $self->ScripObj->id . " "
. ($self->ScripObj->Description || '') );
- #If we don't have any recipients to send to, don't send a message;
- unless ( $MIMEObj->head->get('To')
- || $MIMEObj->head->get('Cc')
- || $MIMEObj->head->get('Bcc') )
- {
- $RT::Logger->info( $msgid . " No recipients found. Not sending.\n" );
- return (-1);
- }
-
- return(0) unless RT::Interface::Email::SendEmail(
+ my $status = RT::Interface::Email::SendEmail(
Entity => $MIMEObj,
Ticket => $self->TicketObj,
Transaction => $self->TransactionObj,
);
+ return $status unless $status > 0;
my $success = $msgid . " sent ";
foreach( qw(To Cc Bcc) ) {
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 Sun Apr 22 09:53:35 2007
@@ -1,8 +1,8 @@
-package RT::Crypt::GnuPG;
-
use strict;
use warnings;
+package RT::Crypt::GnuPG;
+
use IO::Handle;
use GnuPG::Interface;
use RT::EmailParser ();
@@ -66,18 +66,17 @@
$stderr->fdopen( 2, 'w' );
local *STDERR = $stderr;
- local $SIG{'CHLD'} = 'DEFAULT';
local @ENV{'LANG', 'LC_ALL'} = ('C', 'C');
- shift->();
+ return shift->();
}
sub SignEncrypt {
my $format = lc RT->Config->Get('GnuPG')->{'OutgoingMessagesFormat'} || 'RFC';
if ( $format eq 'inline' ) {
- SignEncryptInline( @_ );
+ return SignEncryptInline( @_ );
} else {
- SignEncryptRFC3156( @_ );
+ return SignEncryptRFC3156( @_ );
}
}
@@ -123,13 +122,14 @@
$gnupg->passphrase( $args{'Passphrase'} );
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
my $pid = _safe_run_child { $gnupg->detach_sign( handles => $handles ) };
$entity->make_multipart( 'mixed', Force => 1 );
$entity->parts(0)->print( $handle{'input'} );
close $handle{'input'};
waitpid $pid, 0;
};
- my $err = $@;
+ my $err = $@;
my @signature = readline $handle{'output'};
close $handle{'output'};
@@ -181,6 +181,7 @@
$gnupg->passphrase( $args{'Passphrase'} ) if $args{'Sign'};
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
my $pid = _safe_run_child { $args{'Sign'}
? $gnupg->sign_and_encrypt( handles => $handles )
: $gnupg->encrypt( handles => $handles ) };
@@ -223,7 +224,238 @@
);
$entity->parts(-1)->bodyhandle->{'_dirty_hack_to_save_a_ref_tmp_fh'} = $tmp_fh;
}
- %res;
+ return %res;
+}
+
+sub SignEncryptInline {
+ my %args = (@_);
+
+ my $entity = $args{'Entity'};
+ if ( $args{'Sign'} && !defined $args{'Signer'} ) {
+ $args{'Signer'} = (Mail::Address->parse( $entity->head->get( 'From' ) ))[0]->address;
+ }
+ if ( $args{'Encrypt'} && !$args{'Recipients'} ) {
+ my %seen;
+ $args{'Recipients'} = [
+ grep $_ && !$seen{ $_ }++, map $_->address,
+ map Mail::Address->parse( $entity->head->get( $_ ) ),
+ qw(To Cc Bcc)
+ ];
+ }
+
+ my %res;
+
+ $entity->make_singlepart;
+ if ( $entity->is_multipart ) {
+ foreach ( $entity->parts ) {
+ %res = SignEncryptInline( %args, Entity => $_ );
+ return %res if $res{'exit_code'};
+ }
+ return %res;
+ }
+
+ return _SignEncryptTextInline( %args )
+ if $entity->effective_type =~ /^text\//i;
+
+ return _SignEncryptAttachmentInline( %args );
+}
+
+sub _SignEncryptTextInline {
+ my %args = (
+ Entity => undef,
+
+ Sign => 1,
+ Signer => undef,
+ Passphrase => undef,
+
+ Encrypt => 1,
+ Recipients => undef,
+
+ @_
+ );
+ return unless $args{'Sign'} || $args{'Encrypt'};
+
+ if ( $args{'Sign'} && !defined $args{'Passphrase'} ) {
+ $args{'Passphrase'} = GetPassphrase();
+ }
+
+ my $gnupg = new GnuPG::Interface;
+ my %opt = RT->Config->Get('GnuPGOptions');
+ $opt{'digest-algo'} ||= 'SHA1';
+ $gnupg->options->hash_init(
+ _PrepareGnuPGOptions( %opt ),
+ armor => 1,
+ meta_interactive => 0,
+ ( $args{'Sign'} && $args{'Signer'}? (default_key => $args{'Signer'}): () ),
+ );
+
+ my $entity = $args{'Entity'};
+ if ( $args{'Encrypt'} ) {
+ unless ( $args{'Recipients'} ) {
+ my %seen;
+ $gnupg->options->push_recipients( $_ )
+ foreach grep $_ && !$seen{ $_ }++, map $_->address,
+ map Mail::Address->parse( $entity->head->get( $_ ) ),
+ qw(To Cc Bcc);
+ } else {
+ $gnupg->options->push_recipients( $_ )
+ foreach @{ $args{'Recipients'} };
+ }
+ }
+
+ my %res;
+
+ my ($tmp_fh, $tmp_fn) = File::Temp::tempfile();
+ binmode $tmp_fh, ':raw';
+
+ my %handle;
+ my $handles = GnuPG::Handles->new(
+ stdin => ($handle{'input'} = new IO::Handle),
+ stdout => $tmp_fh,
+ stderr => ($handle{'error'} = new IO::Handle),
+ logger => ($handle{'logger'} = new IO::Handle),
+ status => ($handle{'status'} = new IO::Handle),
+ );
+ $handles->options( 'stdout' )->{'direct'} = 1;
+ $gnupg->passphrase( $args{'Passphrase'} ) if $args{'Sign'};
+
+ eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
+ my $method = $args{'Sign'} && $args{'Encrypt'}
+ ? 'sign_and_encrypt'
+ : ($args{'Sign'}? 'clearsign': 'encrypt');
+ my $pid = _safe_run_child { $gnupg->$method( handles => $handles ) };
+ $entity->bodyhandle->print( $handle{'input'} );
+ close $handle{'input'};
+ waitpid $pid, 0;
+ };
+ $res{'exit_code'} = $?;
+ my $err = $@;
+
+ foreach ( qw(error logger status) ) {
+ $res{$_} = do { local $/; readline $handle{$_} };
+ delete $res{$_} unless $res{$_} && $res{$_} =~ /\S/s;
+ close $handle{$_};
+ }
+ $RT::Logger->debug( $res{'status'} ) if $res{'status'};
+ $RT::Logger->warning( $res{'error'} ) if $res{'error'};
+ $RT::Logger->error( $res{'logger'} ) if $res{'logger'} && $?;
+ if ( $err || $res{'exit_code'} ) {
+ $res{'message'} = $err? $err : "gpg exitted with error code ". ($res{'exit_code'} >> 8);
+ return %res;
+ }
+
+ $entity->bodyhandle( new MIME::Body::File $tmp_fn );
+ $entity->{'__store_tmp_handle_to_avoid_early_cleanup'} = $tmp_fh;
+
+ return %res;
+}
+
+sub _SignEncryptAttachmentInline {
+ my %args = (
+ Entity => undef,
+
+ Sign => 1,
+ Signer => undef,
+ Passphrase => undef,
+
+ Encrypt => 1,
+ Recipients => undef,
+
+ @_
+ );
+ return unless $args{'Sign'} || $args{'Encrypt'};
+
+ if ( $args{'Sign'} && !defined $args{'Passphrase'} ) {
+ $args{'Passphrase'} = GetPassphrase();
+ }
+
+ my $gnupg = new GnuPG::Interface;
+ my %opt = RT->Config->Get('GnuPGOptions');
+ $opt{'digest-algo'} ||= 'SHA1';
+ $gnupg->options->hash_init(
+ _PrepareGnuPGOptions( %opt ),
+ armor => 1,
+ meta_interactive => 0,
+ ( $args{'Sign'} && $args{'Signer'}? (default_key => $args{'Signer'}): () ),
+ );
+
+ my $entity = $args{'Entity'};
+ if ( $args{'Encrypt'} ) {
+ unless ( $args{'Recipients'} ) {
+ my %seen;
+ $gnupg->options->push_recipients( $_ )
+ foreach grep $_ && !$seen{ $_ }++, map $_->address,
+ map Mail::Address->parse( $entity->head->get( $_ ) ),
+ qw(To Cc Bcc);
+ } else {
+ $gnupg->options->push_recipients( $_ )
+ foreach @{ $args{'Recipients'} };
+ }
+ }
+
+ my %res;
+
+ my ($tmp_fh, $tmp_fn) = File::Temp::tempfile();
+ binmode $tmp_fh, ':raw';
+
+ my %handle;
+ my $handles = GnuPG::Handles->new(
+ stdin => ($handle{'input'} = new IO::Handle),
+ stdout => $tmp_fh,
+ stderr => ($handle{'error'} = new IO::Handle),
+ logger => ($handle{'logger'} = new IO::Handle),
+ status => ($handle{'status'} = new IO::Handle),
+ );
+ $handles->options( 'stdout' )->{'direct'} = 1;
+ $gnupg->passphrase( $args{'Passphrase'} ) if $args{'Sign'};
+
+ eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
+ my $method = $args{'Sign'} && $args{'Encrypt'}
+ ? 'sign_and_encrypt'
+ : ($args{'Sign'}? 'detach_sign': 'encrypt');
+ my $pid = _safe_run_child { $gnupg->$method( handles => $handles ) };
+ $entity->bodyhandle->print( $handle{'input'} );
+ close $handle{'input'};
+ waitpid $pid, 0;
+ };
+ $res{'exit_code'} = $?;
+ my $err = $@;
+
+ foreach ( qw(error logger status) ) {
+ $res{$_} = do { local $/; readline $handle{$_} };
+ delete $res{$_} unless $res{$_} && $res{$_} =~ /\S/s;
+ close $handle{$_};
+ }
+ $RT::Logger->debug( $res{'status'} ) if $res{'status'};
+ $RT::Logger->warning( $res{'error'} ) if $res{'error'};
+ $RT::Logger->error( $res{'logger'} ) if $res{'logger'} && $?;
+ if ( $err || $res{'exit_code'} ) {
+ $res{'message'} = $err? $err : "gpg exitted with error code ". ($res{'exit_code'} >> 8);
+ return %res;
+ }
+
+ my $filename = $entity->head->recommended_filename || 'no_name';
+ if ( $args{'Sign'} && !$args{'Encrypt'} ) {
+ $entity->make_multipart;
+ $entity->attach(
+ Type => 'application/octeat-stream',
+ Path => $tmp_fn,
+ Filename => "$filename.sig",
+ Disposition => 'attachment',
+ );
+ } else {
+ $entity->bodyhandle( new MIME::Body::File $tmp_fn );
+ $entity->effective_type('application/octeat-stream');
+ $args{'Data'}->head->mime_attr( $_ => "$filename.pgp" )
+ foreach (qw(Content-Type.name Content-Disposition.filename));
+
+ }
+ $entity->{'__store_tmp_handle_to_avoid_early_cleanup'} = $tmp_fh;
+
+ return %res;
+
}
sub FindProtectedParts {
@@ -401,6 +633,7 @@
my %res;
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
my $pid = _safe_run_child { $gnupg->verify( handles => $handles ) };
$args{'Data'}->bodyhandle->print( $handle{'input'} );
close $handle{'input'};
@@ -449,6 +682,7 @@
my %res;
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
my $pid = _safe_run_child { $gnupg->verify( handles => $handles, command_args => [ '-', $tmp_fn ] ) };
$args{'Signature'}->bodyhandle->print( $handle{'input'} );
close $handle{'input'};
@@ -497,6 +731,7 @@
my %res;
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
my $pid = _safe_run_child { $gnupg->verify( handles => $handles, command_args => [ '-', $tmp_fn ] ) };
$args{'Signature'}->bodyhandle->print( $handle{'input'} );
close $handle{'input'};
@@ -553,6 +788,7 @@
my %res;
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
$gnupg->passphrase( $args{'Passphrase'} );
my $pid = _safe_run_child { $gnupg->decrypt( handles => $handles ) };
$args{'Data'}->bodyhandle->print( $handle{'input'} );
@@ -619,6 +855,7 @@
my %res;
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
$gnupg->passphrase( $args{'Passphrase'} );
my $pid = _safe_run_child { $gnupg->decrypt( handles => $handles ) };
$args{'Data'}->bodyhandle->print( $handle{'input'} );
@@ -810,6 +1047,7 @@
} else {
$user_hint{ $tmp{'MainKey'} } = \%tmp;
}
+ next;
}
elsif ( $keyword eq 'BAD_PASSPHRASE' || $keyword eq 'GOOD_PASSPHRASE' ) {
my $key_id = $args;
@@ -991,7 +1229,7 @@
$RT::Logger->warning("Keyword $keyword is unknown");
next;
}
- $res[-1]{'Keyword'} = $keyword unless $res[-1]{'Keyword'};
+ $res[-1]{'Keyword'} = $keyword if @res && !$res[-1]{'Keyword'};
}
return @res;
}
@@ -1053,6 +1291,7 @@
);
eval {
+ local $SIG{'CHLD'} = 'DEFAULT';
my $method = $type eq 'private'? 'list_secret_keys': 'list_public_keys';
my $pid = _safe_run_child { $gnupg->$method( handles => $handles, command_args => [ $email ] ) };
waitpid $pid, 0;
@@ -1086,7 +1325,8 @@
my @res = ();
foreach my $line( @lines ) {
chomp $line;
- my ($tag, $line) = split /:/, $line, 2;
+ my $tag;
+ ($tag, $line) = split /:/, $line, 2;
if ( $tag eq 'pub' ) {
my %info;
@info{ qw(
@@ -1172,8 +1412,6 @@
# helper package to avoid using temp file
package IO::Handle::CRLF;
-use strict;
-use warnings FATAL => 'all';
use base qw(IO::Handle);
sub print {
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Email.pm Sun Apr 22 09:53:35 2007
@@ -324,6 +324,18 @@
return 0;
}
+ my $msgid = $args{'Entity'}->head->get('Message-ID') || '';
+ chomp $msgid;
+
+ # If we don't have any recipients to send to, don't send a message;
+ unless ( $args{'Entity'}->head->get('To')
+ || $args{'Entity'}->head->get('Cc')
+ || $args{'Entity'}->head->get('Bcc') )
+ {
+ $RT::Logger->info( $msgid . " No recipients found. Not sending.\n" );
+ return -1;
+ }
+
if ( $args{'Transaction'} && !$args{'Ticket'}
&& $args{'Transaction'}->ObjectType eq 'RT::Ticket' )
{
@@ -346,9 +358,6 @@
return $res unless $res > 0;
}
- my $msgid = $args{'Entity'}->head->get('Message-ID') || '';
- chomp $msgid;
-
unless ( $args{'Entity'}->head->get('Date') ) {
require RT::Date;
my $date = RT::Date->new( $RT::SystemUser );
@@ -548,15 +557,14 @@
);
return 1 unless $args{'Sign'} || $args{'Ecrypt'};
- $RT::Logger->debug('Signing message') if $args{'Sign'};
- $RT::Logger->debug('Encrypting message') if $args{'Ecrypt'};
+ my $msgid = $args{'Entity'}->head->get('Message-ID') || '';
+ chomp $msgid;
+
+ $RT::Logger->debug("$msgid Signing message") if $args{'Sign'};
+ $RT::Logger->debug("$msgid Encrypting message") if $args{'Ecrypt'};
require RT::Crypt::GnuPG;
- my %res = RT::Crypt::GnuPG::SignEncrypt(
- Entity => $args{'Entity'},
- Sign => $args{'Sign'},
- Encrypt => $args{'Encrypt'},
- );
+ my %res = RT::Crypt::GnuPG::SignEncrypt( %args );
return 1 unless $res{'exit_code'};
my @status = RT::Crypt::GnuPG::ParseStatus( $res{'status'} );
@@ -610,15 +618,12 @@
|| $args{'Entity'}->head->get('Cc')
|| $args{'Entity'}->head->get('Bcc') )
{
+ $RT::Logger->debug("$msgid No recipients that have public key, not sending");
return -1;
}
# redo without broken recipients
- %res = RT::Crypt::GnuPG::SignEncrypt(
- Entity => $args{'Entity'},
- Sign => $args{'Sign'},
- Encrypt => $args{'Encrypt'},
- );
+ %res = RT::Crypt::GnuPG::SignEncrypt( %args );
return 0 if $res{'exit_code'};
return 1;
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Web.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Web.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Interface/Web.pm Sun Apr 22 09:53:35 2007
@@ -610,7 +610,7 @@
TimeTaken => $args{ARGSRef}->{'UpdateTimeWorked'});
- unless ( $args{'ARGRef'}->{'UpdateIgnoreAddressCheckboxes'} =="1") {
+ if ( not $args{'ARGRef'}->{'UpdateIgnoreAddressCheckboxes'}) {
foreach my $key ( keys %{ $args{ARGSRef} } ) {
if ( $key =~ /^Update(Cc|Bcc)-(.*)$/ ) {
my $var = ucfirst($1).'MessageTo';
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Principal_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Principal_Overlay.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Principal_Overlay.pm Sun Apr 22 09:53:35 2007
@@ -320,11 +320,13 @@
# If this object is a ticket, we care about ticket roles and queue roles
if ( UNIVERSAL::isa( $args{'Object'} => 'RT::Ticket' ) ) {
+
+
# this is a little bit hacky, but basically, now that we've done
# the ticket roles magic, we load the queue object
# and ask all the rest of our questions about the queue.
- push( @{ $args{'EquivObjects'} }, $args{'Object'}->QueueObj );
+ push( @{ $args{'EquivObjects'} }, $args{'Object'}->ACLEquivalenceObjects);
}
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 Sun Apr 22 09:53:35 2007
@@ -808,7 +808,7 @@
sub _DecodeLOB {
my $self = shift;
- my $ContentType = shift;
+ my $ContentType = shift || '';
my $ContentEncoding = shift || 'none';
my $Content = shift;
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Ticket_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Ticket_Overlay.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Ticket_Overlay.pm Sun Apr 22 09:53:35 2007
@@ -3597,6 +3597,23 @@
"RT::Queue-RT::Ticket";
}
+=head2 ACLEquivalenceObjects
+
+This method returns a list of objects for which a user's rights also apply
+to this ticket. Generally, this is only the ticket's queue, but some RT
+extensions may make other objects availalbe too.
+
+This method is called from L<RT::Principal/HasRight>.
+
+=cut
+
+sub ACLEquivalenceObjects {
+ my $self = shift;
+ return $self->QueueObj;
+
+}
+
+
1;
=head1 AUTHOR
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Transaction_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Transaction_Overlay.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/lib/RT/Transaction_Overlay.pm Sun Apr 22 09:53:35 2007
@@ -610,7 +610,7 @@
$field = $cf->Name();
}
- if ( $self->OldValue eq '' ) {
+ if ( ! defined $self->OldValue || $self->OldValue eq '' ) {
return ( $self->loc("[_1] [_2] added", $field, $self->NewValue) );
}
elsif ( $self->NewValue eq '' ) {
Modified: rt/branches/3.7-EXPERIMENTAL-TUNIS/sbin/rt-test-dependencies.in
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL-TUNIS/sbin/rt-test-dependencies.in (original)
+++ rt/branches/3.7-EXPERIMENTAL-TUNIS/sbin/rt-test-dependencies.in Sun Apr 22 09:53:35 2007
@@ -184,6 +184,7 @@
Digest::MD5 2.27
DBI 1.37
Class::ReturnValue 0.40
+GnuPG::Interface
DBIx::SearchBuilder 1.40
Text::Template
File::Spec 0.8
More information about the Rt-commit
mailing list