Author: muffin
Date: 2005-11-18 20:28:45 -0500 (Fri, 18 Nov 2005)
New Revision: 929
Added:
trunk/perl/client/bin/haver_passcode.pl
Removed:
trunk/perl/client/bin/passcode.pl
Modified:
trunk/perl/client/lib/Haver/Client.pm
trunk/perl/server/lib/Haver/Server/Talker.pm
Log:
Add AUTH support to Haver::Client, tidy it up, add AUTH stuff to POD. Fix
small typo in Haver::Server::Talker that I noticed. Rename passcode.pl to
haver_passcode.pl.
Copied: trunk/perl/client/bin/haver_passcode.pl (from rev 928,
trunk/perl/client/bin/passcode.pl)
Deleted: trunk/perl/client/bin/passcode.pl
===================================================================
--- trunk/perl/client/bin/passcode.pl 2005-11-18 23:45:10 UTC (rev 928)
+++ trunk/perl/client/bin/passcode.pl 2005-11-19 01:28:45 UTC (rev 929)
@@ -1,35 +0,0 @@
-# vim: set ft=perl ts=4 sw=4:
-# passcode.pl - generate a passcode for use in any Haver client according
-# to Haver::Spec::Auth.
-#
-# Copyright (C) 2005 Eric Goodwin.
-#
-# This module is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This module is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this module; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-use strict;
-
-use Digest::SHA1 qw( sha1_base64 );
-
-if (!defined $ARGV[2]) {
- print "Usage: $0 <user> <host> <password>\n";
- exit 0;
-}
-
-print "Passcode for $ARGV[0] on $ARGV[1] with password $ARGV[2] - ";
-print sha1_base64($ARGV[2] . lc("$ARGV[1]$ARGV[2]"))."\n";
-
-
-
-
Modified: trunk/perl/client/lib/Haver/Client.pm
===================================================================
--- trunk/perl/client/lib/Haver/Client.pm 2005-11-18 23:45:10 UTC (rev
928)
+++ trunk/perl/client/lib/Haver/Client.pm 2005-11-19 01:28:45 UTC (rev
929)
@@ -1,7 +1,7 @@
# vim: set ft=perl ts=4 sw=4:
# Haver::Client - A POE::Component for haver clients.
#
-# Copyright (C) 2004, 2005 Bryan Donlan, Dylan Hardison.
+# Copyright (C) 2004, 2005 Bryan Donlan, Dylan Hardison, Eric Goodwin.
#
# This module is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@
# version => client version
# name => user name,
# reg => {
-# event name => { session ID => 1 }
+# event name => { session ID => 1 }
# },
# wheel => active wheel,
# state => see below constants,
@@ -39,20 +39,22 @@
use POE::Wheel::ReadWrite;
use POE::Wheel::SocketFactory;
use Haver::Protocol::Filter;
+use Digest::MD5 qw( md5_base64 );
+use Digest::SHA1 qw( sha1_base64 );
use constant {
- S_IDLE => 0, # not connected, not connecting
- S_CONN => 1, # establishing socket connection
- S_INIT => 2, # C: HAVER sent
- S_LOGIN => 3, # S: HAVER recieved, C: IDENT sent
- S_ONLINE => 4, # S: HELLO received
- S_DYING => 5, # C: BYE sent, socket still open
+ S_IDLE => 0, # not connected, not connecting
+ S_CONN => 1, # establishing socket connection
+ S_INIT => 2, # C: HAVER sent
+ S_LOGIN => 3, # S: HAVER recieved, C: IDENT sent
+ S_ONLINE => 4, # S: HELLO received
+ S_DYING => 5, # C: BYE sent, socket still open
};
our $VERSION = 0.09;
sub dispatch {
- call('dispatch', @_);
+ call('dispatch', @_);
}
### SETUP
@@ -91,21 +93,21 @@
IN FROM
PING BYE
FAIL
- AUTH:TYPES AUTH:BASIC
+ AUTH_TYPES AUTH_BASIC
))
};
}
sub on__start {
- my ($kernel, $heap, $opt) = @_[KERNEL, HEAP, ARG0];
- croak "No alias" unless $opt->{alias};
- $heap->{reg} = {};
- $heap->{state} = S_IDLE;
- $heap->{alias} = $opt->{alias};
- $heap->{resolver} = $opt->{resolver};
- $heap->{version} = $opt->{version} || "Haver::Client/$VERSION";
-
- $kernel->alias_set($opt->{alias});
+ my ($kernel, $heap, $opt) = @_[KERNEL, HEAP, ARG0];
+ croak "No alias" unless $opt->{alias};
+ $heap->{reg} = {};
+ $heap->{state} = S_IDLE;
+ $heap->{alias} = $opt->{alias};
+ $heap->{resolver} = $opt->{resolver};
+ $heap->{version} = $opt->{version} || "Haver::Client/$VERSION";
+
+ $kernel->alias_set($opt->{alias});
}
sub on__default {
@@ -119,262 +121,264 @@
### SESSION MANAGEMENT
sub on_connect {
- my ($kernel, $heap, %opts) = @_[KERNEL,HEAP,ARG0..$#_];
- $opts{port} ||= 7575;
-
- # TODO: handle arg errors
- if ($heap->{state} == S_DYING) {
- $heap->{pending} = \%opts;
- return;
- } elsif ($heap->{state} != S_IDLE) {
- call('disconnect');
- $heap->{pending} = \%opts;
- } else {
- $heap->{state} = S_CONN;
- $heap->{name} = $opts{name};
- $heap->{port} = $opts{port};
- if (!$heap->{resolver}) {
- call('do_connect', $opts{host});
- } else {
- my $resp = $heap->{resolver}->resolve(
- host => $opts{host},
- context => {},
- event => 'dns_response',
- );
- if ($resp) {
- call('dns_response', $resp);
- }
- }
- }
+ my ($kernel, $heap, %opts) = @_[KERNEL,HEAP,ARG0..$#_];
+ $opts{port} ||= 7575;
+
+ # TODO: handle arg errors
+ if ($heap->{state} == S_DYING) {
+ $heap->{pending} = \%opts;
+ return;
+ } elsif ($heap->{state} != S_IDLE) {
+ call('disconnect');
+ $heap->{pending} = \%opts;
+ } else {
+ $heap->{state} = S_CONN;
+ $heap->{name} = $opts{name};
+ $heap->{host} = $opts{host};
+ $heap->{port} = $opts{port};
+ $heap->{password} = $opts{password} || "";
+ if (!$heap->{resolver}) {
+ call('do_connect', $opts{host});
+ } else {
+ my $resp = $heap->{resolver}->resolve(
+ host => $opts{host},
+ context => {},
+ event => 'dns_response',
+ );
+ if ($resp) {
+ call('dns_response', $resp);
+ }
+ }
+ }
}
sub on_do_connect {
- my ($heap, $addr) = @_[HEAP,ARG0];
- my $port = delete $heap->{port};
- if ($heap->{state} == S_DYING) {
- call('cleanup');
- return;
- }
- $heap->{wheel} = POE::Wheel::SocketFactory->new(
- RemoteAddress => $addr,
- RemotePort => $port,
- SuccessEvent => 'connect_ok',
- FailureEvent => 'connect_fail',
- );
+ my ($heap, $addr) = @_[HEAP,ARG0];
+ my $port = delete $heap->{port};
+ if ($heap->{state} == S_DYING) {
+ call('cleanup');
+ return;
+ }
+ $heap->{wheel} = POE::Wheel::SocketFactory->new(
+ RemoteAddress => $addr,
+ RemotePort => $port,
+ SuccessEvent => 'connect_ok',
+ FailureEvent => 'connect_fail',
+ );
}
BEGIN {
- eval {
- require List::Util;
- List::Util->import(qw(shuffle));
- };
- eval {
- shuffle();
- };
- if ($@) {
- *shuffle = sub { return @_; }
- }
+ eval {
+ require List::Util;
+ List::Util->import(qw(shuffle));
+ };
+ eval {
+ shuffle();
+ };
+ if ($@) {
+ *shuffle = sub { return @_; }
+ }
}
sub on_dns_response {
- my ($heap, $packet) = @_[HEAP,ARG0];
- if ($packet->{response}) {
- my $resp = $packet->{response};
- my @answer = shuffle($resp->answer);
- foreach my $record (@answer) {
- if ($record->type eq 'A') {
- # XXX: ipv6 support
- $poe_kernel->yield('do_connect', $record->address);
- return;
- }
- }
- # dns fail
- dispatch('connect_fail', 'dns');
- call('cleanup');
- } else {
- dispatch('connect_fail', 'dns', $packet->{error});
- }
+ my ($heap, $packet) = @_[HEAP,ARG0];
+ if ($packet->{response}) {
+ my $resp = $packet->{response};
+ my @answer = shuffle($resp->answer);
+ foreach my $record (@answer) {
+ if ($record->type eq 'A') {
+ # XXX: ipv6 support
+ $poe_kernel->yield('do_connect',
$record->address);
+ return;
+ }
+ }
+ # dns fail
+ dispatch('connect_fail', 'dns');
+ call('cleanup');
+ } else {
+ dispatch('connect_fail', 'dns', $packet->{error});
+ }
}
sub on_connect_fail {
- my $heap = $_[HEAP];
- dispatch('connect_fail', @_[ARG0..ARG2]);
- call('cleanup');
+ my $heap = $_[HEAP];
+ dispatch('connect_fail', @_[ARG0..ARG2]);
+ call('cleanup');
}
sub on_connect_ok {
- my ($kernel, $heap, $sock) = @_[KERNEL,HEAP,ARG0];
- if ($heap->{state} == S_DYING) {
- call('cleanup');
- return;
- }
- dispatch('connected');
- $heap->{state} = S_INIT;
- $heap->{wheel} = new POE::Wheel::ReadWrite(
- Handle => $sock,
- Filter => new Haver::Protocol::Filter,
- InputEvent => 'input',
- ErrorEvent => 'error',
- );
- $heap->{wheel}->put( ['HAVER', $heap->{version}] );
- # XXX: timeout
+ my ($kernel, $heap, $sock) = @_[KERNEL,HEAP,ARG0];
+ if ($heap->{state} == S_DYING) {
+ call('cleanup');
+ return;
+ }
+ dispatch('connected');
+ $heap->{state} = S_INIT;
+ $heap->{wheel} = new POE::Wheel::ReadWrite(
+ Handle => $sock,
+ Filter => new Haver::Protocol::Filter,
+ InputEvent => 'input',
+ ErrorEvent => 'error',
+ );
+ $heap->{wheel}->put( ['HAVER', $heap->{version}, 'auth'] );
+ # XXX: timeout
}
sub on_input {
- my ($kernel, $heap, $arg) = @_[KERNEL,HEAP,ARG0];
- return if (ref $arg ne 'ARRAY' || @$arg == 0);
-
- if (DEBUG) {
- print STDERR "S: ", join "\t", @$arg;
- print STDERR "\n";
+ my ($kernel, $heap, $arg) = @_[KERNEL,HEAP,ARG0];
+ return if (ref $arg ne 'ARRAY' || @$arg == 0);
+
+ if (DEBUG) {
+ print STDERR "S: ", join "\t", @$arg;
+ print STDERR "\n";
}
- dispatch('raw_in', @$arg);
- my $cmd = $arg->[0];
- $cmd =~ tr/:/_/;
- $kernel->yield("msg_$cmd", @$arg);
+ dispatch('raw_in', @$arg);
+ my $cmd = $arg->[0];
+ $cmd =~ tr/:/_/;
+ $kernel->yield("msg_$cmd", @$arg);
}
sub on_error {
- dispatch('disconnected', @_[ARG0..ARG2]);
- call('cleanup');
+ dispatch('disconnected', @_[ARG0..ARG2]);
+ call('cleanup');
}
sub on_disconnect {
- my $heap = $_[HEAP];
- call('send_raw', 'BYE');
- $heap->{state} = S_DYING;
- $poe_kernel->delay('force_down', 5);
+ my $heap = $_[HEAP];
+ call('send_raw', 'BYE');
+ $heap->{state} = S_DYING;
+ $poe_kernel->delay('force_down', 5);
}
sub on_force_down {
- my $heap = $_[HEAP];
- $heap->{state} = S_IDLE;
- call('cleanup');
+ my $heap = $_[HEAP];
+ $heap->{state} = S_IDLE;
+ call('cleanup');
}
sub on_cleanup {
- my $heap = $_[HEAP];
- $poe_kernel->delay('force_down');
- if ($heap->{pending}) {
- my @opts = %{delete $heap->{pending}};
- $poe_kernel->yield('connect', @opts);
- }
- delete $heap->{wheel};
- delete $heap->{name};
- $heap->{state} = S_IDLE;
+ my $heap = $_[HEAP];
+ $poe_kernel->delay('force_down');
+ if ($heap->{pending}) {
+ my @opts = %{delete $heap->{pending}};
+ $poe_kernel->yield('connect', @opts);
+ }
+ delete $heap->{wheel};
+ delete $heap->{name};
+ $heap->{state} = S_IDLE;
}
sub on_send_raw {
- my ($heap, @args) = @_[HEAP,ARG0..$#_];
- if ($heap->{state} == S_IDLE || $heap->{state} == S_CONN ||
- $heap->{state} == S_DYING) {
- return;
- }
- if (DEBUG) {
- print STDERR "C: ", join("\t", @args), "\n";
+ my ($heap, @args) = @_[HEAP,ARG0..$#_];
+ if ($heap->{state} == S_IDLE || $heap->{state} == S_CONN ||
+ $heap->{state} == S_DYING) {
+ return;
}
- $heap->{wheel}->put([EMAIL PROTECTED]);
+ if (DEBUG) {
+ print STDERR "C: ", join("\t", @args), "\n";
+ }
+ $heap->{wheel}->put([EMAIL PROTECTED]);
}
sub on_send {
- my ($kernel, @args) = @_[KERNEL,ARG0..$#_];
- call('send_raw', @args);
+ my ($kernel, @args) = @_[KERNEL,ARG0..$#_];
+ call('send_raw', @args);
}
sub on_join {
- my $channel = $_[ARG0];
- call('send', 'JOIN', $channel);
+ my $channel = $_[ARG0];
+ call('send', 'JOIN', $channel);
}
sub on_part {
- my $channel = $_[ARG0];
- call('send', 'PART', $channel);
+ my $channel = $_[ARG0];
+ call('send', 'PART', $channel);
}
sub on_public {
- my ($kernel, $heap, $c, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
- call('send', 'IN', $c, $t, @a);
+ my ($kernel, $heap, $c, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
+ call('send', 'IN', $c, $t, @a);
}
sub on_private {
- my ($kernel, $heap, $d, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
- call('send', 'TO', $d, $t, @a);
+ my ($kernel, $heap, $d, $t, @a) = @_[KERNEL,HEAP,ARG0..$#_];
+ call('send', 'TO', $d, $t, @a);
}
sub on_list {
- my ($chan, $type) = @_[ARG0, ARG1];
- $type = defined $type ? $type : 'user';
- call('send', 'LIST', $chan, $type);
+ my ($chan, $type) = @_[ARG0, ARG1];
+ $type = defined $type ? $type : 'user';
+ call('send', 'LIST', $chan, $type);
}
sub on_destroy {
my ($kernel, $heap) = @_[KERNEL,HEAP];
- dispatch('destroyed');
- delete $heap->{pending};
- my $reg = $heap->{reg};
- foreach my $ehash (values %$reg) {
- foreach my $id (keys %$ehash) {
- $poe_kernel->refcount_decrement($id, $ehash->{$id});
- }
- }
- $heap->{reg} = {};
- call('disconnect');
- $kernel->alias_remove($heap->{alias});
+ dispatch('destroyed');
+ delete $heap->{pending};
+ my $reg = $heap->{reg};
+ foreach my $ehash (values %$reg) {
+ foreach my $id (keys %$ehash) {
+ $poe_kernel->refcount_decrement($id, $ehash->{$id});
+ }
+ }
+ $heap->{reg} = {};
+ call('disconnect');
+ $kernel->alias_remove($heap->{alias});
}
## server-response stuff
sub msg_HAVER {
- my ($kernel, $heap) = @_[KERNEL,HEAP];
- return if ($heap->{state} != S_INIT); # should never happen, unless the
- # server is non-compliant
- $kernel->yield('send_raw', 'IDENT', $heap->{name});
- $heap->{state} = S_LOGIN;
+ my ($kernel, $heap) = @_[KERNEL,HEAP];
+ return if ($heap->{state} != S_INIT); # should never happen, unless the
+
# server is non-compliant
+ $kernel->yield('send_raw', 'IDENT', $heap->{name});
+ $heap->{state} = S_LOGIN;
}
sub msg_HELLO {
- my $heap = $_[HEAP];
- $heap->{state} = S_ONLINE;
- dispatch('ready');
+ my $heap = $_[HEAP];
+ $heap->{state} = S_ONLINE;
+ dispatch('ready');
}
sub msg_JOIN {
- my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
- if ($name eq $heap->{name}) {
- dispatch('ijoined', $chan);
- } else {
- dispatch('join', $chan, $name);
- }
+ my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
+ if ($name eq $heap->{name}) {
+ dispatch('ijoined', $chan);
+ } else {
+ dispatch('join', $chan, $name);
+ }
}
sub msg_PART {
- my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
- if ($name eq $heap->{name}) {
- dispatch('iparted', $chan);
- } else {
- dispatch('part', $chan, $name);
- }
+ my ($heap, $chan, $name) = @_[HEAP,ARG1,ARG2];
+ if ($name eq $heap->{name}) {
+ dispatch('iparted', $chan);
+ } else {
+ dispatch('part', $chan, $name);
+ }
}
sub msg_LIST {
- my ($heap, $chan, $ns, @things) = @_[HEAP,ARG1..$#_];
- return unless defined $ns;
- dispatch('list', $chan, $ns, @things);
+ my ($heap, $chan, $ns, @things) = @_[HEAP,ARG1..$#_];
+ return unless defined $ns;
+ dispatch('list', $chan, $ns, @things);
}
sub msg_IN {
- dispatch('public', @_[ARG1..$#_]);
+ dispatch('public', @_[ARG1..$#_]);
}
sub msg_FROM {
- dispatch('private', @_[ARG1..$#_]);
+ dispatch('private', @_[ARG1..$#_]);
}
sub msg_AUTH_TYPES {
my ($kernel, $heap, @types) = @_[KERNEL, HEAP, ARG0 .. $#_];
-
+
if (grep(/^AUTH:BASIC$/, @types)) {
call('send_raw', qw( AUTH:TYPE AUTH:BASIC ));
} else {
@@ -383,72 +387,85 @@
}
sub msg_AUTH_BASIC {
- my ($kernel, $heap, $nonce, @types) = @_[KERNEL, HEAP, ARG0 .. $#_];
+ my ($kernel, $heap, $nonce, @types) = @_[KERNEL, HEAP, ARG1 .. $#_];
+ my ($type, $response);
+ my $passcode = sha1_base64($heap->{password} .
lc("$heap->{host}$heap->{name}"));
+
+ if (grep(/^sha1$/, @types)) {
+ $type = "sha1";
+ $response = sha1_base64($nonce . $passcode);
+ } else {
+ #Surely, *surely* the server has MD5 if nothing else...
+ $type = "md5";
+ $response = md5_base64($nonce . $passcode);
+ }
+
+ $kernel->yield('send_raw', 'AUTH:BASIC', $type, $response);
}
sub msg_PING {
- call('send_raw', 'PONG', @_[ARG1..$#_]);
+ call('send_raw', 'PONG', @_[ARG1..$#_]);
}
sub msg_BYE {
- my ($type, $detail) = @_[ARG2,ARG3];
- dispatch('bye', $detail);
- call('cleanup');
+ my ($type, $detail) = @_[ARG2,ARG3];
+ dispatch('bye', $detail);
+ call('cleanup');
}
sub msg_FAIL {
my ($kernel, $heap, $cmd, $code, @args) = @_[KERNEL, HEAP, ARG0 .. $#_];
- dispatch('fail', $cmd, $code, [EMAIL PROTECTED]);
- $code =~ tr/./_/;
- dispatch("fail_$code", $cmd, [EMAIL PROTECTED]);
+ dispatch('fail', $cmd, $code, [EMAIL PROTECTED]);
+ $code =~ tr/./_/;
+ dispatch("fail_$code", $cmd, [EMAIL PROTECTED]);
}
sub on_register {
my ($kernel, $heap, $sender, @events) =
@_[KERNEL,HEAP,SENDER,ARG0..$#_];
- my $reg = $heap->{reg};
- my $id = $sender->ID;
-
- foreach my $event (@events) {
- $event = uc $event;
- next if exists $reg->{$event}{$id};
- # Tags don't need to be anything special...
- #my $tag = '1' . $reg->{$event} . '\0' . $id . '\0' . rand;
- my $tag = __PACKAGE__;
- $reg->{$event}{$id} = $tag;
- $kernel->refcount_increment( $id, $tag );
- }
+ my $reg = $heap->{reg};
+ my $id = $sender->ID;
+
+ foreach my $event (@events) {
+ $event = uc $event;
+ next if exists $reg->{$event}{$id};
+ # Tags don't need to be anything special...
+ #my $tag = '1' . $reg->{$event} . '\0' . $id . '\0' . rand;
+ my $tag = __PACKAGE__;
+ $reg->{$event}{$id} = $tag;
+ $kernel->refcount_increment( $id, $tag );
+ }
}
sub on_unregister {
my ($kernel, $heap, $sender, @events) = @_[KERNEL, HEAP, SENDER,
ARG0..$#_];
- my $reg = $heap->{reg};
- my $id = $sender->ID;
-
- foreach my $event (@events) {
- $event = uc $event;
- my $tag;
- next unless $tag = delete $reg->{$event}{$id};
- $kernel->refcount_decrement( $id, $tag );
- }
+ my $reg = $heap->{reg};
+ my $id = $sender->ID;
+
+ foreach my $event (@events) {
+ $event = uc $event;
+ my $tag;
+ next unless $tag = delete $reg->{$event}{$id};
+ $kernel->refcount_decrement( $id, $tag );
+ }
}
sub on_dispatch {
- my ($kernel, $heap, $evname, @args) = @_[KERNEL,HEAP,ARG0..$#_];
- $evname = uc $evname;
- my $reg = $heap->{reg};
- $reg->{$evname} ||= {};
- $reg->{ALL} ||= {};
- my %targ = (%{$reg->{$evname}}, %{$reg->{ALL}});
- my @ids = keys %targ;
+ my ($kernel, $heap, $evname, @args) = @_[KERNEL,HEAP,ARG0..$#_];
+ $evname = uc $evname;
+ my $reg = $heap->{reg};
+ $reg->{$evname} ||= {};
+ $reg->{ALL} ||= {};
+ my %targ = (%{$reg->{$evname}}, %{$reg->{ALL}});
+ my @ids = keys %targ;
- unshift @args, [$heap->{alias}];
+ unshift @args, [$heap->{alias}];
- foreach my $id (@ids) {
- $kernel->post($id, "haver_$evname", @args);
- }
+ foreach my $id (@ids) {
+ $kernel->post($id, "haver_$evname", @args);
+ }
}
1;
@@ -468,13 +485,15 @@
version => "WackyClient/1.20",
);
+ $kernel->post('haver', 'register', 'all');
+
$kernel->post('haver', 'connect',
host => 'hardison.net',
- name => ucfirst($ENV{USER}),
+ name => 'WackyUser',
port => 7575,
+ password => 'offmyrocker',
);
-
=head1 DESCRIPTION
This module eases the creation of Haver clients. It provides a POE::Component
in the style of
@@ -492,25 +511,29 @@
If given, $resolver should be a L<POE::Component::Client::DNS> object.
Finally, $version is what we will advertize as the client name and version
number to the
-server. It defaults to C<Haver::Client/0.08>.
+server. It defaults to C<Haver::Client/0.09>.
=head1 STATES
While these are listed just like methods, you must post() to them, and not
call them
directly.
-=head2 connect(host => $host, name => $name, [ port => 7575 ])
+=head2 connect(host => $host, name => $name, [ port => 7575 ], [ password =>
$password ])
Connect to $host on port $port (defaults to 7575) with the user name $name.
If already connected to a server, Haver::Client will disconnect and re-connect
using the
new settings.
-=head2 register(@events)
+You may specify a password if the account requires authentication (which will
be
+handled automatically by the module). If not given the password will default
to
+a blank string.
-This summons the sun god Ra and makes him eat your liver.
+=head2 register(Z<>@eventsZ<>)
-FIXME: This is inaccurate.
+This will register events with the module.
+FIXME: Be more specific.
+
=head1 BUGS
None known. Bug reports are welcome. Please use our bug tracker at
@@ -519,7 +542,8 @@
=head1 AUTHOR
Bryan Donlan E<lt>[EMAIL PROTECTED]<gt>,
-Dylan Hardison E<lt>[EMAIL PROTECTED]<gt>.
+Dylan Hardison E<lt>[EMAIL PROTECTED]<gt>,
+Eric Goodwin E<lt>[EMAIL PROTECTED]<gt>.
=head1 SEE ALSO
@@ -527,7 +551,7 @@
=head1 COPYRIGHT and LICENSE
-Copyright (C) 2004, 2005 by Bryan Donlan, Dylan Hardison. All Rights Reserved.
+Copyright (C) 2004, 2005 by Bryan Donlan, Dylan Hardison, and Eric Goodwin.
All Rights Reserved.
This module is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
Modified: trunk/perl/server/lib/Haver/Server/Talker.pm
===================================================================
--- trunk/perl/server/lib/Haver/Server/Talker.pm 2005-11-18 23:45:10 UTC
(rev 928)
+++ trunk/perl/server/lib/Haver/Server/Talker.pm 2005-11-19 01:28:45 UTC
(rev 929)
@@ -67,7 +67,7 @@
$heap->{client} = undef;
call('shutdown');
} else {
- Log('warning', "Client isseud unknown command $cmd");
+ Log('warning', "Client issued unknown command $cmd");
call('fail', 'unknown.cmd');
}
}