You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by he...@apache.org on 2019/08/04 14:23:20 UTC

svn commit: r1864383 - /spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm

Author: hege
Date: Sun Aug  4 14:23:20 2019
New Revision: 1864383

URL: http://svn.apache.org/viewvc?rev=1864383&view=rev
Log:
Remove ugly goto clauses from get_envelope_from(), cleanup, add cache

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm?rev=1864383&r1=1864382&r2=1864383&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm Sun Aug  4 14:23:20 2019
@@ -2933,11 +2933,13 @@ sub _test_log_line {
 
 ###########################################################################
 
-# helper for get().  Do not call directly, as get() caches its results
-# and this does not!
+# helper for get()
 sub get_envelope_from {
   my ($self) = @_;
 
+  # Cached?
+  return $self->{envelopefrom} if exists $self->{envelopefrom};
+
   # bug 2142:
   # Get the SMTP MAIL FROM:, aka. the "envelope sender", if our
   # calling app has helpfully marked up the source message
@@ -2953,17 +2955,22 @@ sub get_envelope_from {
     # make sure we get the most recent copy - there can be only one EnvelopeSender.
     $envf = $self->get($self->{conf}->{envelope_sender_header}.":addr",undef);
     # ok if it contains an "@" sign, or is "" (ie. "<>" without the < and >)
-    goto ok if defined $envf && (index($envf, '@') > 0 || $envf eq '');
+    if (defined $envf && (index($envf, '@') > 0 || $envf eq '')) {
+      dbg("message: using envelope_sender_header '%s' as EnvelopeFrom: '%s'",
+          $self->{conf}->{envelope_sender_header}, $envf);
+      $self->{envelopefrom} = $envf;
+      return $envf;
+    }
     # Warn them if it's configured, but not there or not usable.
     if (defined $envf) {
-      chomp $envf;
-      dbg("message: envelope_sender_header '%s: %s' is not an FQDN, ignoring",
+      dbg("message: envelope_sender_header '%s': '%s' is not valid, ignoring",
           $self->{conf}->{envelope_sender_header}, $envf);
     } else {
       dbg("message: envelope_sender_header '%s' not found in message",
           $self->{conf}->{envelope_sender_header});
     }
     # Couldn't get envelope-sender using the configured header.
+    $self->{envelopefrom} = undef;
     return;
   }
 
@@ -2986,7 +2993,8 @@ sub get_envelope_from {
     # ok if it contains an "@" sign, or is "" (ie. "<>" without the < and >)
     if (defined $envf && (index($envf, '@') > 0 || $envf eq '')) {
       dbg("message: using $lasthop_str relay envelope-from as EnvelopeFrom: '$envf'");
-      goto ok;
+      $self->{envelopefrom} = $envf;
+      return $envf;
     }
   }
 
@@ -2998,36 +3006,40 @@ sub get_envelope_from {
   # lines, we cannot trust any Envelope-From headers, since they're likely to
   # be incorrect fetchmail guesses.
 
-  if ($self->get("X-Sender") =~ /\@/) {
+  if (index($self->get("X-Sender"), '@') != -1) {
     my $rcvd = join(' ', $self->get("Received"));
-    if ($rcvd =~ /\(fetchmail/) {
+    if (index($rcvd, '(fetchmail') != -1) {
       dbg("message: X-Sender and fetchmail signatures found, cannot trust envelope-from");
+      $self->{envelopefrom} = undef;
       return;
     }
   }
 
   # procmailrc notes this (we now recommend adding it to Received instead)
-  if ($envf = $self->get("X-Envelope-From")) {
+  if (defined($envf = $self->get("X-Envelope-From:addr",undef))) {
     # heuristic: this could have been relayed via a list which then used
     # a *new* Envelope-from.  check
     if ($self->get("ALL") =~ /^Received:.*?^X-Envelope-From:/smi) {
       dbg("message: X-Envelope-From header found after 1 or more Received lines, cannot trust envelope-from");
+      $self->{envelopefrom} = undef;
       return;
     } else {
       dbg("message: using X-Envelope-From header as EnvelopeFrom: '$envf'");
-      goto ok;
+      $self->{envelopefrom} = $envf;
+      return $envf;
     }
   }
 
   # qmail, new-inject(1)
-  if ($envf = $self->get("Envelope-Sender")) {
+  if (defined($envf = $self->get("Envelope-Sender:addr",undef))) {
     # heuristic: this could have been relayed via a list which then used
     # a *new* Envelope-from.  check
     if ($self->get("ALL") =~ /^Received:.*?^Envelope-Sender:/smi) {
       dbg("message: Envelope-Sender header found after 1 or more Received lines, cannot trust envelope-from");
     } else {
       dbg("message: using Envelope-Sender header as EnvelopeFrom: '$envf'");
-      goto ok;
+      $self->{envelopefrom} = $envf;
+      return $envf;
     }
   }
 
@@ -3038,25 +3050,21 @@ sub get_envelope_from {
   #   data.  This use of return-path is required; mail systems MUST support
   #   it.  The return-path line preserves the information in the <reverse-
   #   path> from the MAIL command.
-  if ($envf = $self->get("Return-Path")) {
+  if (defined($envf = $self->get("Return-Path:addr",undef))) {
     # heuristic: this could have been relayed via a list which then used
     # a *new* Envelope-from.  check
     if ($self->get("ALL") =~ /^Received:.*?^Return-Path:/smi) {
       dbg("message: Return-Path header found after 1 or more Received lines, cannot trust envelope-from");
     } else {
       dbg("message: using Return-Path header as EnvelopeFrom: '$envf'");
-      goto ok;
+      $self->{envelopefrom} = $envf;
+      return $envf;
     }
   }
 
   # give up.
+  $self->{envelopefrom} = undef;
   return;
-
-ok:
-  $envf =~ s/^<*//s;            # remove <
-  $envf =~ s/>*\s*\z//s;        # remove >, whitespace, newlines
-
-  return $envf;
 }
 
 ###########################################################################