qpsmtpd/plugins/check_earlytalker

43 lines
1.1 KiB
Plaintext
Raw Normal View History

=head1 NAME
check_earlytalker - Check that the client doesn't talk before we send the SMTP banner
=head1 DESCRIPTION
Hooks connect, checks to see if the remote host starts talking before
we've issued a 2xx greeting. If so, we're likely looking at a
direct-to-MX spam agent which pipelines its entire SMTP conversation,
and will happily dump an entire spam into our mail log even if later
tests deny acceptance.
Such clients gets a 450 error code.
=head1 TODO
Make how long we wait before reading from the socket configurable
(currently 1 second)
Make the soft/hard response code configurable (currently DENYSOFT)
=cut
use IO::Select;
sub register {
my ($self, $qp) = @_;
$self->register_hook('connect', 'connect_handler');
}
sub connect_handler {
my ($self, $transaction) = @_;
my $in = new IO::Select;
$in->add(\*STDIN) || return DECLINED;
if ($in->can_read(1)) {
$self->log(LOGDEBUG, "remote host started talking before we said hello");
return (DENYSOFT, "Don't be rude and talk before I say hello!");
}
$self->log(LOGINFO,"remote host said nothing spontaneous, proceeding");
return DECLINED;
}