[Rt-commit] rt branch, rt-address-regexp, updated. rt-3.8.7-146-g25c972b

Ruslan Zakirov ruz at bestpractical.com
Tue Feb 16 17:26:13 EST 2010


The branch, rt-address-regexp has been updated
       via  25c972b8e107450a1ec406614ad0d8d7d8cf7161 (commit)
       via  3fe9edf416d24f0a40664c0472d861802b0cb6a5 (commit)
       via  22ccde5cdb5ab1ac6e5b69d4af9d0999ea66d00e (commit)
       via  497b1863142cc23c7d0bff1e2d937d8f2194b819 (commit)
       via  90ff7e74d6e2f52c7e2ad27e25adb26aceaa0f5b (commit)
       via  5b01ff972d3d394b9b7c2342af8daf272be51cbb (commit)
       via  7768db8aff169a1acb96032d8afe58dd24fc7dca (commit)
      from  d7f9eefe35a999ae9ec84696df1e3b7c73cb979a (commit)

Summary of changes:
 lib/RT/Attachment_Overlay.pm  |   14 +++++---------
 lib/RT/Config.pm              |   26 ++++----------------------
 lib/RT/EmailParser.pm         |   35 ++++++++++++++++++++---------------
 lib/RT/Interface/Email.pm     |   20 ++++++--------------
 share/html/Ticket/Create.html |    5 +----
 share/html/Ticket/Update.html |    5 +----
 6 files changed, 37 insertions(+), 68 deletions(-)

- Log -----------------------------------------------------------------
commit 7768db8aff169a1acb96032d8afe58dd24fc7dca
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Tue Feb 16 21:01:33 2010 +0300

    use IsRTAddress on Create/Update

diff --git a/share/html/Ticket/Create.html b/share/html/Ticket/Create.html
index 6ecad01..716bcb7 100755
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@ -395,15 +395,12 @@ if ( !exists $ARGS{'AddMoreAttach'} && ($ARGS{'id'}||'') eq 'new' ) {
 
 # check email addresses for RT's
 {
-    my $address_re = RT->Config->Get('RTAddressRegexp');
     foreach my $field ( qw(Requestors Cc AdminCc) ) {
         my $value = $ARGS{ $field };
         next unless defined $value && length $value;
 
         my @emails = Email::Address->parse( $value );
-        foreach my $email ( @emails ) {
-            next unless $email->address =~ $address_re;
-
+        foreach my $email ( grep RT::EmailParser->IsRTAddress($_->address), @emails ) {
             push @results, loc("[_1] is an address RT receives mail at. Adding it as a '[_2]' would create a mail loop", $email->format, loc($field =~ /^(.*?)s?$/) );
             $checks_failure = 1;
             $email = undef;
diff --git a/share/html/Ticket/Update.html b/share/html/Ticket/Update.html
index 58e1812..90263c2 100755
--- a/share/html/Ticket/Update.html
+++ b/share/html/Ticket/Update.html
@@ -261,15 +261,12 @@ if ( $ARGS{'SubmitTicket'} ) {
 
 # check email addresses for RT's
 {
-    my $address_re = RT->Config->Get('RTAddressRegexp');
     foreach my $field ( qw(UpdateCc UpdateBcc) ) {
         my $value = $ARGS{ $field };
         next unless defined $value && length $value;
 
         my @emails = Email::Address->parse( $value );
-        foreach my $email ( @emails ) {
-            next unless $email->address =~ $address_re;
-
+        foreach my $email ( grep RT::EmailAddress->IsRTAddress($_->address), @emails ) {
             push @results, loc("[_1] is an address RT receives mail at. Adding it as a '[_2]' would create a mail loop", $email->format, loc(substr($field, 6)) );
             $checks_failure = 1;
             $email = undef;

commit 5b01ff972d3d394b9b7c2342af8daf272be51cbb
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Tue Feb 16 21:04:29 2010 +0300

    don't generate lame regexp for RTAddressRegexp

diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index b652d3e..cc4b1c1 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -342,29 +342,10 @@ our %META = (
 
             $RT::Logger->error(
                 'RTAddressRegexp option is not set in the config.'
-                .' Not setting this option may result in big mail loops.'
-                .' Going to generate value for you, but generating value takes'
-                .' time and only a few queues are accounted. So this slow downs'
-                .' server restarts and command line utilities, as well dont'
-                .' protect you from loops if you have many queues'
+                .' Not setting this option result in additional SQL queries to check'
+                .' every address if it belongs to RT or not. These checks are'
+                .' required to avoid mail loops and other consequences.'
             );
-
-            my @emails = (
-                $self->Get('CorrespondAddress'),
-                $self->Get('CommentAddress'),
-            );
-            my $queues = RT::Queues->new( $RT::SystemUser );
-            $queues->UnLimit;
-            $queues->RowsPerPage(100);
-            while ( my $queue = $queues->Next ) {
-                push @emails, $queue->CorrespondAddress, $queue->CommentAddress;
-            }
-
-            my %seen;
-            my $re = join '|', map "\Q$_\E",
-                grep defined && length && !$seen{ lc $_ }++,
-                @emails;
-            $self->Set( qr/$re/ );
         },
     },
     # User overridable mail options

commit 90ff7e74d6e2f52c7e2ad27e25adb26aceaa0f5b
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Tue Feb 16 21:06:29 2010 +0300

    if RT address regexp is not set then load queues for check

diff --git a/lib/RT/EmailParser.pm b/lib/RT/EmailParser.pm
index 7890f49..88041fe 100755
--- a/lib/RT/EmailParser.pm
+++ b/lib/RT/EmailParser.pm
@@ -333,12 +333,18 @@ sub IsRTAddress {
     my $self = shift;
     my $address = shift;
 
-    # Example: the following rule would tell RT not to Cc 
-    #   "tickets at noc.example.com"
-    my $address_re = RT->Config->Get('RTAddressRegexp');
-    if ( defined $address_re && $address =~ /$address_re/i ) {
-        return 1;
+    if ( my $address_re = RT->Config->Get('RTAddressRegexp') ) {
+        return $address =~ /$address_re/i ? 1 : undef;
     }
+
+    # we don't warn here, but do in config check
+    my $queue = RT::Queue->new( $RT::SystemUser );
+    $queue->LoadByCols( CorrespondAddress => $address );
+    return 1 if $queue->id;
+
+    $queue->LoadByCols( CommentAddress => $address );
+    return 1 if $queue->id;
+
     return undef;
 }
 

commit 497b1863142cc23c7d0bff1e2d937d8f2194b819
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Tue Feb 16 21:11:10 2010 +0300

    match against global Comment/Correspond addresses

diff --git a/lib/RT/EmailParser.pm b/lib/RT/EmailParser.pm
index 88041fe..5445080 100755
--- a/lib/RT/EmailParser.pm
+++ b/lib/RT/EmailParser.pm
@@ -338,6 +338,13 @@ sub IsRTAddress {
     }
 
     # we don't warn here, but do in config check
+    if ( my $global_address = RT->Config->Get('CorrespondAddress') ) {
+        return 1 if lc $global_address eq lc $address;
+    }
+    if ( my $global_address = RT->Config->Get('CommentAddress') ) {
+        return 1 if lc $global_address eq lc $address;
+    }
+
     my $queue = RT::Queue->new( $RT::SystemUser );
     $queue->LoadByCols( CorrespondAddress => $address );
     return 1 if $queue->id;
@@ -349,8 +356,6 @@ sub IsRTAddress {
 }
 
 
-
-
 =head2 CullRTAddresses ARRAY
 
 Takes a single argument, an array of email addresses.

commit 22ccde5cdb5ab1ac6e5b69d4af9d0999ea66d00e
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Tue Feb 16 21:13:30 2010 +0300

    change every usage of the IsRTAddress function

diff --git a/lib/RT/Attachment_Overlay.pm b/lib/RT/Attachment_Overlay.pm
index e709814..e2707a7 100644
--- a/lib/RT/Attachment_Overlay.pm
+++ b/lib/RT/Attachment_Overlay.pm
@@ -447,24 +447,20 @@ sub Addresses {
 
     my %data = ();
     my $current_user_address = lc $self->CurrentUser->EmailAddress;
-    my $correspond = lc $self->TransactionObj->TicketObj->QueueObj->CorrespondAddress;
-    my $comment = lc $self->TransactionObj->TicketObj->QueueObj->CommentAddress;
     foreach my $hdr (qw(From To Cc Bcc RT-Send-Cc RT-Send-Bcc)) {
         my @Addresses;
-        my $line      = $self->GetHeader($hdr);
+        my $line = $self->GetHeader($hdr);
         
         foreach my $AddrObj ( Email::Address->parse( $line )) {
             my $address = $AddrObj->address;
             $address = lc RT::User->CanonicalizeEmailAddress($address);
-            next if ( $current_user_address eq $address );
-            next if ( $comment              eq $address );
-            next if ( $correspond           eq $address );
-            next if ( RT::EmailParser->IsRTAddress($address) );
+            next if $current_user_address eq $address;
+            next if RT::EmailParser->IsRTAddress($address);
             push @Addresses, $AddrObj ;
         }
-		$data{$hdr} = \@Addresses;
+        $data{$hdr} = \@Addresses;
     }
-	return \%data;
+    return \%data;
 }
 
 =head2 NiceHeaders
diff --git a/lib/RT/EmailParser.pm b/lib/RT/EmailParser.pm
index 5445080..036743f 100755
--- a/lib/RT/EmailParser.pm
+++ b/lib/RT/EmailParser.pm
@@ -289,9 +289,7 @@ email address and anything that the RT->Config->Get('RTAddressRegexp') matches.
 =cut
 
 sub ParseCcAddressesFromHead {
-
     my $self = shift;
-
     my %args = (
         QueueObj    => undef,
         CurrentUser => undef,
@@ -307,10 +305,8 @@ sub ParseCcAddressesFromHead {
         my $Address = $AddrObj->address;
         my $user = RT::User->new($RT::SystemUser);
         $Address = $user->CanonicalizeEmailAddress($Address);
-        next if ( lc $args{'CurrentUser'}->EmailAddress   eq lc $Address );
-        next if ( lc $args{'QueueObj'}->CorrespondAddress eq lc $Address );
-        next if ( lc $args{'QueueObj'}->CommentAddress    eq lc $Address );
-        next if ( $self->IsRTAddress($Address) );
+        next if lc $args{'CurrentUser'}->EmailAddress eq lc $Address;
+        next if $self->IsRTAddress($Address) );
 
         push ( @Addresses, $Address );
     }
@@ -318,8 +314,6 @@ sub ParseCcAddressesFromHead {
 }
 
 
-
-
 =head2 IsRTaddress ADDRESS
 
 Takes a single parameter, an email address. 
diff --git a/lib/RT/Interface/Email.pm b/lib/RT/Interface/Email.pm
index 6df907c..e0815fb 100755
--- a/lib/RT/Interface/Email.pm
+++ b/lib/RT/Interface/Email.pm
@@ -978,22 +978,14 @@ sub ParseCcAddressesFromHead {
         @_
     );
 
-    my @recipients =
-        map lc $_->address,
+    my $current_address = lc $args{'CurrentUser'}->EmailAddress;
+    my $user = $args{'CurrentUser'}->UserObj;
+
+    return
+        grep $_ ne $current_address && !RT::EmailParser->IsRTAddress( $_ ),
+        map lc $user->CanonicalizeEmailAddress( $_->address ),
         map Email::Address->parse( $args{'Head'}->get( $_ ) ),
         qw(To Cc);
-
-    my @res;
-    foreach my $address ( @recipients ) {
-        $address = $args{'CurrentUser'}->UserObj->CanonicalizeEmailAddress( $address );
-        next if lc $args{'CurrentUser'}->EmailAddress   eq $address;
-        next if lc $args{'QueueObj'}->CorrespondAddress eq $address;
-        next if lc $args{'QueueObj'}->CommentAddress    eq $address;
-        next if RT::EmailParser->IsRTAddress( $address );
-
-        push @res, $address;
-    }
-    return @res;
 }
 
 

commit 3fe9edf416d24f0a40664c0472d861802b0cb6a5
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Tue Feb 16 22:26:58 2010 +0300

    adjust warning wording

diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index cc4b1c1..f552b0c 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -343,8 +343,9 @@ our %META = (
             $RT::Logger->error(
                 'RTAddressRegexp option is not set in the config.'
                 .' Not setting this option result in additional SQL queries to check'
-                .' every address if it belongs to RT or not. These checks are'
-                .' required to avoid mail loops and other consequences.'
+                .' every address if it belongs to RT or not.'
+                .' Especially important to set this option if RT recieves'
+                .' emails on addresses that are not in DB or config.'
             );
         },
     },

commit 25c972b8e107450a1ec406614ad0d8d7d8cf7161
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Wed Feb 17 01:22:38 2010 +0300

    fix some mistakes

diff --git a/lib/RT/EmailParser.pm b/lib/RT/EmailParser.pm
index 036743f..63c7698 100755
--- a/lib/RT/EmailParser.pm
+++ b/lib/RT/EmailParser.pm
@@ -306,7 +306,7 @@ sub ParseCcAddressesFromHead {
         my $user = RT::User->new($RT::SystemUser);
         $Address = $user->CanonicalizeEmailAddress($Address);
         next if lc $args{'CurrentUser'}->EmailAddress eq lc $Address;
-        next if $self->IsRTAddress($Address) );
+        next if $self->IsRTAddress($Address);
 
         push ( @Addresses, $Address );
     }
@@ -332,11 +332,11 @@ sub IsRTAddress {
     }
 
     # we don't warn here, but do in config check
-    if ( my $global_address = RT->Config->Get('CorrespondAddress') ) {
-        return 1 if lc $global_address eq lc $address;
+    if ( my $correspond_address = RT->Config->Get('CorrespondAddress') ) {
+        return 1 if lc $correspond_address eq lc $address;
     }
-    if ( my $global_address = RT->Config->Get('CommentAddress') ) {
-        return 1 if lc $global_address eq lc $address;
+    if ( my $comment_address = RT->Config->Get('CommentAddress') ) {
+        return 1 if lc $comment_address eq lc $address;
     }
 
     my $queue = RT::Queue->new( $RT::SystemUser );

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


More information about the Rt-commit mailing list