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;
> }
>
> ###########################################################################