From 1002d0dd561ad7cd22ecb76f1ecf46487ad83cf7 Mon Sep 17 00:00:00 2001 From: Steve Kemp Date: Tue, 4 May 2010 23:37:52 +0100 Subject: new plugin - check_bogus_bounce The current status file, in git, has the following entry: -plugin to reject mails from <> if it has multiple recipients. I hereby submit my plugin to handle this case for possible inclusion, under the same terms as the current qpsmtpd release. The plugin is available here: http://www.steve.org.uk/Software/qpsmtpd/check_bogus_bounce/ Please find patch against git head below, adding the file and removing the TODO line from the status file. Signed-off-by: Robert --- STATUS | 2 - plugins/check_bogus_bounce | 126 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 plugins/check_bogus_bounce diff --git a/STATUS b/STATUS index 4a00dc6..81cf0df 100644 --- a/STATUS +++ b/STATUS @@ -59,8 +59,6 @@ Make a system for configuring the plugins per user/domain/... support databytes per user / domain -plugin to reject mails from <> if it has multiple recipients. - localiphost - support foo@[a.b.c.d] addresses Move dispatch() etc from SMTP.pm to Qpsmtpd.pm to allow other similar diff --git a/plugins/check_bogus_bounce b/plugins/check_bogus_bounce new file mode 100644 index 0000000..045889c --- /dev/null +++ b/plugins/check_bogus_bounce @@ -0,0 +1,126 @@ +#!/usr/bin/perl -w + +=head1 NAME + +check_bogus_bounce - Check that a bounce message isn't bogus + +=head1 DESCRIPTION + +This plugin is designed to reject bogus bounce messages. + +In our case a bogus bounce message is defined as a bounce message +which has more than a single recipient. + +=head1 CONFIGURATION + +Only a single argument is recognized and is assumed to be the default +action. Valid settings are: + +=over 8 + +=item log + +Merely log the receipt of the bogus bounce (the default behaviour). + +=item deny + +Deny with a hard error code. + +=item denysoft + +Deny with a soft error code. + +=back + +=cut + +=head1 AUTHOR + +Steve Kemp +-- +http://steve.org.uk/Software/qpsmtpd/ + +=cut + +=begin doc + +Look for our single expected argument and configure "action" appropriately. + +=end doc + +=cut + +sub register { + my ($self, $qp, $arg, @nop) = (@_); + + # + # Default behaviour is to merely log. + # + $self->{_action} = "log"; + + # + # Unless one was specified + # + if ($arg) { + if ($arg =~ /^(log|deny|denysoft)$/i) { + $self->{_action} = $arg; + } + else { + die "Invalid argument '$arg' - use one of : log, deny, denysoft"; + } + } +} + +=begin doc + +Handle the detection of bounces here. + +If we find a match then we'll react with our expected action. + +=end doc + +=cut + +sub hook_data_post { + my ($self, $transaction) = (@_); + + # + # Find the sender, and return unless it wasn't a bounce. + # + my $sender = $transaction->sender->address || undef; + return DECLINED unless ($sender =~ /^<>$/); + + # + # Get the recipients. + # + my @to = $transaction->recipients || (); + return DECLINED unless (scalar @to > 1); + + # + # OK at this point we know: + # + # 1. It is a bounce, via the null-envelope. + # 2. It is a bogus bounce, because there are more than one recipients. + # + if ($self->{_action} =~ /^log$/i) { + $self->log(LOGWARN, + $self->plugin_name() . " bogus bounce for :" . join(",", @to)); + } + elsif ($self->{_action} =~ /^deny$/i) { + return (DENY, + $self->plugin_name() . " determined this to be a bogus bounce"); + } + elsif ($self->{_action} =~ /^denysoft$/i) { + return (DENYSOFT, + $self->plugin_name() . " determined this to be a bogus bounce"); + } + else { + $self->log(LOGWARN, + $self->plugin_name() . " failed to determine action. bug?"); + } + + # + # All done; allow this to proceed + # + return DECLINED; +} -- 1.7.2.2