#!/usr/bin/perl -I../lib
use strict;
use warnings;
use Test::Simple tests => 24;
use Mail::DKIM::Signer;
my $keyfile = -f "t/test.key" ? "t/test.key" : "test.key";
my $policy;
my $dkim;
# test specification of a policy "class"
$policy = "MySignerPolicy";
$dkim = sign_sample_using_args(
Policy => $policy,
KeyFile => $keyfile
);
ok( $dkim, "processed message" );
my $signature = $dkim->signature;
ok( $signature, "signature() works" );
print "# signature=" . $signature->as_string . "\n";
ok( $signature->as_string =~ /d=different-domain/,
"got expected domain in signature" );
ok( $signature->as_string =~ /c=relaxed/,
"got expected canonicalization method in signature" );
ok(
$signature->as_string =~ /a=rsa-sha256/,
"got expected algorithm in signature"
);
# try using a policy "object"
$policy = bless {}, "MySignerPolicy";
$dkim = sign_sample_using_args(
Policy => $policy,
KeyFile => $keyfile
);
ok( $dkim, "processed message" );
$signature = $dkim->signature;
ok( $signature, "signature() works" );
print "# signature=" . $signature->as_string . "\n";
ok( $signature->as_string =~ /d=different-domain/,
"got expected domain in signature" );
# now a policy as an anonymous subroutine
$policy = sub {
my $signer = shift;
$signer->domain("different-domain.example");
$signer->method("relaxed");
$signer->algorithm("rsa-sha256");
$signer->selector("beta");
$signer->key_file($keyfile);
return 1;
};
$dkim = sign_sample_using_args( Policy => $policy );
ok( $dkim, "processed message" );
$signature = $dkim->signature;
ok( $signature, "got signature" );
# this policy should not produce any signature
$policy = sub {
my $signer = shift;
return 0;
};
$dkim = sign_sample_using_args(
Policy => $policy,
KeyFile => $keyfile
);
ok( $dkim, "processed message" );
$signature = $dkim->signature;
ok( !$signature, "no signature" );
# this policy should produce a DomainKeys signature
use Mail::DKIM::DkSignature;
$policy = sub {
my $signer = shift;
$signer->add_signature(
new Mail::DKIM::DkSignature(
Algorithm => "rsa-sha1",
Method => "nofws",
Headers => $dkim->headers,
Domain => "different-domain.example",
Selector => "beta",
)
);
return;
};
$dkim = sign_sample_using_args(
Policy => $policy,
KeyFile => $keyfile
);
ok( $dkim, "processed message" );
$signature = $dkim->signature;
ok( $signature, "got signature" );
print "# signature=" . $signature->as_string . "\n";
ok( $signature->as_string =~ /DomainKey-Signature/,
"got DomainKeys signature" );
ok( $signature->as_string =~ /d=different-domain/,
"got expected domain in signature" );
ok( $signature->as_string =~ /c=nofws/,
"got expected canonicalization method in signature" );
ok( $signature->as_string !~ /bh=/, "no bh= tag in signature" );
# this policy should produce two signature (one DKIM and one DomainKeys)
$policy = sub {
my $signer = shift;
$signer->add_signature(
new Mail::DKIM::DkSignature(
Algorithm => "rsa-sha1",
Method => "nofws",
Headers => $dkim->headers,
Domain => "different-domain.example",
Selector => "beta",
)
);
$signer->add_signature(
new Mail::DKIM::Signature(
Algorithm => "rsa-sha256",
Method => "relaxed",
Headers => $dkim->headers,
Domain => "different-domain.example",
Selector => "beta",
)
);
};
$dkim = sign_sample_using_args(
Policy => $policy,
KeyFile => $keyfile
);
ok( $dkim, "processed message" );
$signature = $dkim->signature;
ok( $signature, "got signature" );
print "# signature=" . $signature->as_string . "\n";
ok( $signature->as_string =~ /^DKIM-Signature/, "got DKIM signature" );
my @multiple = $dkim->signatures;
ok( @multiple == 2, "got 2 signatures" );
ok( $multiple[0]->as_string =~ /^DomainKey-Signature/,
"first is DomainKeys signature" );
ok( $multiple[1]->as_string =~ /^DKIM-Signature/, "second is DKIM signature" );
sub sign_sample_using_args {
my %args = @_;
my $dkim = Mail::DKIM::Signer->new(%args)
or die "couldn't create signer object";
my $sample_email = <<END_OF_SAMPLE;
From: jason <jason\@example.org>
Subject: hi there
this is a sample message
END_OF_SAMPLE
$sample_email =~ s/\n/\015\012/gs;
$dkim->PRINT($sample_email);
$dkim->CLOSE;
return $dkim;
}
package MySignerPolicy;
use Mail::DKIM::SignerPolicy;
use base "Mail::DKIM::SignerPolicy";
sub apply {
my ( $self, $signer ) = @_;
$signer->domain("different-domain.example");
$signer->method("relaxed");
$signer->algorithm("rsa-sha256");
$signer->selector("beta");
return 1;
}