Applied.

On Sun, May 6, 2012 at 1:59 PM, Matt Simerson <m...@tnpi.net> wrote:

> added logging and tests to check_badmailfrom
>
> refactored several checks out of hook_mail and added LOGDEBUG
>
> added tests for is_immune method
> ---
> plugins/check_badmailfrom        |   27 +++++++++++++++++++++++----
> t/plugin_tests/check_badmailfrom |   29 ++++++++++++++++++++++++++++-
> 2 files changed, 51 insertions(+), 5 deletions(-)
>
> diff --git a/plugins/check_badmailfrom b/plugins/check_badmailfrom
> index 0a92f23..975cecc 100644
> --- a/plugins/check_badmailfrom
> +++ b/plugins/check_badmailfrom
> @@ -58,15 +58,13 @@ sub hook_mail {
>        @badmailfrom = @{$self->{_badmailfrom_config}};
>    };
>
> -    return DECLINED if ! scalar @badmailfrom;
> -    return DECLINED if $sender->format eq '<>';
> -    return DECLINED if ! $sender->host || ! $sender->user;
> +    return DECLINED if $self->is_immune( $sender, \@badmailfrom );
>
>    my $host = lc $sender->host;
>    my $from = lc($sender->user) . '@' . $host;
>
>    for my $config (@badmailfrom) {
> -        $config =~ s/^\s+//g;   # trim any leading whitespace
> +        $config =~ s/^\s+//g;   # trim leading whitespace
>        my ($bad, $reason) = split /\s+/, $config, 2;
>        next unless $bad;
>        next unless $self->is_match( $from, $bad, $host );
> @@ -105,3 +103,24 @@ sub hook_rcpt {
>    $self->log(LOGINFO, $note);
>    return (DENY, $note);
> }
> +
> +sub is_immune {
> +    my ($self, $sender, $badmf ) = @_;
> +
> +    if ( ! scalar @$badmf ) {
> +        $self->log(LOGDEBUG, 'skip: empty list');
> +        return 1;
> +    };
> +
> +    if ( ! $sender || $sender->format eq '<>' ) {
> +        $self->log(LOGDEBUG, 'skip: null sender');
> +        return 1;
> +    };
> +
> +    if ( ! $sender->host || ! $sender->user ) {
> +        $self->log(LOGDEBUG, 'skip: missing user or host');
> +        return 1;
> +    };
> +
> +    return;
> +};
> diff --git a/t/plugin_tests/check_badmailfrom
> b/t/plugin_tests/check_badmailfrom
> index e183003..60610fe 100644
> --- a/t/plugin_tests/check_badmailfrom
> +++ b/t/plugin_tests/check_badmailfrom
> @@ -1,3 +1,4 @@
> +#!perl -w
>
> use strict;
> use Data::Dumper;
> @@ -7,11 +8,38 @@ use Qpsmtpd::Address;
> sub register_tests {
>    my $self = shift;
>
> +    $self->register_test("test_badmailfrom_is_immune", 5);
>    $self->register_test("test_badmailfrom_match", 7);
>    $self->register_test("test_badmailfrom_hook_mail", 4);
>    $self->register_test("test_badmailfrom_hook_rcpt", 2);
> }
>
> +sub test_badmailfrom_is_immune {
> +    my $self = shift;
> +
> +    my $transaction = $self->qp->transaction;
> +    my $test_email = 'm...@test.com';
> +    my $address = Qpsmtpd::Address->new( "<$test_email>" );
> +    $transaction->sender($address);
> +    ok( $self->is_immune( $transaction->sender, [] ), "is_immune, empty
> list");
> +
> +    $address = Qpsmtpd::Address->new( '<>' );
> +    $transaction->sender($address);
> +    ok( $self->is_immune( $transaction->sender, ['b...@example.com'] ),
> "is_immune, null sender");
> +
> +    $address = Qpsmtpd::Address->new( '<matt@>' );
> +    $transaction->sender($address);
> +    ok( $self->is_immune( $transaction->sender, ['b...@example.com'] ),
> "is_immune, missing host");
> +
> +    $address = Qpsmtpd::Address->new( '<@example.com>' );
> +    $transaction->sender($address);
> +    ok( $self->is_immune( $transaction->sender, ['b...@example.com'] ),
> "is_immune, missing user");
> +
> +    $address = Qpsmtpd::Address->new( '<m...@example.com>' );
> +    $transaction->sender($address);
> +    ok( ! $self->is_immune( $transaction->sender, ['b...@example.com'] ),
> "is_immune, false");
> +};
> +
> sub test_badmailfrom_hook_mail {
>    my $self = shift;
>
> @@ -77,4 +105,3 @@ sub test_badmailfrom_match {
>        "check_badmailfrom pattern non-match");
> };
>
> -
> --
> 1.7.9.6
>
>

Reply via email to