171 lines
3.8 KiB
PHP
171 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace AlibabaCloud\Client\Credentials\Providers;
|
|
|
|
use Closure;
|
|
use AlibabaCloud\Client\SDK;
|
|
use AlibabaCloud\Client\AlibabaCloud;
|
|
use AlibabaCloud\Client\Exception\ClientException;
|
|
|
|
/**
|
|
* Class CredentialsProvider
|
|
*
|
|
* @package AlibabaCloud\Client\Credentials\Providers
|
|
*/
|
|
class CredentialsProvider
|
|
{
|
|
/**
|
|
* @var array
|
|
*/
|
|
private static $customChains;
|
|
|
|
/**
|
|
* @throws ClientException
|
|
*/
|
|
public static function chain()
|
|
{
|
|
$providers = func_get_args();
|
|
|
|
if (empty($providers)) {
|
|
throw new ClientException('No providers in chain', SDK::INVALID_ARGUMENT);
|
|
}
|
|
|
|
foreach ($providers as $provider) {
|
|
if (!$provider instanceof Closure) {
|
|
throw new ClientException('Providers must all be Closures', SDK::INVALID_ARGUMENT);
|
|
}
|
|
}
|
|
|
|
self::$customChains = $providers;
|
|
}
|
|
|
|
/**
|
|
* Forget the custom providers chain.
|
|
*/
|
|
public static function flush()
|
|
{
|
|
self::$customChains = [];
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public static function hasCustomChain()
|
|
{
|
|
return (bool)self::$customChains;
|
|
}
|
|
|
|
/**
|
|
* @param string $clientName
|
|
*
|
|
* @throws ClientException
|
|
*/
|
|
public static function customProvider($clientName)
|
|
{
|
|
foreach (self::$customChains as $provider) {
|
|
$provider();
|
|
if (AlibabaCloud::has($clientName)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param string $clientName
|
|
*
|
|
* @throws ClientException
|
|
*/
|
|
public static function defaultProvider($clientName)
|
|
{
|
|
$providers = [
|
|
self::env(),
|
|
self::ini(),
|
|
self::instance(),
|
|
];
|
|
|
|
foreach ($providers as $provider) {
|
|
$provider();
|
|
if (AlibabaCloud::has($clientName)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return Closure
|
|
*/
|
|
public static function env()
|
|
{
|
|
return static function () {
|
|
$accessKeyId = \AlibabaCloud\Client\envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_ID');
|
|
$accessKeySecret = \AlibabaCloud\Client\envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
|
|
|
|
if ($accessKeyId && $accessKeySecret) {
|
|
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)->asDefaultClient();
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @return Closure
|
|
*/
|
|
public static function ini()
|
|
{
|
|
return static function () {
|
|
$ini = \AlibabaCloud\Client\envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_FILE');
|
|
|
|
if ($ini) {
|
|
AlibabaCloud::load($ini);
|
|
} else {
|
|
// @codeCoverageIgnoreStart
|
|
AlibabaCloud::load();
|
|
// @codeCoverageIgnoreEnd
|
|
}
|
|
|
|
self::compatibleWithGlobal();
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @codeCoverageIgnore
|
|
*
|
|
* Compatible with global
|
|
*
|
|
* @throws ClientException
|
|
*/
|
|
private static function compatibleWithGlobal()
|
|
{
|
|
if (AlibabaCloud::has('global') && !AlibabaCloud::has(self::getDefaultName())) {
|
|
AlibabaCloud::get('global')->name(self::getDefaultName());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return array|false|string
|
|
* @throws ClientException
|
|
*/
|
|
public static function getDefaultName()
|
|
{
|
|
$name = \AlibabaCloud\Client\envNotEmpty('ALIBABA_CLOUD_PROFILE');
|
|
|
|
if ($name) {
|
|
return $name;
|
|
}
|
|
|
|
return 'default';
|
|
}
|
|
|
|
/**
|
|
* @return Closure
|
|
*/
|
|
public static function instance()
|
|
{
|
|
return static function () {
|
|
$instance = \AlibabaCloud\Client\envNotEmpty('ALIBABA_CLOUD_ECS_METADATA');
|
|
if ($instance) {
|
|
AlibabaCloud::ecsRamRoleClient($instance)->asDefaultClient();
|
|
}
|
|
};
|
|
}
|
|
}
|