use strict;
use vars qw($VERSION %IRSSI);

use Irssi;
use Digest::MD5 qw(md5_hex);

$VERSION = '1.12';

%IRSSI = (
  authors	=> 'Chris Porter',
  contact	=> 'slug@quakenet.org',
  name		=> 'Q CHALLENGEAUTH script',
  description	=> 'This script auths to Q using CHALLENGEAUTH.',
  license	=> 'BSD',
  url		=> 'http://warp13.co.uk/secureqauth.pl',
  changed	=> 'Sun 27th June 2004',
);

my $secureq_timestamp;
my $secureq_server;
my @secureq_args;

sub secureq_challenge {
  my ($server, $data, $nick, $address, $target) = @_;

  # this could be tidier
  return if(!$server || ($server->{tag} ne $secureq_server) || ("Q" ne $nick) || ("TheQBot\@CServe.quakenet.org" ne $address) || (time() > $secureq_timestamp) || (scalar @secureq_args != 2));

  if($data =~ /^CHALLENGE ([^ ]+) ([\dabcdef]{32})$/i) {
    $secureq_timestamp = 0;
    $secureq_server = "";

    if($1 ne "MD5") {
      Irssi::print("Unknown digest type ($1)!");
    } else {
      $server->command("^MSG Q\@CServe.quakenet.org CHALLENGEAUTH $secureq_args[0] " . md5_hex(substr($secureq_args[1], 0, 10) . " $2"));
      Irssi::signal_stop();
    }
    @secureq_args = ();

  }
}

sub secureq_auth {
  my ($data, $server, $window, $type) = @_;

  my @args = split / /, $data;

  if(scalar @args != 2) {
    Irssi::print("Username and password required.");
    return;
  }

  if(!$server) {
    Irssi::print("Not on a server.");
    return;
  }

  # I did have a check to see if you could see Q here, but some people
  # auth before they join channels

  $secureq_server = $server->{tag};
  $secureq_timestamp = time() + 60; 
  @secureq_args = @args;
  $server->command("^MSG Q\@CServe.quakenet.org CHALLENGE");
}

Irssi::command_bind("secureqauth", "secureq_auth");

Irssi::signal_add("message irc notice", "secureq_challenge");
