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/Arn/Arn.php |
initial
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Arn/Arn.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/Arn/Arn.php | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/Arn/Arn.php b/vendor/aws/aws-sdk-php/src/Arn/Arn.php new file mode 100644 index 0000000..50367c6 --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/Arn/Arn.php @@ -0,0 +1,188 @@ +<?php +namespace Aws\Arn; + +use Aws\Arn\Exception\InvalidArnException; + +/** + * Amazon Resource Names (ARNs) uniquely identify AWS resources. The Arn class + * parses and stores a generic ARN object representation that can apply to any + * service resource. + * + * @internal + */ +class Arn implements ArnInterface +{ + protected $data; + protected $string; + + public static function parse($string) + { + $data = [ + 'arn' => null, + 'partition' => null, + 'service' => null, + 'region' => null, + 'account_id' => null, + 'resource' => null, + ]; + + $length = strlen($string); + $lastDelim = 0; + $numComponents = 0; + for ($i = 0; $i < $length; $i++) { + + if (($numComponents < 5 && $string[$i] === ':')) { + // Split components between delimiters + $data[key($data)] = substr($string, $lastDelim, $i - $lastDelim); + + // Do not include delimiter character itself + $lastDelim = $i + 1; + next($data); + $numComponents++; + } + + if ($i === $length - 1) { + // Put the remainder in the last component. + if (in_array($numComponents, [5])) { + $data['resource'] = substr($string, $lastDelim); + } else { + // If there are < 5 components, put remainder in current + // component. + $data[key($data)] = substr($string, $lastDelim); + } + } + } + + return $data; + } + + public function __construct($data) + { + if (is_array($data)) { + $this->data = $data; + } elseif (is_string($data)) { + $this->data = static::parse($data); + } else { + throw new InvalidArnException('Constructor accepts a string or an' + . ' array as an argument.'); + } + + static::validate($this->data); + } + + public function __toString() + { + if (!isset($this->string)) { + $components = [ + $this->getPrefix(), + $this->getPartition(), + $this->getService(), + $this->getRegion(), + $this->getAccountId(), + $this->getResource(), + ]; + + $this->string = implode(':', $components); + } + return $this->string; + } + + public function getPrefix() + { + return $this->data['arn']; + } + + public function getPartition() + { + return $this->data['partition']; + } + + public function getService() + { + return $this->data['service']; + } + + public function getRegion() + { + return $this->data['region']; + } + + public function getAccountId() + { + return $this->data['account_id']; + } + + public function getResource() + { + return $this->data['resource']; + } + + public function toArray() + { + return $this->data; + } + + /** + * Minimally restrictive generic ARN validation + * + * @param array $data + */ + protected static function validate(array $data) + { + if ($data['arn'] !== 'arn') { + throw new InvalidArnException("The 1st component of an ARN must be" + . " 'arn'."); + } + + if (empty($data['partition'])) { + throw new InvalidArnException("The 2nd component of an ARN" + . " represents the partition and must not be empty."); + } + + if (empty($data['service'])) { + throw new InvalidArnException("The 3rd component of an ARN" + . " represents the service and must not be empty."); + } + + if (empty($data['resource'])) { + throw new InvalidArnException("The 6th component of an ARN" + . " represents the resource information and must not be empty." + . " Individual service ARNs may include additional delimiters" + . " to further qualify resources."); + } + } + + protected static function validateAccountId($data, $arnName) + { + if (!self::isValidHostLabel($data['account_id'])) { + throw new InvalidArnException("The 5th component of a {$arnName}" + . " is required, represents the account ID, and" + . " must be a valid host label."); + } + } + + protected static function validateRegion($data, $arnName) + { + if (empty($data['region'])) { + throw new InvalidArnException("The 4th component of a {$arnName}" + . " represents the region and must not be empty."); + } + } + + /** + * Validates whether a string component is a valid host label + * + * @param $string + * @return bool + */ + protected static function isValidHostLabel($string) + { + if (empty($string) || strlen($string) > 63) { + return false; + } + if ($value = preg_match("/^[a-zA-Z0-9-]+$/", $string)) { + return true; + } + return false; + } +}
\ No newline at end of file |