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;
> +}

Reply via email to