#!/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 = < 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; }