svn commit: r1934363 - spamassassin/trunk/lib/Mail/SpamAssassin/Plugin

[email protected] Mon, 18 May 2026 21:59:48 -0000
Newsgroups gmane.mail.spam.spamassassin.cvs
Message-ID <177914158806.402278.476382831851043105@svn03-he-fi>
Author: fkento
Date: Mon May 18 21:59:47 2026
New Revision: 1934363

Log:
Preserve anchor_text and types from redirected URL

Modified:
   spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Redirectors.pm
   spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDetail.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Redirectors.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Redirectors.pm	Mon May 18 21:15:34 2026	(r1934362)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Redirectors.pm	Mon May 18 21:59:47 2026	(r1934363)
@@ -1085,6 +1085,7 @@ sub _check_redir {
 
   # Launch HTTP requests
   foreach my $uri (keys %redir_urls) {
+    $redir_urls{$uri}->{source_info} = $pms->{uri_detail_list}->{$uri};
     $self->recursive_lookup($redir_urls{$uri}, $pms, $ua);
   }
 
@@ -1123,7 +1124,7 @@ sub recursive_lookup {
     if ($location =~ /^\d{3}$/) {
       $pms->{"redir_url_$location"} = 1;
       # add uri to uri_detail_list
-      $pms->add_uri_detail_list($redir_url) if !$pms->{uri_detail_list}->{$redir_url};
+      _add_redirect_uri($pms, $redir_url, $redir_url_info->{source_info});
       # Update cache
       $self->cache_add($redir_url, $location);
       return;
@@ -1174,7 +1175,7 @@ sub recursive_lookup {
       $pms->{"redir_url_$rcode"} = 1;
       # Update cache
       $self->cache_add($redir_url, $rcode);
-      $pms->add_uri_detail_list($redir_url) if !$pms->{uri_detail_list}->{$redir_url};
+      _add_redirect_uri($pms, $redir_url, $redir_url_info->{source_info});
       if($rcode !~ /^30[12]/) {
         # Calling quit prevents session_id from beeing reused
         # $ua->quit();
@@ -1209,7 +1210,7 @@ sub recursive_lookup {
             $pms->{"redir_url_$rcode"} = 1;
             # Update cache
             $self->cache_add($redir_url, $rcode);
-            $pms->add_uri_detail_list($redir_url) if !$pms->{uri_detail_list}->{$redir_url};
+            _add_redirect_uri($pms, $redir_url, $redir_url_info->{source_info});
           }
         }
         if($rcode !~ /^30[12]/) {
@@ -1302,15 +1303,38 @@ sub recursive_lookup {
     return;
   }
 
-  $pms->add_uri_detail_list($location) if !$pms->{uri_detail_list}->{$location};
+  _add_redirect_uri($pms, $location, $redir_url_info->{source_info});
 
   # Check for recursion
-  if (my $redir_url_info = _check_redirector_uri($location, $conf)) {
+  if (my $new_redir_url_info = _check_redirector_uri($location, $conf)) {
+    # Propagate the original source info through the chain so types and
+    # anchor_text from the message-level URI keep getting merged in.
+    $new_redir_url_info->{source_info} = $redir_url_info->{source_info};
     # Recurse...
-    $self->recursive_lookup($redir_url_info, $pms, $ua, %been_here);
+    $self->recursive_lookup($new_redir_url_info, $pms, $ua, %been_here);
   }
 }
 
+sub _add_redirect_uri {
+  my ($pms, $uri, $src) = @_;
+
+  my %types = $src && $src->{types} ? %{$src->{types}} : ();
+  $types{redirect} = 1;
+
+  my $added = $pms->add_uri_detail_list($uri, \%types);
+
+  if ($src && $src->{anchor_text} && @{$src->{anchor_text}}) {
+    my $dst = $pms->{uri_detail_list}->{$uri} ||= {};
+    my %seen;
+    $seen{$_}++ for @{$dst->{anchor_text} || []};
+    foreach my $at (@{$src->{anchor_text}}) {
+      push @{$dst->{anchor_text}}, $at unless $seen{$at}++;
+    }
+  }
+
+  return $added;
+}
+
 sub cache_add {
   my ($self, $redir_url, $target_url) = @_;
 

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDetail.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDetail.pm	Mon May 18 21:15:34 2026	(r1934362)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/URIDetail.pm	Mon May 18 21:59:47 2026	(r1934363)
@@ -41,7 +41,10 @@ C<raw> is the raw URI prior to any clean
 
 C<type> is the tag(s) which referenced the raw_uri.  I<parsed> is a
 faked type which specifies that the raw_uri was parsed from the
-rendered text.
+rendered text.  I<redirect> is a faked type which specifies that the
+raw_uri was discovered by following a URL redirector (see the
+Redirectors plugin); the tag(s) from the originating URI are also
+preserved on the redirected entry.
 
 C<cleaned> is a list including the raw URI and various cleaned
 versions of the raw URI (http://spamassassin.apache%2Eorg/,