You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@spamassassin.apache.org by Justin Mason <jm...@jmason.org> on 2008/02/07 10:27:04 UTC

Re: svn commit: r619221 - /spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm

Mark -- you forgot the actual *rule*. ;)

--j.

mmartinec@apache.org writes:
> Author: mmartinec
> Date: Wed Feb  6 15:40:10 2008
> New Revision: 619221
> 
> URL: http://svn.apache.org/viewvc?rev=619221&view=rev
> Log:
> new eval rule "check_mailfrom_matches_rcvd": check if domain name of an envelope sender address matches a domain name of the first untrusted relay (if any), or any trusted relay otherwise
> 
> Modified:
>  spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm
> 
> Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm
> URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm?rev=619221&r1=619220&r2=619221&view=diff
> ==============================================================================
> --- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm (original)
> +++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/WLBLEval.pm Wed Feb  6 15:40:10 2008
> @@ -50,6 +50,7 @@
> $self->register_eval_rule("check_forged_in_whitelist");
> $self->register_eval_rule("check_from_in_default_whitelist");
> $self->register_eval_rule("check_forged_in_default_whitelist");
> +  $self->register_eval_rule("check_mailfrom_matches_rcvd");
>  
> return $self;
>  }
> @@ -229,6 +230,59 @@
>  
> $pms->{from_in_default_whitelist} = $found_match;
> return;
> +}
> +
> +###########################################################################
> +
> +# check if domain name of an envelope sender address matches a domain name
> +# of the first untrusted relay (if any), or any trusted relay otherwise
> +sub check_mailfrom_matches_rcvd {
> +  my ($self, $pms) = @_;
> +  my $sender = $pms->get("EnvelopeFrom:addr");
> +  return 0  if !defined $sender || $sender eq '';
> +  return $self->_check_addr_matches_rcvd($pms,$sender);
> +}
> +
> +# check if domain name of a supplied e-mail address matches a domain name
> +# of the first untrusted relay (if any), or any trusted relay otherwise
> +sub _check_addr_matches_rcvd {
> +  my ($self, $pms, $addr) = @_;
> +
> +  local $1;
> +  return 0  if $addr !~ / \@ ( [^\@]+ \. [^\@]+ ) \z/x;
> +  my $addr_domain = lc $1;
> +
> +  my @relays;
> +  if ($pms->{num_relays_untrusted} > 0) {
> +    # check against the first untrusted, if present
> +    @relays = $pms->{relays_untrusted}->[0];
> +  } elsif ($pms->{num_relays_trusted} > 0) {
> +    # otherwise try all trusted ones, but only do so
> +    # if there are no untrusted relays to avoid forgery
> +    push(@relays, @{$pms->{relays_trusted}});
> +  }
> +  return 0  if !@relays;
> +
> +  my($adrh,$adrd) =
> +    Mail::SpamAssassin::Util::RegistrarBoundaries::split_domain($addr_domain);
> +  my $match = 0;
> +  my $any_tried = 0;
> +  foreach my $rly (@relays) {
> +    my $relay_rdns = $rly->{lc_rdns};
> +    next  if !defined $relay_rdns || $relay_rdns eq '';
> +    my($rlyh,$rlyd) =
> +      Mail::SpamAssassin::Util::RegistrarBoundaries::split_domain($relay_rdns);
> +    $any_tried = 1;
> +    if ($adrd eq $rlyd) {
> +      dbg("rules: $addr MATCHES relay $relay_rdns ($adrd)");
> +      $match = 1; last;
> +    }
> +  }
> +  if ($any_tried && !$match) {
> +    dbg("rules: %s does NOT match relay(s) %s",
> +        $addr, join(', ', map { $_->{lc_rdns} } @relays));
> +  }
> +  return $match;
>  }
>  
>  ###########################################################################