Mail-MtPolicyd
view release on metacpan or search on metacpan
lib/Mail/MtPolicyd/Plugin/GeoIPAction.pm view on Meta::CPAN
package Mail::MtPolicyd::Plugin::GeoIPAction;
use Moose;
use namespace::autoclean;
our $VERSION = '2.05'; # VERSION
# ABSTRACT: mtpolicyd plugin for checking geo information of an ip
extends 'Mail::MtPolicyd::Plugin';
with 'Mail::MtPolicyd::Plugin::Role::Scoring';
with 'Mail::MtPolicyd::Plugin::Role::UserConfig' => {
'uc_attributes' => [ 'enabled', 'mode' ],
};
use Mail::MtPolicyd::Plugin::Result;
has 'result_from' => ( is => 'rw', isa => 'Str', required => 1 );
has 'enabled' => ( is => 'rw', isa => 'Str', default => 'on' );
has 'mode' => ( is => 'rw', isa => 'Str', default => 'reject' );
has 'country_codes' => ( is => 'rw', isa => 'Str', required => 1 );
has '_country_codes' => (
is => 'ro', isa => 'ArrayRef', lazy => 1,
default => sub {
my $self = shift;
return [ split(/\s*,\s*/, $self->country_codes) ];
},
);
sub is_in_country_codes {
my ( $self, $cc ) = @_;
if ( grep { $_ eq $cc } @{$self->_country_codes} ) {
return(1);
}
return(0);
}
has 'reject_message' => (
is => 'ro', isa => 'Str', default => 'delivery from %CC% (%IP%) rejected',
);
has 'score' => ( is => 'rw', isa => 'Maybe[Num]' );
sub run {
my ( $self, $r ) = @_;
my $ip = $r->attr('client_address');
my $session = $r->session;
my $mode = $self->get_uc( $session, 'mode' );
my $enabled = $self->get_uc( $session, 'enabled' );
if( $enabled eq 'off' ) {
return;
}
my $result_key = 'geoip-'.$self->result_from.'-result';
if( ! defined $session->{$result_key} ) {
$self->log( $r, 'no GeoIP check result for '.$self->name.' found!');
return;
}
my ( $country_code ) = @{$session->{$result_key}};
if( ! defined $country_code ) {
return;
}
if( ! $self->is_in_country_codes( $country_code ) ) {
$self->log( $r, 'country_code '.$country_code.' of IP not in country_code list'.$self->name);
return;
}
$self->log( $r, 'country code '.$country_code.' on list'.$self->name );
if( defined $self->score && ! $r->is_already_done('geoip-'.$self->name.'-score') ) {
$self->add_score($r, $self->name => $self->score);
}
if( $mode eq 'reject' ) {
return Mail::MtPolicyd::Plugin::Result->new(
action => $self->_get_reject_action($ip, $country_code ),
abort => 1,
);
}
if( $mode eq 'accept' || $mode eq 'dunno' ) {
return Mail::MtPolicyd::Plugin::Result->new_dunno;
}
( run in 1.734 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )