polyze/Polyze/HPostgreyAccept.pm

52 lines
1.5 KiB
Perl

package Polyze::HPostgreyAccept;
use Moose;
use Domain::PublicSuffix;
with 'Polyze::Handler';
our $DPSuffix = Domain::PublicSuffix->new;
has rreject => (
is => 'ro',
isa => 'Polyze::RReject',
required => 1,
);
sub BUILD { $_[0]->isa_post_day_handler(1); }
my $RegClientName = qr[, client_name=([^,]+)];
my $RegClientAddress = qr[, client_address=([^,]+)];
my $RegSender = qr[, sender=([^,]+)];
my $RegRecipient = qr[, recipient=([^,\n]+)];
sub scan_line {
my ($self, $line) = @_;
if ($line->text =~ m/ postgrey\[[[:digit:]]+\]: action=pass, /) {
my ($client_name) = ($line->text =~ $RegClientName);
$client_name //= '';
my ($client_address) = ($line->text =~ $RegClientAddress);
$client_address //= '';
my ($sender) = ($line->text =~ $RegSender);
$sender //= '';
my ($recipient) = ($line->text =~ $RegRecipient);
$recipient //= '';
# This is in case $client_name is invalid as a domain name.
my $root_domain_or_ip =
$DPSuffix->get_root_domain($client_name) // $client_address;
# Does the current line match with our rreject?
my $is_acceptance = (
$root_domain_or_ip eq $self->rreject->root_domain_or_ip
&& $sender eq $self->rreject->from
&& $recipient eq $self->rreject->to
);
if ($is_acceptance) {
$self->rreject->is_later_accepted(1);
$self->polyze->remove_handler($self);
}
}
return $Polyze::CONTINUE_LINE;
}
no Moose;
__PACKAGE__->meta->make_immutable;