qpsmtpd/t/plugin_tests/badmailfrom

100 lines
3.2 KiB
Plaintext

use strict;
use Qpsmtpd::Address;
use Qpsmtpd::Constants;
sub register_tests {
my $self = shift;
$self->register_test("test_badmailfrom_is_immune_sender");
$self->register_test("test_badmailfrom_match");
$self->register_test("test_badmailfrom_hook_mail");
}
sub test_badmailfrom_is_immune_sender {
my $self = shift;
my $transaction = $self->qp->transaction;
my $test_email = 'matt@test.com';
my $address = Qpsmtpd::Address->new( "<$test_email>" );
$transaction->sender($address);
ok( $self->is_immune_sender( $transaction->sender, [] ), "empty list");
$address = Qpsmtpd::Address->new( '<>' );
$transaction->sender($address);
ok( $self->is_immune_sender( $transaction->sender, ['bad@example.com'] ), "null sender");
$address = Qpsmtpd::Address->new( '<matt@>' );
$transaction->sender($address);
ok( $self->is_immune_sender( $transaction->sender, ['bad@example.com'] ), "missing host");
$address = Qpsmtpd::Address->new( '<@example.com>' );
$transaction->sender($address);
ok( $self->is_immune_sender( $transaction->sender, ['bad@example.com'] ), "missing user");
$address = Qpsmtpd::Address->new( '<matt@example.com>' );
$transaction->sender($address);
ok( ! $self->is_immune_sender( $transaction->sender, ['bad@example.com'] ), "false");
}
sub test_badmailfrom_hook_mail {
my $self = shift;
$self->_reset_connection_flags();
my $transaction = $self->qp->transaction;
my $test_email = 'matt@test.com';
my $address = Qpsmtpd::Address->new( "<$test_email>" );
$transaction->sender($address);
$self->{_badmailfrom_config} = ['matt@test.net','matt@test.com'];
$self->{_args}{reject} = 1;
$transaction->notes('naughty', '');
my ($r, $err) = $self->hook_mail( $transaction, $address );
cmp_ok( $r, '==', DENY, "hook_mail rc");
cmp_ok( $err, 'eq', 'Your envelope sender is in my badmailfrom list', "default reason");
$self->{_badmailfrom_config} = ['matt@test.net','matt@test.com Yer a spammin bastert'];
$transaction->notes('naughty', '');
($r, $err) = $self->hook_mail( $transaction, $address );
cmp_ok( $r, '==', DENY, "hook_mail rc");
cmp_ok( $err, 'eq', 'Yer a spammin bastert', "custom reason");
}
sub test_badmailfrom_match {
my $self = shift;
# is_match receives ( $from, $bad, $host )
my $r = $self->is_match( 'matt@test.net', 'matt@test.net', 'test.net' );
ok($r, "match");
ok( ! $self->is_match( 'matt@test.net', 'matt@test.com', 'tnpi.net' ),
"non-match");
ok( $self->is_match( 'matt@test.net', '@test.net', 'test.net' ),
"match host");
ok( ! $self->is_match( 'matt@test.net', '@test.not', 'test.net' ),
"non-match host");
ok( ! $self->is_match( 'matt@test.net', '@test.net', 'test.not' ),
"non-match host");
ok( $self->is_match( 'matt@test.net', 'test.net$', 'tnpi.net' ),
"pattern match");
ok( ! $self->is_match( 'matt@test.net', 'test.not$', 'tnpi.net' ),
"pattern non-match");
}
sub _reset_connection_flags {
my $self = shift;
$self->qp->connection->relay_client(0);
$self->qp->connection->notes('whitelisthost', 0);
$self->connection->notes('naughty',0);
$self->connection->notes('rejected', 0);
}