summaryrefslogtreecommitdiff
path: root/vendor/aws/aws-sdk-php/src/Arn/Arn.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/Arn/Arn.php')
-rw-r--r--vendor/aws/aws-sdk-php/src/Arn/Arn.php188
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