From c2b8e8aa19f09385fef0cc2c1a796eea938a7a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ask=20Bj=C3=B8rn=20Hansen?= Date: Mon, 21 Apr 2003 09:42:01 +0000 Subject: [PATCH] Add not even halfbaked saslauth plugin. Hopefully it'll give us SMTP AUTH some day. :-) If a plugin running the ehlo hook add something to the ARRAY reference $self->transaction->notes('capabilities') then it will be added to the EHLO response. Add command_counter method to the SMTP object. Plugins can use this to catch (or not) consecutive commands. In particular useful with the unrecognized_command hook. git-svn-id: https://svn.perl.org/qpsmtpd/trunk@144 958fd67b-6ff1-0310-b445-bb7760255be9 --- Changes | 8 +++++++ lib/Qpsmtpd/SMTP.pm | 12 +++++++++- plugins/saslauth | 57 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 plugins/saslauth diff --git a/Changes b/Changes index f70bb30..1414edd 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,13 @@ 0.26-dev + If a plugin running the ehlo hook add something to the ARRAY + reference $self->transaction->notes('capabilities') then it will be + added to the EHLO response. + + Add command_counter method to the SMTP object. Plugins can use this + to catch (or not) consecutive commands. In particular useful with + the unrecognized_command hook. + Filter out all uncommon characters from the remote_host setting. (thanks to Frank Denis / Jedi/Sector One for the hint). diff --git a/lib/Qpsmtpd/SMTP.pm b/lib/Qpsmtpd/SMTP.pm index 8310977..869b75e 100644 --- a/lib/Qpsmtpd/SMTP.pm +++ b/lib/Qpsmtpd/SMTP.pm @@ -37,12 +37,17 @@ sub new { $self; } - +sub command_counter { + my $self = shift; + $self->{_counter} || 0; +} sub dispatch { my $self = shift; my ($cmd) = lc shift; + $self->{_counter}++; + #$self->respond(553, $state{dnsbl_blocked}), return 1 # if $state{dnsbl_blocked} and ($cmd eq "rcpt"); @@ -157,11 +162,16 @@ sub ehlo { $conn->hello_host($hello_host); $self->transaction; + my @capabilities = $self->transaction->notes('capabilities') + ? @{ $self->transaction->notes('capabilities') } + : (); + $self->respond(250, $self->config("me") . " Hi " . $conn->remote_info . " [" . $conn->remote_ip ."]", "PIPELINING", "8BITMIME", ($self->config('databytes') ? "SIZE ". ($self->config('databytes'))[0] : ()), + @capabilities, ); } } diff --git a/plugins/saslauth b/plugins/saslauth new file mode 100644 index 0000000..0813866 --- /dev/null +++ b/plugins/saslauth @@ -0,0 +1,57 @@ + +# +# This plugin doesn't work at all yet! Really; it's not even a +# prototype. More like a skeleton with no bones. Patches welcome. +# + +=pod + +TODO: + + After an AUTH command has successfully completed, no more AUTH + commands may be issued in the same session. After a successful + AUTH command completes, a server MUST reject any further AUTH + commands with a 503 reply. + + The AUTH command is not permitted during a mail transaction. + + If the client wishes to cancel an authentication exchange, it issues a line + with a single "*". If the server receives such an answer, it + MUST reject the AUTH command by sending a 501 reply. + +=cut + + +sub register { + my ($self, $qp) = @_; + $self->register_hook("ehlo", "ehlo"); + $self->register_hook("unrecognized_command", "auth"); +} + +sub ehlo { + my ($self, $transaction, $host) = @_; + $transaction->notes('capabilities'); # or + $transaction->notes('capabilities', []); + my $capabilities = $transaction->notes('capabilities'); + push @{$capabilities}, 'AUTH PLAIN LOGIN DIGEST-MD5 PLAIN'; +} + +sub auth { + my ($self, $transaction, $command) = @_; + return DECLINED unless $self->{expecting_response} or $command eq "auth"; + + if ($command eq "auth") { + warn "COMMAND: $command"; + $self->qp->respond(334, "VXNlcm5hbWU6"); + $self->{expecting_response} = $self->qp->command_counter; + return DONE; + } + else { + $self->{expecting_response}+1 == $self->qp->command_counter + or return DECLINED; + # check the response + $self->qp->respond(123, "Something should go here..."); + return DONE; + } +} +