in lib/Mail/SpamAssassin/Plugin/URILocalBL.pm [147:320]
sub set_config {
my ($self, $conf) = @_;
my @cmds;
push (@cmds, {
setting => 'uri_block_cc',
type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
is_priv => 1,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
my $name = $1;
my $args = $2;
my @added;
foreach my $cc (split(/\s+/, uc($args))) {
# this should match all country codes including satellite providers
if ($cc =~ /^((\!)?([a-z][a-z0-9]))$/i) {
if (defined $2) {
$self->{urilocalbl}->{$name}{countries_neg} = 1;
$self->{urilocalbl}->{$name}{countries}{$3} = 0;
} else {
$self->{urilocalbl}->{$name}{countries}{$3} = 1;
}
push @added, $1;
} else {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
}
my %checkneg = map { $_ => 1 } values %{$self->{urilocalbl}->{$name}{countries}};
if (scalar keys %checkneg > 1) {
dbg("config: uri_block_cc $name failed: trying to combine negations and non-negations");
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
dbg("config: uri_block_cc $name added: ".join(' ', @added));
$self->{parser}->add_test($name, 'check_uri_local_bl()',
$Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
$self->{parser}->{conf}->{priority}->{$name} = -100;
}
});
push (@cmds, {
setting => 'uri_block_cont',
type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
is_priv => 1,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
my $name = $1;
my $args = $2;
my @added;
foreach my $cc (split(/\s+/, uc($args))) {
# this should match all continent codes
if ($cc =~ /^((\!)?([a-z]{2}))$/i) {
if (defined $2) {
$self->{urilocalbl}->{$name}{continents_neg} = 1;
$self->{urilocalbl}->{$name}{continents}{$3} = 0;
} else {
$self->{urilocalbl}->{$name}{continents}{$3} = 1;
}
push @added, $1;
} else {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
}
my %checkneg = map { $_ => 1 } values %{$self->{urilocalbl}->{$name}{continents}};
if (scalar keys %checkneg > 1) {
dbg("config: uri_block_cont $name failed: trying to combine negations and non-negations");
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
dbg("config: uri_block_cont $name added: ".join(' ', @added));
$self->{parser}->add_test($name, 'check_uri_local_bl()',
$Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
$self->{parser}->{conf}->{priority}->{$name} = -100;
}
});
push (@cmds, {
setting => 'uri_block_isp',
type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
is_priv => 1,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
my $name = $1;
my $args = $2;
my @added;
# gather up possibly quoted strings
while ($args =~ /("[^"]*"|(?<!")\S+(?!"))/g) {
my $isp = $1;
$isp =~ s/"//g;
my $ispkey = uc($isp); $ispkey =~ s/\s+//gs;
$self->{urilocalbl}->{$name}{isps}{$ispkey} = $isp;
push @added, "\"$isp\"";
}
if (!defined $self->{urilocalbl}->{$name}{isps}) {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
dbg("config: uri_block_isp $name added: ". join(', ', @added));
$self->{parser}->add_test($name, 'check_uri_local_bl()',
$Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
$self->{parser}->{conf}->{priority}->{$name} = -100;
}
});
push (@cmds, {
setting => 'uri_block_cidr',
type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
is_priv => 1,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
my $name = $1;
my $args = $2;
foreach my $addr (split(/\s+/, $args)) {
if ($addr =~ m!^$IP_ADDRESS(?:/\d{1,3})?$!o) {
$self->{urilocalbl}->{$name}{cidr}{$addr} = 1;
} else {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
}
$self->{parser}->add_test($name, 'check_uri_local_bl()',
$Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
$self->{parser}->{conf}->{priority}->{$name} = -100;
}
});
push (@cmds, {
setting => 'uri_block_exclude',
type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
is_priv => 1,
code => sub {
my ($self, $key, $value, $line) = @_;
if ($value !~ /^(${RULENAME_RE})\s+(.+?)\s*$/) {
return $Mail::SpamAssassin::Conf::INVALID_VALUE;
}
my $name = $1;
my $args = $2;
foreach my $arg (split(/\s+/, $args)) {
$self->{urilocalbl}->{$name}{exclusions}{lc($arg)} = 1;
}
$self->{parser}->add_test($name, 'check_uri_local_bl()',
$Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
$self->{parser}->{conf}->{priority}->{$name} = -100;
}
});
$conf->{parser}->register_commands(\@cmds);
}