diff --git a/MANIFEST b/MANIFEST index e4a9e0b..9a7654e 100644 --- a/MANIFEST +++ b/MANIFEST @@ -153,6 +153,7 @@ t/plugin_tests/auth/authnull t/plugin_tests/check_badrcptto t/plugin_tests/greylisting t/plugin_tests/dnsbl +t/plugin_tests/ident/geoip t/plugin_tests/rcpt_ok t/qpsmtpd-address.t t/rset.t diff --git a/config.sample/plugins b/config.sample/plugins index b3d35e2..785c7f7 100644 --- a/config.sample/plugins +++ b/config.sample/plugins @@ -15,6 +15,11 @@ # from one IP! hosts_allow +# information plugins +ident/geoip +#ident/p0f /tmp/.p0f_socket version 3 +#connection_time + # enable to accept MAIL FROM:/RCPT TO: addresses without surrounding <> dont_require_anglebrackets diff --git a/plugins/ident/geoip b/plugins/ident/geoip index bfe8e30..f6b337f 100644 --- a/plugins/ident/geoip +++ b/plugins/ident/geoip @@ -7,27 +7,48 @@ do a lookup on incoming connections and record the country of origin. Thats all it does. -It logs the 2 char country code to note 'geoip_country'. -It logs the country name to the connection note 'geoip_country_name'. +It logs the 2 char country code to connection note I. +It logs the country name to the connection note I. Other plugins can use that info to do things to the connection, like reject or greylist. =cut -use Geo::IP; +use strict; +use warnings; -sub hook_connect { - my ($self) = @_; +use Qpsmtpd::Constants; +#use Geo::IP; # eval'ed in register() - my $geoip = Geo::IP->new(GEOIP_STANDARD); +sub register { + my $self = shift; + eval 'use Geo::IP'; + if ( $@ ) { + warn "could not load Geo::IP"; + $self->log( LOGERROR, "could not load Geo::IP" ); + return; + }; + + $self->register_hook( 'connect', 'connect_handler' ); +}; + +sub connect_handler { + my $self = shift; + + my $geoip = Geo::IP->new(); my $remote_ip = $self->qp->connection->remote_ip; - my $c_code = $geoip->country_code_by_addr( $remote_ip ) - or return DECLINED; # if this fails, so too will name - my $c_name = $geoip->country_name_by_addr( $remote_ip ); + my $c_code = $geoip->country_code_by_addr( $remote_ip ) or do { + $self->log( LOGINFO, "fail: no results" ); + return DECLINED; + }; + + my $c_name = $geoip->country_name_by_addr( $remote_ip ); + if ( $c_name ) { + $self->qp->connection->notes('geoip_country_name', $c_name); + }; - $self->qp->connection->notes('geoip_country_name', $c_name); $self->qp->connection->notes('geoip_country', $c_code); my $message = $c_code; diff --git a/t/plugin_tests/auth/auth_vpopmail b/t/plugin_tests/auth/auth_vpopmail index 11cbdfa..fb9c724 100644 --- a/t/plugin_tests/auth/auth_vpopmail +++ b/t/plugin_tests/auth/auth_vpopmail @@ -1,5 +1,10 @@ #!perl -w +use strict; +use warnings; + +use Qpsmtpd::Constants; + sub register_tests { my $self = shift; @@ -17,7 +22,7 @@ sub test_auth_vpopmail { my $self = shift; if ( ! $self->test_vpopmail_module ) { - $self->log(LOGERROR, "vpopmail plugin not configured" ); + warn "vpopmail plugin not configured\n"; foreach ( 0..2) { ok( 1, "test_auth_vpopmail, skipped") }; return; }; diff --git a/t/plugin_tests/ident/geoip b/t/plugin_tests/ident/geoip new file mode 100644 index 0000000..c5f59ba --- /dev/null +++ b/t/plugin_tests/ident/geoip @@ -0,0 +1,29 @@ +#!perl -w + +use strict; +use warnings; + +use Qpsmtpd::Constants; + +sub register_tests { + my $self = shift; + + eval 'use Geo::IP'; + if ( $@ ) { + warn "could not load Geo::IP\n"; + return; + }; + + $self->register_test('test_geoip_lookup', 2); +}; + +sub test_geoip_lookup { + my $self = shift; + + $self->qp->connection->remote_ip('24.24.24.24'); + cmp_ok( $self->connect_handler(), '==', DECLINED, "exit code"); + + cmp_ok( $self->qp->connection->notes('geoip_country'), 'eq', 'US', "note"); +}; + +