package MT::Plugin::CountryIPCheck; use strict; use MT; use MT::Plugin; use MT::Comment; use MT::Trackback; our $VERSION = "0.01"; my $data_path = '/tmp/'; my $counter_data = "$data_path/ipaddr_to_cctld.txt"; my %ClassA_map =(); my %ClassB_map =(); my @ip_start_tab = (); my @ip_end_tab = (); my @cctld_tab = (); my $index = 1; my $plugin = MT::Plugin->new(); $plugin->name("CountryIPCheck"); $plugin->description("Check Country via Remote IP Address (Version $VERSION)"); MT->add_plugin($plugin); MT->add_callback('TBPingFilter', 2, $plugin, \&CountryIPCheck); MT->add_callback('CommentFilter', 2, $plugin, \&CountryIPCheck); sub CountryIPCheck { my ($eh, $app, $obj) = @_; my $ip = $app->remote_ip; my $obj_text = $obj->isa("MT::Comment") ? "Comment" : "TrackBack"; &load_data(); my $ccTLD = &ConvIP2ccTLD($ip); $app->log("$obj_text IP Address: $ip ($ccTLD)"); return 1; } sub load_data { # Load IP list. open(FILE, "<$counter_data" ); while(){ my ($code, $ip_start_str, $ip_end_str, $ip_start, $ip_end ); ($ip_start_str, $ip_end_str, $code) = /^(\S+)\s+(\S+)\s+(\S+)/; my ($ip1, $ip2, $ip3, $ip4) = ($ip_start_str =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/); $ip_start = ($ip1<<24) + ($ip2<<16) + ($ip3<<8) + $ip4; my ($ip5, $ip6, $ip7, $ip8) = ($ip_end_str =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)/); $ip_end = ($ip5<<24) + ($ip6<<16) + ($ip7<<8) + $ip8; if( $ip_start > 0 && $ip_end > 0 ){ if( ($ip2|$ip3|$ip4) == 0 && ($ip6 & $ip7 & $ip8) == 255) { for(my $i=$ip1 ; $i<=$ip5 ; $i++){ $ClassA_map{ $i } = $code ; } } elsif( ($ip3|$ip4) == 0 && ($ip7 & $ip8) == 255) { for(my $i=(($ip1<<8)+$ip2) ; $i<=(($ip5<<8)+$ip6) ; $i++){ $ClassB_map{ $i } = $code ; } } else { $ip_start_tab[ $index ] = $ip_start ; $ip_end_tab[ $index ] = $ip_end ; $cctld_tab[ $index ] = $code ; $index++; } } } close(FILE); } sub ConvIP2ccTLD { my $line = shift(@_) ; my ($ip, $value); my ($ip1, $ip2, $ip3, $ip4) = ($line =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)/); $ip = ($ip1<<24) + ($ip2<<16) + ($ip3<<8) + $ip4; if( $ip > 0 ){ $value = $ClassA_map{ $ip1 }; return $value if ( $value ); $value = $ClassB_map{ ($ip1<<8) + $ip2 }; return $value if ( $value ); for( my $i = 1 ; $i < $index ; $i++ ){ if( $ip < $ip_start_tab[$i] ){ last; } return $cctld_tab[$i] if ( $ip <= $ip_end_tab[$i] ); } return "UNKNOWN"; } return "ERROR\[$line\]"; } 1;