qpsmtpd/plugins/count_unrecognized_commands

51 lines
1.1 KiB
Perl

#!perl -w
=head1 NAME
count_unrecognized_commands - and disconnect after too many
=head1 DESCRIPTION
Disconnect the client if it sends too many unrecognized commands.
Good for rejecting spam sent through open HTTP proxies.
=head1 CONFIGURATION
Takes one parameter, the number of allowed unrecognized commands
before we disconnect the client. Defaults to 4.
=cut
use strict;
use warnings;
use Qpsmtpd::Constants;
sub register {
my ($self, $qp) = (shift, shift);
$self->{_unrec_cmd_max} = shift || 4;
if (scalar @_) {
$self->log(LOGWARN, "Ignoring additional arguments.");
}
}
sub hook_unrecognized_command {
my ($self, $cmd) = @_[0, 2];
my $count = $self->connection->notes('unrec_cmd_count') || 0;
$count = $count + 1;
$self->connection->notes('unrec_cmd_count', $count);
if ($count < $self->{_unrec_cmd_max}) {
$self->log(LOGINFO, "'$cmd', ($count)");
return DECLINED;
}
$self->log(LOGINFO, "fail, '$cmd' ($count)");
return DENY_DISCONNECT,
"Closing connection, $count unrecognized commands. Perhaps you should read RFC 2821?";
}