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 2018/09/26 14:21:13 UTC
svn commit: r1842029 - in /spamassassin:
branches/3.4/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm
trunk/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm
Author: hege
Date: Wed Sep 26 14:21:12 2018
New Revision: 1842029
URL: http://svn.apache.org/viewvc?rev=1842029&view=rev
Log:
Bug 7624 - fix fns_ignore_dkim etc cleanup
Modified:
spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm
spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm
Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm?rev=1842029&r1=1842028&r2=1842029&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm Wed Sep 26 14:21:12 2018
@@ -108,7 +108,7 @@ score FROMNAME_SPOOF_EQUALS_TO 1.2
use strict;
package Mail::SpamAssassin::Plugin::FromNameSpoof;
-my $VERSION = 0.8;
+my $VERSION = 0.9;
use Mail::SpamAssassin::Plugin;
use List::Util ();
@@ -161,31 +161,32 @@ sub set_config {
push (@cmds, {
setting => 'fns_add_addrlist',
- type => 5,
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST,
code => sub {
- my($conf, $key, $value, $line) = @_;
+ my($self, $key, $value, $line) = @_;
local($1,$2);
if ($value !~ /^ \( (.*?) \) \s+ (.*) \z/sx) {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
my $listname = "FNS_$1";
$value = $2;
- $conf->{parser}->add_to_addrlist ($listname, split(/\s+/, $value));
+ $self->{parser}->add_to_addrlist ($listname, split(/\s+/, lc($value)));
+ $self->{fns_addrlists}{$listname} = 1;
}
});
push (@cmds, {
setting => 'fns_remove_addrlist',
- type => 5,
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST,
code => sub {
- my($conf, $key, $value, $line) = @_;
+ my($self, $key, $value, $line) = @_;
local($1,$2);
if ($value !~ /^ \( (.*?) \) \s+ (.*) \z/sx) {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
my $listname = "FNS_$1";
$value = $2;
- $conf->{parser}->remove_from_addrlist ($listname, split (/\s+/, $value));
+ $self->{parser}->remove_from_addrlist ($listname, split (/\s+/, $value));
}
});
@@ -197,29 +198,27 @@ sub set_config {
push (@cmds, {
setting => 'fns_ignore_dkim',
- default => [],
- type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRINGLIST,
+ default => {},
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value eq '') {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
- $self->{fns_ignore_dkim} = {};
- $self->{fns_ignore_dkim}->{$_} = 1 for (split(/\s+/, $value));
+ $self->{fns_ignore_dkim}->{$_} = 1 foreach (split(/\s+/, lc($value)));
}
});
push (@cmds, {
setting => 'fns_ignore_headers',
- default => [],
- type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRINGLIST,
+ default => {},
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value eq '') {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
- $self->{fns_ignore_header} = {};
- $self->{fns_ignore_header}->{$_} = 1 for (split(/\s+/, $value));
+ $self->{fns_ignore_header}->{$_} = 1 foreach (split(/\s+/, $value));
}
});
@@ -262,7 +261,7 @@ sub check_fromname_spoof
my ($self, $pms, $check_lvl) = @_;
$self->_check_fromnamespoof($pms);
- $check_lvl //= $self->{main}{conf}{fns_check};
+ $check_lvl //= $pms->{conf}->{fns_check};
my @array = (
($pms->{fromname_address_different}) ,
@@ -308,6 +307,8 @@ sub _check_fromnamespoof
return if (defined $pms->{fromname_contains_email});
+ my $conf = $pms->{conf};
+
$pms->{fromname_contains_email} = 0;
$pms->{fromname_address_different} = 0;
$pms->{fromname_equals_to_addr} = 0;
@@ -316,19 +317,28 @@ sub _check_fromnamespoof
$pms->{fromname_equals_replyto} = 0;
foreach my $addr (split / /, $pms->get_tag('DKIMDOMAIN') || '') {
- return 0 if ($self->{main}{conf}{fns_ignore_dkim}{$addr});
+ if ($conf->{fns_ignore_dkim}->{lc($addr)}) {
+ dbg("ignoring, DKIM signed: $addr");
+ return 0;
+ }
}
- foreach my $iheader (keys %{$self->{main}{conf}{fns_ignore_header}}) {
- return 0 if ($pms->get($iheader));
+ foreach my $iheader (keys %{$conf->{fns_ignore_header}}) {
+ if ($pms->get($iheader)) {
+ dbg("ignoring, header $iheader found");
+ return 0 if ($pms->get($iheader));
+ }
}
my $list_refs = {};
- foreach my $conf (keys %{$self->{main}{conf}}) {
- if ($conf =~ /^FNS_/) {
- $list_refs->{$conf} = $self->{main}{conf}{$conf};
+ if ($conf->{fns_addrlists}) {
+ my @lists = keys %{$conf->{fns_addrlists}};
+ foreach my $list (@lists) {
+ $list_refs->{$list} = $conf->{$list};
}
+ s/^FNS_// foreach (@lists);
+ dbg("using addrlists: ".join(', ', @lists));
}
my %fnd = ();
@@ -341,7 +351,7 @@ sub _check_fromnamespoof
my $nochar = ($fnd{'addr'} =~ y/A-Za-z0-9//c);
$nochar -= ($1 =~ y/A-Za-z0-9//c);
- return 0 unless ((length($fnd{'addr'})+$nochar) - length($1) <= $self->{main}{conf}{'fns_extrachars'});
+ return 0 unless ((length($fnd{'addr'})+$nochar) - length($1) <= $conf->{'fns_extrachars'});
$fnd{'addr'} = lc $1;
} else {
@@ -389,9 +399,9 @@ sub _check_fromnamespoof
$pms->set_tag("FNSFNAMEDOMAIN", $fnd{'domain'});
$pms->set_tag("FNSFADDRDOMAIN", $fad{'domain'});
- dbg("From name spoof: $fnd{'addr'} $fnd{'domain'} $fnd{'owner'}");
- dbg("Actual From: $fad{'addr'} $fad{'domain'} $fad{'owner'}");
- dbg("To Address: $tod{'addr'} $tod{'domain'} $tod{'owner'}");
+ dbg("From name spoof: $fnd{addr} $fnd{domain} $fnd{owner}");
+ dbg("Actual From: $fad{addr} $fad{domain} $fad{owner}");
+ dbg("To Address: $tod{addr} $tod{domain} $tod{owner}");
}
}
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm?rev=1842029&r1=1842028&r2=1842029&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/FromNameSpoof.pm Wed Sep 26 14:21:12 2018
@@ -108,7 +108,7 @@ score FROMNAME_SPOOF_EQUALS_TO 1.2
use strict;
package Mail::SpamAssassin::Plugin::FromNameSpoof;
-my $VERSION = 0.8;
+my $VERSION = 0.9;
use Mail::SpamAssassin::Plugin;
use List::Util ();
@@ -161,31 +161,32 @@ sub set_config {
push (@cmds, {
setting => 'fns_add_addrlist',
- type => 5,
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST,
code => sub {
- my($conf, $key, $value, $line) = @_;
+ my($self, $key, $value, $line) = @_;
local($1,$2);
if ($value !~ /^ \( (.*?) \) \s+ (.*) \z/sx) {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
my $listname = "FNS_$1";
$value = $2;
- $conf->{parser}->add_to_addrlist ($listname, split(/\s+/, $value));
+ $self->{parser}->add_to_addrlist ($listname, split(/\s+/, lc($value)));
+ $self->{fns_addrlists}{$listname} = 1;
}
});
push (@cmds, {
setting => 'fns_remove_addrlist',
- type => 5,
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST,
code => sub {
- my($conf, $key, $value, $line) = @_;
+ my($self, $key, $value, $line) = @_;
local($1,$2);
if ($value !~ /^ \( (.*?) \) \s+ (.*) \z/sx) {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
my $listname = "FNS_$1";
$value = $2;
- $conf->{parser}->remove_from_addrlist ($listname, split (/\s+/, $value));
+ $self->{parser}->remove_from_addrlist ($listname, split (/\s+/, $value));
}
});
@@ -197,29 +198,27 @@ sub set_config {
push (@cmds, {
setting => 'fns_ignore_dkim',
- default => [],
- type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRINGLIST,
+ default => {},
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value eq '') {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
- $self->{fns_ignore_dkim} = {};
- $self->{fns_ignore_dkim}->{$_} = 1 for (split(/\s+/, $value));
+ $self->{fns_ignore_dkim}->{$_} = 1 foreach (split(/\s+/, lc($value)));
}
});
push (@cmds, {
setting => 'fns_ignore_headers',
- default => [],
- type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRINGLIST,
+ default => {},
+ type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value eq '') {
return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
}
- $self->{fns_ignore_header} = {};
- $self->{fns_ignore_header}->{$_} = 1 for (split(/\s+/, $value));
+ $self->{fns_ignore_header}->{$_} = 1 foreach (split(/\s+/, $value));
}
});
@@ -262,7 +261,7 @@ sub check_fromname_spoof
my ($self, $pms, $check_lvl) = @_;
$self->_check_fromnamespoof($pms);
- $check_lvl //= $self->{main}{conf}{fns_check};
+ $check_lvl //= $pms->{conf}->{fns_check};
my @array = (
($pms->{fromname_address_different}) ,
@@ -308,6 +307,8 @@ sub _check_fromnamespoof
return if (defined $pms->{fromname_contains_email});
+ my $conf = $pms->{conf};
+
$pms->{fromname_contains_email} = 0;
$pms->{fromname_address_different} = 0;
$pms->{fromname_equals_to_addr} = 0;
@@ -316,19 +317,28 @@ sub _check_fromnamespoof
$pms->{fromname_equals_replyto} = 0;
foreach my $addr (split / /, $pms->get_tag('DKIMDOMAIN') || '') {
- return 0 if ($self->{main}{conf}{fns_ignore_dkim}{$addr});
+ if ($conf->{fns_ignore_dkim}->{lc($addr)}) {
+ dbg("ignoring, DKIM signed: $addr");
+ return 0;
+ }
}
- foreach my $iheader (keys %{$self->{main}{conf}{fns_ignore_header}}) {
- return 0 if ($pms->get($iheader));
+ foreach my $iheader (keys %{$conf->{fns_ignore_header}}) {
+ if ($pms->get($iheader)) {
+ dbg("ignoring, header $iheader found");
+ return 0 if ($pms->get($iheader));
+ }
}
my $list_refs = {};
- foreach my $conf (keys %{$self->{main}{conf}}) {
- if ($conf =~ /^FNS_/) {
- $list_refs->{$conf} = $self->{main}{conf}{$conf};
+ if ($conf->{fns_addrlists}) {
+ my @lists = keys %{$conf->{fns_addrlists}};
+ foreach my $list (@lists) {
+ $list_refs->{$list} = $conf->{$list};
}
+ s/^FNS_// foreach (@lists);
+ dbg("using addrlists: ".join(', ', @lists));
}
my %fnd = ();
@@ -341,7 +351,7 @@ sub _check_fromnamespoof
my $nochar = ($fnd{'addr'} =~ y/A-Za-z0-9//c);
$nochar -= ($1 =~ y/A-Za-z0-9//c);
- return 0 unless ((length($fnd{'addr'})+$nochar) - length($1) <= $self->{main}{conf}{'fns_extrachars'});
+ return 0 unless ((length($fnd{'addr'})+$nochar) - length($1) <= $conf->{'fns_extrachars'});
$fnd{'addr'} = lc $1;
} else {
@@ -389,9 +399,9 @@ sub _check_fromnamespoof
$pms->set_tag("FNSFNAMEDOMAIN", $fnd{'domain'});
$pms->set_tag("FNSFADDRDOMAIN", $fad{'domain'});
- dbg("From name spoof: $fnd{'addr'} $fnd{'domain'} $fnd{'owner'}");
- dbg("Actual From: $fad{'addr'} $fad{'domain'} $fad{'owner'}");
- dbg("To Address: $tod{'addr'} $tod{'domain'} $tod{'owner'}");
+ dbg("From name spoof: $fnd{addr} $fnd{domain} $fnd{owner}");
+ dbg("Actual From: $fad{addr} $fad{domain} $fad{owner}");
+ dbg("To Address: $tod{addr} $tod{domain} $tod{owner}");
}
}