diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dfffe9f..7ebe073 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,18 +5,23 @@ on: pull_request: jobs: + test: strategy: matrix: - os: ["ubuntu-latest"] - perl: ["5.16", "5.32"] + perl-version: + - "5.16" + - "5.26" + - "5.38" fail-fast: false runs-on: ubuntu-latest + services: redis: image: redis ports: - 6379:6379 + steps: - uses: actions/checkout@v4 with: diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP index f281243..df40cf2 100644 --- a/MANIFEST.SKIP +++ b/MANIFEST.SKIP @@ -37,4 +37,4 @@ packaging ^supervise/ ^ssl/ ^t/config/greylist -^.github \ No newline at end of file +^.github/ diff --git a/META.yml b/META.yml index 69d9edd..03e0248 100644 --- a/META.yml +++ b/META.yml @@ -18,16 +18,24 @@ no_index: - t - inc requires: + CDB_File: 0 Data::Dumper: 0 Date::Parse: 0 + File::NFSLock: 0 File::Tail: 0 File::Temp: 0 + GeoIP2: 0 IO::Socket::SSL: 0 MIME::Base64: 0 Mail::DKIM: 0 + Mail::DMARC: 0 Mail::Header: 0 + Mail::SPF: 0 Net::DNS: 0.39 Net::IP: 0 + Redis: 0 Time::HiRes: 0 Time::TAI64: 0 -version: 0.91 + Test::More: 0 + Test::Output: 0 +version: 1.00 diff --git a/Makefile.PL b/Makefile.PL index 125b8c7..1662631 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -31,7 +31,7 @@ WriteMakefile( # 'DBI' => 0, # auth_vpopmail_sql and # 'DBD::mysql' => 0, # log2sql # 'DBIx::Simple' => 0, # log2sql - 'Geo::IP' => 1, + 'GeoIP2' => 2, 'Mail::SpamAssassin' => 0, 'Math::Complex' => 0, # geodesic distance in Geo::IP 'PerlIO::gzip' => 0, # gunzip GeoIP databases diff --git a/config.sample/plugins b/config.sample/plugins index 28684a6..ead5a88 100644 --- a/config.sample/plugins +++ b/config.sample/plugins @@ -22,7 +22,7 @@ hosts_allow # connection / informational plugins #connection_time #karma penalty_box 1 reject naughty -ident/geoip +#ident/geoip #ident/p0f /tmp/.p0f_socket version 3 fcrdns @@ -90,7 +90,7 @@ spamassassin reject 12 # spamassassin reject 20 munge_subject_threshold 10 # dspam must run after spamassassin for the learn_from_sa feature to work -dspam autolearn spamassassin reject 0.95 +#dspam autolearn spamassassin reject 0.95 # run the clamav virus checking plugin (max size in Kb) # virus/clamav diff --git a/t/plugin_tests/dmarc b/t/plugin_tests/dmarc index 58c0909..5092ac9 100644 --- a/t/plugin_tests/dmarc +++ b/t/plugin_tests/dmarc @@ -43,4 +43,4 @@ sub _check_dmarc { cmp_ok($msg, 'eq', 'failed DMARC policy', 'check_dmarc, no SPF'); #warn $self->qp->connection->notes('authentication_results'); -} \ No newline at end of file +} diff --git a/t/plugin_tests/helo b/t/plugin_tests/helo index f144ab3..03aa491 100644 --- a/t/plugin_tests/helo +++ b/t/plugin_tests/helo @@ -55,7 +55,7 @@ sub test_invalid_localhost { my ($err, $why); foreach my $ip ( undef, '', '192.0.99.5' ) { $self->qp->connection->remote_ip(undef); - ($err, $why) = $self->invalid_localhost('localhost' ); + ($err, $why) = $self->invalid_localhost('localhost'); ok($err, "host: localhost, remote ip ($ip)"); $self->qp->connection->remote_ip(undef); diff --git a/t/plugin_tests/ident/geoip b/t/plugin_tests/ident/geoip index 5436866..7c46b02 100644 --- a/t/plugin_tests/ident/geoip +++ b/t/plugin_tests/ident/geoip @@ -13,19 +13,6 @@ sub register_tests { if ( !$@ ) { $self->register_test('test_geoip2_lookup'); } - - eval 'use Geo::IP'; - if ( !$@ ) { - $self->register_test('test_geoip_lookup'); - $self->register_test('test_geoip_load_db'); - $self->register_test('test_geoip_init_cc'); - $self->register_test('test_set_country_code'); - $self->register_test('test_set_country_name'); - $self->register_test('test_set_continent'); - $self->register_test('test_set_distance'); - $self->register_test('test_set_asn'); - $self->register_test('test_add_headers'); - } } sub test_geoip2_lookup { @@ -41,7 +28,7 @@ sub test_geoip2_lookup { cmp_ok( $self->connection->notes('geoip_country'), 'eq', 'US', "24.24.24.24 is in country US"); cmp_ok( $self->connection->notes('geoip_country_name'), 'eq', 'United States', "24.24.24.24 is in country United States"); cmp_ok( $self->connection->notes('geoip_continent'), 'eq', 'NA', "24.24.24.24 is in continent NA"); - cmp_ok( $self->connection->notes('geoip_city'), 'eq', 'Deer Park', "24.24.24.24 is in city of Deer Park"); + cmp_ok( $self->connection->notes('geoip_city'), 'eq', 'Syracuse', "24.24.24.24 is in city of Syracuse"); } sub test_add_headers { @@ -68,173 +55,3 @@ sub all_headers { return join " | ", map { chomp $_; $_ } $self->transaction->header->get($tag); } -sub test_geoip_lookup { - my $self = shift; - - $self->qp->connection->remote_ip('24.24.24.24'); - cmp_ok( $self->geoip_lookup(), '==', DECLINED, "exit code"); - - cmp_ok( $self->connection->notes('geoip_country'), 'eq', 'US', "24.24.24.24 is in the US"); -} - -sub test_geoip_load_db { - my $self = shift; - - $self->open_geoip_db(); - - if ( $self->{_geoip_city} ) { - ok( ref $self->{_geoip_city}, "loaded GeoIP city db" ); - } - else { - ok( "no GeoIP city db" ); - } - - if ( $self->{_geoip} ) { - ok( ref $self->{_geoip}, "loaded GeoIP db" ); - } - else { - ok( "no GeoIP db" ); - } -} - -sub test_geoip_init_cc { - my $self = shift; - - $self->{_my_country_code} = undef; - ok( ! $self->{_my_country_code}, "undefined"); - - my $test_ip = '208.175.177.10'; - $self->{_args}{distance} = $test_ip; - $self->init_my_country_code( $test_ip ); - cmp_ok( $self->{_my_country_code}, 'eq', 'US', "country set and matches"); -} - -sub test_set_country_code { - my $self = shift; - - $self->qp->connection->remote_ip(''); - my $cc = $self->set_country_code(); - ok( ! $cc, "undef"); - - $self->qp->connection->remote_ip('24.24.24.24'); - $self->clear_geoip_data; - $cc = $self->set_country_code(); - ok( ! $cc, "set_country_code() returns nothing for no geoip data"); - $self->restore_geoip_data; - $cc = $self->set_country_code(); - cmp_ok( $cc, 'eq', 'US', "set_country_code result is $cc"); - - my $note = $self->connection->notes('geoip_country'); - cmp_ok( $note, 'eq', 'US', "set_country_code set note to $cc"); -} - -sub test_set_country_name { - my $self = shift; - - $self->{_geoip_record} = undef; - $self->qp->connection->remote_ip(''); - $self->set_country_code(); - my $cn = $self->set_country_name(); - ok( ! $cn, "undef") or warn "$cn\n"; - - $self->qp->connection->remote_ip('24.24.24.24'); - $self->clear_geoip_data; - $self->set_country_code(); - $cn = $self->set_country_name(); - ok( ! $cn, "set_country_name() returns nothing for no geoip data"); - $self->restore_geoip_data; - $self->set_country_code(); - $cn = $self->set_country_name(); - cmp_ok( $cn, 'eq', 'United States', "$cn"); - - my $note = $self->connection->notes('geoip_country_name'); - cmp_ok( $note, 'eq', 'United States', "note has: $cn"); -} - -sub test_set_continent { - my $self = shift; - - $self->{_geoip_record} = undef; - $self->qp->connection->remote_ip(''); - $self->set_country_code(); - my $cn = $self->set_continent(); - ok( ! $cn, "undef") or warn "$cn\n"; - - $self->qp->connection->remote_ip('24.24.24.24'); - $self->clear_geoip_data; - $self->set_country_code(); - $cn = $self->set_continent('US'); - ok( ! $cn, 'set_continent() returns nothing for no geoip data'); - $self->restore_geoip_data; - $self->set_country_code(); - $cn = $self->set_continent() || ''; - my $note = $self->connection->notes('geoip_continent'); - if ( $cn ) { - cmp_ok( $cn, 'eq', 'NA', "$cn"); - cmp_ok( $note, 'eq', 'NA', "note has: $cn"); - } - else { - ok(1, "no continent data" ); - ok(1, "no continent data" ); - } -} - -sub test_set_distance { - my $self = shift; - - $self->{_geoip_record} = undef; - $self->qp->connection->remote_ip(''); - $self->set_country_code(); - my $cn = $self->set_distance_gc(); - ok( ! $cn, "undef") or warn "$cn\n"; - - $self->qp->connection->remote_ip('24.24.24.24'); - $self->set_country_code(); - $cn = $self->set_distance_gc(); - if ( $cn ) { - ok( $cn, "$cn km"); - - my $note = $self->connection->notes('geoip_distance'); - ok( $note, "note has: $cn"); - } - else { - ok( 1, "no distance data"); - ok( 1, "no distance data"); - } -} - -sub test_set_asn { - my $self = shift; - - return if !$self->{GeoIPASNum}; - - $self->qp->connection->remote_ip(''); - $self->set_asn(); - my $asn = $self->set_asn(); - ok( ! $asn, "undef") or warn "$asn\n"; - - $self->qp->connection->remote_ip('24.24.24.24'); - $self->clear_geoip_data; - $asn = $self->set_asn(); - ok( ! $asn, 'set_asn() returns nothing for no ASN data' ); - $self->restore_geoip_data; - $asn = $self->set_asn(); - ok( $self->connection->notes('geoip_asn') =~ /^11351/, "note has: $asn"); - - $self->qp->connection->remote_ip('66.128.51.163'); - $asn = $self->set_asn(); - - ok( $self->connection->notes('geoip_asn') =~ /^7819/, "note has: $asn"); -} - -my $geoip_data_bak; -my @geoip_keys = qw( _geoip _geoip_city GeoIPASNum ); -sub clear_geoip_data { - my ( $self ) = @_; - $geoip_data_bak->{$_} = delete $self->{$_} for @geoip_keys; -} - -sub restore_geoip_data { - my ( $self ) = @_; - $self->{$_} = delete $geoip_data_bak->{$_} for @geoip_keys; -}