diff options
Diffstat (limited to 'scripts/identify-md5.pl')
| -rw-r--r-- | scripts/identify-md5.pl | 168 | 
1 files changed, 168 insertions, 0 deletions
| diff --git a/scripts/identify-md5.pl b/scripts/identify-md5.pl new file mode 100644 index 0000000..f6680fd --- /dev/null +++ b/scripts/identify-md5.pl @@ -0,0 +1,168 @@ +use Irssi; +use Digest::MD5 qw(md5_hex); +use strict; +use vars qw($VERSION %IRSSI @identify @reop); + +$VERSION = '1.05'; +%IRSSI = ( +    authors 	=> 'Eric Jansen', +    contact 	=> 'chaos@sorcery.net', +    name 	=> 'identify-md5', +    description => 'MD5 NickServ identification script for SorceryNet', +    license 	=> 'GPL', +    modules	=> 'Digest::MD5', +    url		=> 'http://xyrion.org/irssi/', +    changed 	=> 'Sat Mar  1 13:32:30 CET 2003' +); + +################################################################################ +# +#  MD5 NickServ identification script for SorceryNet (irc.sorcery.net) +# +#  The script will do several things: +#  - It adds the command /identify-md5 to Irssi, which can be used to identify +#    to your current nickname or a list of nicknames given as arguments using  +#    the passwords provided below +#  - It will automatically issue this command whenever NickServ notices you  +#    that you need to identify (e.g. after a services outage) +#  - It will remember any channels ChanServ deopped you in and try to regain  +#    ops after authentication is accepted by NickServ +# +#  For more information on SorceryNets MD5 identification see: +#  http://www.sorcery.net/help/howto/MD5_identify +# +#  Put your nicknames and MD5-hashed passwords here: +# + +my %nicknames = ( +    lc('nick1')		=> md5_hex('password1'), 		# Plain text password 'password1' +    lc('nick2')		=> '6cb75f652a9b52798eb6cf2201057c73',	# MD5-hash of password 'password2' +    lc('nick3')		=> md5_hex('password3') +); + +# +#  Please note: This file should NOT be world-readable. Although it's (quite)  +#               impossible to get the original passwords from the hashes, a +#               malicious person can identify using the hash and then change +#               your password without knowing the old password. +# +################################################################################ + +sub cmd_identify { + +    my ($data, $server, $witem) = @_; + +    # Are we connected? +    if(!$server || !$server->{'connected'}) { + +	Irssi::print("Not connected to a server."); +	return; +    } + +    # Did the user specify what nick(s) to identify to? +    if($data ne '') { + +	# Store the list of nicknames to identify to then +	@identify = split /\s+/, $data; +    } +    else { + +	# Or put our current nick on the list +	push @identify, $server->{'nick'}; +    } + +    # Start with some checks +    for(my $i = $#identify; $i >= 0; $i--) { + +	# If we don't know the password +	if(!defined $nicknames{lc $identify[$i]}) { + +	    # Send an error +	    Irssi::print("I do not know the password for ${identify[$i]}. Please add it to identify-md5.pl."); + +	    # And remove the nick from the list +	    splice @identify, $i, 1; +	} +    } + +    # Let's ask NickServ for a cookie if there are nicks left +    $server->command("QUOTE NickServ identify-md5") if $#identify >= 0; +} + +sub event_notice { + +    my ($server, $text, $nick, $address) = @_; + +    # Just ignore it if we are not on SorceryNet +    return unless $server->{'real_address'} =~ /\.sorcery\.net$/; + +    # Is it a notice from NickServ? +    if($nick eq 'NickServ') { + +	# Is it a cookie and do we need one? +	if($text =~ /^205 S\/MD5 1\.0 (.+)$/ && $#identify >= 0) { + +	    my $cookie = $1; + +	    my $nickname = lc shift @identify; +	    my $password = $nicknames{$nickname}; + +	    # Create the hash and send it +	    my $hash = md5_hex("$nickname:$cookie:$password"); +	    $server->command("QUOTE NickServ identify-md5 $nickname $hash"); + +	    # Suppress the notice from NickServ +	    Irssi::signal_stop(); + +	    # And get a new cookie if there are still nicks left to identify to +	    $server->command("QUOTE NickServ identify-md5") if $#identify >= 0; +	} + +	# Is it a response? +	elsif($text =~ /^\d{3} \- (.+)$/) { + +	    my $response = $1; + +	    # Just print the text-part and suppress the notice +	    Irssi::print($response); + +	    if($response eq 'Authentication accepted -- you are now identified.') { + +		foreach my $channel (@reop) { +		    $server->command("QUOTE ChanServ $channel op $server->{nick}"); +		} +		undef @reop; +	    } + +	    Irssi::signal_stop(); +	} + +	# Do we know the password? Let's see what NickServ has to tell us then +	elsif(defined $nicknames{lc $server->{'nick'}}) { +	 +	    # Identify when NickServ asks us to +	    if($text =~ /^This nick belongs to another user\./) { + +		$server->command("identify-md5"); +		Irssi::signal_stop(); +	    } + +	    # Just ignore this notice, we already identify when receiving the other one +	    elsif($text eq 'If this is your nick please try: /msg NickServ ID password') { + +		Irssi::signal_stop(); +	    } +	} +    } + +    # If it's ChanServ saying it just deopped us, remember the channel so we can reop +    elsif($nick eq 'ChanServ' && $text =~ /^You are not allowed ops in ([^\s]+)$/) { + +	push @reop, $1; + +	Irssi::signal_stop(); +    } +} + +Irssi::command_bind('identify-md5', 'cmd_identify'); +Irssi::signal_add('message irc notice', 'event_notice'); | 
