| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 | <?phpnamespace Aws\S3;use Aws\Api\Service;use Aws\Arn\ArnInterface;use Aws\Arn\S3\OutpostsArnInterface;use Aws\Endpoint\PartitionEndpointProvider;use Aws\Exception\InvalidRegionException;/** * @internal */trait EndpointRegionHelperTrait{    /** @var array */    private $config;    /** @var PartitionEndpointProvider */    private $partitionProvider;    /** @var string */    private $region;    /** @var Service */    private $service;    private function getPartitionSuffix(        ArnInterface $arn,        PartitionEndpointProvider $provider    ) {        $partition = $provider->getPartition(            $arn->getRegion(),            $arn->getService()        );        return $partition->getDnsSuffix();    }    private function getSigningRegion(        $region,        $service,        PartitionEndpointProvider $provider    ) {        $partition = $provider->getPartition($region, $service);        $data = $partition->toArray();        if (isset($data['services'][$service]['endpoints'][$region]['credentialScope']['region'])) {            return $data['services'][$service]['endpoints'][$region]['credentialScope']['region'];        }        return $region;    }    private function isMatchingSigningRegion(        $arnRegion,        $clientRegion,        $service,        PartitionEndpointProvider $provider    ) {        $arnRegion = \Aws\strip_fips_pseudo_regions(strtolower($arnRegion));        $clientRegion = strtolower($clientRegion);        if ($arnRegion === $clientRegion) {            return true;        }        if ($this->getSigningRegion($clientRegion, $service, $provider) === $arnRegion) {            return true;        }        return false;    }    private function validateFipsConfigurations(ArnInterface $arn)    {        $useFipsEndpoint = !empty($this->config['use_fips_endpoint']);        if ($arn instanceof OutpostsArnInterface) {            if (empty($this->config['use_arn_region'])                || !($this->config['use_arn_region']->isUseArnRegion())            ) {                $region = $this->region;            } else {                $region = $arn->getRegion();            }            if (\Aws\is_fips_pseudo_region($region)) {                throw new InvalidRegionException(                    'Fips is currently not supported with S3 Outposts access'                    . ' points. Please provide a non-fips region or do not supply an'                    . ' access point ARN.');            }        }    }    private function validateMatchingRegion(ArnInterface $arn)    {        if (!($this->isMatchingSigningRegion(            $arn->getRegion(),            $this->region,            $this->service->getEndpointPrefix(),            $this->partitionProvider)        )) {            if (empty($this->config['use_arn_region'])                || !($this->config['use_arn_region']->isUseArnRegion())            ) {                throw new InvalidRegionException('The region'                    . " specified in the ARN (" . $arn->getRegion()                    . ") does not match the client region ("                    . "{$this->region}).");            }        }    }}
 |