Mark -- you forgot the actual *rule*. ;) --j.
[EMAIL PROTECTED] 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 !~ / \@ ( [EMAIL PROTECTED] \. [EMAIL PROTECTED] ) \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 [EMAIL PROTECTED]; > + > + 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; > } > > ###########################################################################
