diff options
author | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
---|---|---|
committer | Andrew Dolgov <[email protected]> | 2022-11-23 21:14:33 +0300 |
commit | 0c8af4992cb0f7589dcafaad65ada12753c64594 (patch) | |
tree | 18e83d068c3e7dd2499331de977782b382279396 /vendor/aws/aws-sdk-php/src/CloudFront/UrlSigner.php |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/CloudFront/UrlSigner.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/CloudFront/UrlSigner.php | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/CloudFront/UrlSigner.php b/vendor/aws/aws-sdk-php/src/CloudFront/UrlSigner.php new file mode 100644 index 0000000..3929c2f --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/CloudFront/UrlSigner.php @@ -0,0 +1,119 @@ +<?php +namespace Aws\CloudFront; + +use GuzzleHttp\Psr7; +use GuzzleHttp\Psr7\Uri; +use Psr\Http\Message\UriInterface; + +/** + * Creates signed URLs for Amazon CloudFront resources. + */ +class UrlSigner +{ + private $signer; + + /** + * @param $keyPairId string ID of the key pair + * @param $privateKey string Path to the private key used for signing + * + * @throws \RuntimeException if the openssl extension is missing + * @throws \InvalidArgumentException if the private key cannot be found. + */ + public function __construct($keyPairId, $privateKey) + { + $this->signer = new Signer($keyPairId, $privateKey); + } + + /** + * Create a signed Amazon CloudFront URL. + * + * Keep in mind that URLs meant for use in media/flash players may have + * different requirements for URL formats (e.g. some require that the + * extension be removed, some require the file name to be prefixed + * - mp4:<path>, some require you to add "/cfx/st" into your URL). + * + * @param string $url URL to sign (can include query + * string string and wildcards) + * @param string|integer|null $expires UTC Unix timestamp used when signing + * with a canned policy. Not required + * when passing a custom $policy. + * @param string $policy JSON policy. Use this option when + * creating a signed URL for a custom + * policy. + * + * @return string The file URL with authentication parameters + * @throws \InvalidArgumentException if the URL provided is invalid + * @link http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/WorkingWithStreamingDistributions.html + */ + public function getSignedUrl($url, $expires = null, $policy = null) + { + // Determine the scheme of the url + $urlSections = explode('://', $url); + + if (count($urlSections) < 2) { + throw new \InvalidArgumentException("Invalid URL: {$url}"); + } + + // Get the real scheme by removing wildcards from the scheme + $scheme = str_replace('*', '', $urlSections[0]); + $uri = new Uri($scheme . '://' . $urlSections[1]); + $query = Psr7\Query::parse($uri->getQuery(), PHP_QUERY_RFC3986); + $signature = $this->signer->getSignature( + $this->createResource($scheme, (string) $uri), + $expires, + $policy + ); + $uri = $uri->withQuery( + http_build_query($query + $signature, '', '&', PHP_QUERY_RFC3986) + ); + + return $scheme === 'rtmp' + ? $this->createRtmpUrl($uri) + : (string) $uri; + } + + private function createRtmpUrl(UriInterface $uri) + { + // Use a relative URL when creating Flash player URLs + $result = ltrim($uri->getPath(), '/'); + + if ($query = $uri->getQuery()) { + $result .= '?' . $query; + } + + return $result; + } + + /** + * @param $scheme + * @param $url + * + * @return string + */ + private function createResource($scheme, $url) + { + switch ($scheme) { + case 'http': + case 'http*': + case 'https': + return $url; + case 'rtmp': + $parts = parse_url($url); + $pathParts = pathinfo($parts['path']); + $resource = ltrim( + $pathParts['dirname'] . '/' . $pathParts['basename'], + '/' + ); + + // Add a query string if present. + if (isset($parts['query'])) { + $resource .= "?{$parts['query']}"; + } + + return $resource; + } + + throw new \InvalidArgumentException("Invalid URI scheme: {$scheme}. " + . "Scheme must be one of: http, https, or rtmp"); + } +} |