Skip to content

Commit 5642327

Browse files
committed
refactor: move aws session token resolution to configuration and inject into aws clients
1 parent e19c703 commit 5642327

10 files changed

Lines changed: 71 additions & 13 deletions

src/CloudProvider/Aws/AbstractClient.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,13 @@ abstract class AbstractClient
5858
/**
5959
* Constructor.
6060
*/
61-
public function __construct(ClientInterface $client, string $key, string $region, string $secret)
61+
public function __construct(ClientInterface $client, string $key, string $region, string $secret, string $securityToken = '')
6262
{
6363
$this->client = $client;
6464
$this->key = $key;
6565
$this->region = $region;
6666
$this->secret = $secret;
67-
$this->securityToken = getenv('AWS_SESSION_TOKEN') ?: '';
67+
$this->securityToken = $securityToken;
6868
}
6969

7070
/**

src/CloudProvider/Aws/CloudFrontClient.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class CloudFrontClient extends AbstractClient implements ContentDeliveryNetworkP
3939
/**
4040
* {@inheritdoc}
4141
*/
42-
public function __construct(ClientInterface $client, string $distributionId, string $key, string $secret)
42+
public function __construct(ClientInterface $client, string $distributionId, string $key, string $secret, string $securityToken = '')
4343
{
44-
parent::__construct($client, $key, 'us-east-1', $secret);
44+
parent::__construct($client, $key, 'us-east-1', $secret, $securityToken);
4545

4646
$this->distributionId = $distributionId;
4747
$this->invalidationPaths = [];

src/CloudProvider/Aws/LambdaClient.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class LambdaClient extends AbstractClient implements ConsoleClientInterface
3939
/**
4040
* {@inheritdoc}
4141
*/
42-
public function __construct(ClientInterface $client, string $functionName, string $key, string $region, string $secret, string $siteUrl)
42+
public function __construct(ClientInterface $client, string $functionName, string $key, string $region, string $secret, string $siteUrl, string $securityToken = '')
4343
{
44-
parent::__construct($client, $key, $region, $secret);
44+
parent::__construct($client, $key, $region, $secret, $securityToken);
4545

4646
$this->functionName = $functionName;
4747
$this->siteUrl = $siteUrl;

src/CloudProvider/Aws/S3Client.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ class S3Client extends AbstractClient implements CloudStorageClientInterface
3131
/**
3232
* Constructor.
3333
*/
34-
public function __construct(ClientInterface $client, string $bucket, string $key, string $region, string $secret)
34+
public function __construct(ClientInterface $client, string $bucket, string $key, string $region, string $secret, string $securityToken = '')
3535
{
36-
parent::__construct($client, $key, $region, $secret);
36+
parent::__construct($client, $key, $region, $secret, $securityToken);
3737

3838
$this->bucket = $bucket;
3939
}

src/Configuration/CloudProviderConfiguration.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ public function modify(Container $container)
4646
$container['cloud_provider_secret'] = $container->service(function () {
4747
return getenv('AWS_SECRET_ACCESS_KEY') ?: (defined('YMIR_CLOUD_PROVIDER_SECRET') ? YMIR_CLOUD_PROVIDER_SECRET : '');
4848
});
49+
$container['cloud_provider_security_token'] = $container->service(function () {
50+
return getenv('AWS_SESSION_TOKEN') ?: '';
51+
});
4952
$container['cloud_provider_private_store'] = $container->service(function () {
5053
return getenv('YMIR_PRIVATE_STORE') ?: (defined('YMIR_CLOUD_PROVIDER_PRIVATE_STORE') ? YMIR_CLOUD_PROVIDER_PRIVATE_STORE : '');
5154
});

src/Configuration/CloudStorageConfiguration.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ class CloudStorageConfiguration implements ContainerConfigurationInterface
3030
public function modify(Container $container)
3131
{
3232
$container['private_cloud_storage_client'] = $container->service(function (Container $container) {
33-
return new S3Client($container['ymir_http_client'], $container['cloud_provider_private_store'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret']);
33+
return new S3Client($container['ymir_http_client'], $container['cloud_provider_private_store'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret'], $container['cloud_provider_security_token']);
3434
});
3535
$container['private_cloud_storage_protocol'] = PrivateCloudStorageStreamWrapper::getProtocol().'://';
3636
$container['public_cloud_storage_client'] = $container->service(function (Container $container) {
37-
return new S3Client($container['ymir_http_client'], $container['cloud_provider_public_store'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret']);
37+
return new S3Client($container['ymir_http_client'], $container['cloud_provider_public_store'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret'], $container['cloud_provider_security_token']);
3838
});
3939
$container['public_cloud_storage_protocol'] = PublicCloudStorageStreamWrapper::getProtocol().'://';
4040
}

src/Configuration/ConsoleConfiguration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function modify(Container $container)
3939
];
4040
});
4141
$container['console_client'] = $container->service(function (Container $container) {
42-
return new LambdaClient($container['ymir_http_client'], $container['cloud_provider_function_name'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret'], $container['site_url']);
42+
return new LambdaClient($container['ymir_http_client'], $container['cloud_provider_function_name'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret'], $container['site_url'], $container['cloud_provider_security_token']);
4343
});
4444
$container['wp_cli'] = $container->service(function () {
4545
return new Console\WpCli();

src/Configuration/EmailConfiguration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class EmailConfiguration implements ContainerConfigurationInterface
2929
public function modify(Container $container)
3030
{
3131
$container['email_client'] = $container->service(function (Container $container) {
32-
return new SesClient($container['ymir_http_client'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret']);
32+
return new SesClient($container['ymir_http_client'], $container['cloud_provider_key'], $container['cloud_provider_region'], $container['cloud_provider_secret'], $container['cloud_provider_security_token']);
3333
});
3434
$container['email'] = function (Container $container) {
3535
return new Email($container['event_manager'], $container['default_email_from'], $container['file_manager'], $container['phpmailer'], $container['blog_charset']);

src/Configuration/PageCacheConfiguration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class PageCacheConfiguration implements ContainerConfigurationInterface
2828
public function modify(Container $container)
2929
{
3030
$container['cloudfront_client'] = $container->service(function (Container $container) {
31-
return new CloudFrontClient($container['ymir_http_client'], getenv('YMIR_DISTRIBUTION_ID'), $container['cloud_provider_key'], $container['cloud_provider_secret']);
31+
return new CloudFrontClient($container['ymir_http_client'], getenv('YMIR_DISTRIBUTION_ID'), $container['cloud_provider_key'], $container['cloud_provider_secret'], $container['cloud_provider_security_token']);
3232
});
3333
$container['page_caching_invalidation_disabled'] = $container->service(function (Container $container) {
3434
if (false !== getenv('YMIR_DISABLE_PAGE_CACHING')) {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/*
6+
* This file is part of Ymir WordPress plugin.
7+
*
8+
* (c) Carl Alexander <support@ymirapp.com>
9+
*
10+
* For the full copyright and license information, please view the LICENSE
11+
* file that was distributed with this source code.
12+
*/
13+
14+
namespace Ymir\Plugin\Tests\Unit\CloudProvider\Aws;
15+
16+
use Ymir\Plugin\CloudProvider\Aws\S3Client;
17+
use Ymir\Plugin\Tests\Mock\FunctionMockTrait;
18+
use Ymir\Plugin\Tests\Mock\HttpClientMockTrait;
19+
use Ymir\Plugin\Tests\Unit\TestCase;
20+
21+
class AbstractClientTest extends TestCase
22+
{
23+
use FunctionMockTrait;
24+
use HttpClientMockTrait;
25+
26+
public function testCreatePresignedRequestWithSecurityToken()
27+
{
28+
$gmdate = $this->getFunctionMock($this->getNamespace(S3Client::class), 'gmdate');
29+
$gmdate->expects($this->exactly(5))
30+
->withConsecutive(
31+
[$this->identicalTo('Ymd')],
32+
[$this->identicalTo('Ymd\THis\Z')],
33+
[$this->identicalTo('Ymd\THis\Z')],
34+
[$this->identicalTo('Ymd')],
35+
[$this->identicalTo('Ymd')]
36+
)
37+
->willReturnOnConsecutiveCalls('20200515', '20200515T181004Z', '20200515T181004Z', '20200515', '20200515');
38+
39+
$client = new S3Client($this->getHttpClientMock(), 'test-bucket', 'aws-key', 'us-east-1', 'aws-secret', 'security-token');
40+
$createPresignedRequestMethod = new \ReflectionMethod(S3Client::class, 'createPresignedRequest');
41+
$createPresignedRequestMethod->setAccessible(true);
42+
43+
$request = $createPresignedRequestMethod->invoke($client, '/object-key', 'put');
44+
45+
$this->assertIsString($request);
46+
47+
$query = parse_url($request, PHP_URL_QUERY);
48+
49+
$this->assertIsString($query);
50+
51+
parse_str($query, $parameters);
52+
53+
$this->assertSame('security-token', $parameters['X-Amz-Security-Token']);
54+
}
55+
}

0 commit comments

Comments
 (0)