Merge pull request #99 from msimerson/earlytalker

Cleanups and style changes.
This commit is contained in:
flimzy 2014-09-15 11:42:28 -05:00
commit 43eb6381fe
2 changed files with 27 additions and 14 deletions

View File

@ -26,6 +26,12 @@ greeting timeouts -- these are known to range as low as 30 seconds, and may
in some cases be configured lower by mailserver admins. Network transit time in some cases be configured lower by mailserver admins. Network transit time
must also be allowed for. must also be allowed for.
=head3 overriding wait
Other plugins can set specify a per-connection delay by setting
connection->notes->('relayclient_wait'). This is ideally used in conjunction with
a reputation database.
=head2 reject <boolean> =head2 reject <boolean>
Do we reject/deny connections to early talkers? Do we reject/deny connections to early talkers?
@ -88,7 +94,7 @@ sub register {
$check_at{CONNECT} = 1; $check_at{CONNECT} = 1;
} }
$self->{_args} = { $self->{_args} = {
'wait' => 1, wait => 1,
@args, @args,
'check-at' => \%check_at, 'check-at' => \%check_at,
}; };
@ -106,8 +112,8 @@ sub register {
if (!defined $self->{_args}{reject_type}) { if (!defined $self->{_args}{reject_type}) {
$self->{_args}{reject_type} = 'perm'; $self->{_args}{reject_type} = 'perm';
} }
# /end compat # /end compat
if ($qp->{conn} && $qp->{conn}->isa('Apache2::Connection')) { if ($qp->{conn} && $qp->{conn}->isa('Apache2::Connection')) {
require APR::Const; require APR::Const;
APR::Const->import(qw(POLLIN SUCCESS)); APR::Const->import(qw(POLLIN SUCCESS));
@ -118,11 +124,22 @@ sub register {
$self->register_hook('connect', 'connect_handler'); $self->register_hook('connect', 'connect_handler');
$self->register_hook('data', 'data_handler'); $self->register_hook('data', 'data_handler');
} }
if ($self->{_args}{'defer-reject'}) {
$self->register_hook('mail', 'mail_handler') $self->register_hook('mail', 'mail_handler')
if $self->{_args}{'defer-reject'}; };
$self->{_args}{reject} = 1 if !defined $self->{_args}{reject}; if (!defined $self->{_args}{reject}) {
$self->{_args}{reject} = 1;
};
} }
sub wait_length {
my ($self) = @_;
if ($self->connection->notes('earlytalker_wait')) {
return $self->connection->notes('earlytalker_wait');
}
return $self->{_args}{wait};
};
sub apr_connect_handler { sub apr_connect_handler {
my ($self, $transaction) = @_; my ($self, $transaction) = @_;
@ -131,7 +148,7 @@ sub apr_connect_handler {
my $c = $self->qp->{conn} or return DECLINED; my $c = $self->qp->{conn} or return DECLINED;
my $socket = $c->client_socket or return DECLINED; my $socket = $c->client_socket or return DECLINED;
my $timeout = $self->{_args}{'wait'} * 1_000_000; my $timeout = $self->wait_length() * 1_000_000;
my $rc = $socket->poll($c->pool, $timeout, APR::Const::POLLIN()); my $rc = $socket->poll($c->pool, $timeout, APR::Const::POLLIN());
if ($rc == APR::Const::SUCCESS()) { if ($rc == APR::Const::SUCCESS()) {
@ -152,7 +169,7 @@ sub apr_data_handler {
my $c = $self->qp->{conn} or return DECLINED; my $c = $self->qp->{conn} or return DECLINED;
my $socket = $c->client_socket or return DECLINED; my $socket = $c->client_socket or return DECLINED;
my $timeout = $self->{_args}{'wait'} * 1_000_000; my $timeout = $self->wait_length() * 1_000_000;
my $rc = $socket->poll($c->pool, $timeout, APR::Const::POLLIN()); my $rc = $socket->poll($c->pool, $timeout, APR::Const::POLLIN());
if ($rc == APR::Const::SUCCESS()) { if ($rc == APR::Const::SUCCESS()) {
@ -163,7 +180,6 @@ sub apr_data_handler {
sub connect_handler { sub connect_handler {
my ($self, $transaction) = @_; my ($self, $transaction) = @_;
my $in = new IO::Select;
return DECLINED unless $self->{_args}{'check-at'}{CONNECT}; return DECLINED unless $self->{_args}{'check-at'}{CONNECT};
return DECLINED if $self->is_immune(); return DECLINED if $self->is_immune();
@ -175,8 +191,9 @@ sub connect_handler {
return DECLINED; return DECLINED;
} }
my $in = new IO::Select;
$in->add(\*STDIN) or return DECLINED; $in->add(\*STDIN) or return DECLINED;
if (!$in->can_read($self->{_args}{'wait'})) { if (!$in->can_read($self->wait_length())) {
return $self->log_and_pass(); return $self->log_and_pass();
} }
@ -197,7 +214,7 @@ sub data_handler {
return DECLINED if $self->is_immune(); return DECLINED if $self->is_immune();
$in->add(\*STDIN) or return DECLINED; $in->add(\*STDIN) or return DECLINED;
if (!$in->can_read($self->{_args}{'wait'})) { if (!$in->can_read($self->wait_length())) {
return $self->log_and_pass(); return $self->log_and_pass();
} }
@ -206,7 +223,6 @@ sub data_handler {
sub log_and_pass { sub log_and_pass {
my $self = shift; my $self = shift;
my $ip = $self->qp->connection->remote_ip || 'remote host';
$self->log(LOGINFO, "pass, not spontaneous"); $self->log(LOGINFO, "pass, not spontaneous");
return DECLINED; return DECLINED;
} }
@ -214,8 +230,6 @@ sub log_and_pass {
sub log_and_deny { sub log_and_deny {
my $self = shift; my $self = shift;
my $ip = $self->qp->connection->remote_ip || 'remote host';
$self->connection->notes('earlytalker', 1); $self->connection->notes('earlytalker', 1);
$self->adjust_karma(-1); $self->adjust_karma(-1);

View File

@ -144,4 +144,3 @@ sub test_reject_type {
$self->{_args}{reject_type} = 'disconnect'; $self->{_args}{reject_type} = 'disconnect';
cmp_ok( $self->get_reject_type(), '==', DENY_DISCONNECT, "disconnect"); cmp_ok( $self->get_reject_type(), '==', DENY_DISCONNECT, "disconnect");
}; };