summaryrefslogtreecommitdiffstats
path: root/scripts/identify-md5.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/identify-md5.pl')
-rw-r--r--scripts/identify-md5.pl168
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');