diff options
Diffstat (limited to 'modules/util.pl')
| -rw-r--r-- | modules/util.pl | 81 |
1 files changed, 58 insertions, 23 deletions
diff --git a/modules/util.pl b/modules/util.pl index 54e25a6..9a104c1 100644 --- a/modules/util.pl +++ b/modules/util.pl @@ -4,6 +4,7 @@ use POSIX qw(strftime); use warnings; use strict; use Term::ANSIColor qw (:constants); +use Socket qw( inet_aton inet_ntoa ); %::RISKS = ( @@ -183,45 +184,79 @@ sub dprint { print STDERR $text, "\n"; } + +sub intToDottedQuad { + my ($module, $num) = @_; + return inet_ntoa(pack('N', $num)); +} + sub dottedQuadToInt { my ($module, $dottedquad) = @_; - my $ip_number = 0; - my @octets = split(/\./, $dottedquad); - foreach my $octet (@octets) { - $ip_number <<= 8; - $ip_number |= $octet; - } - return $ip_number; +# my $ip_number = 0; +# my @octets = split(/\./, $dottedquad); +# foreach my $octet (@octets) { +# $ip_number <<= 8; +# $ip_number |= $octet; +# } +# return $ip_number; + return unpack('N', inet_aton($dottedquad)); } -sub getNickIP +sub getHostIP { - my ($module, $nick) = @_; - $nick = lc $nick; - return unless defined($::sn{$nick}); - if (defined($::sn{$nick}{ip})) { - return $::sn{$nick}{ip}; - } - my $host = $::sn{$nick}{host}; + my ($module, $host) = @_; if ( ($host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) or ($host =~ /^gateway\/web\/freenode\/ip\.(\d+)\.(\d+)\.(\d+)\.(\d+)$/) ) { - #yay, easy IP! - $::sn{$nick}{ip} = dottedQuadToInt(undef, "$1.$2.$3.$4"); - return $::sn{$nick}{ip}; + #yay, easy IP! + return dottedQuadToInt(undef, "$1.$2.$3.$4"); } elsif (index($host, '/') != -1) { return; } elsif ($host =~ /^2001:0:/) { my @splitip = split(/:/, $host); + return unless defined($splitip[6]) && defined($splitip[7]); #I think I can just do (hex($splitip[6] . $splitip[7]) ^ hex('ffffffff')) here but meh my $host = join('.', unpack('C4', pack('N', (hex($splitip[6] . $splitip[7])^hex('ffffffff'))))); - $::sn{$nick}{ip} = dottedQuadToInt(undef, $host); - return $::sn{$nick}{ip}; + return dottedQuadToInt(undef, $host); } - my @resolve = gethostbyname($::sn{$nick}{host}); + my @resolve = gethostbyname($host); return unless @resolve; - $::sn{$nick}{ip} = dottedQuadToInt(undef, join('.', unpack('C4', $resolve[4]))); - return $::sn{$nick}{ip}; + return dottedQuadToInt(undef, join('.', unpack('C4', $resolve[4]))); +} + +sub getNickIP +{ + my ($module, $nick) = @_; + $nick = lc $nick; + return unless defined($::sn{$nick}); + if (defined($::sn{$nick}{ip})) { + return $::sn{$nick}{ip}; + } + my $host = $::sn{$nick}{host}; + my $ip = getHostIP(undef, $host); + if (defined($ip)) { + $::sn{$nick}{ip} = $ip; + return $ip; + } + return; +# if ( ($host =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) or +# ($host =~ /^gateway\/web\/freenode\/ip\.(\d+)\.(\d+)\.(\d+)\.(\d+)$/) ) { +# #yay, easy IP! +# $::sn{$nick}{ip} = dottedQuadToInt(undef, "$1.$2.$3.$4"); +# return $::sn{$nick}{ip}; +# } elsif (index($host, '/') != -1) { +# return; +# } elsif ($host =~ /^2001:0:/) { +# my @splitip = split(/:/, $host); +# #I think I can just do (hex($splitip[6] . $splitip[7]) ^ hex('ffffffff')) here but meh +# my $host = join('.', unpack('C4', pack('N', (hex($splitip[6] . $splitip[7])^hex('ffffffff'))))); +# $::sn{$nick}{ip} = dottedQuadToInt(undef, $host); +# return $::sn{$nick}{ip}; +# } +# my @resolve = gethostbyname($::sn{$nick}{host}); +# return unless @resolve; +# $::sn{$nick}{ip} = dottedQuadToInt(undef, join('.', unpack('C4', $resolve[4]))); +# return $::sn{$nick}{ip}; } sub notRestricted { |
