This patch extends the geoip patch to take into account whether the TLD of
the sender matches the mail servers country of origin.
I would also advise anyone using geoip to update the free database file.
It can be done on a cronjob from the maxmind site.
debian stable policyd patched
--- policyd-weight.debian 2007-08-14 14:36:48.000000000 +0100
+++ policyd-weight.geoip_plus_mismatch 2007-08-14 14:38:34.000000000 +0100
@@ -73,6 +73,7 @@
use IO::Select;
use Config;
use POSIX;
+use Geo::IP;
use vars qw($csock $s $tcp_socket $sock $new_sock $old_mtime);
@@ -369,6 +370,9 @@
'abuse.rfc-ignorant.org', 0.1, 0, 'ABUSE_RFCI'
);
+my @geoip_score = ();
+
+
my $BL_ERROR_SKIP = 2; # skip a RBL if this RBL had this many
continuous
# errors
@@ -469,7 +473,7 @@
my @random_sender_score = (0.25, 0 );
my @rhsbl_penalty_score = (3.1, 0 );
my @enforce_dyndns_score = (3, 0 );
-
+my @geoip_mismatch_tld = (2, 0 );
my $VERBOSE = 0;
@@ -786,6 +790,7 @@
cache_query("stats");
exit;
}
+our $geoip = Geo::IP->new(GEOIP_STANDARD);
# ----------------------------------------------------------
# main
@@ -1485,6 +1490,13 @@
{
return ($my_REJECTMSG.' (multirecipient mail)');
}
+ mylog(info=>"sender domain: $from_domain ") if $DEBUG;
+ my $from_tld;
+ if($from_domain =~ /.*\.([a-zA-Z]{2,2})$/)
+ {
+ $from_tld = $1;
+ mylog(info=>"sender TLD: $from_tld ") if $DEBUG;
+ }
## cache check
if( ($CACHESIZE > 0) || ($POSCACHESIZE > 0) )
@@ -1901,7 +1913,56 @@
$rate += $score;
$helo_ok = 2;
}
+ ## GeoIP check
###############################################################
+
+ my $country = $geoip->country_code_by_addr("$ip");
+
+ if(defined($country))
+ {
+
+ for($i=0; $i < @geoip_score; $i += 4)
+ {
+ if($country eq $geoip_score[$i])
+ {
+ my $score = $geoip_score[$i+2];
+ if ($score != 0) {
+ $RET .= " IN_".$geoip_score[$i+3]."=" . $score;
+ $rate += $score;;
+ }
+ }
+ else
+ {
+ my $score = $geoip_score[$i+1];
+ if ($score != 0) {
+ $RET .= " NOT_IN_".$geoip_score[$i+3]."=" .
$score;
+ $rate += $score;;
+ }
+ }
+ }
+## GeoIP TLD inconsitencies and failover
#####################################
+ # only if a country tld was extracted compare it to the geoip detected
country.
+ if (length($from_tld) >1)
+ {
+ # reduce score if they match
+ if( lc($country) eq lc($from_tld) )
+ {
+ $rate += $geoip_mismatch_tld[0];
+ $RET .= " GEO_MATCH=" . $geoip_mismatch_tld[1];
+ }
+ else {
+ $rate += $geoip_mismatch_tld[1];
+ $RET .= " GEO_MISMATCH=" . $geoip_mismatch_tld[0];
+ }
+ }
+ }
+ else
+ {
+ # this never appears to be triggered
+ # was going to use it to failover to using the tld for the country
+ # geo lookup
+ mylog(info=>"geoip lookup failed") if $DEBUG;
+ }
## Reverse IP == dynhost check
###############################################
____________________________________________________________
Policyd-weight Mailinglist - http://www.policyd-weight.org/