Mail-MtPolicyd

 view release on metacpan or  search on metacpan

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

package Mail::MtPolicyd::Plugin::PostfixMap;

use Moose;
use namespace::autoclean;

our $VERSION = '2.05'; # VERSION
# ABSTRACT: mtpolicyd plugin for accessing a postfix access map

extends 'Mail::MtPolicyd::Plugin';
with 'Mail::MtPolicyd::Plugin::Role::Scoring';
with 'Mail::MtPolicyd::Plugin::Role::UserConfig' => {
	'uc_attributes' => [ 'enabled' ],
};

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

use BerkeleyDB;
use BerkeleyDB::Hash;


has 'enabled' => ( is => 'rw', isa => 'Str', default => 'on' );

has 'db_file' => ( is => 'rw', isa => 'Str', required => 1 );
has _map => (
	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" ;
		$db->filter_fetch_key  ( sub { s/\0$//    } ) ;
		$db->filter_store_key  ( sub { $_ .= "\0" } ) ;
		$db->filter_fetch_value( sub { s/\0$//    } ) ;
		$db->filter_store_value( sub { $_ .= "\0" } ) ;
		return(\%map);
	},
);

has 'score' => ( is => 'rw', isa => 'Maybe[Num]' );
has 'match_action' => ( is => 'rw', isa => 'Maybe[Str]' );
has 'not_match_action' => ( is => 'rw', isa => 'Maybe[Str]' );

sub _match_ipv4 {
	my ( $self, $ip ) = @_;
	my @octs = split('\.', $ip);

	while( @octs ) {
		my $key = join('.', @octs);
		my $value = $self->_map->{$key};
		if( defined $value ) {
			return( $key, $value );
		}
		pop(@octs);
	}

	return;
}

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

	for(;;) {
		my $value = $self->_map->{$ip};
		if( $value ) {
			return( $ip, $value );
		}
		if( $ip !~ m/:/) {
			last;
		}
		# remove last part
		$ip =~ s/:+[^:]+$//;
	}

	return;
}

sub _query_db {
	my ( $self, $ip ) = @_;
	my ( $key, $value );
	if( $ip =~ m/^\d+\.\d+\.\d+\.\d+$/) {
		( $key, $value ) = $self->_match_ipv4( $ip );
	} elsif( $ip =~ m/^[:0-9a-f]+$/) {
		( $key, $value ) = $self->_match_ipv6( $ip );



( run in 3.117 seconds using v1.01-cache-2.11-cpan-f56aa216473 )