package Mail::SpamAssassin::Plugin::URIEval;
use Mail::SpamAssassin::Plugin;
use Mail::SpamAssassin::Logger;
use strict;
use warnings;
use bytes;
use vars qw(@ISA);
@ISA = qw(Mail::SpamAssassin::Plugin);
sub new {
my $class = shift;
my $mailsaobject = shift;
$class = ref($class) || $class;
my $self = $class->SUPER::new($mailsaobject);
bless ($self, $class);
$self->register_eval_rule("check_for_http_redirector");
$self->register_eval_rule("check_https_ip_mismatch");
$self->register_eval_rule("check_uri_truncated");
return $self;
}
sub check_for_http_redirector {
my ($self, $pms) = @_;
foreach ($pms->get_uri_list()) {
while (s{^https?://([^/:\?]+).+?(https?:/{0,2}?([^/:\?]+).*)$}{$2}) {
my ($redir, $dest) = ($1, $3);
foreach ($redir, $dest) {
$_ = Mail::SpamAssassin::Util::uri_to_domain(lc($_)) || $_;
}
next if ($redir eq $dest);
dbg("eval: redirect: found $redir to $dest, flagging");
return 1;
}
}
return 0;
}
sub check_https_ip_mismatch {
my ($self, $pms) = @_;
while (my($k,$v) = each %{$pms->{html}->{uri_detail}}) {
next if ($k !~ m%^https?:/*(?:[^\@/]+\@)?\d+\.\d+\.\d+\.\d+%i);
foreach (@{$v->{anchor_text}}) {
next if (m%^https:/*(?:[^\@/]+\@)?\d+\.\d+\.\d+\.\d+%i);
if (m%https:%i) {
keys %{$self->{html}->{uri_detail}}; return 1;
}
}
}
return 0;
}
sub check_uri_truncated {
my ($self, $pms) = @_;
return $pms->{'uri_truncated'};
}
1;