[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