Mail-MtPolicyd

 view release on metacpan or  search on metacpan

lib/Mail/MtPolicyd/Plugin/SaAwlLookup.pm  view on Meta::CPAN

package Mail::MtPolicyd::Plugin::SaAwlLookup;

use Moose;
use namespace::autoclean;

our $VERSION = '2.05'; # VERSION
# ABSTRACT: mtpolicyd plugin for querying a spamassassin AWL database for reputation

extends 'Mail::MtPolicyd::Plugin';

use Mail::MtPolicyd::Plugin::Result;

use BerkeleyDB;
use BerkeleyDB::Hash;

use NetAddr::IP;


has 'db_file' => ( is => 'rw', isa => 'Str',
    default => '/var/lib/amamvis/.spamassassin/auto-whitelist'
);

has '_awl' => (
	is => 'ro', isa => 'HashRef', lazy => 1,
	default => sub {
		my $self = shift;
		my %map;
		my $db = tie %map, 'BerkeleyDB::Hash',
			-Filename => $self->db_file,
			-Flags => DB_RDONLY
		or die "Cannot open ".$self->db_file.": $!\n" ;
		return(\%map);
	},
);

sub truncate_ip_v4 {
    my ( $self, $ip ) = @_;
    if( $ip =~ m/^(\d+\.\d+).\d+.\d+$/ ) {
        return( $1 );
    }
    return;
}

sub truncate_ip_v6 {
    my ( $self, $ip ) = @_;
    my $addr = NetAddr::IP->new6( $ip.'/48' );
    if( ! defined $addr ) {
        return;
    }
    my $result = $addr->network->full6;
    $result =~ s/(:0000)+/::/;
    return $result;
}

sub truncate_ip {
    my ( $self, $ip ) = @_;

    if( $ip =~ /:/) {
        return $self->truncate_ip_v6($ip);
    }
    return $self->truncate_ip_v4($ip);
}

sub query_awl {
    my ( $self, $addr, $ip ) = @_;
    my $ip_key = $self->truncate_ip( $ip );
    if( ! defined $ip_key ) {
        return;
    }
    my $count = $self->_awl->{$addr.'|ip='.$ip_key};
    if( ! defined $count ) { return; }

    my $total = $self->_awl->{$addr.'|ip='.$ip_key.'|totscore'};
    if( ! defined $total ) { return; }

    my $score = $total / $count;

    return( $count, $score );
}

sub run {
	my ( $self, $r ) = @_;
	my $addr = $r->attr('sender');
	my $ip = $r->attr('client_address');



( run in 0.943 second using v1.01-cache-2.11-cpan-fe3c2283af0 )