/tests/CloudFront/UrlSignerTest.php

https://gitlab.com/github-cloud-corp/aws-sdk-php · PHP · 167 lines · 130 code · 16 blank · 21 comment · 3 complexity · 5b07cc8e285148a99889d792800b315e MD5 · raw file

  1. <?php
  2. namespace Aws\Test\CloudFront;
  3. use Aws\CloudFront\CloudFrontClient;
  4. use Aws\CloudFront\UrlSigner;
  5. use GuzzleHttp\Psr7\Uri;
  6. /**
  7. * @covers Aws\CloudFront\UrlSigner
  8. */
  9. class UrlSignerTest extends \PHPUnit_Framework_TestCase
  10. {
  11. public function setUp()
  12. {
  13. foreach (['CF_PRIVATE_KEY', 'CF_KEY_PAIR_ID'] as $k) {
  14. if (!isset($_SERVER[$k]) || $_SERVER[$k] == 'change_me') {
  15. $this->markTestSkipped('$_SERVER[\'' . $k . '\'] not set in '
  16. . 'phpunit.xml');
  17. }
  18. }
  19. }
  20. public function testCreatesUrlSignersForHttp()
  21. {
  22. /** @var $client \Aws\CloudFront\CloudFrontClient */
  23. $client = CloudFrontClient::factory([
  24. 'region' => 'us-west-2',
  25. 'version' => 'latest'
  26. ]);
  27. $ts = time() + 1000;
  28. $key = $_SERVER['CF_PRIVATE_KEY'];
  29. $kp = $_SERVER['CF_KEY_PAIR_ID'];
  30. $url = $client->getSignedUrl([
  31. 'url' => 'http://abc.cloudfront.net/images/image.jpg?color=red',
  32. 'expires' => $ts,
  33. 'private_key' => $key,
  34. 'key_pair_id' => $kp
  35. ]);
  36. $this->assertContains("Key-Pair-Id={$kp}", $url);
  37. $this->assertStringStartsWith(
  38. "http://abc.cloudfront.net/images/image.jpg?color=red&Expires={$ts}&Signature=",
  39. $url
  40. );
  41. $urlObject = new Uri($url);
  42. $query = \GuzzleHttp\Psr7\parse_query($urlObject->getQuery());
  43. $signature = $query['Signature'];
  44. $this->assertNotContains('?', $signature);
  45. $this->assertNotContains('=', $signature);
  46. $this->assertNotContains('/', $signature);
  47. $this->assertNotContains('&', $signature);
  48. $this->assertNotContains('+', $signature);
  49. }
  50. public function testCreatesUrlSignersWithSpecialCharacters()
  51. {
  52. /** @var $client \Aws\CloudFront\CloudFrontClient */
  53. $client = CloudFrontClient::factory([
  54. 'region' => 'us-west-2',
  55. 'version' => 'latest'
  56. ]);
  57. $ts = time() + 1000;
  58. $key = $_SERVER['CF_PRIVATE_KEY'];
  59. $kp = $_SERVER['CF_KEY_PAIR_ID'];
  60. $invalidUri = 'http://abc.cloudfront.net/images/éüàçµñ圌.jpg?query key=query value';
  61. $uri = new Uri($invalidUri);
  62. $this->assertNotEquals($invalidUri, (string) $uri);
  63. $url = $client->getSignedUrl([
  64. 'url' => $invalidUri,
  65. 'expires' => $ts,
  66. 'private_key' => $key,
  67. 'key_pair_id' => $kp
  68. ]);
  69. $this->assertContains("Key-Pair-Id={$kp}", $url);
  70. $this->assertContains((string) $uri, $url);
  71. $this->assertStringStartsWith(
  72. "{$uri}&Expires={$ts}&Signature=",
  73. $url
  74. );
  75. }
  76. public function testCreatesUrlSignersWithCustomPolicy()
  77. {
  78. /** @var $client \Aws\CloudFront\CloudFrontClient */
  79. $client = CloudFrontClient::factory([
  80. 'region' => 'us-west-2',
  81. 'version' => 'latest'
  82. ]);
  83. $url = $client->getSignedUrl(array(
  84. 'url' => 'http://abc.cloudfront.net/images/image.jpg',
  85. 'policy' => '{}',
  86. 'private_key' => $_SERVER['CF_PRIVATE_KEY'],
  87. 'key_pair_id' => $_SERVER['CF_KEY_PAIR_ID']
  88. ));
  89. $policy = (new Uri($url))->getQuery();
  90. $this->assertRegExp('/Policy=[0-9a-zA-Z-_~]+/', $policy);
  91. }
  92. public function testCreatesUrlSignersForRtmp()
  93. {
  94. /** @var $client \Aws\CloudFront\CloudFrontClient */
  95. $client = CloudFrontClient::factory([
  96. 'region' => 'us-west-2',
  97. 'version' => 'latest'
  98. ]);
  99. $ts = time() + 1000;
  100. $kp = $_SERVER['CF_KEY_PAIR_ID'];
  101. $url = $client->getSignedUrl(array(
  102. 'url' => 'rtmp://foo.cloudfront.net/test.mp4?a=b',
  103. 'expires' => $ts,
  104. 'private_key' => $_SERVER['CF_PRIVATE_KEY'],
  105. 'key_pair_id' => $kp
  106. ));
  107. $this->assertStringStartsWith("test.mp4?a=b&Expires={$ts}&Signature=", $url);
  108. $this->assertContains("Key-Pair-Id={$kp}", $url);
  109. }
  110. /**
  111. * @expectedException \InvalidArgumentException
  112. * @expectedExceptionMessage Invalid URI scheme
  113. */
  114. public function testEnsuresUriSchemeIsValid()
  115. {
  116. $s = new UrlSigner('a', $_SERVER['CF_PRIVATE_KEY']);
  117. $s->getSignedUrl('foo://bar.com', '+10 minutes');
  118. }
  119. /**
  120. * @expectedException \InvalidArgumentException
  121. * @expectedExceptionMessage Invalid URL: bar.com
  122. */
  123. public function testEnsuresUriSchemeIsPresent()
  124. {
  125. $s = new UrlSigner('a', $_SERVER['CF_PRIVATE_KEY']);
  126. $s->getSignedUrl('bar.com');
  127. }
  128. /**
  129. * @dataProvider urlAndResourceProvider
  130. *
  131. * @param string $url
  132. * @param string $resource
  133. */
  134. public function testIsolatesResourceIUrls($url, $resource)
  135. {
  136. $s = new UrlSigner('a', $_SERVER['CF_PRIVATE_KEY']);
  137. $m = new \ReflectionMethod(get_class($s), 'createResource');
  138. $m->setAccessible(true);
  139. $scheme = parse_url($url)['scheme'];
  140. $this->assertSame($resource, $m->invoke($s, $scheme, $url));
  141. }
  142. public function urlAndResourceProvider()
  143. {
  144. return [
  145. ['rtmp://foo.cloudfront.net/videos/test.mp4', 'videos/test.mp4'],
  146. ['rtmp://foo.cloudfront.net/test.mp4', 'test.mp4'],
  147. array_fill(0, 2, 'https://aws.amazon.com/something.html'),
  148. array_fill(0, 2, 'http://www.foo.com/bar/baz.quux'),
  149. ];
  150. }
  151. }