Skip to content

Commit

Permalink
Merge pull request #104 from genkgo/dkim_ignore_headers
Browse files Browse the repository at this point in the history
allow ignoring headers during dkim signing
  • Loading branch information
frederikbosch committed Sep 16, 2022
2 parents 186859b + 3e8b32e commit e449580
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 2 deletions.
8 changes: 6 additions & 2 deletions src/Dkim/HeaderV1Factory.php
Expand Up @@ -58,19 +58,23 @@ public function __construct(
/**
* @param MessageInterface $message
* @param Parameters $parameters
* @param array<int, string> $ignoreHeaders
* @return HeaderInterface
*/
public function factory(
MessageInterface $message,
Parameters $parameters
Parameters $parameters,
array $ignoreHeaders = []
): HeaderInterface {
$ignoreHeaders = \array_map('strtolower', $ignoreHeaders);

$headerCanonicalized = [];
$headerNames = [];
foreach ($message->getHeaders() as $headers) {
/** @var HeaderInterface $header */
foreach ($headers as $header) {
$headerName = \strtolower((string)$header->getName());
if (isset(self::HEADERS_IGNORED[$headerName])) {
if (isset(self::HEADERS_IGNORED[$headerName]) || \in_array($headerName, $ignoreHeaders, true)) {
break;
}

Expand Down
48 changes: 48 additions & 0 deletions test/Unit/Dkim/HeaderV1FactoryTest.php
Expand Up @@ -14,6 +14,7 @@
use Genkgo\Mail\Header\Bcc;
use Genkgo\Mail\Header\Date;
use Genkgo\Mail\Header\From;
use Genkgo\Mail\Header\GenericHeader;
use Genkgo\Mail\Header\MessageId;
use Genkgo\Mail\Header\To;
use Genkgo\Mail\PlainTextMessage;
Expand Down Expand Up @@ -112,4 +113,51 @@ public function it_skips_bcc_header_signing_signature(): void
(string)$header->getValue()
);
}

/**
* @test
*/
public function it_skips_another_custom_header(): void
{
$signer = $this->createMock(SignInterface::class);
$signer->expects($this->any())
->method('hashBody')
->willReturn('hash');

$signer->expects($this->any())
->method('name')
->willReturn('rsa-sha256');

$signer->expects($this->any())
->method('signHeaders')
->willReturn('signature');

$headerCanonicalize = $this->createMock(CanonicalizeHeaderInterface::class);
$headerCanonicalize
->expects($this->any())
->method('name')
->willReturn('relaxed');

$bodyCanonicalize = $this->createMock(CanonicalizeBodyInterface::class);
$bodyCanonicalize
->expects($this->any())
->method('name')
->willReturn('relaxed');

$message = (new PlainTextMessage('Hello World'))
->withHeader(new Date(new \DateTimeImmutable('1/1/2017')))
->withHeader(new From(new Address(new EmailAddress('sender@genkgodev.com'))))
->withHeader(new To(new AddressList([new Address(new EmailAddress('recipient@genkgodev.com'))])))
->withHeader(new Bcc(new AddressList([new Address(new EmailAddress('bcc@genkgodev.com'))])))
->withHeader(new MessageId('testing', 'genkgodev.com'))
->withHeader(new GenericHeader('X-ABC', 'YYZ'));

$factory = new HeaderV1Factory($signer, $headerCanonicalize, $bodyCanonicalize);
$header = $factory->factory($message, new Parameters('x', 'example.com'), ['X-ABC']);

$this->assertEquals(
\file_get_contents(__DIR__.'/../../Stub/Dkim/dkim_factory_test_header.eml'),
(string)$header->getValue()
);
}
}

0 comments on commit e449580

Please sign in to comment.