Steve,
Oddly, this doesn't apply cleanly to the STATUS file.
Can you generate a new patch, and run perltidy on it as well? At
the very least, the qpsmtpd style is to put the braces { } on the
same line as the operation, not the line itself.
Thanks-
-R
Steve Kemp wrote:
>
>
> 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.
>
> Steve
> --
> http://stolen-souls.com/
>
>
> 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 f...@[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..8652151
> --- /dev/null
> +++ b/plugins/check_bogus_bounce
> @@ -0,0 +1,139 @@
> +#!/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;
> +}