8000 feature #42982 Add Session Token to Amazon Mailer (Jubeki) · symfony/symfony@91b40b0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 91b40b0

Browse files
committed
feature #42982 Add Session Token to Amazon Mailer (Jubeki)
This PR was squashed before being merged into the 5.4 branch. Discussion ---------- Add Session Token to Amazon Mailer | Q | A | ------------- | --- | Branch? | 5.4 | Bug fix? | no | New feature? | yes <!-- please update src/**/CHANGELOG.md files --> | Deprecations? | no <!-- please update UPGRADE-*.md and src/**/CHANGELOG.md files --> | Tickets | <!-- prefix each issue number with "Fix #", no need to create an issue if none exist, explain below instead --> | License | MIT | Doc PR | There doesn't appear to be a Amazon/SES section in the docs right now <!-- required for new features --> This PR provide's support for Amazons separate Session Token feature in both the API and HTTPS transports. I've added the ability to set the session token via a query parameter in the DSN. Right now in Laravel users have the ability to use a Session Token together with temporary Access and Secret keys for sending emails. But unfortunately Symfony Mailer, which we're switching to for the upcoming Laravel v9 release doesn't has this feature yet. That's why I decided to send in this PR so both Symfony and Laravel users can enjoy this feature from SES / Amazon. This PR is needed for laravel/framework#38481 Documentation for the Session Token with temporary credentials can be found here: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html Documentation for creating `AsyncAws/Ses/SesClient` can be found here: https://async-aws.com/configuration.html#sessiontoken Current setup through Laravel can be found here: https://github.com/laravel/framework/blob/8.x/src/Illuminate/Mail/MailManager.php#L258-L293 (It seems like Laravel has not documented this feature yet. I will be sending a PR to the Laravel docs and then update this PR accordingly) `@driesvints` maybe you can also take a look at this PR. Commits ------- fdeec77 Add Session Token to Amazon Mailer
2 parents 9d12f14 + fdeec77 commit 91b40b0

File tree

4 files changed

+69
-0
lines changed

4 files changed

+69
-0
lines changed

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesApiAsyncAwsTransportTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,22 @@ public function getTransportData()
5252
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com:99']))),
5353
'ses+api://ACCESS_KEY@example.com:99',
5454
],
55+
[
56+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'sessionToken' => 'SESSION_TOKEN']))),
57+
'ses+api://ACCESS_KEY@us-east-1',
58+
],
59+
[
60+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'region' => 'us-west-1', 'sessionToken' => 'SESSION_TOKEN']))),
8000
61+
'ses+api://ACCESS_KEY@us-west-1',
62+
],
63+
[
64+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com', 'sessionToken' => 'SESSION_TOKEN']))),
65+
'ses+api://ACCESS_KEY@example.com',
66+
],
67+
[
68+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com:99', 'sessionToken' => 'SESSION_TOKEN']))),
69+
'ses+api://ACCESS_KEY@example.com:99',
70+
],
5571
];
5672
}
5773

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesHttpAsyncAwsTransportTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,22 @@ public function getTransportData()
5252
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com:99']))),
5353
'ses+https://ACCESS_KEY@example.com:99',
5454
],
55+
[
56+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'sessionToken' => 'SESSION_TOKEN']))),
57+
'ses+https://ACCESS_KEY@us-east-1',
58+
],
59+
[
60+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'region' => 'us-west-1', 'sessionToken' => 'SESSION_TOKEN']))),
61+
'ses+https://ACCESS_KEY@us-west-1',
62+
],
63+
[
64+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com', 'sessionToken' => 'SESSION_TOKEN']))),
65+
'ses+https://ACCESS_KEY@example.com',
66+
],
67+
[
68+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => 'ACCESS_KEY', 'accessKeySecret' => 'SECRET_KEY', 'endpoint' => 'https://example.com:99', 'sessionToken' => 'SESSION_TOKEN']))),
69+
'ses+https://ACCESS_KEY@example.com:99',
70+
],
5571
];
5672
}
5773

src/Symfony/Component/Mailer/Bridge/Amazon/Tests/Transport/SesTransportFactoryTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ public function createProvider(): iterable
8282
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'endpoint' => 'https://example.com:8080']), null, $client, $logger), $dispatcher, $logger),
8383
];
8484

85+
yield [
86+
new Dsn('ses+api', 'default', self::USER, self::PASSWORD, null, ['session_token' => 'se$sion']),
87+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
88+
];
89+
90+
yield [
91+
new Dsn('ses+api', 'default', self::USER, self::PASSWORD, null, ['region' => 'eu-west-2', 'session_token' => 'se$sion']),
92+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-2', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
93+
];
94+
95+
yield [
96+
new Dsn('ses+api', 'example.com', self::USER, self::PASSWORD, 8080, ['session_token' => 'se$sion']),
97+
new SesApiAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'endpoint' => 'https://example.com:8080', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
98+
];
99+
85100
yield [
86101
new Dsn('ses+https', 'default', self::USER, self::PASSWORD),
87102
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1']), null, $client, $logger), $dispatcher, $logger),
@@ -102,6 +117,26 @@ public function createProvider(): iterable
102117
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-2']), null, $client, $logger), $dispatcher, $logger),
103118
];
104119

120+
yield [
121+
new Dsn('ses+https', 'default', self::USER, self::PASSWORD, null, ['session_token' => 'se$sion']),
122+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
123+
];
124+
125+
yield [
126+
new Dsn('ses', 'default', self::USER, self::PASSWORD, null, ['session_token' => 'se$sion']),
127+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
128+
];
129+
130+
yield [
131+
new Dsn('ses+https', 'example.com', self::USER, self::PASSWORD, 8080, ['session_token' => 'se$sion']),
132+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-1', 'endpoint' => 'https://example.com:8080', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
133+
];
134+
135+
yield [
136+
new Dsn('ses+https', 'default', self::USER, self::PASSWORD, null, ['region' => 'eu-west-2', 'session_token' => 's C552 e$sion']),
137+
new SesHttpAsyncAwsTransport(new SesClient(Configuration::create(['accessKeyId' => self::USER, 'accessKeySecret' => self::PASSWORD, 'region' => 'eu-west-2', 'sessionToken' => 'se$sion']), null, $client, $logger), $dispatcher, $logger),
138+
];
139+
105140
yield [
106141
new Dsn('ses+smtp', 'default', self::USER, self::PASSWORD),
107142
new SesSmtpTransport(self::USER, self::PASSWORD, null, $dispatcher, $logger),

src/Symfony/Component/Mailer/Bridge/Amazon/Transport/SesTransportFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ public function create(Dsn $dsn): TransportInterface
5252
'accessKeySecret' => $dsn->getPassword(),
5353
] + (
5454
'default' === $dsn->getHost() ? [] : ['endpoint' => 'https://'.$dsn->getHost().($dsn->getPort() ? ':'.$dsn->getPort() : '')]
55+
) + (
56+
null === $dsn->getOption('session_token') ? [] : ['sessionToken' => $dsn->getOption('session_token')]
5557
);
5658

5759
return new $class(new SesClient(Configuration::create($options), null, $this->client, $this->logger), $this->dispatcher, $this->logger);

0 commit comments

Comments
 (0)
0