diff options
Diffstat (limited to 'scripts/tordetect.pl')
| -rw-r--r-- | scripts/tordetect.pl | 73 | 
1 files changed, 73 insertions, 0 deletions
| diff --git a/scripts/tordetect.pl b/scripts/tordetect.pl new file mode 100644 index 0000000..4f4cd89 --- /dev/null +++ b/scripts/tordetect.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl +use strict; +use Irssi; +use Net::DNS; +use vars qw($VERSION %IRSSI); + +$VERSION = "0.0.1"; +%IRSSI = ( +    authors     => "Sebastian 'yath' Schmidt", +    contact     => "yath+irssiscripts\@yath.de", +    name        => "Tor autodetection for Irssi", +    description => "This script will automatically detect people using the ". +                   "Tor anonymity network and append \".TOR\" to their ". +                   "hostname, to make things like /ignore -time 3600 ". +                   "*!*\@*.TOR possible (e.g. when your favourite ". +                   "channel gets flooded).", +    license     => "Public domain" +); + +use constant { +    HOSTSUFFIX => ".TOR", +    DNSBL      => "tor-irc.dnsbl.oftc.net", +    CACHETIME  => 3600, +}; + +my %cache; + +sub resolve_host($) { +    my $hostname = shift; +    return $hostname if "$hostname." =~ (/^(\d{1,3}\.){4}$/); # yes, that sucks + +    my $res = Net::DNS::Resolver->new(); +    my $q = $res->search($hostname, "A"); +    return unless $q; +    return map { $_->address } grep { $_->type eq "A" } $q->answer; +} + +sub reverse_addr($) { +    return join(".", reverse(split(/\./, $_[0]))); +} + +sub istor($) { +    my $hostname = shift; +    if (exists($cache{$hostname})) { +        if (time >= $cache{$hostname}->[0]) { +            delete $cache{$hostname}; +        } else { +            return $cache{$hostname}->[1]; +        } +    } + +    my $result = 0; + +    foreach my $addr (resolve_host($hostname)) { +        if (grep /^127\.0\.0\.1$/, +                resolve_host(reverse_addr($addr).".".DNSBL)) { +            $result = 1; +            last; +        } +    } + +    $cache{$hostname} = [time+CACHETIME, $result]; +    return $result; +} + +sub handler_server_event { +    my ($server, $data, $sender_nick, $sender_addr) = @_; +    return unless ($sender_nick ne "" and $sender_addr =~ /.+@(.+)/); +    $sender_addr .= HOSTSUFFIX if istor($1); +    Irssi::signal_continue($server, $data, $sender_nick, $sender_addr); +} + +Irssi::signal_add("server event", \&handler_server_event); | 
