--- cvsroot/AnyEvent-Porttracker/Porttracker.pm 2010/11/15 04:39:36 1.1 +++ cvsroot/AnyEvent-Porttracker/Porttracker.pm 2010/11/15 04:57:39 1.2 @@ -49,7 +49,7 @@ $self->{$type} ? $self->{$type}($self, @args) - : $type = (UNIVERSAL::can $self, $type) + : ($type = (UNIVERSAL::can $self, $type)) ? $type->($self, @args) : () } @@ -74,6 +74,17 @@ on_error => sub { $self->error (); }, + on_connect => sub { + if ($self->{tls}) { + $self->{queue} ||= []; + $self->_req (start_tls => sub { + $_[1] + or return $self->error ("TLS rejected by server"); + + $self->unqueue; + }); + } + }, on_read => sub { while ($_[0]{rbuf} =~ s/^([^\x0a]*)\x0a//) { my $msg = JSON::decode_json $1; @@ -111,7 +122,7 @@ () } -sub send { +sub _req { my $self = shift; my $cb = pop; @@ -125,6 +136,30 @@ $self->{hdl}->push_write ($msg); } +sub req { + $_[0]{queue} + ? push @{ $_[0]{queue} }, [@_] + : &_req +} + +sub unqueue { + my ($self) = @_; + + my $queue = delete $self->{queue} + or return; + + _req @$_ + for @$queue; +} + +sub on_start_tls_notify { + my ($self) = @_; + + $self->{hdl}->starttls ("connect"); + + $self->unqueue; +} + sub on_hello_notify { my ($self, $version, $auths, $nonce) = @_; @@ -134,7 +169,8 @@ $nonce = MIME::Base64::decode_base64 $nonce; if (grep $_ eq "none", @$auths) { - # successfully authenticated... + call $self, "on_login"; + } elsif (grep $_ eq "login_cram_md6", @$auths) { my $cc = join "", map chr 256 * rand, 0..63; @@ -144,7 +180,7 @@ $cc = MIME::Base64::encode_base64 $cc; - $self->send (login_cram_md6 => $self->{username}, $cr, $cc, sub { + $self->req (login_cram_md6 => $self->{username}, $cr, $cc, sub { my ($self, $ok, $msg) = @_; $ok @@ -153,19 +189,19 @@ $msg eq $sr or return call $self, on_login_failure => "sr and cr mismatch, possible man in the middle attack"; - call $self, "on_login" + call $self, "on_login"; }); } elsif (grep $_ eq "login", @$auths) { - $self->send (login => $self->{username}, $self->{password}, sub { + $self->req (login => $self->{username}, $self->{password}, sub { my ($self, $ok, $msg) = @_; $ok or return call $self, on_login_failure => $msg; - call $self, "on_login" + call $self, "on_login"; }); } else { - return $self->error ("no supported auth method (@$auths)"); + call $self, on_login_failure => "no supported auth method (@$auths)"; } } @@ -176,6 +212,12 @@ $self->error ("login failed: $msg"); } +sub on_error_notify { + my ($self, $msg) = @_; + + $self->error ($msg); +} + =back =head1 SEE ALSO