#! /usr/bin/perl # iauth-test: test script for IRC authorization (iauth) protocol # Copyright 2006-2007 Michael Poole # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. require 5.008; # We assume deferred signal handlers, new in 5.008. use strict; use warnings; use vars qw(%pending); use FileHandle; # for autoflush method on file handles # This script is an iauth helper script to help check for bugs in # ircu's IAuth handling. sub dolog ($) { print LOG "$_[0]\n"; } sub reply ($;$$) { my ($msg, $client, $extra) = @_; if (not defined $msg) { # Accept this for easier handling of client reply messages. return; } elsif (ref $msg eq '') { $msg =~ s/^(.) ?/$1 $client->{id} $client->{ip} $client->{port} / if $client; dolog "< $msg"; print "$msg\n"; } elsif (ref $msg eq 'ARRAY') { grep { reply($_, $client, $extra); } @$msg; } elsif (ref $msg eq 'CODE') { &$msg($client, $extra); } else { die "Unknown reply message type."; } } open LOG, ">> iauth.log"; autoflush LOG 1; autoflush STDOUT 1; autoflush STDERR 1; dolog "IAuth starting at " . scalar(localtime(time)); reply("O ARU"); while (<>) { # Chomp newline and log incoming message. s/\r?\n?\r?$//; dolog "> $_"; # If there's an ID at the start of the line, parse it out. my $client = $pending{my $id = $1} if s/^(\d+) //; # Figure out how to handle the command. if (/^C (\S+) (\S+) (.+)$/) { $pending{$id} = { id => $id, ip => $1, port => $2 }; } elsif (/^([DT])/ and $client) { delete $pending{$id}; } elsif (/^n (.+)$/ and $client) { reply("C $client->{id} :Do not choke on missing parameters.") if $1 eq 'Bug1685648'; reply("D", $client); } }