init commit
This commit is contained in:
18
addons/wdsxh/library/alibabacloud/credentials/CHANGELOG.md
Normal file
18
addons/wdsxh/library/alibabacloud/credentials/CHANGELOG.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 1.2.0 - 2024-10-17
|
||||
|
||||
- Refactor all credentials providers.
|
||||
|
||||
## 1.1.3 - 2020-12-24
|
||||
|
||||
- Require guzzle ^6.3|^7.0
|
||||
|
||||
## 1.0.2 - 2020-02-14
|
||||
- Update Tea.
|
||||
|
||||
## 1.0.1 - 2019-12-30
|
||||
- Supported get `Role Name` automatically.
|
||||
|
||||
## 1.0.0 - 2019-09-01
|
||||
- Initial release of the Alibaba Cloud Credentials for PHP Version 1.0.0 on Packagist See <https://github.com/aliyun/credentials-php> for more information.
|
||||
@@ -0,0 +1,30 @@
|
||||
# CONTRIBUTING
|
||||
|
||||
We work hard to provide a high-quality and useful SDK for Alibaba Cloud, and
|
||||
we greatly value feedback and contributions from our community. Please submit
|
||||
your [issues][issues] or [pull requests][pull-requests] through GitHub.
|
||||
|
||||
## Tips
|
||||
|
||||
- The SDK is released under the [Apache license][license]. Any code you submit
|
||||
will be released under that license. For substantial contributions, we may
|
||||
ask you to sign a [Alibaba Documentation Corporate Contributor License
|
||||
Agreement (CLA)][cla].
|
||||
- We follow all of the relevant PSR recommendations from the [PHP Framework
|
||||
Interop Group][php-fig]. Please submit code that follows these standards.
|
||||
The [PHP CS Fixer][cs-fixer] tool can be helpful for formatting your code.
|
||||
Your can use `composer fixer` to fix code.
|
||||
- We maintain a high percentage of code coverage in our unit tests. If you make
|
||||
changes to the code, please add, update, and/or remove tests as appropriate.
|
||||
- If your code does not conform to the PSR standards, does not include adequate
|
||||
tests, or does not contain a changelog document, we may ask you to update
|
||||
your pull requests before we accept them. We also reserve the right to deny
|
||||
any pull requests that do not align with our standards or goals.
|
||||
|
||||
[issues]: https://github.com/aliyun/credentials-php/issues
|
||||
[pull-requests]: https://github.com/aliyun/credentials-php/pulls
|
||||
[license]: http://www.apache.org/licenses/LICENSE-2.0
|
||||
[cla]: https://alibaba-cla-2018.oss-cn-beijing.aliyuncs.com/Alibaba_Documentation_Open_Source_Corporate_CLA.pdf
|
||||
[php-fig]: http://php-fig.org
|
||||
[cs-fixer]: http://cs.sensiolabs.org/
|
||||
[docs-readme]: https://github.com/aliyun/credentials-php/blob/master/README.md
|
||||
13
addons/wdsxh/library/alibabacloud/credentials/LICENSE.md
Normal file
13
addons/wdsxh/library/alibabacloud/credentials/LICENSE.md
Normal file
@@ -0,0 +1,13 @@
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
88
addons/wdsxh/library/alibabacloud/credentials/NOTICE.md
Normal file
88
addons/wdsxh/library/alibabacloud/credentials/NOTICE.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# NOTICE
|
||||
|
||||
<https://www.alibabacloud.com/>
|
||||
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License").
|
||||
You may not use this file except in compliance with the License.
|
||||
A copy of the License is located at
|
||||
|
||||
<http://www.apache.org/licenses/LICENSE-2.0>
|
||||
|
||||
or in the "license" file accompanying this file. This file is distributed
|
||||
on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||
express or implied. See the License for the specific language governing
|
||||
permissions and limitations under the License.
|
||||
|
||||
# Guzzle
|
||||
|
||||
<https://github.com/guzzle/guzzle>
|
||||
|
||||
Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling <mtdowling@gmail.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
# jmespath.php
|
||||
|
||||
<https://github.com/mtdowling/jmespath.php>
|
||||
|
||||
Copyright (c) 2014 Michael Dowling, https://github.com/mtdowling
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
# Dot
|
||||
|
||||
<https://github.com/adbario/php-dot-notation>
|
||||
|
||||
Copyright (c) 2016-2019 Riku Särkinen
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
21
addons/wdsxh/library/alibabacloud/credentials/SECURITY.md
Normal file
21
addons/wdsxh/library/alibabacloud/credentials/SECURITY.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 5.1.x | :white_check_mark: |
|
||||
| 5.0.x | :x: |
|
||||
| 4.0.x | :white_check_mark: |
|
||||
| < 4.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Use this section to tell people how to report a vulnerability.
|
||||
|
||||
Tell them where to go, how often they can expect to get an update on a
|
||||
reported vulnerability, what to expect if the vulnerability is accepted or
|
||||
declined, etc.
|
||||
@@ -0,0 +1,6 @@
|
||||
Upgrading Guide
|
||||
===============
|
||||
|
||||
1.x
|
||||
-----------------------
|
||||
- This is the first version. See <https://github.com/aliyun/credentials-php> for more information.
|
||||
107
addons/wdsxh/library/alibabacloud/credentials/composer.json
Normal file
107
addons/wdsxh/library/alibabacloud/credentials/composer.json
Normal file
@@ -0,0 +1,107 @@
|
||||
{
|
||||
"name": "alibabacloud/credentials",
|
||||
"homepage": "https://www.alibabacloud.com/",
|
||||
"description": "Alibaba Cloud Credentials for PHP",
|
||||
"keywords": [
|
||||
"sdk",
|
||||
"tool",
|
||||
"cloud",
|
||||
"client",
|
||||
"aliyun",
|
||||
"library",
|
||||
"alibaba",
|
||||
"Credentials",
|
||||
"alibabacloud"
|
||||
],
|
||||
"type": "library",
|
||||
"license": "Apache-2.0",
|
||||
"support": {
|
||||
"source": "https://github.com/aliyun/credentials-php",
|
||||
"issues": "https://github.com/aliyun/credentials-php/issues"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Alibaba Cloud SDK",
|
||||
"email": "sdk-team@alibabacloud.com",
|
||||
"homepage": "http://www.alibabacloud.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.6",
|
||||
"ext-curl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-openssl": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-simplexml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"guzzlehttp/guzzle": "^6.3|^7.0",
|
||||
"adbario/php-dot-notation": "^2.2",
|
||||
"alibabacloud/tea": "^3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"ext-spl": "*",
|
||||
"ext-dom": "*",
|
||||
"ext-pcre": "*",
|
||||
"psr/cache": "^1.0",
|
||||
"ext-sockets": "*",
|
||||
"drupal/coder": "^8.3",
|
||||
"symfony/dotenv": "^3.4",
|
||||
"phpunit/phpunit": "^5.7|^6.6|^9.3",
|
||||
"monolog/monolog": "^1.24",
|
||||
"composer/composer": "^1.8",
|
||||
"mikey179/vfsstream": "^1.6",
|
||||
"symfony/var-dumper": "^3.4"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-sockets": "To use client-side monitoring"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"AlibabaCloud\\Credentials\\": "src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"AlibabaCloud\\Credentials\\Tests\\": "tests/"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"preferred-install": "dist",
|
||||
"optimize-autoloader": true,
|
||||
"allow-plugins": {
|
||||
"dealerdirect/phpcodesniffer-composer-installer": true
|
||||
}
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
"scripts-descriptions": {
|
||||
"cs": "Tokenizes PHP, JavaScript and CSS files to detect violations of a defined coding standard.",
|
||||
"cbf": "Automatically correct coding standard violations.",
|
||||
"fixer": "Fixes code to follow standards.",
|
||||
"test": "Run all tests.",
|
||||
"unit": "Run Unit tests.",
|
||||
"feature": "Run Feature tests.",
|
||||
"clearCache": "Clear cache like coverage.",
|
||||
"coverage": "Show Coverage html.",
|
||||
"endpoints": "Update endpoints from OSS."
|
||||
},
|
||||
"scripts": {
|
||||
"cs": "phpcs --standard=PSR2 -n ./",
|
||||
"cbf": "phpcbf --standard=PSR2 -n ./",
|
||||
"fixer": "php-cs-fixer fix ./",
|
||||
"test": [
|
||||
"phpunit --colors=always"
|
||||
],
|
||||
"unit": [
|
||||
"@clearCache",
|
||||
"phpunit --testsuite=Unit --colors=always"
|
||||
],
|
||||
"feature": [
|
||||
"@clearCache",
|
||||
"phpunit --testsuite=Feature --colors=always"
|
||||
],
|
||||
"coverage": "open cache/coverage/index.html",
|
||||
"clearCache": "rm -rf cache/*"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use the AccessKey to complete the authentication.
|
||||
*/
|
||||
class AccessKeyCredential implements CredentialsInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeySecret;
|
||||
|
||||
/**
|
||||
* AccessKeyCredential constructor.
|
||||
*
|
||||
* @param string $access_key_id Access key ID
|
||||
* @param string $access_key_secret Access Key Secret
|
||||
*/
|
||||
public function __construct($access_key_id, $access_key_secret)
|
||||
{
|
||||
Filter::accessKey($access_key_id, $access_key_secret);
|
||||
|
||||
$this->accessKeyId = $access_key_id;
|
||||
$this->accessKeySecret = $access_key_secret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->accessKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->accessKeySecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return "$this->accessKeyId#$this->accessKeySecret";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ShaHmac1Signature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return new ShaHmac1Signature();
|
||||
}
|
||||
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
return new CredentialModel([
|
||||
'accessKeyId' => $this->accessKeyId,
|
||||
'accessKeySecret' => $this->accessKeySecret,
|
||||
'type' => 'access_key',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\BearerTokenSignature;
|
||||
|
||||
/**
|
||||
* Class BearerTokenCredential
|
||||
*/
|
||||
class BearerTokenCredential implements CredentialsInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $bearerToken;
|
||||
|
||||
/**
|
||||
* BearerTokenCredential constructor.
|
||||
*
|
||||
* @param $bearer_token
|
||||
*/
|
||||
public function __construct($bearer_token)
|
||||
{
|
||||
Filter::bearerToken($bearer_token);
|
||||
|
||||
$this->bearerToken = $bearer_token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getBearerToken()
|
||||
{
|
||||
return $this->bearerToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return "bearerToken#$this->bearerToken";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return BearerTokenSignature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return new BearerTokenSignature();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
return new CredentialModel([
|
||||
'bearerToken' => $this->bearerToken,
|
||||
'type' => 'bearer',
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
268
addons/wdsxh/library/alibabacloud/credentials/src/Credential.php
Normal file
268
addons/wdsxh/library/alibabacloud/credentials/src/Credential.php
Normal file
@@ -0,0 +1,268 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Credential\Config;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Providers\DefaultCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\EcsRamRoleCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\OIDCRoleArnCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\RamRoleArnCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\RsaKeyPairCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\StaticAKCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\StaticSTSCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Providers\URLCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* Class Credential
|
||||
*
|
||||
* @package AlibabaCloud\Credentials
|
||||
*
|
||||
*/
|
||||
class Credential
|
||||
{
|
||||
|
||||
/**
|
||||
* Version of the Client
|
||||
*/
|
||||
const VERSION = '1.1.5';
|
||||
|
||||
/**
|
||||
* @var Config
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* @var CredentialsInterface
|
||||
*/
|
||||
protected $credential;
|
||||
|
||||
/**
|
||||
* Credential constructor.
|
||||
*
|
||||
* @param array|Config $config
|
||||
*/
|
||||
public function __construct($config = [])
|
||||
{
|
||||
if (\is_array($config)) {
|
||||
if (empty($config)) {
|
||||
$this->config = null;
|
||||
} else {
|
||||
$this->config = new Config($this->parseConfig($config));
|
||||
}
|
||||
} else {
|
||||
$this->config = $config;
|
||||
}
|
||||
$this->credential = $this->getCredentials($this->config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $config
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function parseConfig($config)
|
||||
{
|
||||
$res = [];
|
||||
foreach (\array_change_key_case($config) as $key => $value) {
|
||||
$res[Helper::snakeToCamelCase($key)] = $value;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Credentials getter.
|
||||
*
|
||||
* @param Config $config
|
||||
* @return CredentialsInterface
|
||||
*
|
||||
*/
|
||||
private function getCredentials($config)
|
||||
{
|
||||
if (is_null($config)) {
|
||||
return new CredentialsProviderWrap('default', new DefaultCredentialsProvider());
|
||||
}
|
||||
switch ($config->type) {
|
||||
case 'access_key':
|
||||
$provider = new StaticAKCredentialsProvider([
|
||||
'accessKeyId' => $config->accessKeyId,
|
||||
'accessKeySecret' => $config->accessKeySecret,
|
||||
]);
|
||||
return new CredentialsProviderWrap('access_key', $provider);
|
||||
case 'sts':
|
||||
$provider = new StaticSTSCredentialsProvider([
|
||||
'accessKeyId' => $config->accessKeyId,
|
||||
'accessKeySecret' => $config->accessKeySecret,
|
||||
'securityToken' => $config->securityToken,
|
||||
]);
|
||||
return new CredentialsProviderWrap('sts', $provider);
|
||||
case 'bearer':
|
||||
return new BearerTokenCredential($config->bearerToken);
|
||||
case 'ram_role_arn':
|
||||
if (!is_null($config->securityToken) && $config->securityToken !== '') {
|
||||
$innerProvider = new StaticSTSCredentialsProvider([
|
||||
'accessKeyId' => $config->accessKeyId,
|
||||
'accessKeySecret' => $config->accessKeySecret,
|
||||
'securityToken' => $config->securityToken,
|
||||
]);
|
||||
} else {
|
||||
$innerProvider = new StaticAKCredentialsProvider([
|
||||
'accessKeyId' => $config->accessKeyId,
|
||||
'accessKeySecret' => $config->accessKeySecret,
|
||||
]);
|
||||
}
|
||||
$provider = new RamRoleArnCredentialsProvider([
|
||||
'credentialsProvider' => $innerProvider,
|
||||
'roleArn' => $config->roleArn,
|
||||
'roleSessionName' => $config->roleSessionName,
|
||||
'policy' => $config->policy,
|
||||
'durationSeconds' => $config->roleSessionExpiration,
|
||||
'externalId' => $config->externalId,
|
||||
'stsEndpoint' => $config->STSEndpoint,
|
||||
], [
|
||||
'connectTimeout' => $config->connectTimeout,
|
||||
'readTimeout' => $config->readTimeout,
|
||||
]);
|
||||
return new CredentialsProviderWrap('ram_role_arn', $provider);
|
||||
case 'rsa_key_pair':
|
||||
$provider = new RsaKeyPairCredentialsProvider([
|
||||
'publicKeyId' => $config->publicKeyId,
|
||||
'privateKeyFile' => $config->privateKeyFile,
|
||||
'durationSeconds' => $config->roleSessionExpiration,
|
||||
'stsEndpoint' => $config->STSEndpoint,
|
||||
], [
|
||||
'connectTimeout' => $config->connectTimeout,
|
||||
'readTimeout' => $config->readTimeout,
|
||||
]);
|
||||
return new CredentialsProviderWrap('rsa_key_pair', $provider);
|
||||
case 'ecs_ram_role':
|
||||
$provider = new EcsRamRoleCredentialsProvider([
|
||||
'roleName' => $config->roleName,
|
||||
'disableIMDSv1' => $config->disableIMDSv1,
|
||||
], [
|
||||
'connectTimeout' => $config->connectTimeout,
|
||||
'readTimeout' => $config->readTimeout,
|
||||
]);
|
||||
return new CredentialsProviderWrap('ecs_ram_role', $provider);
|
||||
case 'oidc_role_arn':
|
||||
$provider = new OIDCRoleArnCredentialsProvider([
|
||||
'roleArn' => $config->roleArn,
|
||||
'oidcProviderArn' => $config->oidcProviderArn,
|
||||
'oidcTokenFilePath' => $config->oidcTokenFilePath,
|
||||
'roleSessionName' => $config->roleSessionName,
|
||||
'policy' => $config->policy,
|
||||
'durationSeconds' => $config->roleSessionExpiration,
|
||||
'stsEndpoint' => $config->STSEndpoint,
|
||||
], [
|
||||
'connectTimeout' => $config->connectTimeout,
|
||||
'readTimeout' => $config->readTimeout,
|
||||
]);
|
||||
return new CredentialsProviderWrap('oidc_role_arn', $provider);
|
||||
case "credentials_uri":
|
||||
$provider = new URLCredentialsProvider([
|
||||
'credentialsURI' => $config->credentialsURI,
|
||||
], [
|
||||
'connectTimeout' => $config->connectTimeout,
|
||||
'readTimeout' => $config->readTimeout,
|
||||
]);
|
||||
return new CredentialsProviderWrap('credentials_uri', $provider);
|
||||
default:
|
||||
throw new InvalidArgumentException('Unsupported credential type option: ' . $config->type . ', support: access_key, sts, bearer, ecs_ram_role, ram_role_arn, rsa_key_pair, oidc_role_arn, credentials_uri');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return CredentialModel
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
return $this->credential->getCredential();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
return $this->config->toMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getCredential() instead
|
||||
*
|
||||
* @return string
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return $this->credential->getCredential()->getType();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getCredential() instead
|
||||
*
|
||||
* @return string
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->credential->getCredential()->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getCredential() instead
|
||||
*
|
||||
* @return string
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->credential->getCredential()->getAccessKeySecret();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getCredential() instead
|
||||
*
|
||||
* @return string
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->credential->getCredential()->getSecurityToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use getCredential() instead
|
||||
*
|
||||
* @return string
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getBearerToken()
|
||||
{
|
||||
return $this->credential->getCredential()->getBearerToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($name, $arguments)
|
||||
{
|
||||
return $this->credential->$name($arguments);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,270 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Credential;
|
||||
|
||||
use AlibabaCloud\Tea\Model;
|
||||
|
||||
class Config extends Model
|
||||
{
|
||||
public function validate()
|
||||
{
|
||||
}
|
||||
public function toMap()
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->accessKeyId) {
|
||||
$res['accessKeyId'] = $this->accessKeyId;
|
||||
}
|
||||
if (null !== $this->accessKeySecret) {
|
||||
$res['accessKeySecret'] = $this->accessKeySecret;
|
||||
}
|
||||
if (null !== $this->securityToken) {
|
||||
$res['securityToken'] = $this->securityToken;
|
||||
}
|
||||
if (null !== $this->bearerToken) {
|
||||
$res['bearerToken'] = $this->bearerToken;
|
||||
}
|
||||
if (null !== $this->durationSeconds) {
|
||||
$res['durationSeconds'] = $this->durationSeconds;
|
||||
}
|
||||
if (null !== $this->roleArn) {
|
||||
$res['roleArn'] = $this->roleArn;
|
||||
}
|
||||
if (null !== $this->policy) {
|
||||
$res['policy'] = $this->policy;
|
||||
}
|
||||
if (null !== $this->roleSessionExpiration) {
|
||||
$res['roleSessionExpiration'] = $this->roleSessionExpiration;
|
||||
}
|
||||
if (null !== $this->roleSessionName) {
|
||||
$res['roleSessionName'] = $this->roleSessionName;
|
||||
}
|
||||
if (null !== $this->publicKeyId) {
|
||||
$res['publicKeyId'] = $this->publicKeyId;
|
||||
}
|
||||
if (null !== $this->privateKeyFile) {
|
||||
$res['privateKeyFile'] = $this->privateKeyFile;
|
||||
}
|
||||
if (null !== $this->roleName) {
|
||||
$res['roleName'] = $this->roleName;
|
||||
}
|
||||
if (null !== $this->credentialsURI) {
|
||||
$res['credentialsURI'] = $this->credentialsURI;
|
||||
}
|
||||
if (null !== $this->type) {
|
||||
$res['type'] = $this->type;
|
||||
}
|
||||
if (null !== $this->STSEndpoint) {
|
||||
$res['STSEndpoint'] = $this->STSEndpoint;
|
||||
}
|
||||
if (null !== $this->externalId) {
|
||||
$res['externalId'] = $this->externalId;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
/**
|
||||
* @param array $map
|
||||
* @return Config
|
||||
*/
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['accessKeyId'])) {
|
||||
$model->accessKeyId = $map['accessKeyId'];
|
||||
}
|
||||
if (isset($map['accessKeySecret'])) {
|
||||
$model->accessKeySecret = $map['accessKeySecret'];
|
||||
}
|
||||
if (isset($map['securityToken'])) {
|
||||
$model->securityToken = $map['securityToken'];
|
||||
}
|
||||
if (isset($map['bearerToken'])) {
|
||||
$model->bearerToken = $map['bearerToken'];
|
||||
}
|
||||
if (isset($map['durationSeconds'])) {
|
||||
$model->durationSeconds = $map['durationSeconds'];
|
||||
}
|
||||
if (isset($map['roleArn'])) {
|
||||
$model->roleArn = $map['roleArn'];
|
||||
}
|
||||
if (isset($map['policy'])) {
|
||||
$model->policy = $map['policy'];
|
||||
}
|
||||
if (isset($map['roleSessionExpiration'])) {
|
||||
$model->roleSessionExpiration = $map['roleSessionExpiration'];
|
||||
}
|
||||
if (isset($map['roleSessionName'])) {
|
||||
$model->roleSessionName = $map['roleSessionName'];
|
||||
}
|
||||
if (isset($map['publicKeyId'])) {
|
||||
$model->publicKeyId = $map['publicKeyId'];
|
||||
}
|
||||
if (isset($map['privateKeyFile'])) {
|
||||
$model->privateKeyFile = $map['privateKeyFile'];
|
||||
}
|
||||
if (isset($map['roleName'])) {
|
||||
$model->roleName = $map['roleName'];
|
||||
}
|
||||
if (isset($map['credentialsURI'])) {
|
||||
$model->credentialsURI = $map['credentialsURI'];
|
||||
}
|
||||
if (isset($map['type'])) {
|
||||
$model->type = $map['type'];
|
||||
}
|
||||
if (isset($map['STSEndpoint'])) {
|
||||
$model->STSEndpoint = $map['STSEndpoint'];
|
||||
}
|
||||
if (isset($map['externalId'])) {
|
||||
$model->externalId = $map['externalId'];
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
/**
|
||||
* @description credential type
|
||||
* @example access_key
|
||||
* @var string
|
||||
*/
|
||||
public $type = 'default';
|
||||
|
||||
/**
|
||||
* @description accesskey id
|
||||
* @var string
|
||||
*/
|
||||
public $accessKeyId;
|
||||
|
||||
/**
|
||||
* @description accesskey secret
|
||||
* @var string
|
||||
*/
|
||||
public $accessKeySecret;
|
||||
|
||||
/**
|
||||
* @description security token
|
||||
* @var string
|
||||
*/
|
||||
public $securityToken;
|
||||
|
||||
/**
|
||||
* @description bearer token
|
||||
* @var string
|
||||
*/
|
||||
public $bearerToken;
|
||||
|
||||
/**
|
||||
* @description role name
|
||||
* @var string
|
||||
*/
|
||||
public $roleName;
|
||||
|
||||
/**
|
||||
* @description role arn
|
||||
* @var string
|
||||
*/
|
||||
public $roleArn;
|
||||
|
||||
/**
|
||||
* @description oidc provider arn
|
||||
* @var string
|
||||
*/
|
||||
public $oidcProviderArn;
|
||||
|
||||
/**
|
||||
* @description oidc token file path
|
||||
* @var string
|
||||
*/
|
||||
public $oidcTokenFilePath;
|
||||
|
||||
/**
|
||||
* @description role session expiration
|
||||
* @example 3600
|
||||
* @var int
|
||||
*/
|
||||
public $roleSessionExpiration;
|
||||
|
||||
/**
|
||||
* @description role session name
|
||||
* @var string
|
||||
*/
|
||||
public $roleSessionName;
|
||||
|
||||
/**
|
||||
* @description role arn policy
|
||||
* @var string
|
||||
*/
|
||||
public $policy;
|
||||
|
||||
/**
|
||||
* @description external id for ram role arn
|
||||
* @var string
|
||||
*/
|
||||
public $externalId;
|
||||
|
||||
/**
|
||||
* @description sts endpoint
|
||||
* @var string
|
||||
*/
|
||||
public $STSEndpoint;
|
||||
|
||||
public $publicKeyId;
|
||||
|
||||
public $privateKeyFile;
|
||||
|
||||
/**
|
||||
* @description read timeout
|
||||
* @var int
|
||||
*/
|
||||
public $readTimeout;
|
||||
|
||||
/**
|
||||
* @description connection timeout
|
||||
* @var int
|
||||
*/
|
||||
public $connectTimeout;
|
||||
|
||||
/**
|
||||
* @description disable IMDS v1
|
||||
* @var bool
|
||||
*/
|
||||
public $disableIMDSv1;
|
||||
|
||||
/**
|
||||
* @description credentials URI
|
||||
* @var string
|
||||
*/
|
||||
public $credentialsURI;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public $metadataTokenDuration;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public $durationSeconds;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public $host;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public $expiration;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public $certFile = "";
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
public $certPassword = "";
|
||||
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
public $proxy;
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
namespace AlibabaCloud\Credentials\Credential;
|
||||
|
||||
use AlibabaCloud\Tea\Model;
|
||||
|
||||
class CredentialModel extends Model
|
||||
{
|
||||
public function validate()
|
||||
{
|
||||
}
|
||||
public function toMap()
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->accessKeyId) {
|
||||
$res['accessKeyId'] = $this->accessKeyId;
|
||||
}
|
||||
if (null !== $this->accessKeySecret) {
|
||||
$res['accessKeySecret'] = $this->accessKeySecret;
|
||||
}
|
||||
if (null !== $this->securityToken) {
|
||||
$res['securityToken'] = $this->securityToken;
|
||||
}
|
||||
if (null !== $this->bearerToken) {
|
||||
$res['bearerToken'] = $this->bearerToken;
|
||||
}
|
||||
if (null !== $this->type) {
|
||||
$res['type'] = $this->type;
|
||||
}
|
||||
if (null !== $this->providerName) {
|
||||
$res['providerName'] = $this->providerName;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
/**
|
||||
* @param array $map
|
||||
* @return CredentialModel
|
||||
*/
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['accessKeyId'])) {
|
||||
$model->accessKeyId = $map['accessKeyId'];
|
||||
}
|
||||
if (isset($map['accessKeySecret'])) {
|
||||
$model->accessKeySecret = $map['accessKeySecret'];
|
||||
}
|
||||
if (isset($map['securityToken'])) {
|
||||
$model->securityToken = $map['securityToken'];
|
||||
}
|
||||
if (isset($map['bearerToken'])) {
|
||||
$model->bearerToken = $map['bearerToken'];
|
||||
}
|
||||
if (isset($map['type'])) {
|
||||
$model->type = $map['type'];
|
||||
}
|
||||
if(isset($map['providerName'])){
|
||||
$model->providerName = $map['providerName'];
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
/**
|
||||
* @description accesskey id
|
||||
* @var string
|
||||
*/
|
||||
public $accessKeyId;
|
||||
|
||||
/**
|
||||
* @description accesskey secret
|
||||
* @var string
|
||||
*/
|
||||
public $accessKeySecret;
|
||||
|
||||
/**
|
||||
* @description security token
|
||||
* @var string
|
||||
*/
|
||||
public $securityToken;
|
||||
|
||||
/**
|
||||
* @description bearer token
|
||||
* @var string
|
||||
*/
|
||||
public $bearerToken;
|
||||
|
||||
/**
|
||||
* @description type
|
||||
* @example access_key
|
||||
* @var string
|
||||
*/
|
||||
public $type;
|
||||
|
||||
/**
|
||||
* @description provider name
|
||||
* @example cli_profile/static_ak
|
||||
* @var string
|
||||
*/
|
||||
public $providerName;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->accessKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->accessKeySecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->securityToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getBearerToken()
|
||||
{
|
||||
return $this->bearerToken;
|
||||
}
|
||||
|
||||
public function getType()
|
||||
{
|
||||
return $this->type;
|
||||
}
|
||||
|
||||
public function getProviderName()
|
||||
{
|
||||
return $this->providerName;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Credential;
|
||||
|
||||
use AlibabaCloud\Credentials\Providers\Credentials;
|
||||
|
||||
class RefreshResult
|
||||
{
|
||||
|
||||
/**
|
||||
* RefreshResult constructor.
|
||||
* @param Credentials $params
|
||||
* @param int $staleTime
|
||||
* @param int $prefetchTime
|
||||
*/
|
||||
public function __construct($credentials = null, $staleTime = PHP_INT_MAX, $prefetchTime = PHP_INT_MAX)
|
||||
{
|
||||
$this->credentials = $credentials;
|
||||
$this->staleTime = $staleTime;
|
||||
$this->prefetchTime = $prefetchTime;
|
||||
}
|
||||
public function validate() {}
|
||||
public function toMap()
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->staleTime) {
|
||||
$res['staleTime'] = $this->staleTime;
|
||||
}
|
||||
if (null !== $this->prefetchTime) {
|
||||
$res['prefetchTime'] = $this->prefetchTime;
|
||||
}
|
||||
if (null !== $this->credentials) {
|
||||
$res['credentials'] = $this->credentials;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
/**
|
||||
* @param array $map
|
||||
* @return RefreshResult
|
||||
*/
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['staleTime'])) {
|
||||
$model->staleTime = $map['staleTime'];
|
||||
}
|
||||
if (isset($map['prefetchTime'])) {
|
||||
$model->staleTime = $map['prefetchTime'];
|
||||
}
|
||||
if (isset($map['credentials'])) {
|
||||
$model->staleTime = $map['credentials'];
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
/**
|
||||
* @description staleTime
|
||||
* @var int
|
||||
*/
|
||||
public $staleTime;
|
||||
|
||||
/**
|
||||
* @description prefetchTime
|
||||
* @var int
|
||||
*/
|
||||
public $prefetchTime;
|
||||
|
||||
/**
|
||||
* @description credentials
|
||||
* @var Credentials
|
||||
*/
|
||||
public $credentials;
|
||||
|
||||
|
||||
/**
|
||||
* @return Credentials
|
||||
*/
|
||||
public function credentials()
|
||||
{
|
||||
return $this->credentials;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public function staleTime()
|
||||
{
|
||||
return $this->staleTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public function prefetchTime()
|
||||
{
|
||||
return $this->prefetchTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Providers\ChainProvider;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Utils\MockTrait;
|
||||
use ReflectionException;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* Class Credentials
|
||||
*
|
||||
* @package AlibabaCloud\Credentials
|
||||
*/
|
||||
class Credentials
|
||||
{
|
||||
use MockTrait;
|
||||
|
||||
/**
|
||||
* @var array|CredentialsInterface[] containers of credentials
|
||||
*/
|
||||
protected static $credentials = [];
|
||||
|
||||
/**
|
||||
* Get the credential instance by name.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return Credential
|
||||
* @throws ReflectionException
|
||||
*/
|
||||
public static function get($name = null)
|
||||
{
|
||||
if ($name !== null) {
|
||||
Filter::credentialName($name);
|
||||
} else {
|
||||
$name = ChainProvider::getDefaultName();
|
||||
}
|
||||
|
||||
self::load();
|
||||
|
||||
if (self::has($name)) {
|
||||
return new Credential(self::$credentials[\strtolower($name)]);
|
||||
}
|
||||
|
||||
throw new RuntimeException("Credential '$name' not found");
|
||||
}
|
||||
|
||||
private static function load()
|
||||
{
|
||||
if (self::$credentials) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ChainProvider::hasCustomChain()) {
|
||||
ChainProvider::customProvider(ChainProvider::getDefaultName());
|
||||
} else {
|
||||
ChainProvider::defaultProvider(ChainProvider::getDefaultName());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether there is a credential.
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function has($name)
|
||||
{
|
||||
Filter::credentialName($name);
|
||||
|
||||
return isset(self::$credentials[\strtolower($name)]);
|
||||
}
|
||||
|
||||
public static function flush()
|
||||
{
|
||||
self::$credentials = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all credentials.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function all()
|
||||
{
|
||||
self::load();
|
||||
|
||||
return self::$credentials;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param array $credential
|
||||
*/
|
||||
public static function set($name, array $credential)
|
||||
{
|
||||
Filter::credentialName($name);
|
||||
|
||||
self::$credentials[\strtolower($name)] = \array_change_key_case($credential);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\SignatureInterface;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Interface CredentialsInterface
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
interface CredentialsInterface
|
||||
{
|
||||
/**
|
||||
* @deprecated
|
||||
* @return string
|
||||
*/
|
||||
public function __toString();
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* @return SignatureInterface
|
||||
*/
|
||||
public function getSignature();
|
||||
|
||||
/**
|
||||
* @return CredentialModel
|
||||
*/
|
||||
public function getCredential();
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Providers\CredentialsProvider;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class CredentialsProviderWrap
|
||||
*
|
||||
* @package AlibabaCloud\Credentials
|
||||
*/
|
||||
class CredentialsProviderWrap implements CredentialsInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $typeName;
|
||||
|
||||
/**
|
||||
* @var CredentialsProvider
|
||||
*/
|
||||
private $credentialsProvider;
|
||||
|
||||
/**
|
||||
* CLIProfileCredentialsProvider constructor.
|
||||
*
|
||||
* @param string $typeName
|
||||
* @param CredentialsProvider $credentialsProvider
|
||||
*/
|
||||
public function __construct($typeName, $credentialsProvider)
|
||||
{
|
||||
$this->typeName = $typeName;
|
||||
$this->credentialsProvider = $credentialsProvider;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
$credentials = $this->credentialsProvider->getCredentials();
|
||||
return new CredentialModel([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'type' => $this->typeName,
|
||||
'providerName' => $credentials->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($name, $arguments)
|
||||
{
|
||||
return $this->credentialsProvider->$name($arguments);
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
return "credentialsProviderWrap#$this->typeName";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ShaHmac1Signature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Providers\EcsRamRoleCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
|
||||
use AlibabaCloud\Credentials\Request\Request;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use Exception;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use the RAM role of an ECS instance to complete the authentication.
|
||||
*/
|
||||
class EcsRamRoleCredential implements CredentialsInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleName;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $disableIMDSv1;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $metadataTokenDuration;
|
||||
|
||||
|
||||
/**
|
||||
* EcsRamRoleCredential constructor.
|
||||
*
|
||||
* @param $role_name
|
||||
*/
|
||||
public function __construct($role_name = null, $disable_imdsv1 = false, $metadata_token_duration = 21600)
|
||||
{
|
||||
Filter::roleName($role_name);
|
||||
|
||||
$this->roleName = $role_name;
|
||||
|
||||
Filter::disableIMDSv1($disable_imdsv1);
|
||||
|
||||
$this->disableIMDSv1 = $disable_imdsv1;
|
||||
|
||||
$this->metadataTokenDuration = $metadata_token_duration;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws GuzzleException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getRoleName()
|
||||
{
|
||||
if ($this->roleName !== null) {
|
||||
return $this->roleName;
|
||||
}
|
||||
|
||||
$this->roleName = $this->getRoleNameFromMeta();
|
||||
|
||||
return $this->roleName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
public function getRoleNameFromMeta()
|
||||
{
|
||||
$options = [
|
||||
'http_errors' => false,
|
||||
'timeout' => 1,
|
||||
'connect_timeout' => 1,
|
||||
];
|
||||
|
||||
$result = Request::createClient()->request(
|
||||
'GET',
|
||||
'http://100.100.100.200/latest/meta-data/ram/security-credentials/',
|
||||
$options
|
||||
);
|
||||
|
||||
if ($result->getStatusCode() === 404) {
|
||||
throw new InvalidArgumentException('The role name was not found in the instance');
|
||||
}
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error retrieving credentials from result: ' . $result->getBody());
|
||||
}
|
||||
|
||||
$role_name = (string) $result;
|
||||
if (!$role_name) {
|
||||
throw new RuntimeException('Error retrieving credentials from result is empty');
|
||||
}
|
||||
|
||||
return $role_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return "roleName#$this->roleName";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ShaHmac1Signature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return new ShaHmac1Signature();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->getSessionCredential()->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AlibabaCloud\Credentials\Providers\Credentials
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
protected function getSessionCredential()
|
||||
{
|
||||
$params = [
|
||||
"roleName" => $this->roleName,
|
||||
'disableIMDSv1' => $this->disableIMDSv1,
|
||||
'metadataTokenDuration' => $this->metadataTokenDuration,
|
||||
];
|
||||
return (new EcsRamRoleCredentialsProvider($params))->getCredentials();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->getSessionCredential()->getAccessKeySecret();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->getSessionCredential()->getSecurityToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->getSessionCredential()->getExpiration();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isDisableIMDSv1()
|
||||
{
|
||||
return $this->disableIMDSv1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
$credentials = $this->getSessionCredential();
|
||||
return new CredentialModel([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'type' => 'ecs_ram_role',
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,193 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class CLIProfileCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class CLIProfileCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $profileName;
|
||||
|
||||
/**
|
||||
* @var CredentialsProvider
|
||||
*/
|
||||
private $credentialsProvider;
|
||||
|
||||
|
||||
/**
|
||||
* CLIProfileCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function __construct(array $params = [])
|
||||
{
|
||||
$this->filterProfileName($params);
|
||||
}
|
||||
|
||||
private function filterProfileName(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_PROFILE')) {
|
||||
$this->profileName = Helper::env('ALIBABA_CLOUD_PROFILE');
|
||||
}
|
||||
|
||||
if (isset($params['profileName'])) {
|
||||
$this->profileName = $params['profileName'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
private function shouldReloadCredentialsProvider()
|
||||
{
|
||||
if (is_null($this->credentialsProvider)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return CredentialsProvider
|
||||
*/
|
||||
protected function reloadCredentialsProvider($profileFile, $profileName)
|
||||
{
|
||||
if (!Helper::inOpenBasedir($profileFile)) {
|
||||
throw new RuntimeException('Unable to open credentials file: ' . $profileFile);
|
||||
}
|
||||
|
||||
if (!\is_readable($profileFile) || !\is_file($profileFile)) {
|
||||
throw new RuntimeException('Credentials file is not readable: ' . $profileFile);
|
||||
}
|
||||
|
||||
$jsonContent = \file_get_contents($profileFile);
|
||||
$fileArray = json_decode($jsonContent, true);
|
||||
|
||||
if (\is_array($fileArray) && !empty($fileArray)) {
|
||||
if (is_null($profileName) || $profileName === '') {
|
||||
$profileName = $fileArray['current'];
|
||||
}
|
||||
if (isset($fileArray['profiles'])) {
|
||||
foreach ($fileArray['profiles'] as $profile) {
|
||||
if (Helper::unsetReturnNull($profile, 'name') === $profileName) {
|
||||
switch (Helper::unsetReturnNull($profile, 'mode')) {
|
||||
case 'AK':
|
||||
return new StaticAKCredentialsProvider([
|
||||
'accessKeyId' => Helper::unsetReturnNull($profile, 'access_key_id'),
|
||||
'accessKeySecret' => Helper::unsetReturnNull($profile, 'access_key_secret'),
|
||||
]);
|
||||
case 'StsToken':
|
||||
return new StaticSTSCredentialsProvider([
|
||||
'accessKeyId' => Helper::unsetReturnNull($profile, 'access_key_id'),
|
||||
'accessKeySecret' => Helper::unsetReturnNull($profile, 'access_key_secret'),
|
||||
'securityToken' => Helper::unsetReturnNull($profile, 'sts_token'),
|
||||
]);
|
||||
case 'RamRoleArn':
|
||||
$innerProvider = new StaticAKCredentialsProvider([
|
||||
'accessKeyId' => Helper::unsetReturnNull($profile, 'access_key_id'),
|
||||
'accessKeySecret' => Helper::unsetReturnNull($profile, 'access_key_secret'),
|
||||
]);
|
||||
return new RamRoleArnCredentialsProvider([
|
||||
'credentialsProvider' => $innerProvider,
|
||||
'roleArn' => Helper::unsetReturnNull($profile, 'ram_role_arn'),
|
||||
'roleSessionName' => Helper::unsetReturnNull($profile, 'ram_session_name'),
|
||||
'durationSeconds' => Helper::unsetReturnNull($profile, 'expired_seconds'),
|
||||
'policy' => Helper::unsetReturnNull($profile, 'policy'),
|
||||
'externalId' => Helper::unsetReturnNull($profile, 'external_id'),
|
||||
'stsRegionId' => Helper::unsetReturnNull($profile, 'sts_region'),
|
||||
'enableVpc' => Helper::unsetReturnNull($profile, 'enable_vpc'),
|
||||
]);
|
||||
case 'EcsRamRole':
|
||||
return new EcsRamRoleCredentialsProvider([
|
||||
'roleName' => Helper::unsetReturnNull($profile, 'ram_role_name'),
|
||||
]);
|
||||
case 'OIDC':
|
||||
return new OIDCRoleArnCredentialsProvider([
|
||||
'roleArn' => Helper::unsetReturnNull($profile, 'ram_role_arn'),
|
||||
'oidcProviderArn' => Helper::unsetReturnNull($profile, 'oidc_provider_arn'),
|
||||
'oidcTokenFilePath' => Helper::unsetReturnNull($profile, 'oidc_token_file'),
|
||||
'roleSessionName' => Helper::unsetReturnNull($profile, 'ram_session_name'),
|
||||
'durationSeconds' => Helper::unsetReturnNull($profile, 'expired_seconds'),
|
||||
'policy' => Helper::unsetReturnNull($profile, 'policy'),
|
||||
'stsRegionId' => Helper::unsetReturnNull($profile, 'sts_region'),
|
||||
'enableVpc' => Helper::unsetReturnNull($profile, 'enable_vpc'),
|
||||
]);
|
||||
case 'ChainableRamRoleArn':
|
||||
$previousProvider = $this->reloadCredentialsProvider($profileFile, Helper::unsetReturnNull($profile, 'source_profile'));
|
||||
return new RamRoleArnCredentialsProvider([
|
||||
'credentialsProvider' => $previousProvider,
|
||||
'roleArn' => Helper::unsetReturnNull($profile, 'ram_role_arn'),
|
||||
'roleSessionName' => Helper::unsetReturnNull($profile, 'ram_session_name'),
|
||||
'durationSeconds' => Helper::unsetReturnNull($profile, 'expired_seconds'),
|
||||
'policy' => Helper::unsetReturnNull($profile, 'policy'),
|
||||
'externalId' => Helper::unsetReturnNull($profile, 'external_id'),
|
||||
'stsRegionId' => Helper::unsetReturnNull($profile, 'sts_region'),
|
||||
'enableVpc' => Helper::unsetReturnNull($profile, 'enable_vpc'),
|
||||
]);
|
||||
default:
|
||||
throw new RuntimeException('Unsupported credential mode from CLI credentials file: ' . Helper::unsetReturnNull($profile, 'mode'));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new RuntimeException('Failed to get credential from CLI credentials file: ' . $profileFile);
|
||||
}
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_CLI_PROFILE_DISABLED') && Helper::env('ALIBABA_CLOUD_CLI_PROFILE_DISABLED') === true) {
|
||||
throw new RuntimeException('CLI credentials file is disabled');
|
||||
}
|
||||
$cliProfileFile = self::getDefaultFile();
|
||||
if ($this->shouldReloadCredentialsProvider()) {
|
||||
$this->credentialsProvider = $this->reloadCredentialsProvider($cliProfileFile, $this->profileName);
|
||||
}
|
||||
|
||||
$credentials = $this->credentialsProvider->getCredentials();
|
||||
return new Credentials([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'providerName' => $this->getProviderName() . '/' . $this->credentialsProvider->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default credential file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getDefaultFile()
|
||||
{
|
||||
return Helper::getHomeDirectory() .
|
||||
DIRECTORY_SEPARATOR .
|
||||
'.aliyun' .
|
||||
DIRECTORY_SEPARATOR .
|
||||
'config.json';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'cli_profile';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Credentials;
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use Closure;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Class ChainProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class ChainProvider
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $customChains;
|
||||
|
||||
/**
|
||||
* @param callable ...$providers
|
||||
*/
|
||||
public static function set(...$providers)
|
||||
{
|
||||
if (empty($providers)) {
|
||||
throw new InvalidArgumentException('No providers in chain');
|
||||
}
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
if (!$provider instanceof Closure) {
|
||||
throw new InvalidArgumentException('Providers must all be Closures');
|
||||
}
|
||||
}
|
||||
|
||||
self::$customChains = $providers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasCustomChain()
|
||||
{
|
||||
return (bool)self::$customChains;
|
||||
}
|
||||
|
||||
public static function flush()
|
||||
{
|
||||
self::$customChains = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*/
|
||||
public static function customProvider($name)
|
||||
{
|
||||
foreach (self::$customChains as $provider) {
|
||||
$provider();
|
||||
|
||||
if (Credentials::has($name)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*/
|
||||
public static function defaultProvider($name)
|
||||
{
|
||||
$providers = [
|
||||
self::env(),
|
||||
self::ini(),
|
||||
self::instance(),
|
||||
];
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
$provider();
|
||||
|
||||
if (Credentials::has($name)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Closure
|
||||
*/
|
||||
public static function env()
|
||||
{
|
||||
return static function () {
|
||||
$accessKeyId = Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_ID');
|
||||
$accessKeySecret = Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
|
||||
|
||||
if ($accessKeyId && $accessKeySecret) {
|
||||
Credentials::set(
|
||||
self::getDefaultName(),
|
||||
[
|
||||
'type' => 'access_key',
|
||||
'access_key_id' => $accessKeyId,
|
||||
'access_key_secret' => $accessKeySecret,
|
||||
]
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public static function getDefaultName()
|
||||
{
|
||||
$name = Helper::envNotEmpty('ALIBABA_CLOUD_PROFILE');
|
||||
|
||||
if ($name) {
|
||||
return $name;
|
||||
}
|
||||
|
||||
return 'default';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Closure
|
||||
*/
|
||||
public static function ini()
|
||||
{
|
||||
return static function () {
|
||||
$filename = Helper::envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_FILE');
|
||||
if (!$filename) {
|
||||
$filename = self::getDefaultFile();
|
||||
}
|
||||
|
||||
if (!Helper::inOpenBasedir($filename)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($filename !== self::getDefaultFile() && (!\is_readable($filename) || !\is_file($filename))) {
|
||||
throw new RuntimeException(
|
||||
'Credentials file is not readable: ' . $filename
|
||||
);
|
||||
}
|
||||
|
||||
$file_array = \parse_ini_file($filename, true);
|
||||
|
||||
if (\is_array($file_array) && !empty($file_array)) {
|
||||
foreach (\array_change_key_case($file_array) as $name => $configures) {
|
||||
Credentials::set($name, $configures);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default credential file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getDefaultFile()
|
||||
{
|
||||
return Helper::getHomeDirectory() .
|
||||
DIRECTORY_SEPARATOR .
|
||||
'.alibabacloud' .
|
||||
DIRECTORY_SEPARATOR .
|
||||
'credentials';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Closure
|
||||
*/
|
||||
public static function instance()
|
||||
{
|
||||
return static function () {
|
||||
$instance = Helper::envNotEmpty('ALIBABA_CLOUD_ECS_METADATA');
|
||||
if ($instance) {
|
||||
Credentials::set(
|
||||
self::getDefaultName(),
|
||||
[
|
||||
'type' => 'ecs_ram_role',
|
||||
'role_name' => $instance,
|
||||
]
|
||||
);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class Credentials
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class Credentials
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeySecret;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $securityToken;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $expiration;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $providerName;
|
||||
|
||||
public function __construct($config = [])
|
||||
{
|
||||
if (!empty($config)) {
|
||||
foreach ($config as $k => $v) {
|
||||
$this->{$k} = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->accessKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->accessKeySecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->securityToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->expiration;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return $this->providerName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Interface CredentialsInterface
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
interface CredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @return Credentials
|
||||
*/
|
||||
public function getCredentials();
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getProviderName();
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class DefaultCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class DefaultCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $defaultProviders = [];
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
private $reuseLastProviderEnabled;
|
||||
|
||||
/**
|
||||
* @var CredentialsProvider
|
||||
*/
|
||||
private $lastUsedCredentialsProvider;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $customChain = [];
|
||||
|
||||
/**
|
||||
* DefaultCredentialsProvider constructor.
|
||||
* @param array $params
|
||||
*/
|
||||
public function __construct(array $params = [])
|
||||
{
|
||||
$this->filterReuseLastProviderEnabled($params);
|
||||
$this->createDefaultChain();
|
||||
Filter::reuseLastProviderEnabled($this->reuseLastProviderEnabled);
|
||||
}
|
||||
|
||||
private function filterReuseLastProviderEnabled(array $params)
|
||||
{
|
||||
$this->reuseLastProviderEnabled = true;
|
||||
if (isset($params['reuseLastProviderEnabled'])) {
|
||||
$this->reuseLastProviderEnabled = $params['reuseLastProviderEnabled'];
|
||||
}
|
||||
}
|
||||
|
||||
private function createDefaultChain()
|
||||
{
|
||||
self::$defaultProviders = [
|
||||
new EnvironmentVariableCredentialsProvider(),
|
||||
];
|
||||
if (
|
||||
Helper::envNotEmpty('ALIBABA_CLOUD_ROLE_ARN')
|
||||
&& Helper::envNotEmpty('ALIBABA_CLOUD_OIDC_PROVIDER_ARN')
|
||||
&& Helper::envNotEmpty('ALIBABA_CLOUD_OIDC_TOKEN_FILE')
|
||||
) {
|
||||
array_push(
|
||||
self::$defaultProviders,
|
||||
new OIDCRoleArnCredentialsProvider()
|
||||
);
|
||||
}
|
||||
array_push(
|
||||
self::$defaultProviders,
|
||||
new CLIProfileCredentialsProvider()
|
||||
);
|
||||
array_push(
|
||||
self::$defaultProviders,
|
||||
new ProfileCredentialsProvider()
|
||||
);
|
||||
array_push(
|
||||
self::$defaultProviders,
|
||||
new EcsRamRoleCredentialsProvider()
|
||||
);
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_URI')) {
|
||||
array_push(
|
||||
self::$defaultProviders,
|
||||
new URLCredentialsProvider()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param CredentialsProvider ...$providers
|
||||
*/
|
||||
public static function set(...$providers)
|
||||
{
|
||||
if (empty($providers)) {
|
||||
throw new InvalidArgumentException('No providers in chain');
|
||||
}
|
||||
|
||||
foreach ($providers as $provider) {
|
||||
if (!$provider instanceof CredentialsProvider) {
|
||||
throw new InvalidArgumentException('Providers must all be CredentialsProvider');
|
||||
}
|
||||
}
|
||||
|
||||
self::$customChain = $providers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasCustomChain()
|
||||
{
|
||||
return (bool) self::$customChain;
|
||||
}
|
||||
|
||||
public static function flush()
|
||||
{
|
||||
self::$customChain = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
if ($this->reuseLastProviderEnabled && !is_null($this->lastUsedCredentialsProvider)) {
|
||||
$credentials = $this->lastUsedCredentialsProvider->getCredentials();
|
||||
return new Credentials([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'providerName' => $this->getProviderName() . '/' . $this->lastUsedCredentialsProvider->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
$providerChain = array_merge(
|
||||
self::$customChain,
|
||||
self::$defaultProviders
|
||||
);
|
||||
|
||||
$exceptionMessages = [];
|
||||
|
||||
foreach ($providerChain as $provider) {
|
||||
try {
|
||||
$credentials = $provider->getCredentials();
|
||||
$this->lastUsedCredentialsProvider = $provider;
|
||||
return new Credentials([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'providerName' => $this->getProviderName() . '/' . $provider->getProviderName(),
|
||||
]);
|
||||
} catch (Exception $exception) {
|
||||
array_push($exceptionMessages, basename(str_replace('\\', '/', get_class($provider))) . ': ' . $exception->getMessage());
|
||||
}
|
||||
}
|
||||
throw new RuntimeException('Unable to load credentials from any of the providers in the chain: ' . implode(', ', $exceptionMessages));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return "default";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,276 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Request\Request;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
use AlibabaCloud\Credentials\Credential\RefreshResult;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class EcsRamRoleCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class EcsRamRoleCredentialsProvider extends SessionCredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $metadataHost = 'http://100.100.100.200';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $ecsUri = '/latest/meta-data/ram/security-credentials/';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $metadataTokenUri = '/latest/api/token';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleName;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $disableIMDSv1 = false;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $metadataTokenDuration = 21600;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $connectTimeout = 1;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $readTimeout = 1;
|
||||
|
||||
|
||||
/**
|
||||
* EcsRamRoleCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(array $params = [], array $options = [])
|
||||
{
|
||||
$this->filterOptions($options);
|
||||
$this->filterRoleName($params);
|
||||
$this->filterDisableECSIMDSv1($params);
|
||||
Filter::roleName($this->roleName);
|
||||
Filter::disableIMDSv1($this->disableIMDSv1);
|
||||
}
|
||||
|
||||
private function filterOptions(array $options)
|
||||
{
|
||||
if (isset($options['connectTimeout'])) {
|
||||
$this->connectTimeout = $options['connectTimeout'];
|
||||
}
|
||||
|
||||
if (isset($options['readTimeout'])) {
|
||||
$this->readTimeout = $options['readTimeout'];
|
||||
}
|
||||
|
||||
Filter::timeout($this->connectTimeout, $this->readTimeout);
|
||||
}
|
||||
|
||||
private function filterRoleName(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ECS_METADATA')) {
|
||||
$this->roleName = Helper::env('ALIBABA_CLOUD_ECS_METADATA');
|
||||
}
|
||||
|
||||
if (isset($params['roleName'])) {
|
||||
$this->roleName = $params['roleName'];
|
||||
}
|
||||
}
|
||||
|
||||
private function filterDisableECSIMDSv1($params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_IMDSV1_DISABLED')) {
|
||||
$this->disableIMDSv1 = Helper::env('ALIBABA_CLOUD_IMDSV1_DISABLED') === true ? true : false;
|
||||
}
|
||||
|
||||
if (isset($params['disableIMDSv1'])) {
|
||||
$this->disableIMDSv1 = $params['disableIMDSv1'];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credentials by request.
|
||||
*
|
||||
* @return RefreshResult
|
||||
* @throws InvalidArgumentException
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function refreshCredentials()
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ECS_METADATA_DISABLED') && Helper::env('ALIBABA_CLOUD_ECS_METADATA_DISABLED') === true) {
|
||||
throw new RuntimeException('IMDS credentials is disabled');
|
||||
}
|
||||
|
||||
if (is_null($this->roleName) || $this->roleName === '') {
|
||||
$this->roleName = $this->getRoleNameFromMeta();
|
||||
}
|
||||
|
||||
$url = $this->metadataHost . $this->ecsUri . $this->roleName;
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
|
||||
$metadataToken = $this->getMetadataToken();
|
||||
if (!is_null($metadataToken)) {
|
||||
$options['headers']['X-aliyun-ecs-metadata-token'] = $metadataToken;
|
||||
}
|
||||
|
||||
$result = Request::createClient()->request('GET', $url, $options);
|
||||
|
||||
if ($result->getStatusCode() === 404) {
|
||||
throw new InvalidArgumentException('The role was not found in the instance' . (string) $result);
|
||||
}
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error refreshing credentials from IMDS, statusCode: ' . $result->getStatusCode() . ', result: ' . (string) $result);
|
||||
}
|
||||
|
||||
$credentials = $result->toArray();
|
||||
|
||||
if (!isset($credentials['AccessKeyId']) || !isset($credentials['AccessKeySecret']) || !isset($credentials['SecurityToken'])) {
|
||||
throw new RuntimeException('Error retrieving credentials from IMDS result:' . $result->toJson());
|
||||
}
|
||||
|
||||
if (!isset($credentials['Code']) || $credentials['Code'] !== 'Success') {
|
||||
throw new RuntimeException('Error retrieving credentials from IMDS result, Code is not Success:' . $result->toJson());
|
||||
}
|
||||
|
||||
return new RefreshResult(new Credentials([
|
||||
'accessKeyId' => $credentials['AccessKeyId'],
|
||||
'accessKeySecret' => $credentials['AccessKeySecret'],
|
||||
'securityToken' => $credentials['SecurityToken'],
|
||||
'expiration' => \strtotime($credentials['Expiration']),
|
||||
'providerName' => $this->getProviderName(),
|
||||
]), $this->getStaleTime(strtotime($credentials["Expiration"])), $this->getPrefetchTime(strtotime($credentials["Expiration"])));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws InvalidArgumentException
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
private function getRoleNameFromMeta()
|
||||
{
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
|
||||
$metadataToken = $this->getMetadataToken();
|
||||
if (!is_null($metadataToken)) {
|
||||
$options['headers']['X-aliyun-ecs-metadata-token'] = $metadataToken;
|
||||
}
|
||||
|
||||
$result = Request::createClient()->request(
|
||||
'GET',
|
||||
'http://100.100.100.200/latest/meta-data/ram/security-credentials/',
|
||||
$options
|
||||
);
|
||||
|
||||
if ($result->getStatusCode() === 404) {
|
||||
throw new InvalidArgumentException('The role name was not found in the instance' . (string) $result);
|
||||
}
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error retrieving role name from result: ' . (string) $result);
|
||||
}
|
||||
|
||||
$role_name = (string) $result;
|
||||
if (!$role_name) {
|
||||
throw new RuntimeException('Error retrieving role name from result is empty');
|
||||
}
|
||||
|
||||
return $role_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get metadata token by request.
|
||||
*
|
||||
* @return string
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
private function getMetadataToken()
|
||||
{
|
||||
$url = $this->metadataHost . $this->metadataTokenUri;
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
$options['headers']['X-aliyun-ecs-metadata-token-ttl-seconds'] = $this->metadataTokenDuration;
|
||||
|
||||
$result = Request::createClient()->request('PUT', $url, $options);
|
||||
|
||||
if ($result->getStatusCode() != 200) {
|
||||
if ($this->disableIMDSv1) {
|
||||
throw new RuntimeException('Failed to get token from ECS Metadata Service. HttpCode= ' . $result->getStatusCode());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return (string) $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public function getPrefetchTime($expiration)
|
||||
{
|
||||
return $expiration <= 0 ?
|
||||
time() + (5 * 60) :
|
||||
time() + (60 * 60);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
return 'ecs_ram_role#roleName#' . $this->roleName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'ecs_ram_role';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRoleName()
|
||||
{
|
||||
return $this->roleName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isDisableIMDSv1()
|
||||
{
|
||||
return $this->disableIMDSv1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class EnvironmentVariableCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class EnvironmentVariableCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
/**
|
||||
* EnvironmentVariableCredentialsProvider constructor.
|
||||
*/
|
||||
public function __construct() {}
|
||||
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_ID')) {
|
||||
$accessKeyId = Helper::env('ALIBABA_CLOUD_ACCESS_KEY_ID');
|
||||
} else {
|
||||
throw new InvalidArgumentException('Access key ID must be specified via environment variable (ALIBABA_CLOUD_ACCESS_KEY_ID)');
|
||||
}
|
||||
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_SECRET')) {
|
||||
$accessKeySecret = Helper::env('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
|
||||
} else {
|
||||
throw new InvalidArgumentException('Access key Secret must be specified via environment variable (ALIBABA_CLOUD_ACCESS_KEY_SECRET)');
|
||||
}
|
||||
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_SECURITY_TOKEN')) {
|
||||
$securityToken = Helper::env('ALIBABA_CLOUD_SECURITY_TOKEN');
|
||||
return new Credentials([
|
||||
'accessKeyId' => $accessKeyId,
|
||||
'accessKeySecret' => $accessKeySecret,
|
||||
'securityToken' => $securityToken,
|
||||
'providerName' => $this->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
return new Credentials([
|
||||
'accessKeyId' => $accessKeyId,
|
||||
'accessKeySecret' => $accessKeySecret,
|
||||
'providerName' => $this->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return "env";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,268 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Request\Request;
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
use Exception;
|
||||
use AlibabaCloud\Credentials\Credential\RefreshResult;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class OIDCRoleArnCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class OIDCRoleArnCredentialsProvider extends SessionCredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleArn;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $oidcProviderArn;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $oidcTokenFilePath;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleSessionName;
|
||||
|
||||
/**
|
||||
* @description role session expiration
|
||||
* @example 3600
|
||||
* @var int
|
||||
*/
|
||||
private $durationSeconds = 3600;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $policy;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $stsEndpoint;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $connectTimeout = 5;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $readTimeout = 5;
|
||||
|
||||
/**
|
||||
* OIDCRoleArnCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(array $params = [], array $options = [])
|
||||
{
|
||||
$this->filterOptions($options);
|
||||
$this->filterRoleArn($params);
|
||||
$this->filterOIDCProviderArn($params);
|
||||
$this->filterOIDCTokenFilePath($params);
|
||||
$this->filterRoleSessionName($params);
|
||||
$this->filterDurationSeconds($params);
|
||||
$this->filterPolicy($params);
|
||||
$this->filterSTSEndpoint($params);
|
||||
}
|
||||
|
||||
private function filterRoleArn(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ROLE_ARN')) {
|
||||
$this->roleArn = Helper::env('ALIBABA_CLOUD_ROLE_ARN');
|
||||
}
|
||||
|
||||
if (isset($params['roleArn'])) {
|
||||
$this->roleArn = $params['roleArn'];
|
||||
}
|
||||
|
||||
Filter::roleArn($this->roleArn);
|
||||
}
|
||||
|
||||
private function filterOIDCProviderArn(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_OIDC_PROVIDER_ARN')) {
|
||||
$this->oidcProviderArn = Helper::env('ALIBABA_CLOUD_OIDC_PROVIDER_ARN');
|
||||
}
|
||||
|
||||
if (isset($params['oidcProviderArn'])) {
|
||||
$this->oidcProviderArn = $params['oidcProviderArn'];
|
||||
}
|
||||
|
||||
Filter::oidcProviderArn($this->oidcProviderArn);
|
||||
}
|
||||
|
||||
private function filterOIDCTokenFilePath(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_OIDC_TOKEN_FILE')) {
|
||||
$this->oidcTokenFilePath = Helper::env('ALIBABA_CLOUD_OIDC_TOKEN_FILE');
|
||||
}
|
||||
|
||||
if (isset($params['oidcTokenFilePath'])) {
|
||||
$this->oidcTokenFilePath = $params['oidcTokenFilePath'];
|
||||
}
|
||||
|
||||
Filter::oidcTokenFilePath($this->oidcTokenFilePath);
|
||||
}
|
||||
|
||||
private function filterRoleSessionName(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ROLE_SESSION_NAME')) {
|
||||
$this->roleSessionName = Helper::env('ALIBABA_CLOUD_ROLE_SESSION_NAME');
|
||||
}
|
||||
|
||||
if (isset($params['roleSessionName'])) {
|
||||
$this->roleSessionName = $params['roleSessionName'];
|
||||
}
|
||||
|
||||
if (is_null($this->roleSessionName) || $this->roleSessionName === '') {
|
||||
$this->roleSessionName = 'phpSdkRoleSessionName';
|
||||
}
|
||||
}
|
||||
|
||||
private function filterDurationSeconds(array $params)
|
||||
{
|
||||
if (isset($params['durationSeconds'])) {
|
||||
if (is_int($params['durationSeconds'])) {
|
||||
$this->durationSeconds = $params['durationSeconds'];
|
||||
}
|
||||
}
|
||||
if ($this->durationSeconds < 900) {
|
||||
throw new InvalidArgumentException('Role session expiration should be in the range of 900s - max session duration');
|
||||
}
|
||||
}
|
||||
|
||||
private function filterPolicy(array $params)
|
||||
{
|
||||
if (isset($params['policy'])) {
|
||||
if (is_string($params['policy'])) {
|
||||
$this->policy = $params['policy'];
|
||||
}
|
||||
|
||||
if (is_array($params['policy'])) {
|
||||
$this->policy = json_encode($params['policy']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function filterSTSEndpoint(array $params)
|
||||
{
|
||||
$prefix = 'sts';
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED') || (isset($params['enableVpc']) && $params['enableVpc'] === true)) {
|
||||
$prefix = 'sts-vpc';
|
||||
}
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_STS_REGION')) {
|
||||
$this->stsEndpoint = $prefix . '.' . Helper::env('ALIBABA_CLOUD_STS_REGION') . '.aliyuncs.com';
|
||||
}
|
||||
|
||||
if (isset($params['stsRegionId'])) {
|
||||
$this->stsEndpoint = $prefix . '.' . $params['stsRegionId'] . '.aliyuncs.com';
|
||||
}
|
||||
|
||||
if (isset($params['stsEndpoint'])) {
|
||||
$this->stsEndpoint = $params['stsEndpoint'];
|
||||
}
|
||||
|
||||
if (is_null($this->stsEndpoint) || $this->stsEndpoint === '') {
|
||||
$this->stsEndpoint = 'sts.aliyuncs.com';
|
||||
}
|
||||
}
|
||||
|
||||
private function filterOptions(array $options)
|
||||
{
|
||||
if (isset($options['connectTimeout'])) {
|
||||
$this->connectTimeout = $options['connectTimeout'];
|
||||
}
|
||||
|
||||
if (isset($options['readTimeout'])) {
|
||||
$this->readTimeout = $options['readTimeout'];
|
||||
}
|
||||
|
||||
Filter::timeout($this->connectTimeout, $this->readTimeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credentials by request.
|
||||
*
|
||||
* @return RefreshResult
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function refreshCredentials()
|
||||
{
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
|
||||
$options['query']['Action'] = 'AssumeRoleWithOIDC';
|
||||
$options['query']['Version'] = '2015-04-01';
|
||||
$options['query']['Format'] = 'JSON';
|
||||
$options['query']['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
|
||||
$options['query']['RoleArn'] = $this->roleArn;
|
||||
$options['query']['OIDCProviderArn'] = $this->oidcProviderArn;
|
||||
try {
|
||||
$oidcToken = file_get_contents($this->oidcTokenFilePath);
|
||||
$options['query']['OIDCToken'] = $oidcToken;
|
||||
} catch (Exception $exception) {
|
||||
throw new InvalidArgumentException($exception->getMessage());
|
||||
}
|
||||
$options['query']['RoleSessionName'] = $this->roleSessionName;
|
||||
$options['query']['DurationSeconds'] = (string) $this->durationSeconds;
|
||||
if (!is_null($this->policy)) {
|
||||
$options['query']['Policy'] = $this->policy;
|
||||
}
|
||||
|
||||
$url = (new Uri())->withScheme('https')->withHost($this->stsEndpoint);
|
||||
|
||||
$result = Request::createClient()->request('POST', $url, $options);
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error refreshing credentials from OIDC, statusCode: ' . $result->getStatusCode() . ', result: ' . (string) $result);
|
||||
}
|
||||
|
||||
$json = $result->toArray();
|
||||
$credentials = $json['Credentials'];
|
||||
|
||||
if (!isset($credentials['AccessKeyId']) || !isset($credentials['AccessKeySecret']) || !isset($credentials['SecurityToken'])) {
|
||||
throw new RuntimeException('Error retrieving credentials from OIDC result:' . $result->toJson());
|
||||
}
|
||||
|
||||
return new RefreshResult(new Credentials([
|
||||
'accessKeyId' => $credentials['AccessKeyId'],
|
||||
'accessKeySecret' => $credentials['AccessKeySecret'],
|
||||
'securityToken' => $credentials['SecurityToken'],
|
||||
'expiration' => \strtotime($credentials['Expiration']),
|
||||
'providerName' => $this->getProviderName(),
|
||||
]), $this->getStaleTime(strtotime($credentials['Expiration'])));
|
||||
}
|
||||
|
||||
public function key()
|
||||
{
|
||||
return 'oidc_role_arn#roleArn#' . $this->roleArn . '#oidcProviderArn#' . $this->oidcProviderArn . '#roleSessionName#' . $this->roleSessionName;
|
||||
}
|
||||
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'oidc_role_arn';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use RuntimeException;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class ProfileCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class ProfileCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $profileName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $profileFile;
|
||||
|
||||
/**
|
||||
* @var CredentialsProvider
|
||||
*/
|
||||
private $credentialsProvider;
|
||||
|
||||
|
||||
/**
|
||||
* ProfileCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function __construct(array $params = [])
|
||||
{
|
||||
$this->filterProfileName($params);
|
||||
$this->filterProfileFile();
|
||||
}
|
||||
|
||||
private function filterProfileName(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_PROFILE')) {
|
||||
$this->profileName = Helper::env('ALIBABA_CLOUD_PROFILE');
|
||||
}
|
||||
|
||||
if (isset($params['profileName'])) {
|
||||
$this->profileName = $params['profileName'];
|
||||
}
|
||||
|
||||
if (is_null($this->profileName) || $this->profileName === '') {
|
||||
$this->profileName = 'default';
|
||||
}
|
||||
}
|
||||
|
||||
private function filterProfileFile()
|
||||
{
|
||||
$this->profileFile = Helper::envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_FILE');
|
||||
|
||||
if (!$this->profileFile) {
|
||||
$this->profileFile = self::getDefaultFile();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
private function shouldReloadCredentialsProvider()
|
||||
{
|
||||
if (is_null($this->credentialsProvider)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return CredentialsProvider
|
||||
*/
|
||||
private function reloadCredentialsProvider($profileFile, $profileName)
|
||||
{
|
||||
if (!Helper::inOpenBasedir($profileFile)) {
|
||||
throw new RuntimeException('Unable to open credentials file: ' . $profileFile);
|
||||
}
|
||||
|
||||
if (!\is_readable($profileFile) || !\is_file($profileFile)) {
|
||||
throw new RuntimeException('Credentials file is not readable: ' . $profileFile);
|
||||
}
|
||||
|
||||
$fileArray = \parse_ini_file($profileFile, true);
|
||||
|
||||
if (\is_array($fileArray) && !empty($fileArray)) {
|
||||
$credentialsConfigures = [];
|
||||
foreach (\array_change_key_case($fileArray) as $name => $configures) {
|
||||
if ($name === $profileName) {
|
||||
$credentialsConfigures = $configures;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (\is_array($credentialsConfigures) && !empty($credentialsConfigures)) {
|
||||
switch (Helper::unsetReturnNull($credentialsConfigures, 'type')) {
|
||||
case 'access_key':
|
||||
return new StaticAKCredentialsProvider([
|
||||
'accessKeyId' => Helper::unsetReturnNull($credentialsConfigures, 'access_key_id'),
|
||||
'accessKeySecret' => Helper::unsetReturnNull($credentialsConfigures, 'access_key_secret'),
|
||||
]);
|
||||
case 'ram_role_arn':
|
||||
$innerProvider = new StaticAKCredentialsProvider([
|
||||
'accessKeyId' => Helper::unsetReturnNull($credentialsConfigures, 'access_key_id'),
|
||||
'accessKeySecret' => Helper::unsetReturnNull($credentialsConfigures, 'access_key_secret'),
|
||||
]);
|
||||
return new RamRoleArnCredentialsProvider([
|
||||
'credentialsProvider' => $innerProvider,
|
||||
'roleArn' => Helper::unsetReturnNull($credentialsConfigures, 'role_arn'),
|
||||
'roleSessionName' => Helper::unsetReturnNull($credentialsConfigures, 'role_session_name'),
|
||||
'policy' => Helper::unsetReturnNull($credentialsConfigures, 'policy'),
|
||||
]);
|
||||
case 'ecs_ram_role':
|
||||
return new EcsRamRoleCredentialsProvider([
|
||||
'roleName' => Helper::unsetReturnNull($credentialsConfigures, 'role_name'),
|
||||
]);
|
||||
case 'oidc_role_arn':
|
||||
return new OIDCRoleArnCredentialsProvider([
|
||||
'roleArn' => Helper::unsetReturnNull($credentialsConfigures, 'role_arn'),
|
||||
'oidcProviderArn' => Helper::unsetReturnNull($credentialsConfigures, 'oidc_provider_arn'),
|
||||
'oidcTokenFilePath' => Helper::unsetReturnNull($credentialsConfigures, 'oidc_token_file_path'),
|
||||
'roleSessionName' => Helper::unsetReturnNull($credentialsConfigures, 'role_session_name'),
|
||||
'policy' => Helper::unsetReturnNull($credentialsConfigures, 'policy'),
|
||||
]);
|
||||
case 'rsa_key_pair':
|
||||
return new RsaKeyPairCredentialsProvider([
|
||||
'publicKeyId' => Helper::unsetReturnNull($credentialsConfigures, 'public_key_id'),
|
||||
'privateKeyFile' => Helper::unsetReturnNull($credentialsConfigures, 'private_key_file'),
|
||||
]);
|
||||
default:
|
||||
throw new RuntimeException('Unsupported credential type from credentials file: ' . Helper::unsetReturnNull($credentialsConfigures, 'type'));
|
||||
}
|
||||
}
|
||||
}
|
||||
throw new RuntimeException('Failed to get credential from credentials file: ' . $profileFile);
|
||||
}
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
if ($this->shouldReloadCredentialsProvider()) {
|
||||
$this->credentialsProvider = $this->reloadCredentialsProvider($this->profileFile, $this->profileName);
|
||||
}
|
||||
|
||||
$credentials = $this->credentialsProvider->getCredentials();
|
||||
return new Credentials([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'providerName' => $this->getProviderName() . '/' . $this->credentialsProvider->getProviderName(),
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default credential file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function getDefaultFile()
|
||||
{
|
||||
return Helper::getHomeDirectory() .
|
||||
DIRECTORY_SEPARATOR .
|
||||
'.alibabacloud' .
|
||||
DIRECTORY_SEPARATOR .
|
||||
'credentials';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'profile';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,321 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Request\Request;
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
use AlibabaCloud\Credentials\Credential\RefreshResult;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class RamRoleArnCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class RamRoleArnCredentialsProvider extends SessionCredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var CredentialsProvider
|
||||
*/
|
||||
private $credentialsProvider;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleArn;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleSessionName;
|
||||
|
||||
/**
|
||||
* @description role session expiration
|
||||
* @example 3600
|
||||
* @var int
|
||||
*/
|
||||
private $durationSeconds = 3600;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $externalId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $policy;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $stsEndpoint;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $connectTimeout = 5;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $readTimeout = 5;
|
||||
|
||||
/**
|
||||
* RamRoleArnCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(array $params = [], array $options = [])
|
||||
{
|
||||
$this->filterOptions($options);
|
||||
$this->filterCredentials($params);
|
||||
$this->filterRoleArn($params);
|
||||
$this->filterRoleSessionName($params);
|
||||
$this->filterDurationSeconds($params);
|
||||
$this->filterPolicy($params);
|
||||
$this->filterExternalId($params);
|
||||
$this->filterSTSEndpoint($params);
|
||||
}
|
||||
|
||||
private function filterRoleArn(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ROLE_ARN')) {
|
||||
$this->roleArn = Helper::env('ALIBABA_CLOUD_ROLE_ARN');
|
||||
}
|
||||
|
||||
if (isset($params['roleArn'])) {
|
||||
$this->roleArn = $params['roleArn'];
|
||||
}
|
||||
|
||||
Filter::roleArn($this->roleArn);
|
||||
}
|
||||
|
||||
private function filterRoleSessionName(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ROLE_SESSION_NAME')) {
|
||||
$this->roleSessionName = Helper::env('ALIBABA_CLOUD_ROLE_SESSION_NAME');
|
||||
}
|
||||
|
||||
if (isset($params['roleSessionName'])) {
|
||||
$this->roleSessionName = $params['roleSessionName'];
|
||||
}
|
||||
|
||||
if (is_null($this->roleSessionName) || $this->roleSessionName === '') {
|
||||
$this->roleSessionName = 'phpSdkRoleSessionName';
|
||||
}
|
||||
}
|
||||
|
||||
private function filterDurationSeconds(array $params)
|
||||
{
|
||||
if (isset($params['durationSeconds'])) {
|
||||
if (is_int($params['durationSeconds'])) {
|
||||
$this->durationSeconds = $params['durationSeconds'];
|
||||
}
|
||||
}
|
||||
if ($this->durationSeconds < 900) {
|
||||
throw new InvalidArgumentException('Role session expiration should be in the range of 900s - max session duration');
|
||||
}
|
||||
}
|
||||
|
||||
private function filterPolicy(array $params)
|
||||
{
|
||||
if (isset($params['policy'])) {
|
||||
if (is_string($params['policy'])) {
|
||||
$this->policy = $params['policy'];
|
||||
}
|
||||
|
||||
if (is_array($params['policy'])) {
|
||||
$this->policy = json_encode($params['policy']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function filterExternalId(array $params)
|
||||
{
|
||||
if (isset($params['externalId'])) {
|
||||
if (is_string($params['externalId'])) {
|
||||
$this->externalId = $params['externalId'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function filterSTSEndpoint(array $params)
|
||||
{
|
||||
$prefix = 'sts';
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_VPC_ENDPOINT_ENABLED') || (isset($params['enableVpc']) && $params['enableVpc'] === true)) {
|
||||
$prefix = 'sts-vpc';
|
||||
}
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_STS_REGION')) {
|
||||
$this->stsEndpoint = $prefix . '.' . Helper::env('ALIBABA_CLOUD_STS_REGION') . '.aliyuncs.com';
|
||||
}
|
||||
|
||||
if (isset($params['stsRegionId'])) {
|
||||
$this->stsEndpoint = $prefix . '.' . $params['stsRegionId'] . '.aliyuncs.com';
|
||||
}
|
||||
|
||||
if (isset($params['stsEndpoint'])) {
|
||||
$this->stsEndpoint = $params['stsEndpoint'];
|
||||
}
|
||||
|
||||
if (is_null($this->stsEndpoint) || $this->stsEndpoint === '') {
|
||||
$this->stsEndpoint = 'sts.aliyuncs.com';
|
||||
}
|
||||
}
|
||||
|
||||
private function filterCredentials(array $params)
|
||||
{
|
||||
if (isset($params['credentialsProvider'])) {
|
||||
if (!($params['credentialsProvider'] instanceof CredentialsProvider)) {
|
||||
throw new InvalidArgumentException('Invalid credentialsProvider option for ram_role_arn');
|
||||
}
|
||||
$this->credentialsProvider = $params['credentialsProvider'];
|
||||
} else if (isset($params['accessKeyId']) && isset($params['accessKeySecret']) && isset($params['securityToken'])) {
|
||||
Filter::accessKey($params['accessKeyId'], $params['accessKeySecret']);
|
||||
Filter::securityToken($params['securityToken']);
|
||||
$this->credentialsProvider = new StaticSTSCredentialsProvider($params);
|
||||
} else if (isset($params['accessKeyId']) && isset($params['accessKeySecret'])) {
|
||||
Filter::accessKey($params['accessKeyId'], $params['accessKeySecret']);
|
||||
$this->credentialsProvider = new StaticAKCredentialsProvider($params);
|
||||
} else {
|
||||
throw new InvalidArgumentException('Missing required credentials option for ram_role_arn');
|
||||
}
|
||||
}
|
||||
|
||||
private function filterOptions(array $options)
|
||||
{
|
||||
if (isset($options['connectTimeout'])) {
|
||||
$this->connectTimeout = $options['connectTimeout'];
|
||||
}
|
||||
|
||||
if (isset($options['readTimeout'])) {
|
||||
$this->readTimeout = $options['readTimeout'];
|
||||
}
|
||||
|
||||
Filter::timeout($this->connectTimeout, $this->readTimeout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credentials by request.
|
||||
*
|
||||
* @return RefreshResult
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function refreshCredentials()
|
||||
{
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
|
||||
$options['query']['Action'] = 'AssumeRole';
|
||||
$options['query']['Version'] = '2015-04-01';
|
||||
$options['query']['Format'] = 'JSON';
|
||||
$options['query']['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
|
||||
$options['query']['SignatureMethod'] = 'HMAC-SHA1';
|
||||
$options['query']['SignatureVersion'] = '1.0';
|
||||
$options['query']['SignatureNonce'] = Request::uuid(json_encode($options['query']));
|
||||
$options['query']['RoleArn'] = $this->roleArn;
|
||||
$options['query']['RoleSessionName'] = $this->roleSessionName;
|
||||
$options['query']['DurationSeconds'] = (string) $this->durationSeconds;
|
||||
if (!is_null($this->policy) && $this->policy !== '') {
|
||||
$options['query']['Policy'] = $this->policy;
|
||||
}
|
||||
if (!is_null($this->externalId) && $this->externalId !== '') {
|
||||
$options['query']['ExternalId'] = $this->externalId;
|
||||
}
|
||||
|
||||
$sessionCredentials = $this->credentialsProvider->getCredentials();
|
||||
$options['query']['AccessKeyId'] = $sessionCredentials->getAccessKeyId();
|
||||
if (!is_null($sessionCredentials->getSecurityToken())) {
|
||||
$options['query']['SecurityToken'] = $sessionCredentials->getSecurityToken();
|
||||
}
|
||||
$options['query']['Signature'] = Request::shaHmac1sign(
|
||||
Request::signString('GET', $options['query']),
|
||||
$sessionCredentials->getAccessKeySecret() . '&'
|
||||
);
|
||||
|
||||
$url = (new Uri())->withScheme('https')->withHost($this->stsEndpoint);
|
||||
|
||||
$result = Request::createClient()->request('GET', $url, $options);
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error refreshing credentials from RamRoleArn, statusCode: ' . $result->getStatusCode() . ', result: ' . (string) $result);
|
||||
}
|
||||
|
||||
$json = $result->toArray();
|
||||
$credentials = $json['Credentials'];
|
||||
|
||||
if (!isset($credentials['AccessKeyId']) || !isset($credentials['AccessKeySecret']) || !isset($credentials['SecurityToken'])) {
|
||||
throw new RuntimeException('Error retrieving credentials from RamRoleArn result:' . $result->toJson());
|
||||
}
|
||||
|
||||
return new RefreshResult(new Credentials([
|
||||
'accessKeyId' => $credentials['AccessKeyId'],
|
||||
'accessKeySecret' => $credentials['AccessKeySecret'],
|
||||
'securityToken' => $credentials['SecurityToken'],
|
||||
'expiration' => \strtotime($credentials['Expiration']),
|
||||
'providerName' => $this->getProviderName(),
|
||||
]), $this->getStaleTime(strtotime($credentials['Expiration'])));
|
||||
}
|
||||
|
||||
public function key()
|
||||
{
|
||||
$credentials = $this->credentialsProvider->getCredentials();
|
||||
return 'ram_role_arn#credential#' . $credentials->getAccessKeyId() . '#roleArn#' . $this->roleArn . '#roleSessionName#' . $this->roleSessionName;
|
||||
}
|
||||
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'ram_role_arn/' . $this->credentialsProvider->getProviderName();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRoleArn()
|
||||
{
|
||||
return $this->roleArn;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRoleSessionName()
|
||||
{
|
||||
return $this->roleSessionName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPolicy()
|
||||
{
|
||||
return $this->policy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* @return string
|
||||
*/
|
||||
public function getOriginalAccessKeyId()
|
||||
{
|
||||
return $this->credentialsProvider->getCredentials()->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* @return string
|
||||
*/
|
||||
public function getOriginalAccessKeySecret()
|
||||
{
|
||||
return $this->credentialsProvider->getCredentials()->getAccessKeySecret();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Request\Request;
|
||||
use GuzzleHttp\Psr7\Uri;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use AlibabaCloud\Credentials\Credential\RefreshResult;
|
||||
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class RsaKeyPairCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class RsaKeyPairCredentialsProvider extends SessionCredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $publicKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $privateKey;
|
||||
|
||||
/**
|
||||
* @description role session expiration
|
||||
* @example 3600
|
||||
* @var int
|
||||
*/
|
||||
private $durationSeconds = 3600;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $stsEndpoint;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $connectTimeout = 5;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $readTimeout = 5;
|
||||
|
||||
/**
|
||||
* RsaKeyPairCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(array $params = [], array $options = [])
|
||||
{
|
||||
$this->filterOptions($options);
|
||||
$this->filterDurationSeconds($params);
|
||||
$this->filterSTSEndpoint($params);
|
||||
$this->publicKeyId = isset($params['publicKeyId']) ? $params['publicKeyId'] : null;
|
||||
$privateKeyFile = isset($params['privateKeyFile']) ? $params['privateKeyFile'] : null;
|
||||
Filter::publicKeyId($this->publicKeyId);
|
||||
Filter::privateKeyFile($privateKeyFile);
|
||||
|
||||
try {
|
||||
$this->privateKey = file_get_contents($privateKeyFile);
|
||||
} catch (Exception $exception) {
|
||||
throw new InvalidArgumentException($exception->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private function filterOptions(array $options)
|
||||
{
|
||||
if (isset($options['connectTimeout'])) {
|
||||
$this->connectTimeout = $options['connectTimeout'];
|
||||
}
|
||||
|
||||
if (isset($options['readTimeout'])) {
|
||||
$this->readTimeout = $options['readTimeout'];
|
||||
}
|
||||
|
||||
Filter::timeout($this->connectTimeout, $this->readTimeout);
|
||||
}
|
||||
|
||||
private function filterDurationSeconds(array $params)
|
||||
{
|
||||
if (isset($params['durationSeconds'])) {
|
||||
if (is_int($params['durationSeconds'])) {
|
||||
$this->durationSeconds = $params['durationSeconds'];
|
||||
}
|
||||
}
|
||||
if ($this->durationSeconds < 900) {
|
||||
throw new InvalidArgumentException('Role session expiration should be in the range of 900s - max session duration');
|
||||
}
|
||||
}
|
||||
|
||||
private function filterSTSEndpoint(array $params)
|
||||
{
|
||||
if (isset($params['stsEndpoint'])) {
|
||||
$this->stsEndpoint = $params['stsEndpoint'];
|
||||
}
|
||||
|
||||
if (is_null($this->stsEndpoint) || $this->stsEndpoint === '') {
|
||||
$this->stsEndpoint = 'sts.ap-northeast-1.aliyuncs.com';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get credentials by request.
|
||||
*
|
||||
* @return RefreshResult
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function refreshCredentials()
|
||||
{
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
|
||||
$options['query']['Action'] = 'GenerateSessionAccessKey';
|
||||
$options['query']['Version'] = '2015-04-01';
|
||||
$options['query']['Format'] = 'JSON';
|
||||
$options['query']['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
|
||||
$options['query']['SignatureMethod'] = 'SHA256withRSA';
|
||||
$options['query']['SignatureType'] = 'PRIVATEKEY';
|
||||
$options['query']['SignatureVersion'] = '1.0';
|
||||
$options['query']['SignatureNonce'] = Request::uuid(json_encode($options['query']));
|
||||
$options['query']['DurationSeconds'] = (string) $this->durationSeconds;
|
||||
$options['query']['AccessKeyId'] = $this->publicKeyId;
|
||||
$options['query']['Signature'] = Request::shaHmac256WithRsasign(
|
||||
Request::signString('GET', $options['query']),
|
||||
$this->privateKey
|
||||
);
|
||||
|
||||
$url = (new Uri())->withScheme('https')->withHost($this->stsEndpoint);
|
||||
|
||||
$result = Request::createClient()->request('GET', $url, $options);
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error refreshing credentials from RsaKeyPair, statusCode: ' . $result->getStatusCode() . ', result: ' . (string) $result);
|
||||
}
|
||||
|
||||
$json = $result->toArray();
|
||||
|
||||
if (!isset($json['SessionAccessKey']['SessionAccessKeyId']) || !isset($json['SessionAccessKey']['SessionAccessKeySecret'])) {
|
||||
throw new RuntimeException('Error retrieving credentials from RsaKeyPair result:' . $result->toJson());
|
||||
}
|
||||
|
||||
$credentials = [];
|
||||
$credentials['AccessKeyId'] = $json['SessionAccessKey']['SessionAccessKeyId'];
|
||||
$credentials['AccessKeySecret'] = $json['SessionAccessKey']['SessionAccessKeySecret'];
|
||||
$credentials['Expiration'] = $json['SessionAccessKey']['Expiration'];
|
||||
$credentials['SecurityToken'] = null;
|
||||
|
||||
|
||||
return new RefreshResult(new Credentials([
|
||||
'accessKeyId' => $credentials['AccessKeyId'],
|
||||
'accessKeySecret' => $credentials['AccessKeySecret'],
|
||||
'securityToken' => $credentials['SecurityToken'],
|
||||
'expiration' => \strtotime($credentials['Expiration']),
|
||||
'providerName' => $this->getProviderName(),
|
||||
]), $this->getStaleTime(strtotime($credentials['Expiration'])));
|
||||
}
|
||||
|
||||
public function key()
|
||||
{
|
||||
return 'rsa_key_pair#publicKeyId#' . $this->publicKeyId;
|
||||
}
|
||||
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'rsa_key_pair';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPublicKeyId()
|
||||
{
|
||||
return $this->publicKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getPrivateKey()
|
||||
{
|
||||
return $this->privateKey;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,161 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Credential\RefreshResult;
|
||||
|
||||
abstract class SessionCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected static $credentialsCache = [];
|
||||
|
||||
/**
|
||||
* Expiration time slot for temporary security credentials.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $expirationSlot = 180;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
protected $error = 'Result contains no credentials';
|
||||
|
||||
/**
|
||||
* Get the credentials from the cache in the validity period.
|
||||
*
|
||||
* @return RefreshResult|null
|
||||
*/
|
||||
protected function getCredentialsInCache()
|
||||
{
|
||||
if (isset(self::$credentialsCache[$this->key()])) {
|
||||
$result = self::$credentialsCache[$this->key()];
|
||||
return $result;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache credentials.
|
||||
*
|
||||
* @param RefreshResult $credential
|
||||
*/
|
||||
protected function cache(RefreshResult $credential)
|
||||
{
|
||||
self::$credentialsCache[$this->key()] = $credential;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
if ($this->cacheIsStale() || $this->shouldInitiateCachePrefetch()) {
|
||||
$result = $this->refreshCache();
|
||||
$this->cache($result);
|
||||
}
|
||||
|
||||
$result = $this->getCredentialsInCache();
|
||||
|
||||
return $result->credentials();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RefreshResult
|
||||
*/
|
||||
protected function refreshCache()
|
||||
{
|
||||
try {
|
||||
return $this->handleFetchedSuccess($this->refreshCredentials());
|
||||
} catch (\Exception $e) {
|
||||
return $this->handleFetchedFailure($e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RefreshResult
|
||||
* @throws \Exception
|
||||
*/
|
||||
protected function handleFetchedFailure(\Exception $e)
|
||||
{
|
||||
$currentCachedValue = $this->getCredentialsInCache();
|
||||
if (is_null($currentCachedValue)) {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
if (time() < $currentCachedValue->staleTime()) {
|
||||
return $currentCachedValue;
|
||||
}
|
||||
|
||||
throw $e;
|
||||
}
|
||||
/**
|
||||
* @return RefreshResult
|
||||
*/
|
||||
protected function handleFetchedSuccess(RefreshResult $value)
|
||||
{
|
||||
$now = time();
|
||||
// 过期时间大于15分钟,不用管
|
||||
if ($now < $value->staleTime()) {
|
||||
return $value;
|
||||
}
|
||||
// 不足或等于15分钟,但未过期,下次会再次刷新
|
||||
if ($now < $value->staleTime() + 15 * 60) {
|
||||
$value->staleTime = $now;
|
||||
return $value;
|
||||
}
|
||||
// 已过期,看缓存,缓存若大于15分钟,返回缓存,若小于15分钟,则稍后重试
|
||||
if (is_null($this->getCredentialsInCache())) {
|
||||
throw new \Exception("The fetched credentials have expired and no cache is available.");
|
||||
} else if ($now < $this->getCredentialsInCache()->staleTime()) {
|
||||
return $this->getCredentialsInCache();
|
||||
} else {
|
||||
// 返回成功,延长有效期 1 分钟
|
||||
$expectation = mt_rand(50, 70);
|
||||
$value->staleTime = time() + $expectation;
|
||||
return $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function cacheIsStale()
|
||||
{
|
||||
return is_null($this->getCredentialsInCache()) || time() >= $this->getCredentialsInCache()->staleTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
protected function shouldInitiateCachePrefetch()
|
||||
{
|
||||
return is_null($this->getCredentialsInCache()) || time() >= $this->getCredentialsInCache()->prefetchTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getStaleTime($expiration)
|
||||
{
|
||||
return $expiration <= 0 ?
|
||||
time() + (60 * 60) :
|
||||
$expiration - (15 * 60);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RefreshResult
|
||||
*/
|
||||
abstract function refreshCredentials();
|
||||
|
||||
/**
|
||||
* Get the toString of the credentials provider as the key.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract function key();
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class StaticAKCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class StaticAKCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeySecret;
|
||||
|
||||
/**
|
||||
* StaticAKCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function __construct(array $params = [])
|
||||
{
|
||||
$this->filterAK($params);
|
||||
}
|
||||
|
||||
private function filterAK(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_ID')) {
|
||||
$this->accessKeyId = Helper::env('ALIBABA_CLOUD_ACCESS_KEY_ID');
|
||||
}
|
||||
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_SECRET')) {
|
||||
$this->accessKeySecret = Helper::env('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
|
||||
}
|
||||
|
||||
if (isset($params['accessKeyId'])) {
|
||||
$this->accessKeyId = $params['accessKeyId'];
|
||||
}
|
||||
if (isset($params['accessKeySecret'])) {
|
||||
$this->accessKeySecret = $params['accessKeySecret'];
|
||||
}
|
||||
|
||||
Filter::accessKey($this->accessKeyId, $this->accessKeySecret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
return new Credentials([
|
||||
'accessKeyId' => $this->accessKeyId,
|
||||
'accessKeySecret' => $this->accessKeySecret,
|
||||
'providerName' => $this->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return "static_ak";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class StaticSTSCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class StaticSTSCredentialsProvider implements CredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeySecret;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $securityToken;
|
||||
|
||||
/**
|
||||
* StaticSTSCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
*/
|
||||
public function __construct(array $params = [])
|
||||
{
|
||||
$this->filterSTS($params);
|
||||
}
|
||||
|
||||
private function filterSTS(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_ID')) {
|
||||
$this->accessKeyId = Helper::env('ALIBABA_CLOUD_ACCESS_KEY_ID');
|
||||
}
|
||||
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_ACCESS_KEY_SECRET')) {
|
||||
$this->accessKeySecret = Helper::env('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
|
||||
}
|
||||
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_SECURITY_TOKEN')) {
|
||||
$this->securityToken = Helper::env('ALIBABA_CLOUD_SECURITY_TOKEN');
|
||||
}
|
||||
|
||||
if (isset($params['accessKeyId'])) {
|
||||
$this->accessKeyId = $params['accessKeyId'];
|
||||
}
|
||||
if (isset($params['accessKeySecret'])) {
|
||||
$this->accessKeySecret = $params['accessKeySecret'];
|
||||
}
|
||||
if (isset($params['securityToken'])) {
|
||||
$this->securityToken = $params['securityToken'];
|
||||
}
|
||||
|
||||
Filter::accessKey($this->accessKeyId, $this->accessKeySecret);
|
||||
Filter::securityToken($this->securityToken);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credential.
|
||||
*
|
||||
* @return Credentials
|
||||
*/
|
||||
public function getCredentials()
|
||||
{
|
||||
return new Credentials([
|
||||
'accessKeyId' => $this->accessKeyId,
|
||||
'accessKeySecret' => $this->accessKeySecret,
|
||||
'securityToken' => $this->securityToken,
|
||||
'providerName' => $this->getProviderName(),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return "static_sts";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,126 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Providers;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Request\Request;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
use RuntimeException;
|
||||
use AlibabaCloud\Credentials\Credential\RefreshResult;
|
||||
|
||||
/**
|
||||
* @internal This class is intended for internal use within the package.
|
||||
* Class URLCredentialsProvider
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Providers
|
||||
*/
|
||||
class URLCredentialsProvider extends SessionCredentialsProvider
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $credentialsURI;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $connectTimeout = 5;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $readTimeout = 5;
|
||||
|
||||
/**
|
||||
* URLCredentialsProvider constructor.
|
||||
*
|
||||
* @param array $params
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(array $params = [], array $options = [])
|
||||
{
|
||||
$this->filterOptions($options);
|
||||
$this->filterCredentialsURI($params);
|
||||
}
|
||||
|
||||
private function filterOptions(array $options)
|
||||
{
|
||||
if (isset($options['connectTimeout'])) {
|
||||
$this->connectTimeout = $options['connectTimeout'];
|
||||
}
|
||||
|
||||
if (isset($options['readTimeout'])) {
|
||||
$this->readTimeout = $options['readTimeout'];
|
||||
}
|
||||
|
||||
Filter::timeout($this->connectTimeout, $this->readTimeout);
|
||||
}
|
||||
|
||||
private function filterCredentialsURI(array $params)
|
||||
{
|
||||
if (Helper::envNotEmpty('ALIBABA_CLOUD_CREDENTIALS_URI')) {
|
||||
$this->credentialsURI = Helper::env('ALIBABA_CLOUD_CREDENTIALS_URI');
|
||||
}
|
||||
|
||||
if (isset($params['credentialsURI'])) {
|
||||
$this->credentialsURI = $params['credentialsURI'];
|
||||
}
|
||||
|
||||
Filter::credentialsURI($this->credentialsURI);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get credentials by request.
|
||||
*
|
||||
* @return RefreshResult
|
||||
* @throws InvalidArgumentException
|
||||
* @throws RuntimeException
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function refreshCredentials()
|
||||
{
|
||||
$options = Request::commonOptions();
|
||||
$options['read_timeout'] = $this->readTimeout;
|
||||
$options['connect_timeout'] = $this->connectTimeout;
|
||||
|
||||
$result = Request::createClient()->request('GET', $this->credentialsURI, $options);
|
||||
|
||||
if ($result->getStatusCode() !== 200) {
|
||||
throw new RuntimeException('Error refreshing credentials from credentialsURI, statusCode: ' . $result->getStatusCode() . ', result: ' . (string) $result);
|
||||
}
|
||||
|
||||
$credentials = $result->toArray();
|
||||
|
||||
if (!isset($credentials['AccessKeyId']) || !isset($credentials['AccessKeySecret']) || !isset($credentials['SecurityToken']) || !isset($credentials['Expiration'])) {
|
||||
throw new RuntimeException('Error retrieving credentials from credentialsURI result:' . $result->toJson());
|
||||
}
|
||||
|
||||
return new RefreshResult(new Credentials([
|
||||
'accessKeyId' => $credentials['AccessKeyId'],
|
||||
'accessKeySecret' => $credentials['AccessKeySecret'],
|
||||
'securityToken' => $credentials['SecurityToken'],
|
||||
'expiration' => \strtotime($credentials['Expiration']),
|
||||
'providerName' => $this->getProviderName(),
|
||||
]), $this->getStaleTime(strtotime($credentials['Expiration'])));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function key()
|
||||
{
|
||||
return 'credential_uri#' . $this->credentialsURI;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getProviderName()
|
||||
{
|
||||
return 'credential_uri';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,242 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Providers\RamRoleArnCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use Exception;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use the AssumeRole of the RAM account to complete the authentication.
|
||||
*/
|
||||
class RamRoleArnCredential implements CredentialsInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeySecret;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleArn;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $roleSessionName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $policy;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* RamRoleArnCredential constructor.
|
||||
*
|
||||
* @param array $credential
|
||||
* @param array $config
|
||||
*/
|
||||
public function __construct(array $credential = [], array $config = [])
|
||||
{
|
||||
$this->filterParameters($credential);
|
||||
$this->filterPolicy($credential);
|
||||
|
||||
Filter::accessKey($credential['access_key_id'], $credential['access_key_secret']);
|
||||
|
||||
$this->config = $config;
|
||||
$this->accessKeyId = $credential['access_key_id'];
|
||||
$this->accessKeySecret = $credential['access_key_secret'];
|
||||
$this->roleArn = $credential['role_arn'];
|
||||
$this->roleSessionName = $credential['role_session_name'];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $credential
|
||||
*/
|
||||
private function filterParameters(array $credential)
|
||||
{
|
||||
if (!isset($credential['access_key_id'])) {
|
||||
throw new InvalidArgumentException('Missing required access_key_id option in config for ram_role_arn');
|
||||
}
|
||||
|
||||
if (!isset($credential['access_key_secret'])) {
|
||||
throw new InvalidArgumentException('Missing required access_key_secret option in config for ram_role_arn');
|
||||
}
|
||||
|
||||
if (!isset($credential['role_arn'])) {
|
||||
throw new InvalidArgumentException('Missing required role_arn option in config for ram_role_arn');
|
||||
}
|
||||
|
||||
if (!isset($credential['role_session_name'])) {
|
||||
throw new InvalidArgumentException('Missing required role_session_name option in config for ram_role_arn');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $credential
|
||||
*/
|
||||
private function filterPolicy(array $credential)
|
||||
{
|
||||
if (isset($credential['policy'])) {
|
||||
if (is_string($credential['policy'])) {
|
||||
$this->policy = $credential['policy'];
|
||||
}
|
||||
|
||||
if (is_array($credential['policy'])) {
|
||||
$this->policy = json_encode($credential['policy']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRoleArn()
|
||||
{
|
||||
return $this->roleArn;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getRoleSessionName()
|
||||
{
|
||||
return $this->roleSessionName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPolicy()
|
||||
{
|
||||
return $this->policy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return "$this->accessKeyId#$this->accessKeySecret#$this->roleArn#$this->roleSessionName";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ShaHmac1Signature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return new ShaHmac1Signature();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOriginalAccessKeyId()
|
||||
{
|
||||
return $this->accessKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOriginalAccessKeySecret()
|
||||
{
|
||||
return $this->accessKeySecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->getSessionCredential()->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AlibabaCloud\Credentials\Providers\Credentials
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
protected function getSessionCredential()
|
||||
{
|
||||
$params = [
|
||||
'accessKeyId' => $this->accessKeyId,
|
||||
'accessKeySecret' => $this->accessKeyId,
|
||||
'roleArn' => $this->roleArn,
|
||||
'roleSessionName' => $this->roleSessionName,
|
||||
'policy' => $this->policy,
|
||||
];
|
||||
return (new RamRoleArnCredentialsProvider($params))->getCredentials();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->getSessionCredential()->getAccessKeySecret();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->getSessionCredential()->getSecurityToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->getSessionCredential()->getExpiration();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
$credentials = $this->getSessionCredential();
|
||||
return new CredentialModel([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'type' => 'ram_role_arn',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Request;
|
||||
|
||||
use AlibabaCloud\Credentials\Credentials;
|
||||
use AlibabaCloud\Credentials\Utils\Helper;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\Middleware;
|
||||
use AlibabaCloud\Tea\Response;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
|
||||
use Exception;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* RESTful RPC Request.
|
||||
*/
|
||||
class Request
|
||||
{
|
||||
|
||||
/**
|
||||
* Request Connect Timeout
|
||||
*/
|
||||
const CONNECT_TIMEOUT = 5;
|
||||
|
||||
/**
|
||||
* Request Read Timeout
|
||||
*/
|
||||
const READ_TIMEOUT = 5;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $config = [];
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function commonOptions()
|
||||
{
|
||||
$options = [];
|
||||
$options['http_errors'] = false;
|
||||
$options['connect_timeout'] = self::CONNECT_TIMEOUT;
|
||||
$options['read_timeout'] = self::READ_TIMEOUT;
|
||||
$options['headers']['User-Agent'] = Helper::getUserAgent();
|
||||
|
||||
// Turn on debug mode based on environment variable.
|
||||
if (strtolower(Helper::env('DEBUG')) === 'sdk') {
|
||||
$options['debug'] = true;
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $salt
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function uuid($salt)
|
||||
{
|
||||
return md5($salt . uniqid(md5(microtime(true)), true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param array $parameters
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function signString($method, array $parameters)
|
||||
{
|
||||
ksort($parameters);
|
||||
$canonicalized = '';
|
||||
foreach ($parameters as $key => $value) {
|
||||
$canonicalized .= '&' . self::percentEncode($key) . '=' . self::percentEncode($value);
|
||||
}
|
||||
|
||||
return $method . '&%2F&' . self::percentEncode(substr($canonicalized, 1));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $accessKeySecret
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function shaHmac1sign($string, $accessKeySecret)
|
||||
{
|
||||
return base64_encode(hash_hmac('sha1', $string, $accessKeySecret, true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $accessKeySecret
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function shaHmac256sign($string, $accessKeySecret)
|
||||
{
|
||||
return base64_encode(hash_hmac('sha256', $string, $accessKeySecret, true));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $privateKey
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function shaHmac256WithRsasign($string, $privateKey)
|
||||
{
|
||||
$binarySignature = '';
|
||||
try {
|
||||
openssl_sign(
|
||||
$string,
|
||||
$binarySignature,
|
||||
$privateKey,
|
||||
\OPENSSL_ALGO_SHA256
|
||||
);
|
||||
} catch (Exception $exception) {
|
||||
throw new InvalidArgumentException(
|
||||
$exception->getMessage()
|
||||
);
|
||||
}
|
||||
|
||||
return base64_encode($binarySignature);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
*
|
||||
* @return null|string|string[]
|
||||
*/
|
||||
private static function percentEncode($string)
|
||||
{
|
||||
$result = rawurlencode($string);
|
||||
$result = str_replace(['+', '*'], ['%20', '%2A'], $result);
|
||||
$result = preg_replace('/%7E/', '~', $result);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Client
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function createClient()
|
||||
{
|
||||
if (Credentials::hasMock()) {
|
||||
$stack = HandlerStack::create(Credentials::getMock());
|
||||
$history = Credentials::getHandlerHistory();
|
||||
$stack->push($history);
|
||||
} else {
|
||||
$stack = HandlerStack::create();
|
||||
}
|
||||
|
||||
$stack->push(Middleware::mapResponse(static function (ResponseInterface $response) {
|
||||
return new Response($response);
|
||||
}));
|
||||
|
||||
self::$config['handler'] = $stack;
|
||||
|
||||
return new Client(self::$config);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Providers\RsaKeyPairCredentialsProvider;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use Exception;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use the RSA key pair to complete the authentication (supported only on Japanese site)
|
||||
*/
|
||||
class RsaKeyPairCredential implements CredentialsInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $publicKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $privateKeyFile;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $privateKey;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* RsaKeyPairCredential constructor.
|
||||
*
|
||||
* @param string $public_key_id
|
||||
* @param string $private_key_file
|
||||
* @param array $config
|
||||
*/
|
||||
public function __construct($public_key_id, $private_key_file, array $config = [])
|
||||
{
|
||||
Filter::publicKeyId($public_key_id);
|
||||
Filter::privateKeyFile($private_key_file);
|
||||
|
||||
$this->publicKeyId = $public_key_id;
|
||||
$this->privateKeyFile = $private_key_file;
|
||||
$this->config = $config;
|
||||
try {
|
||||
$this->privateKey = file_get_contents($private_key_file);
|
||||
} catch (Exception $exception) {
|
||||
throw new InvalidArgumentException($exception->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig()
|
||||
{
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOriginalAccessKeyId()
|
||||
{
|
||||
return $this->getPublicKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getPublicKeyId()
|
||||
{
|
||||
return $this->publicKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getOriginalAccessKeySecret()
|
||||
{
|
||||
return $this->getPrivateKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function getPrivateKey()
|
||||
{
|
||||
return $this->privateKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return "publicKeyId#$this->publicKeyId";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ShaHmac1Signature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return new ShaHmac1Signature();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->getSessionCredential()->getAccessKeyId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return AlibabaCloud\Credentials\Providers\Credentials
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
protected function getSessionCredential()
|
||||
{
|
||||
$params = [
|
||||
'publicKeyId' => $this->publicKeyId,
|
||||
'privateKeyFile' => $this->privateKeyFile,
|
||||
];
|
||||
return (new RsaKeyPairCredentialsProvider($params))->getCredentials();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->getSessionCredential()->getAccessKeySecret();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->getSessionCredential()->getSecurityToken();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
* @throws Exception
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->getSessionCredential()->getExpiration();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
$credentials = $this->getSessionCredential();
|
||||
return new CredentialModel([
|
||||
'accessKeyId' => $credentials->getAccessKeyId(),
|
||||
'accessKeySecret' => $credentials->getAccessKeySecret(),
|
||||
'securityToken' => $credentials->getSecurityToken(),
|
||||
'type' => 'rsa_key_pair',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Signature;
|
||||
|
||||
/**
|
||||
* Class BearerTokenSignature
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Signature
|
||||
*/
|
||||
class BearerTokenSignature implements SignatureInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return 'BEARERTOKEN';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getVersion()
|
||||
{
|
||||
return '1.0';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $accessKeySecret
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function sign($string, $accessKeySecret)
|
||||
{
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Signature;
|
||||
|
||||
/**
|
||||
* Class ShaHmac1Signature
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Signature
|
||||
*/
|
||||
class ShaHmac1Signature implements SignatureInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return 'HMAC-SHA1';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getVersion()
|
||||
{
|
||||
return '1.0';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $accessKeySecret
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function sign($string, $accessKeySecret)
|
||||
{
|
||||
return base64_encode(hash_hmac('sha1', $string, $accessKeySecret, true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Signature;
|
||||
|
||||
/**
|
||||
* Class ShaHmac256Signature
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Signature
|
||||
*/
|
||||
class ShaHmac256Signature implements SignatureInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return 'HMAC-SHA256';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getVersion()
|
||||
{
|
||||
return '1.0';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $accessKeySecret
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function sign($string, $accessKeySecret)
|
||||
{
|
||||
return base64_encode(hash_hmac('sha256', $string, $accessKeySecret, true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Signature;
|
||||
|
||||
use Exception;
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Class ShaHmac256WithRsaSignature
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Signature
|
||||
*/
|
||||
class ShaHmac256WithRsaSignature implements SignatureInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod()
|
||||
{
|
||||
return 'SHA256withRSA';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getType()
|
||||
{
|
||||
return 'PRIVATEKEY';
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getVersion()
|
||||
{
|
||||
return '1.0';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $privateKey
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function sign($string, $privateKey)
|
||||
{
|
||||
$binarySignature = '';
|
||||
try {
|
||||
openssl_sign(
|
||||
$string,
|
||||
$binarySignature,
|
||||
$privateKey,
|
||||
\OPENSSL_ALGO_SHA256
|
||||
);
|
||||
} catch (Exception $exception) {
|
||||
throw new InvalidArgumentException(
|
||||
$exception->getMessage()
|
||||
);
|
||||
}
|
||||
|
||||
return base64_encode($binarySignature);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Signature;
|
||||
|
||||
/**
|
||||
* Interface SignatureInterface
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Signature
|
||||
*/
|
||||
interface SignatureInterface
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getMethod();
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getVersion();
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $accessKeySecret
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function sign($string, $accessKeySecret);
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getType();
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials;
|
||||
|
||||
use AlibabaCloud\Credentials\Utils\Filter;
|
||||
use AlibabaCloud\Credentials\Credential\CredentialModel;
|
||||
use AlibabaCloud\Credentials\Signature\ShaHmac1Signature;
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
* Use the STS Token to complete the authentication.
|
||||
*/
|
||||
class StsCredential implements CredentialsInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeyId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $accessKeySecret;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $securityToken;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $expiration;
|
||||
|
||||
/**
|
||||
* StsCredential constructor.
|
||||
*
|
||||
* @param string $access_key_id Access key ID
|
||||
* @param string $access_key_secret Access Key Secret
|
||||
* @param int $expiration
|
||||
* @param string $security_token Security Token
|
||||
*/
|
||||
public function __construct($access_key_id, $access_key_secret, $expiration, $security_token = '')
|
||||
{
|
||||
Filter::accessKey($access_key_id, $access_key_secret);
|
||||
Filter::expiration($expiration);
|
||||
$this->accessKeyId = $access_key_id;
|
||||
$this->accessKeySecret = $access_key_secret;
|
||||
$this->expiration = $expiration;
|
||||
$this->securityToken = $security_token;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getExpiration()
|
||||
{
|
||||
return $this->expiration;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeyId()
|
||||
{
|
||||
return $this->accessKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccessKeySecret()
|
||||
{
|
||||
return $this->accessKeySecret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getSecurityToken()
|
||||
{
|
||||
return $this->securityToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return "$this->accessKeyId#$this->accessKeySecret#$this->securityToken";
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ShaHmac1Signature
|
||||
*/
|
||||
public function getSignature()
|
||||
{
|
||||
return new ShaHmac1Signature();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function getCredential()
|
||||
{
|
||||
return new CredentialModel([
|
||||
'accessKeyId' => $this->accessKeyId,
|
||||
'accessKeySecret' => $this->accessKeySecret,
|
||||
'securityToken' => $this->securityToken,
|
||||
'type' => 'sts',
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,233 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Utils;
|
||||
|
||||
use InvalidArgumentException;
|
||||
|
||||
/**
|
||||
* Class Filter
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Utils
|
||||
*/
|
||||
class Filter
|
||||
{
|
||||
|
||||
/**
|
||||
* @param $name
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
* @return string
|
||||
*/
|
||||
public static function credentialName($name)
|
||||
{
|
||||
if (!is_string($name)) {
|
||||
throw new InvalidArgumentException('Name must be a string');
|
||||
}
|
||||
|
||||
if ($name === '') {
|
||||
throw new InvalidArgumentException('Name cannot be empty');
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $bearerToken
|
||||
*
|
||||
* @return mixed
|
||||
* @throws InvalidArgumentException
|
||||
*/
|
||||
public static function bearerToken($bearerToken)
|
||||
{
|
||||
if (!is_string($bearerToken)) {
|
||||
throw new InvalidArgumentException('bearerToken must be a string');
|
||||
}
|
||||
|
||||
if ($bearerToken === '') {
|
||||
throw new InvalidArgumentException('bearerToken cannot be empty');
|
||||
}
|
||||
|
||||
return $bearerToken;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $publicKeyId
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function publicKeyId($publicKeyId)
|
||||
{
|
||||
if (!is_string($publicKeyId)) {
|
||||
throw new InvalidArgumentException('publicKeyId must be a string');
|
||||
}
|
||||
|
||||
if ($publicKeyId === '') {
|
||||
throw new InvalidArgumentException('publicKeyId cannot be empty');
|
||||
}
|
||||
|
||||
return $publicKeyId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $privateKeyFile
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function privateKeyFile($privateKeyFile)
|
||||
{
|
||||
if (!is_string($privateKeyFile)) {
|
||||
throw new InvalidArgumentException('privateKeyFile must be a string');
|
||||
}
|
||||
|
||||
if ($privateKeyFile === '') {
|
||||
throw new InvalidArgumentException('privateKeyFile cannot be empty');
|
||||
}
|
||||
|
||||
return $privateKeyFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|null $roleName
|
||||
*/
|
||||
public static function roleName($roleName)
|
||||
{
|
||||
if ($roleName === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!is_string($roleName)) {
|
||||
throw new InvalidArgumentException('roleName must be a string');
|
||||
}
|
||||
|
||||
if ($roleName === '') {
|
||||
throw new InvalidArgumentException('roleName cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param boolean|null $disableIMDSv1
|
||||
*/
|
||||
public static function disableIMDSv1($disableIMDSv1)
|
||||
{
|
||||
if (!is_bool($disableIMDSv1)) {
|
||||
throw new InvalidArgumentException('disableIMDSv1 must be a boolean');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string|null $roleArn
|
||||
*/
|
||||
public static function roleArn($roleArn)
|
||||
{
|
||||
if (is_null($roleArn) || $roleArn === '') {
|
||||
throw new InvalidArgumentException('roleArn cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|null $roleArn
|
||||
*/
|
||||
public static function oidcProviderArn($oidcProviderArn)
|
||||
{
|
||||
if (is_null($oidcProviderArn) || $oidcProviderArn === '') {
|
||||
throw new InvalidArgumentException('oidcProviderArn cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|null $roleArn
|
||||
*/
|
||||
public static function oidcTokenFilePath($oidcTokenFilePath)
|
||||
{
|
||||
if (is_null($oidcTokenFilePath) || $oidcTokenFilePath === '') {
|
||||
throw new InvalidArgumentException('oidcTokenFilePath cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $accessKeyId
|
||||
* @param string $accessKeySecret
|
||||
*/
|
||||
public static function accessKey($accessKeyId, $accessKeySecret)
|
||||
{
|
||||
if (!is_string($accessKeyId)) {
|
||||
throw new InvalidArgumentException('accessKeyId must be a string');
|
||||
}
|
||||
|
||||
if ($accessKeyId === '') {
|
||||
throw new InvalidArgumentException('accessKeyId cannot be empty');
|
||||
}
|
||||
|
||||
if (!is_string($accessKeySecret)) {
|
||||
throw new InvalidArgumentException('accessKeySecret must be a string');
|
||||
}
|
||||
|
||||
if ($accessKeySecret === '') {
|
||||
throw new InvalidArgumentException('accessKeySecret cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $securityToken
|
||||
*/
|
||||
public static function securityToken($securityToken)
|
||||
{
|
||||
if (!is_string($securityToken)) {
|
||||
throw new InvalidArgumentException('securityToken must be a string');
|
||||
}
|
||||
|
||||
if ($securityToken === '') {
|
||||
throw new InvalidArgumentException('securityToken cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $expiration
|
||||
*/
|
||||
public static function expiration($expiration)
|
||||
{
|
||||
if (!is_int($expiration)) {
|
||||
throw new InvalidArgumentException('expiration must be a int');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $connectTimeout
|
||||
* @param int $readTimeout
|
||||
*/
|
||||
public static function timeout($connectTimeout, $readTimeout)
|
||||
{
|
||||
if (!is_int($connectTimeout)) {
|
||||
throw new InvalidArgumentException('connectTimeout must be a int');
|
||||
}
|
||||
|
||||
if (!is_int($readTimeout)) {
|
||||
throw new InvalidArgumentException('readTimeout must be a int');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|null $credentialsURI
|
||||
*/
|
||||
public static function credentialsURI($credentialsURI)
|
||||
{
|
||||
if (!is_string($credentialsURI)) {
|
||||
throw new InvalidArgumentException('credentialsURI must be a string');
|
||||
}
|
||||
|
||||
if ($credentialsURI === '') {
|
||||
throw new InvalidArgumentException('credentialsURI cannot be empty');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param boolean|null $reuseLastProviderEnabled
|
||||
*/
|
||||
public static function reuseLastProviderEnabled($reuseLastProviderEnabled)
|
||||
{
|
||||
if (!is_bool($reuseLastProviderEnabled)) {
|
||||
throw new InvalidArgumentException('reuseLastProviderEnabled must be a boolean');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Utils;
|
||||
|
||||
use AlibabaCloud\Credentials\Credential;
|
||||
use org\bovigo\vfs\vfsStream;
|
||||
use Closure;
|
||||
|
||||
/**
|
||||
* Class Helper
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Utils
|
||||
*/
|
||||
class Helper
|
||||
{
|
||||
/**
|
||||
* @param array $arrays
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function merge(array $arrays)
|
||||
{
|
||||
$result = [];
|
||||
foreach ($arrays as $array) {
|
||||
foreach ($array as $key => $value) {
|
||||
if (is_int($key)) {
|
||||
$result[] = $value;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($result[$key]) && is_array($result[$key])) {
|
||||
$result[$key] = self::merge(
|
||||
[$result[$key], $value]
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
$result[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $filename
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function inOpenBasedir($filename)
|
||||
{
|
||||
$open_basedir = ini_get('open_basedir');
|
||||
if (!$open_basedir) {
|
||||
return true;
|
||||
}
|
||||
if (0 === strpos($filename, vfsStream::SCHEME)) {
|
||||
// 虚拟文件忽略
|
||||
return true;
|
||||
}
|
||||
|
||||
$dirs = explode(PATH_SEPARATOR, $open_basedir);
|
||||
|
||||
return empty($dirs) || self::inDir($filename, $dirs);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $filename
|
||||
* @param array $dirs
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function inDir($filename, array $dirs)
|
||||
{
|
||||
foreach ($dirs as $dir) {
|
||||
if ($dir[strlen($dir) - 1] !== DIRECTORY_SEPARATOR) {
|
||||
$dir .= DIRECTORY_SEPARATOR;
|
||||
}
|
||||
|
||||
if (0 === strpos($filename, $dir)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public static function isWindows()
|
||||
{
|
||||
return PATH_SEPARATOR === ';';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $key
|
||||
*
|
||||
* @return bool|mixed
|
||||
*/
|
||||
public static function envNotEmpty($key)
|
||||
{
|
||||
$value = self::env($key, false);
|
||||
if ($value) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value of an environment variable.
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $default
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function env($key, $default = null)
|
||||
{
|
||||
$value = getenv($key);
|
||||
|
||||
if ($value === false) {
|
||||
return self::value($default);
|
||||
}
|
||||
|
||||
if (self::envSubstr($value)) {
|
||||
return substr($value, 1, -1);
|
||||
}
|
||||
|
||||
return self::envConversion($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the default value of the given value.
|
||||
*
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function value($value)
|
||||
{
|
||||
return $value instanceof Closure ? $value() : $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function envSubstr($value)
|
||||
{
|
||||
return ($valueLength = strlen($value)) > 1
|
||||
&& strpos($value, '"') === 0
|
||||
&& $value[$valueLength - 1] === '"';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $value
|
||||
*
|
||||
* @return bool|string|null
|
||||
*/
|
||||
public static function envConversion($value)
|
||||
{
|
||||
$key = strtolower($value);
|
||||
|
||||
if ($key === 'null' || $key === '(null)') {
|
||||
return null;
|
||||
}
|
||||
|
||||
$list = [
|
||||
'true' => true,
|
||||
'(true)' => true,
|
||||
'false' => false,
|
||||
'(false)' => false,
|
||||
'empty' => '',
|
||||
'(empty)' => '',
|
||||
];
|
||||
|
||||
return isset($list[$key]) ? $list[$key] : $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the environment's HOME directory.
|
||||
*
|
||||
* @return null|string
|
||||
*/
|
||||
public static function getHomeDirectory()
|
||||
{
|
||||
if (getenv('HOME')) {
|
||||
return getenv('HOME');
|
||||
}
|
||||
|
||||
return (getenv('HOMEDRIVE') && getenv('HOMEPATH'))
|
||||
? getenv('HOMEDRIVE') . getenv('HOMEPATH')
|
||||
: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed ...$parameters
|
||||
*
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
public static function dd(...$parameters)
|
||||
{
|
||||
dump(...$parameters);
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Snake to camel case.
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function snakeToCamelCase($str)
|
||||
{
|
||||
$components = explode('_', $str);
|
||||
$camelCaseStr = $components[0];
|
||||
for ($i = 1; $i < count($components); $i++) {
|
||||
$camelCaseStr .= ucfirst($components[$i]);
|
||||
}
|
||||
return $camelCaseStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user agent.
|
||||
*
|
||||
* @param string $userAgent
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getUserAgent()
|
||||
{
|
||||
return sprintf('AlibabaCloud (%s; %s) PHP/%s Credentials/%s TeaDSL/1', PHP_OS, \PHP_SAPI, PHP_VERSION, Credential::VERSION);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $arrays
|
||||
* @param string $key
|
||||
*
|
||||
* @return mix
|
||||
*/
|
||||
public static function unsetReturnNull(array $arrays, $key)
|
||||
{
|
||||
if(isset($arrays[$key])) {
|
||||
return $arrays[$key];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Credentials\Utils;
|
||||
|
||||
use Exception;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use GuzzleHttp\Handler\MockHandler;
|
||||
use GuzzleHttp\Psr7\Response;
|
||||
use GuzzleHttp\Middleware;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
|
||||
/**
|
||||
* Trait MockTrait
|
||||
*
|
||||
* @package AlibabaCloud\Credentials\Utils
|
||||
*/
|
||||
trait MockTrait
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $mockQueue = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $history = [];
|
||||
|
||||
/**
|
||||
* @var MockHandler
|
||||
*/
|
||||
private static $mock;
|
||||
|
||||
/**
|
||||
* @param integer $status
|
||||
* @param array $headers
|
||||
* @param array|string|object $body
|
||||
*/
|
||||
public static function mockResponse($status = 200, array $headers = [], $body = null)
|
||||
{
|
||||
if (is_array($body) || is_object($body)) {
|
||||
$body = json_encode($body);
|
||||
}
|
||||
|
||||
self::$mockQueue[] = new Response($status, $headers, $body);
|
||||
self::createHandlerStack();
|
||||
}
|
||||
|
||||
private static function createHandlerStack()
|
||||
{
|
||||
self::$mock = new MockHandler(self::$mockQueue);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return MockHandler
|
||||
*/
|
||||
public static function getHandlerHistory()
|
||||
{
|
||||
return Middleware::history(self::$history);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $message
|
||||
* @param RequestInterface $request
|
||||
* @param ResponseInterface|null $response
|
||||
* @param Exception|null $previous
|
||||
* @param array $handlerContext
|
||||
*/
|
||||
public static function mockRequestException(
|
||||
$message,
|
||||
RequestInterface $request,
|
||||
ResponseInterface $response = null,
|
||||
Exception $previous = null,
|
||||
array $handlerContext = []
|
||||
) {
|
||||
self::$mockQueue[] = new RequestException(
|
||||
$message,
|
||||
$request,
|
||||
$response,
|
||||
$previous,
|
||||
$handlerContext
|
||||
);
|
||||
|
||||
self::createHandlerStack();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public static function cancelMock()
|
||||
{
|
||||
self::$mockQueue = [];
|
||||
self::$mock = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasMock()
|
||||
{
|
||||
return (bool)self::$mockQueue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return MockHandler
|
||||
*/
|
||||
public static function getMock()
|
||||
{
|
||||
return self::$mock;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function getHistroy()
|
||||
{
|
||||
return self::$history;
|
||||
}
|
||||
}
|
||||
65
addons/wdsxh/library/alibabacloud/darabonba/.php_cs.dist
Normal file
65
addons/wdsxh/library/alibabacloud/darabonba/.php_cs.dist
Normal file
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
/*
|
||||
* This document has been generated with
|
||||
* https://mlocati.github.io/php-cs-fixer-configurator/#version:2.15|configurator
|
||||
* you can change this configuration by importing this file.
|
||||
*/
|
||||
|
||||
return PhpCsFixer\Config::create()
|
||||
->setRiskyAllowed(true)
|
||||
->setIndent(' ')
|
||||
->setRules([
|
||||
'@PSR2' => true,
|
||||
'@PhpCsFixer' => true,
|
||||
'@Symfony:risky' => true,
|
||||
'concat_space' => ['spacing' => 'one'],
|
||||
'array_syntax' => ['syntax' => 'short'],
|
||||
'array_indentation' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'method_separation' => true,
|
||||
'single_quote' => true,
|
||||
'declare_equal_normalize' => true,
|
||||
'function_typehint_space' => true,
|
||||
'hash_to_slash_comment' => true,
|
||||
'include' => true,
|
||||
'lowercase_cast' => true,
|
||||
'no_multiline_whitespace_before_semicolons' => true,
|
||||
'no_leading_import_slash' => true,
|
||||
'no_multiline_whitespace_around_double_arrow' => true,
|
||||
'no_spaces_around_offset' => true,
|
||||
'no_unneeded_control_parentheses' => true,
|
||||
'no_unused_imports' => true,
|
||||
'no_whitespace_before_comma_in_array' => true,
|
||||
'no_whitespace_in_blank_line' => true,
|
||||
'object_operator_without_whitespace' => true,
|
||||
'single_blank_line_before_namespace' => true,
|
||||
'single_class_element_per_statement' => true,
|
||||
'space_after_semicolon' => true,
|
||||
'standardize_not_equals' => true,
|
||||
'ternary_operator_spaces' => true,
|
||||
'trailing_comma_in_multiline_array' => true,
|
||||
'trim_array_spaces' => true,
|
||||
'unary_operator_spaces' => true,
|
||||
'whitespace_after_comma_in_array' => true,
|
||||
'no_extra_consecutive_blank_lines' => [
|
||||
'curly_brace_block',
|
||||
'extra',
|
||||
'parenthesis_brace_block',
|
||||
'square_brace_block',
|
||||
'throw',
|
||||
'use',
|
||||
],
|
||||
'binary_operator_spaces' => [
|
||||
'align_double_arrow' => true,
|
||||
'align_equals' => true,
|
||||
],
|
||||
'braces' => [
|
||||
'allow_single_line_closure' => true,
|
||||
],
|
||||
])
|
||||
->setFinder(
|
||||
PhpCsFixer\Finder::create()
|
||||
->exclude('vendor')
|
||||
->exclude('tests')
|
||||
->in(__DIR__)
|
||||
);
|
||||
148
addons/wdsxh/library/alibabacloud/darabonba/CHANGELOG.md
Normal file
148
addons/wdsxh/library/alibabacloud/darabonba/CHANGELOG.md
Normal file
@@ -0,0 +1,148 @@
|
||||
# CHANGELOG
|
||||
|
||||
## 3.1.22 - 2021-05-11
|
||||
|
||||
- Deprecate `stream_for` method.
|
||||
|
||||
## 3.1.21 - 2021-03-15
|
||||
|
||||
- Supported set proxy&timeout on request.
|
||||
|
||||
## 3.1.20 - 2020-12-02
|
||||
|
||||
- Fix the warning when the Tea::merge method received empty arguments.
|
||||
|
||||
## 3.1.19 - 2020-10-09
|
||||
|
||||
- Fix the error when the code value is a string.
|
||||
|
||||
## 3.1.18 - 2020-09-28
|
||||
|
||||
- Require Guzzle Version 7.0
|
||||
|
||||
## 3.1.17 - 2020-09-24
|
||||
|
||||
- TeaUnableRetryError support get error info.
|
||||
|
||||
## 3.1.16 - 2020-08-31
|
||||
|
||||
- Fix the Maximum function nesting level error when repeated network requests.
|
||||
|
||||
## 3.1.15 - 2020-07-28
|
||||
|
||||
- Improved validatePattern method.
|
||||
|
||||
## 3.1.14 - 2020-07-03
|
||||
|
||||
- Supported set properties of TeaError with `ErrorInfo`.
|
||||
|
||||
## 3.1.13 - 2020-06-09
|
||||
|
||||
- Reduce dependencies.
|
||||
|
||||
## 3.1.12 - 2020-05-13
|
||||
|
||||
- Add validate method.
|
||||
- Supported validate maximun&minimun of property.
|
||||
|
||||
## 3.1.11 - 2020-05-07
|
||||
|
||||
- Fixed error when class is undefined.
|
||||
|
||||
## 3.1.10 - 2020-05-07
|
||||
|
||||
- Fixed error when '$item' of array is null
|
||||
|
||||
## 3.1.9 - 2020-04-13
|
||||
|
||||
- TeaUnableRetryError add $lastException param.
|
||||
|
||||
## 3.1.8 - 2020-04-02
|
||||
|
||||
- Added some static methods of Model to validate fields of Model.
|
||||
|
||||
## 3.1.7 - 2020-03-27
|
||||
|
||||
- Improve Tea::isRetryable method.
|
||||
|
||||
## 3.1.6 - 2020-03-25
|
||||
|
||||
- Fixed bug when body is StreamInterface.
|
||||
|
||||
## 3.1.5 - 2020-03-25
|
||||
|
||||
- Improve Model.toMap method.
|
||||
- Improve Tea.merge method.
|
||||
- Fixed tests.
|
||||
|
||||
## 3.1.4 - 2020-03-20
|
||||
|
||||
- Added Tea::merge method.
|
||||
- Change Tea::isRetryable method.
|
||||
|
||||
## 3.1.3 - 2020-03-20
|
||||
|
||||
- Model: added toModel method.
|
||||
|
||||
## 3.1.2 - 2020-03-19
|
||||
|
||||
- Model constructor supported array type parameter.
|
||||
|
||||
## 3.1.1 - 2020-03-18
|
||||
|
||||
- Fixed bug : set method failed.
|
||||
- Fixed bug : get empty contents form body.
|
||||
|
||||
## 3.1.0 - 2020-03-13
|
||||
|
||||
- TeaUnableRetryError add 'lastRequest' property.
|
||||
- Change Tea.send() method return.
|
||||
- Fixed Tea. allowRetry() method.
|
||||
|
||||
## 3.0.0 - 2020-02-14
|
||||
- Rename package name.
|
||||
|
||||
## 2.0.3 - 2020-02-14
|
||||
- Improved Exception.
|
||||
|
||||
## 2.0.2 - 2019-09-11
|
||||
- Supported `String`.
|
||||
|
||||
## 2.0.1 - 2019-08-15
|
||||
- Supported `IteratorAggregate`.
|
||||
|
||||
## 2.0.0 - 2019-08-14
|
||||
- Design `Request` as a standard `PsrRequest`.
|
||||
|
||||
## 1.0.10 - 2019-08-12
|
||||
- Added `__toString` for `Response`.
|
||||
|
||||
## 1.0.9 - 2019-08-01
|
||||
- Updated `Middleware`.
|
||||
|
||||
## 1.0.8 - 2019-07-29
|
||||
- Supported `TransferStats`.
|
||||
|
||||
## 1.0.7 - 2019-07-27
|
||||
- Improved request.
|
||||
|
||||
## 1.0.6 - 2019-07-23
|
||||
- Trim key for parameter.
|
||||
|
||||
## 1.0.5 - 2019-07-23
|
||||
- Supported default protocol.
|
||||
|
||||
## 1.0.4 - 2019-07-22
|
||||
- Added `toArray()`.
|
||||
|
||||
## 1.0.3 - 2019-05-02
|
||||
- Improved `Request`.
|
||||
|
||||
## 1.0.2 - 2019-05-02
|
||||
- Added getHeader/getHeaders.
|
||||
|
||||
## 1.0.1 - 2019-04-02
|
||||
- Improved design.
|
||||
|
||||
## 1.0.0 - 2019-05-02
|
||||
- Initial release of the AlibabaCloud Tea Version 1.0.0 on Packagist See <https://github.com/aliyun/tea-php> for more information.
|
||||
13
addons/wdsxh/library/alibabacloud/darabonba/LICENSE.md
Normal file
13
addons/wdsxh/library/alibabacloud/darabonba/LICENSE.md
Normal file
@@ -0,0 +1,13 @@
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
27
addons/wdsxh/library/alibabacloud/darabonba/README.md
Normal file
27
addons/wdsxh/library/alibabacloud/darabonba/README.md
Normal file
@@ -0,0 +1,27 @@
|
||||
|
||||

|
||||
|
||||
## Alibaba Cloud Tea for Java
|
||||
|
||||
[](https://github.com/aliyun/tea-php/actions/workflows/ci.yml)
|
||||
[](https://codecov.io/gh/aliyun/tea-php)
|
||||
[](https://packagist.org/packages/alibabacloud/tea)
|
||||
[](https://packagist.org/packages/alibabacloud/tea)
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
composer require alibabacloud/tea --optimize-autoloader
|
||||
```
|
||||
|
||||
> Some users may not be able to install due to network problems, you can try to switch the Composer mirror.
|
||||
|
||||
## Changelog
|
||||
|
||||
Detailed changes for each release are documented in the [release notes](CHANGELOG.md).
|
||||
|
||||
## License
|
||||
|
||||
[Apache-2.0](LICENSE.md)
|
||||
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
79
addons/wdsxh/library/alibabacloud/darabonba/composer.json
Normal file
79
addons/wdsxh/library/alibabacloud/darabonba/composer.json
Normal file
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"name": "alibabacloud/darabonba",
|
||||
"homepage": "https://www.alibabacloud.com/",
|
||||
"description": "Client of Darabonba for PHP",
|
||||
"keywords": [
|
||||
"tea",
|
||||
"client",
|
||||
"alibabacloud",
|
||||
"cloud"
|
||||
],
|
||||
"type": "library",
|
||||
"license": "Apache-2.0",
|
||||
"support": {
|
||||
"source": "https://github.com/aliyun/tea-php",
|
||||
"issues": "https://github.com/aliyun/tea-php/issues"
|
||||
},
|
||||
"authors": [
|
||||
{
|
||||
"name": "Alibaba Cloud SDK",
|
||||
"email": "sdk-team@alibabacloud.com",
|
||||
"homepage": "http://www.alibabacloud.com"
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=5.5",
|
||||
"ext-curl": "*",
|
||||
"ext-json": "*",
|
||||
"ext-libxml": "*",
|
||||
"ext-mbstring": "*",
|
||||
"ext-openssl": "*",
|
||||
"ext-simplexml": "*",
|
||||
"ext-xmlwriter": "*",
|
||||
"adbario/php-dot-notation": "^2.4",
|
||||
"alibabacloud/tea": "^3.2",
|
||||
"guzzlehttp/guzzle": "^6.3|^7.0",
|
||||
"monolog/monolog": "^1.0|^2.1",
|
||||
"psr/http-message": "^0.11.0|^1.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/dotenv": "^3.4",
|
||||
"phpunit/phpunit": "^4.8.35|^5.4.3|^9.3",
|
||||
"symfony/var-dumper": "^3.4"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-sockets": "To use client-side monitoring"
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"AlibabaCloud\\Dara\\": "src"
|
||||
}
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
"AlibabaCloud\\Dara\\Tests\\": "tests"
|
||||
}
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true,
|
||||
"preferred-install": "dist",
|
||||
"optimize-autoloader": true
|
||||
},
|
||||
"prefer-stable": true,
|
||||
"minimum-stability": "dev",
|
||||
"scripts": {
|
||||
"cs": "phpcs --standard=PSR2 -n ./",
|
||||
"cbf": "phpcbf --standard=PSR2 -n ./",
|
||||
"fixer": "php-cs-fixer fix ./",
|
||||
"unit": [
|
||||
"@clearCache",
|
||||
"XDEBUG_MODE=coverage phpunit --testsuite=Unit --colors=always --coverage-xml ./coverage/xml --coverage-html ./coverage/html --coverage-clover ./coverage/coverage.clover"
|
||||
],
|
||||
"feature": [
|
||||
"@clearCache",
|
||||
"phpunit --testsuite=Feature --colors=always"
|
||||
],
|
||||
"clearCache": "rm -rf cache/*",
|
||||
"coverage": "open cache/coverage/index.html"
|
||||
}
|
||||
}
|
||||
372
addons/wdsxh/library/alibabacloud/darabonba/src/Dara.php
Normal file
372
addons/wdsxh/library/alibabacloud/darabonba/src/Dara.php
Normal file
@@ -0,0 +1,372 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
use Adbar\Dot;
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\RetryOptions;
|
||||
use AlibabaCloud\Dara\RetryPolicy\RetryPolicyContext;
|
||||
use GuzzleHttp\Client;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use GuzzleHttp\HandlerStack;
|
||||
use GuzzleHttp\RequestOptions;
|
||||
use GuzzleHttp\Middleware;
|
||||
use GuzzleHttp\Promise\PromiseInterface;
|
||||
use GuzzleHttp\TransferStats;
|
||||
use Psr\Http\Message\RequestInterface;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\UriInterface;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Class Dara.
|
||||
*/
|
||||
class Dara
|
||||
{
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private static $config = [];
|
||||
|
||||
const MAX_DELAY_TIME = 120 * 1000;
|
||||
const MIN_DELAY_TIME = 100;
|
||||
|
||||
public static function config(array $config)
|
||||
{
|
||||
self::$config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws GuzzleException
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public static function send(Request $request, array $config = [])
|
||||
{
|
||||
if (method_exists($request, 'getPsrRequest')) {
|
||||
$request = $request->getPsrRequest();
|
||||
}
|
||||
|
||||
$config = self::resolveConfig($config);
|
||||
$res = self::client()->send(
|
||||
$request,
|
||||
$config
|
||||
);
|
||||
|
||||
return new Response($res);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return PromiseInterface
|
||||
*/
|
||||
public static function sendAsync(RequestInterface $request, array $config = [])
|
||||
{
|
||||
if (method_exists($request, 'getPsrRequest')) {
|
||||
$request = $request->getPsrRequest();
|
||||
}
|
||||
|
||||
$config = self::resolveConfig($config);
|
||||
|
||||
return self::client()->sendAsync(
|
||||
$request,
|
||||
$config
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Client
|
||||
*/
|
||||
public static function client(array $config = [])
|
||||
{
|
||||
if (isset(self::$config['handler'])) {
|
||||
$stack = self::$config['handler'];
|
||||
} else {
|
||||
$stack = HandlerStack::create();
|
||||
$stack->push(Middleware::mapResponse(static function (ResponseInterface $response) {
|
||||
return new Response($response);
|
||||
}));
|
||||
}
|
||||
|
||||
self::$config['handler'] = $stack;
|
||||
|
||||
if (!isset(self::$config['on_stats'])) {
|
||||
self::$config['on_stats'] = function (TransferStats $stats) {
|
||||
Response::$info = $stats->getHandlerStats();
|
||||
};
|
||||
}
|
||||
|
||||
$new_config = Helper::merge([self::$config, $config]);
|
||||
return new Client($new_config);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param string|UriInterface $uri
|
||||
* @param array $options
|
||||
*
|
||||
* @throws GuzzleException
|
||||
*
|
||||
* @return ResponseInterface
|
||||
*/
|
||||
public static function request($method, $uri, $options = [])
|
||||
{
|
||||
return self::client()->request($method, $uri, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param string $uri
|
||||
* @param array $options
|
||||
*
|
||||
* @throws GuzzleException
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function string($method, $uri, $options = [])
|
||||
{
|
||||
return (string) self::client()->request($method, $uri, $options)
|
||||
->getBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $method
|
||||
* @param string|UriInterface $uri
|
||||
* @param array $options
|
||||
*
|
||||
* @return PromiseInterface
|
||||
*/
|
||||
public static function requestAsync($method, $uri, $options = [])
|
||||
{
|
||||
return self::client()->requestAsync($method, $uri, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|UriInterface $uri
|
||||
* @param array $options
|
||||
*
|
||||
* @throws GuzzleException
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public static function getHeaders($uri, $options = [])
|
||||
{
|
||||
return self::request('HEAD', $uri, $options)->getHeaders();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|UriInterface $uri
|
||||
* @param string $key
|
||||
* @param null|mixed $default
|
||||
*
|
||||
* @throws GuzzleException
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public static function getHeader($uri, $key, $default = null)
|
||||
{
|
||||
$headers = self::getHeaders($uri);
|
||||
|
||||
return isset($headers[$key][0]) ? $headers[$key][0] : $default;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $retryTimes
|
||||
* @param float $now
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function allowRetry(array $runtime, $retryTimes, $now)
|
||||
{
|
||||
unset($now);
|
||||
if (!isset($retryTimes) || null === $retryTimes || !\is_numeric($retryTimes)) {
|
||||
return false;
|
||||
}
|
||||
if ($retryTimes > 0 && (empty($runtime) || !isset($runtime['retryable']) || !$runtime['retryable'] || !isset($runtime['maxAttempts']))) {
|
||||
return false;
|
||||
}
|
||||
$maxAttempts = $runtime['maxAttempts'];
|
||||
$retry = empty($maxAttempts) ? 0 : (int) $maxAttempts;
|
||||
|
||||
return $retry >= $retryTimes;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $retryTimes
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function getBackoffTime(array $runtime, $retryTimes)
|
||||
{
|
||||
$backOffTime = 0;
|
||||
$policy = isset($runtime['policy']) ? $runtime['policy'] : '';
|
||||
|
||||
if (empty($policy) || 'no' == $policy) {
|
||||
return $backOffTime;
|
||||
}
|
||||
|
||||
$period = isset($runtime['period']) ? $runtime['period'] : '';
|
||||
if (null !== $period && '' !== $period) {
|
||||
$backOffTime = (int) $period;
|
||||
if ($backOffTime <= 0) {
|
||||
return $retryTimes;
|
||||
}
|
||||
}
|
||||
|
||||
return $backOffTime;
|
||||
}
|
||||
|
||||
public static function sleep($time)
|
||||
{
|
||||
sleep($time);
|
||||
}
|
||||
|
||||
public static function isRetryable($retry, $retryTimes = 0)
|
||||
{
|
||||
if ($retry instanceof DaraException) {
|
||||
return true;
|
||||
}
|
||||
if (\is_array($retry)) {
|
||||
$max = isset($retry['maxAttempts']) ? (int) ($retry['maxAttempts']) : 3;
|
||||
|
||||
return $retryTimes <= $max;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param RetryOptions $options
|
||||
* @param RetryPolicyContext $optctxions
|
||||
* @return bool
|
||||
*/
|
||||
public static function shouldRetry($options, $ctx) {
|
||||
if($ctx->getRetryCount() === 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!$options || !$options->getRetryable()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$retriesAttempted = $ctx->getRetryCount();
|
||||
$ex = $ctx->getException();
|
||||
$conditions = $options->getNoRetryCondition();
|
||||
|
||||
foreach ($conditions as $condition) {
|
||||
if (in_array($ex->getName(), $condition->getException()) || in_array($ex->getErrCode(), $condition->getErrorCode())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
$conditions = $options->getRetryCondition();
|
||||
foreach ($conditions as $condition) {
|
||||
if (!in_array($ex->getName(), $condition->getException()) && !in_array($ex->getErrCode(), $condition->getErrorCode())) {
|
||||
continue;
|
||||
}
|
||||
if ($retriesAttempted >= $condition->getMaxAttempts()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param RetryOptions $options
|
||||
* @param RetryPolicyContext $optctxions
|
||||
* @return int
|
||||
*/
|
||||
public static function getBackoffDelay($options, $ctx) {
|
||||
$ex = $ctx->getException();
|
||||
$fullClassName = get_class($ex);
|
||||
$classNameParts = explode('\\', $fullClassName);
|
||||
$className = end($classNameParts);
|
||||
$conditions = $options->getRetryCondition();
|
||||
foreach ($conditions as $condition) {
|
||||
|
||||
if (!in_array($className, $condition->getException()) && !in_array($ex->getErrCode(), $condition->getErrorCode())) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$maxDelay = $condition->getMaxDelay() ?: self::MAX_DELAY_TIME;
|
||||
$retryAfter = method_exists($ex, 'getRetryAfter') ? $ex->getRetryAfter() : null;
|
||||
|
||||
if ($retryAfter !== null) {
|
||||
return min($retryAfter, $maxDelay);
|
||||
}
|
||||
|
||||
|
||||
$backoff = $condition->getBackoff();
|
||||
if (!isset($backoff) || null === $backoff) {
|
||||
return self::MIN_DELAY_TIME;
|
||||
}
|
||||
|
||||
return min($backoff->getDelayTime($ctx), $maxDelay);
|
||||
}
|
||||
|
||||
return self::MIN_DELAY_TIME;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed|Model[] ...$item
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function merge(...$item)
|
||||
{
|
||||
$tmp = [];
|
||||
$n = 0;
|
||||
foreach ($item as $i) {
|
||||
if (\is_object($i)) {
|
||||
if ($i instanceof Model) {
|
||||
$i = $i->toMap();
|
||||
} else {
|
||||
$i = json_decode(json_encode($i), true);
|
||||
}
|
||||
}
|
||||
if (null === $i) {
|
||||
continue;
|
||||
}
|
||||
if (\is_array($i)) {
|
||||
$tmp[$n++] = $i;
|
||||
}
|
||||
}
|
||||
|
||||
if (\count($tmp)) {
|
||||
return \call_user_func_array('array_merge', $tmp);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private static function resolveConfig(array $config = [])
|
||||
{
|
||||
$options = new Dot(['http_errors' => false]);
|
||||
if (isset($config['httpProxy']) && !empty($config['httpProxy'])) {
|
||||
$options->set('proxy.http', $config['httpProxy']);
|
||||
}
|
||||
if (isset($config['httpsProxy']) && !empty($config['httpsProxy'])) {
|
||||
$options->set('proxy.https', $config['httpsProxy']);
|
||||
}
|
||||
if (isset($config['noProxy']) && !empty($config['noProxy'])) {
|
||||
$options->set('proxy.no', $config['noProxy']);
|
||||
}
|
||||
if (isset($config['ignoreSSL']) && !empty($config['ignoreSSL'])) {
|
||||
$options->set('verify',!((bool)$config['ignoreSSL']));
|
||||
}
|
||||
if (isset($config['stream']) && !empty($config['stream'])) {
|
||||
$options->set(RequestOptions::STREAM, (bool)$config['stream']);
|
||||
}
|
||||
// readTimeout&connectTimeout unit is millisecond
|
||||
$read_timeout = isset($config['readTimeout']) && !empty($config['readTimeout']) ? (int) $config['readTimeout'] : 3000;
|
||||
$con_timeout = isset($config['connectTimeout']) && !empty($config['connectTimeout']) ? (int) $config['connectTimeout'] : 3000;
|
||||
// timeout unit is second
|
||||
$options->set('timeout', ($read_timeout + $con_timeout) / 1000);
|
||||
|
||||
return $options->all();
|
||||
}
|
||||
}
|
||||
148
addons/wdsxh/library/alibabacloud/darabonba/src/Date.php
Normal file
148
addons/wdsxh/library/alibabacloud/darabonba/src/Date.php
Normal file
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
use DateTime;
|
||||
use DateTimeZone;
|
||||
use DateInterval;
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
|
||||
class Date
|
||||
{
|
||||
private $date = null;
|
||||
|
||||
public function __construct($date = 'now') {
|
||||
$pattern = '/(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d+)?)(?: \+?(\d{4}))?/';
|
||||
if (ctype_digit($date) || is_numeric($date)) {
|
||||
$this->date = (new DateTime())->setTimestamp($date);
|
||||
} elseif (preg_match($pattern, $date, $matches)) {
|
||||
$timeStr = $matches[1];
|
||||
$tzStr = isset($matches[2]) ? $matches[2] : null;
|
||||
|
||||
if ($tzStr) {
|
||||
$timezone = new DateTimeZone($this->convertTzOffsetToTzString($tzStr));
|
||||
$this->date = DateTime::createFromFormat('Y-m-d H:i:s.u', $timeStr, $timezone);
|
||||
} else {
|
||||
$this->date = new DateTime($timeStr);
|
||||
}
|
||||
} else {
|
||||
$this->date = new DateTime($date);
|
||||
}
|
||||
if($this->date === false || is_null($this->date)) {
|
||||
throw new DaraException([], $date . ' is not a valid time str.');
|
||||
}
|
||||
}
|
||||
|
||||
private function convertTzOffsetToTzString($offset) {
|
||||
$sign = (intval($offset) >= 0) ? '+' : '-';
|
||||
$hours = substr($offset, 0, 2);
|
||||
$minutes = substr($offset, 2, 2);
|
||||
return $sign . $hours . ':' . $minutes;
|
||||
}
|
||||
|
||||
public function format($layout) {
|
||||
$layout = strtr($layout, [
|
||||
'yyyy' => 'Y', 'yy' => 'y',
|
||||
'MM' => 'm', 'M' => 'n',
|
||||
'DD' => 'd', 'D' => 'j',
|
||||
'HH' => 'H', 'H' => 'G',
|
||||
'hh' => 'h', 'h' => 'g',
|
||||
'mm' => 'i', 'm' => 'i',
|
||||
'ss' => 's', 's' => 's',
|
||||
'A' => 'A', 'a' => 'a',
|
||||
'E' => 'N', 'YYYY' => 'Y',
|
||||
]);
|
||||
return $this->date->format($layout);
|
||||
}
|
||||
|
||||
public function UTC($time = null)
|
||||
{
|
||||
$utcDate = clone $this->date;
|
||||
$utcDate->setTimezone(new DateTimeZone('UTC'));
|
||||
return $utcDate->format('Y-m-d H:i:s.u O \\U\\T\\C');
|
||||
}
|
||||
|
||||
public function unix() {
|
||||
$date = $this->date;
|
||||
return $date->getTimestamp();
|
||||
}
|
||||
|
||||
public function sub($unit, $amount) {
|
||||
$interval = new DateInterval('P' . strtoupper($amount) . strtoupper((string)$unit));
|
||||
$this->date->sub($interval);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function add($unit, $amount) {
|
||||
$interval = new DateInterval('P' . strtoupper($amount) . strtoupper((string)$unit));
|
||||
$this->date->add($interval);
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function diff($diffDate, $unit = null) {
|
||||
$interval = $this->date->diff($diffDate->getDateObject());
|
||||
switch ($unit) {
|
||||
case 'year':
|
||||
return $interval->y;
|
||||
case 'month':
|
||||
return $interval->m;
|
||||
case 'day':
|
||||
return $interval->d;
|
||||
case 'hour':
|
||||
return $interval->h;
|
||||
case 'minute':
|
||||
return $interval->i;
|
||||
case 'second':
|
||||
return $interval->s;
|
||||
default:
|
||||
return ($interval->days * 24 * 60 * 60) +
|
||||
($interval->h * 60 * 60) +
|
||||
($interval->i * 60) +
|
||||
$interval->s;
|
||||
}
|
||||
}
|
||||
|
||||
public function hour() {
|
||||
return (int)$this->date->format('H');
|
||||
}
|
||||
|
||||
public function minute() {
|
||||
return (int)$this->date->format('i');
|
||||
}
|
||||
|
||||
public function second() {
|
||||
return (int)$this->date->format('s');
|
||||
}
|
||||
|
||||
public function month() {
|
||||
return (int)$this->date->format('n');
|
||||
}
|
||||
|
||||
public function year() {
|
||||
return (int)$this->date->format('Y');
|
||||
}
|
||||
|
||||
public function dayOfMonth() {
|
||||
return (int)$this->date->format('j');
|
||||
}
|
||||
|
||||
public function dayOfWeek() {
|
||||
$weekday = (int)$this->date->format('w');
|
||||
return $weekday === 0 ? 7 : $weekday;
|
||||
}
|
||||
|
||||
public function weekOfYear() {
|
||||
$week = (int)$this->date->format('W');
|
||||
$weekday = (int)$this->date->format('w');
|
||||
|
||||
if ($weekday === 0 && $this->date->format('z') === (string)($this->date->format('L') ? '365' : '364')) {
|
||||
return (int)$this->date->sub(new DateInterval('P1D'))->format('W');
|
||||
}
|
||||
|
||||
return $week;
|
||||
}
|
||||
|
||||
public function getDateObject() {
|
||||
return clone $this->date;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Exception;
|
||||
|
||||
use AlibabaCloud\Tea\Exception\TeaError;
|
||||
|
||||
/**
|
||||
* Class DaraException.
|
||||
*/
|
||||
class DaraException extends TeaError
|
||||
{
|
||||
public $message = '';
|
||||
public $errCode = '';
|
||||
public $data;
|
||||
public $name = '';
|
||||
public $statusCode;
|
||||
public $description;
|
||||
public $accessDeniedDetail;
|
||||
public $errorInfo;
|
||||
|
||||
/**
|
||||
* DaraError DaraException.
|
||||
*
|
||||
* @param array $errorInfo
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param null|\Throwable $previous
|
||||
*/
|
||||
public function __construct($errorInfo = [], $message = '', $code = '', $previous = null)
|
||||
{
|
||||
parent::__construct($errorInfo, $message, $code, $previous);
|
||||
$this->errorInfo = $errorInfo;
|
||||
$this->name = 'BaseError';
|
||||
if (!empty($errorInfo)) {
|
||||
$properties = ['name', 'message', 'errCode', 'data', 'description', 'accessDeniedDetail'];
|
||||
foreach ($properties as $property) {
|
||||
if (isset($errorInfo[$property])) {
|
||||
$this->{$property} = $errorInfo[$property];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getName()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getErrCode()
|
||||
{
|
||||
return $this->errCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getErrorInfo()
|
||||
{
|
||||
return $this->errorInfo;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Exception;
|
||||
|
||||
/**
|
||||
* Class DaraRespException.
|
||||
*/
|
||||
class DaraRespException extends DaraException
|
||||
{
|
||||
public $statusCode;
|
||||
protected $retryAfter;
|
||||
public $data;
|
||||
public $accessDeniedDetail;
|
||||
public $description;
|
||||
|
||||
/**
|
||||
* DaraRespException constructor.
|
||||
*
|
||||
* @param array $errorInfo
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param null|\Throwable $previous
|
||||
*/
|
||||
public function __construct($errorInfo = [], $message = '', $code = 0, $previous = null)
|
||||
{
|
||||
parent::__construct($errorInfo, (string) $message, (int) $code, $previous);
|
||||
$this->name = 'ResponseError';
|
||||
if (!empty($errorInfo)) {
|
||||
$properties = ['retryAfter', 'statusCode', 'data', 'description', 'accessDeniedDetail'];
|
||||
foreach ($properties as $property) {
|
||||
if (isset($errorInfo[$property])) {
|
||||
$this->{$property} = $errorInfo[$property];
|
||||
if ($property === 'data' && isset($errorInfo['data']['statusCode'])) {
|
||||
$this->statusCode = $errorInfo['data']['statusCode'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getErrorInfo()
|
||||
{
|
||||
return $this->errorInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getStatusCode()
|
||||
{
|
||||
return $this->statusCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getRetryAfter()
|
||||
{
|
||||
return $this->retryAfter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getAccessDeniedDetail()
|
||||
{
|
||||
return $this->accessDeniedDetail;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getData()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Exception;
|
||||
|
||||
/**
|
||||
* Class DaraRetryException
|
||||
*/
|
||||
class DaraRespException extends DaraException
|
||||
{
|
||||
/**
|
||||
* DaraRetryException constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param int $code
|
||||
* @param null|\Throwable $previous
|
||||
*/
|
||||
public function __construct($message = '', $code = 0, $previous = null)
|
||||
{
|
||||
parent::__construct([], $message, $code, $previous);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Exception;
|
||||
|
||||
use AlibabaCloud\Dara\Request;
|
||||
use AlibabaCloud\Dara\RetryPolicy\RetryPolicyContext;
|
||||
|
||||
/**
|
||||
* Class DaraUnableRetryException.
|
||||
*/
|
||||
class DaraUnableRetryException extends DaraException
|
||||
{
|
||||
private $lastRequest;
|
||||
private $lastException;
|
||||
|
||||
/**
|
||||
* DaraUnableRetryException constructor.
|
||||
*
|
||||
* @param Request $lastRequest
|
||||
* @param null|\Exception $lastException
|
||||
*/
|
||||
public function __construct($lastRequest, $lastException = null)
|
||||
{
|
||||
if($lastRequest instanceof RetryPolicyContext) {
|
||||
$lastException = $lastRequest->getException();
|
||||
$lastRequest = $lastRequest->getHttpRequest();
|
||||
}
|
||||
$error_info = [];
|
||||
if (null !== $lastException && $lastException instanceof DaraException) {
|
||||
$error_info = $lastException->getErrorInfo();
|
||||
}
|
||||
parent::__construct($error_info, $lastException->getMessage(), $lastException->getCode(), $lastException);
|
||||
$this->lastRequest = $lastRequest;
|
||||
$this->lastException = $lastException;
|
||||
}
|
||||
|
||||
public function getLastRequest()
|
||||
{
|
||||
return $this->lastRequest;
|
||||
}
|
||||
|
||||
public function getLastException()
|
||||
{
|
||||
return $this->lastException;
|
||||
}
|
||||
}
|
||||
116
addons/wdsxh/library/alibabacloud/darabonba/src/File.php
Normal file
116
addons/wdsxh/library/alibabacloud/darabonba/src/File.php
Normal file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
use AlibabaCloud\Dara\Date;
|
||||
use GuzzleHttp\Psr7\Stream;
|
||||
use GuzzleHttp\Psr7\Utils;
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
|
||||
class File
|
||||
{
|
||||
private $_path;
|
||||
private $_stat = null;
|
||||
private $_fd = false;
|
||||
private $_position = 0;
|
||||
|
||||
public function __construct($path) {
|
||||
$this->_path = $path;
|
||||
}
|
||||
|
||||
public function path() {
|
||||
return $this->_path;
|
||||
}
|
||||
|
||||
public function createTime() {
|
||||
if (!$this->_stat) {
|
||||
$this->_stat = stat($this->_path);
|
||||
}
|
||||
return new Date($this->_stat['ctime']);
|
||||
}
|
||||
|
||||
public function modifyTime() {
|
||||
if (!$this->_stat) {
|
||||
$this->_stat = stat($this->_path);
|
||||
}
|
||||
return new Date($this->_stat['mtime']);
|
||||
}
|
||||
|
||||
public function length() {
|
||||
if (!$this->_stat) {
|
||||
$this->_stat = stat($this->_path);
|
||||
}
|
||||
return $this->_stat['size'];
|
||||
}
|
||||
|
||||
public function read($size) {
|
||||
if (!$this->_fd) {
|
||||
$this->_fd = fopen($this->_path, 'a+');
|
||||
}
|
||||
$position = ftell($this->_fd);
|
||||
$position = ftell($this->_fd);
|
||||
fseek($this->_fd, $this->_position);
|
||||
$data = fread($this->_fd, $size);
|
||||
$bytesRead = strlen($data);
|
||||
if (!$bytesRead) {
|
||||
return null;
|
||||
}
|
||||
$this->_position += $bytesRead;
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function write($data) {
|
||||
if (!$this->_fd) {
|
||||
$this->_fd = fopen($this->_path, 'a+');
|
||||
}
|
||||
|
||||
fwrite($this->_fd, $data);
|
||||
fflush($this->_fd);
|
||||
clearstatcache();
|
||||
$this->_stat = stat($this->_path);
|
||||
}
|
||||
|
||||
public function close() {
|
||||
if ($this->_fd) {
|
||||
fclose($this->_fd);
|
||||
$this->_fd = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $path
|
||||
* @return bool
|
||||
*/
|
||||
public static function exists($path) {
|
||||
return file_exists($path);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $path
|
||||
* @return Stream
|
||||
*/
|
||||
public static function createReadStream($path) {
|
||||
try {
|
||||
$stream = Utils::streamFor(fopen($path, 'r'));
|
||||
return $stream;
|
||||
} catch (Exception $e) {
|
||||
throw new DaraException([], "Unable to open file for reading: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $path
|
||||
* @return Stream
|
||||
*/
|
||||
public static function createWriteStream($path) {
|
||||
try {
|
||||
$stream = Utils::streamFor(fopen($path, 'a+'));
|
||||
return $stream;
|
||||
} catch (Exception $e) {
|
||||
throw new DaraException([], "Unable to open file for writing: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
112
addons/wdsxh/library/alibabacloud/darabonba/src/Helper.php
Normal file
112
addons/wdsxh/library/alibabacloud/darabonba/src/Helper.php
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
class Helper
|
||||
{
|
||||
/**
|
||||
* @param string $content
|
||||
* @param string $prefix
|
||||
* @param string $end
|
||||
* @param string[] $filter
|
||||
*
|
||||
* @return string|string[]
|
||||
*/
|
||||
public static function findFromString($content, $prefix, $end, $filter = ['"', ' '])
|
||||
{
|
||||
$len = mb_strlen($prefix);
|
||||
$pos = mb_strpos($content, $prefix);
|
||||
if (false === $pos) {
|
||||
return '';
|
||||
}
|
||||
$pos_end = mb_strpos($content, $end, $pos);
|
||||
$str = mb_substr($content, $pos + $len, $pos_end - $pos - $len);
|
||||
|
||||
return str_replace($filter, '', $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $str
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isJson($str)
|
||||
{
|
||||
json_decode($str);
|
||||
|
||||
return \JSON_ERROR_NONE == json_last_error();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function isBytes($value)
|
||||
{
|
||||
if (!\is_array($value)) {
|
||||
return false;
|
||||
}
|
||||
$i = 0;
|
||||
foreach ($value as $k => $ord) {
|
||||
if ($k !== $i) {
|
||||
return false;
|
||||
}
|
||||
if (!\is_int($ord)) {
|
||||
return false;
|
||||
}
|
||||
if ($ord < 0 || $ord > 255) {
|
||||
return false;
|
||||
}
|
||||
++$i;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a bytes to string(utf8).
|
||||
*
|
||||
* @param array $bytes
|
||||
*
|
||||
* @return string the return string
|
||||
*/
|
||||
public static function toString($bytes)
|
||||
{
|
||||
$str = '';
|
||||
foreach ($bytes as $ch) {
|
||||
$str .= \chr($ch);
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function merge(array $arrays)
|
||||
{
|
||||
$result = [];
|
||||
foreach ($arrays as $array) {
|
||||
foreach ($array as $key => $value) {
|
||||
if (\is_int($key)) {
|
||||
$result[] = $value;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($result[$key]) && \is_array($result[$key])) {
|
||||
$result[$key] = self::merge(
|
||||
[$result[$key], $value]
|
||||
);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$result[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
138
addons/wdsxh/library/alibabacloud/darabonba/src/Model.php
Normal file
138
addons/wdsxh/library/alibabacloud/darabonba/src/Model.php
Normal file
@@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
class Model
|
||||
{
|
||||
protected $_name = [];
|
||||
protected $_required = [];
|
||||
|
||||
public function __construct($config = [])
|
||||
{
|
||||
if (!empty($config)) {
|
||||
foreach ($config as $k => $v) {
|
||||
$this->{$k} = $v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getName($name = null)
|
||||
{
|
||||
if (null === $name) {
|
||||
return $this->_name;
|
||||
}
|
||||
|
||||
return isset($this->_name[$name]) ? $this->_name[$name] : $name;
|
||||
}
|
||||
|
||||
public function toMap()
|
||||
{
|
||||
$map = get_object_vars($this);
|
||||
foreach ($map as $k => $m) {
|
||||
if (0 === strpos($k, '_')) {
|
||||
unset($map[$k]);
|
||||
}
|
||||
}
|
||||
$res = [];
|
||||
foreach ($map as $k => $v) {
|
||||
$name = isset($this->_name[$k]) ? $this->_name[$k] : $k;
|
||||
$res[$name] = $v;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function validate()
|
||||
{
|
||||
$vars = get_object_vars($this);
|
||||
foreach ($vars as $k => $v) {
|
||||
if (isset($this->_required[$k]) && $this->_required[$k] && empty($v)) {
|
||||
throw new \InvalidArgumentException("{$k} is required.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function copyWithoutStream() {
|
||||
$map = $this->toArray(true);
|
||||
$calledClass = get_called_class();
|
||||
|
||||
if (method_exists($calledClass, 'fromMap')) {
|
||||
return $calledClass::fromMap($map);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function validateRequired($fieldName, $field, $val = null)
|
||||
{
|
||||
if (true === $val && null === $field) {
|
||||
throw new \InvalidArgumentException($fieldName . ' is required');
|
||||
}
|
||||
}
|
||||
|
||||
public static function validateMaxLength($fieldName, $field, $val = null)
|
||||
{
|
||||
if (null !== $field && \strlen($field) > (int) $val) {
|
||||
throw new \InvalidArgumentException($fieldName . ' is exceed max-length: ' . $val);
|
||||
}
|
||||
}
|
||||
|
||||
public static function validateMinLength($fieldName, $field, $val = null)
|
||||
{
|
||||
if (null !== $field && \strlen($field) < (int) $val) {
|
||||
throw new \InvalidArgumentException($fieldName . ' is less than min-length: ' . $val);
|
||||
}
|
||||
}
|
||||
|
||||
public static function validatePattern($fieldName, $field, $regex = '')
|
||||
{
|
||||
if (null !== $field && '' !== $field && !preg_match("/^{$regex}$/", $field)) {
|
||||
throw new \InvalidArgumentException($fieldName . ' is not match ' . $regex);
|
||||
}
|
||||
}
|
||||
|
||||
public static function validateMaximum($fieldName, $field, $val)
|
||||
{
|
||||
if (null !== $field && $field > $val) {
|
||||
throw new \InvalidArgumentException($fieldName . ' cannot be greater than ' . $val);
|
||||
}
|
||||
}
|
||||
|
||||
public static function validateMinimum($fieldName, $field, $val)
|
||||
{
|
||||
if (null !== $field && $field < $val) {
|
||||
throw new \InvalidArgumentException($fieldName . ' cannot be less than ' . $val);
|
||||
}
|
||||
}
|
||||
|
||||
public static function validateArray($arr)
|
||||
{
|
||||
if (null === $arr) {
|
||||
return;
|
||||
}
|
||||
foreach($arr as $item) {
|
||||
if($item instanceof Model) {
|
||||
$item->validate();
|
||||
} else if(is_array($item)){
|
||||
self::validateArray($item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $map
|
||||
* @param Model $model
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function toModel($map, $model)
|
||||
{
|
||||
$names = $model->getName();
|
||||
$names = array_flip($names);
|
||||
foreach ($map as $key => $value) {
|
||||
$name = isset($names[$key]) ? $names[$key] : $key;
|
||||
$model->{$name} = $value;
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
namespace AlibabaCloud\Dara\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class ExtendsParameters extends Model {
|
||||
public $headers;
|
||||
public $queries;
|
||||
public function validate() {}
|
||||
public function toMap() {
|
||||
$res = [];
|
||||
if (null !== $this->headers) {
|
||||
$res['headers'] = $this->headers;
|
||||
}
|
||||
|
||||
if (null !== $this->queries) {
|
||||
$res['queries'] = $this->queries;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
/**
|
||||
* @param array $map
|
||||
* @return ExtendsParameters
|
||||
*/
|
||||
public static function fromMap($map = []) {
|
||||
$model = new self();
|
||||
if(isset($map['headers'])){
|
||||
$model->headers = $map['headers'];
|
||||
}
|
||||
|
||||
if(isset($map['queries'])){
|
||||
$model->queries = $map['queries'];
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class FileField extends Model
|
||||
{
|
||||
public $filename;
|
||||
public $contentType;
|
||||
public $content;
|
||||
|
||||
public function __construct($config = [])
|
||||
{
|
||||
$this->_required = [
|
||||
'filename' => true,
|
||||
'contentType' => true,
|
||||
'content' => true,
|
||||
];
|
||||
parent::__construct($config);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
namespace AlibabaCloud\Dara\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
/**
|
||||
* The common runtime options model
|
||||
*/
|
||||
class RuntimeOptions extends Model {
|
||||
protected $_name = [
|
||||
'autoretry' => 'autoretry',
|
||||
'ignoreSSL' => 'ignoreSSL',
|
||||
'key' => 'key',
|
||||
'cert' => 'cert',
|
||||
'ca' => 'ca',
|
||||
'maxAttempts' => 'max_attempts',
|
||||
'backoffPolicy' => 'backoff_policy',
|
||||
'backoffPeriod' => 'backoff_period',
|
||||
'readTimeout' => 'readTimeout',
|
||||
'connectTimeout' => 'connectTimeout',
|
||||
'httpProxy' => 'httpProxy',
|
||||
'httpsProxy' => 'httpsProxy',
|
||||
'noProxy' => 'noProxy',
|
||||
'maxIdleConns' => 'maxIdleConns',
|
||||
'localAddr' => 'localAddr',
|
||||
'socks5Proxy' => 'socks5Proxy',
|
||||
'socks5NetWork' => 'socks5NetWork',
|
||||
'keepAlive' => 'keepAlive',
|
||||
];
|
||||
public function validate() {}
|
||||
public function toMap() {
|
||||
$res = [];
|
||||
if (null !== $this->autoretry) {
|
||||
$res['autoretry'] = $this->autoretry;
|
||||
}
|
||||
if (null !== $this->ignoreSSL) {
|
||||
$res['ignoreSSL'] = $this->ignoreSSL;
|
||||
}
|
||||
if (null !== $this->key) {
|
||||
$res['key'] = $this->key;
|
||||
}
|
||||
if (null !== $this->cert) {
|
||||
$res['cert'] = $this->cert;
|
||||
}
|
||||
if (null !== $this->ca) {
|
||||
$res['ca'] = $this->ca;
|
||||
}
|
||||
if (null !== $this->maxAttempts) {
|
||||
$res['max_attempts'] = $this->maxAttempts;
|
||||
}
|
||||
if (null !== $this->backoffPolicy) {
|
||||
$res['backoff_policy'] = $this->backoffPolicy;
|
||||
}
|
||||
if (null !== $this->backoffPeriod) {
|
||||
$res['backoff_period'] = $this->backoffPeriod;
|
||||
}
|
||||
if (null !== $this->readTimeout) {
|
||||
$res['readTimeout'] = $this->readTimeout;
|
||||
}
|
||||
if (null !== $this->connectTimeout) {
|
||||
$res['connectTimeout'] = $this->connectTimeout;
|
||||
}
|
||||
if (null !== $this->httpProxy) {
|
||||
$res['httpProxy'] = $this->httpProxy;
|
||||
}
|
||||
if (null !== $this->httpsProxy) {
|
||||
$res['httpsProxy'] = $this->httpsProxy;
|
||||
}
|
||||
if (null !== $this->noProxy) {
|
||||
$res['noProxy'] = $this->noProxy;
|
||||
}
|
||||
if (null !== $this->maxIdleConns) {
|
||||
$res['maxIdleConns'] = $this->maxIdleConns;
|
||||
}
|
||||
if (null !== $this->localAddr) {
|
||||
$res['localAddr'] = $this->localAddr;
|
||||
}
|
||||
if (null !== $this->socks5Proxy) {
|
||||
$res['socks5Proxy'] = $this->socks5Proxy;
|
||||
}
|
||||
if (null !== $this->socks5NetWork) {
|
||||
$res['socks5NetWork'] = $this->socks5NetWork;
|
||||
}
|
||||
if (null !== $this->keepAlive) {
|
||||
$res['keepAlive'] = $this->keepAlive;
|
||||
}
|
||||
if (null !== $this->extendsParameters) {
|
||||
$res['extendsParameters'] = null !== $this->extendsParameters ? $this->extendsParameters->toMap() : null;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
/**
|
||||
* @param array $map
|
||||
* @return RuntimeOptions
|
||||
*/
|
||||
public static function fromMap($map = []) {
|
||||
$model = new self();
|
||||
if(isset($map['autoretry'])){
|
||||
$model->autoretry = $map['autoretry'];
|
||||
}
|
||||
if(isset($map['ignoreSSL'])){
|
||||
$model->ignoreSSL = $map['ignoreSSL'];
|
||||
}
|
||||
if(isset($map['key'])){
|
||||
$model->key = $map['key'];
|
||||
}
|
||||
if(isset($map['cert'])){
|
||||
$model->cert = $map['cert'];
|
||||
}
|
||||
if(isset($map['ca'])){
|
||||
$model->ca = $map['ca'];
|
||||
}
|
||||
if(isset($map['max_attempts'])){
|
||||
$model->maxAttempts = $map['max_attempts'];
|
||||
}
|
||||
if(isset($map['backoff_policy'])){
|
||||
$model->backoffPolicy = $map['backoff_policy'];
|
||||
}
|
||||
if(isset($map['backoff_period'])){
|
||||
$model->backoffPeriod = $map['backoff_period'];
|
||||
}
|
||||
if(isset($map['readTimeout'])){
|
||||
$model->readTimeout = $map['readTimeout'];
|
||||
}
|
||||
if(isset($map['connectTimeout'])){
|
||||
$model->connectTimeout = $map['connectTimeout'];
|
||||
}
|
||||
if(isset($map['httpProxy'])){
|
||||
$model->httpProxy = $map['httpProxy'];
|
||||
}
|
||||
if(isset($map['httpsProxy'])){
|
||||
$model->httpsProxy = $map['httpsProxy'];
|
||||
}
|
||||
if(isset($map['noProxy'])){
|
||||
$model->noProxy = $map['noProxy'];
|
||||
}
|
||||
if(isset($map['maxIdleConns'])){
|
||||
$model->maxIdleConns = $map['maxIdleConns'];
|
||||
}
|
||||
if(isset($map['localAddr'])){
|
||||
$model->localAddr = $map['localAddr'];
|
||||
}
|
||||
if(isset($map['socks5Proxy'])){
|
||||
$model->socks5Proxy = $map['socks5Proxy'];
|
||||
}
|
||||
if(isset($map['socks5NetWork'])){
|
||||
$model->socks5NetWork = $map['socks5NetWork'];
|
||||
}
|
||||
if(isset($map['keepAlive'])){
|
||||
$model->keepAlive = $map['keepAlive'];
|
||||
}
|
||||
if(isset($map['extendsParameters'])){
|
||||
$model->extendsParameters = ExtendsParameters::fromMap($map['extendsParameters']);
|
||||
}
|
||||
return $model;
|
||||
}
|
||||
/**
|
||||
* @description whether to try again
|
||||
* @var bool
|
||||
*/
|
||||
public $autoretry;
|
||||
|
||||
/**
|
||||
* @description ignore SSL validation
|
||||
* @var bool
|
||||
*/
|
||||
public $ignoreSSL;
|
||||
|
||||
/**
|
||||
* @description privite key for client certificate
|
||||
* @var string
|
||||
*/
|
||||
public $key;
|
||||
|
||||
/**
|
||||
* @description client certificate
|
||||
* @var string
|
||||
*/
|
||||
public $cert;
|
||||
|
||||
/**
|
||||
* @description server certificate
|
||||
* @var string
|
||||
*/
|
||||
public $ca;
|
||||
|
||||
/**
|
||||
* @description maximum number of retries
|
||||
* @var int
|
||||
*/
|
||||
public $maxAttempts;
|
||||
|
||||
/**
|
||||
* @description backoff policy
|
||||
* @var string
|
||||
*/
|
||||
public $backoffPolicy;
|
||||
|
||||
/**
|
||||
* @description backoff period
|
||||
* @var int
|
||||
*/
|
||||
public $backoffPeriod;
|
||||
|
||||
/**
|
||||
* @description read timeout
|
||||
* @var int
|
||||
*/
|
||||
public $readTimeout;
|
||||
|
||||
/**
|
||||
* @description connect timeout
|
||||
* @var int
|
||||
*/
|
||||
public $connectTimeout;
|
||||
|
||||
/**
|
||||
* @description http proxy url
|
||||
* @var string
|
||||
*/
|
||||
public $httpProxy;
|
||||
|
||||
/**
|
||||
* @description https Proxy url
|
||||
* @var string
|
||||
*/
|
||||
public $httpsProxy;
|
||||
|
||||
/**
|
||||
* @description agent blacklist
|
||||
* @var string
|
||||
*/
|
||||
public $noProxy;
|
||||
|
||||
/**
|
||||
* @description maximum number of connections
|
||||
* @var int
|
||||
*/
|
||||
public $maxIdleConns;
|
||||
|
||||
/**
|
||||
* @description local addr
|
||||
* @var string
|
||||
*/
|
||||
public $localAddr;
|
||||
|
||||
/**
|
||||
* @description SOCKS5 proxy
|
||||
* @var string
|
||||
*/
|
||||
public $socks5Proxy;
|
||||
|
||||
/**
|
||||
* @description SOCKS5 netWork
|
||||
* @var string
|
||||
*/
|
||||
public $socks5NetWork;
|
||||
|
||||
/**
|
||||
* @description whether to enable keep-alive
|
||||
* @var bool
|
||||
*/
|
||||
public $keepAlive;
|
||||
|
||||
/**
|
||||
* @description Extends Parameters
|
||||
* @var ExtendsParameters
|
||||
*/
|
||||
public $extendsParameters;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class SSEEvent extends Model {
|
||||
public $data;
|
||||
public $id;
|
||||
public $event;
|
||||
public $retry;
|
||||
|
||||
public function __construct($data = array()) {
|
||||
$this->data = isset($data['data']) ? $data['data'] : null;
|
||||
$this->id = isset($data['id']) ? $data['id'] : null;
|
||||
$this->event = isset($data['event']) ? $data['event'] : null;
|
||||
$this->retry = isset($data['retry']) ? $data['retry'] : null;
|
||||
}
|
||||
|
||||
public function validate() { }
|
||||
|
||||
public function toArray()
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->data) {
|
||||
$res['data'] = $this->data;
|
||||
}
|
||||
|
||||
if (null !== $this->id) {
|
||||
$res['id'] = $this->id;
|
||||
}
|
||||
|
||||
if (null !== $this->event) {
|
||||
$res['event'] = $this->event;
|
||||
}
|
||||
|
||||
if (null !== $this->retry) {
|
||||
$res['retry'] = $this->retry;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap()
|
||||
{
|
||||
return $this->toArray();
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['data'])) {
|
||||
if(!empty($map['data'])){
|
||||
$model->data = [];
|
||||
foreach($map['data'] as $key => $value) {
|
||||
$model->data[$key] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($map['id'])) {
|
||||
$model->id = $map['id'];
|
||||
}
|
||||
|
||||
if (isset($map['event'])) {
|
||||
$model->event = $map['event'];
|
||||
}
|
||||
|
||||
if (isset($map['retry'])) {
|
||||
$model->retry = $map['retry'];
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
use ArrayIterator;
|
||||
use IteratorAggregate;
|
||||
use ReflectionObject;
|
||||
use Traversable;
|
||||
|
||||
/**
|
||||
* Class Parameter.
|
||||
*/
|
||||
abstract class Parameter implements IteratorAggregate
|
||||
{
|
||||
/**
|
||||
* @return ArrayIterator|Traversable
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function getIterator()
|
||||
{
|
||||
return new ArrayIterator($this->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getRealParameters()
|
||||
{
|
||||
$array = [];
|
||||
$obj = new ReflectionObject($this);
|
||||
$properties = $obj->getProperties();
|
||||
|
||||
foreach ($properties as $property) {
|
||||
$docComment = $property->getDocComment();
|
||||
$key = trim(Helper::findFromString($docComment, '@real', "\n"));
|
||||
$value = $property->getValue($this);
|
||||
$array[$key] = $value;
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return $this->getRealParameters();
|
||||
}
|
||||
}
|
||||
123
addons/wdsxh/library/alibabacloud/darabonba/src/Request.php
Normal file
123
addons/wdsxh/library/alibabacloud/darabonba/src/Request.php
Normal file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
use GuzzleHttp\Psr7\Request as PsrRequest;
|
||||
use InvalidArgumentException;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
|
||||
/**
|
||||
* Class Request.
|
||||
*/
|
||||
class Request extends PsrRequest
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $protocol = 'https';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $pathname = '/';
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $headers = [];
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
public $query = [];
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $body;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $port;
|
||||
|
||||
public $method;
|
||||
|
||||
public function __construct($method = 'GET', $uri = '', array $headers = [], $body = null, $version = '1.1')
|
||||
{
|
||||
parent::__construct($method, $uri, $headers, $body, $version);
|
||||
$this->method = $method;
|
||||
}
|
||||
|
||||
/**
|
||||
* These fields are compatible if you define other fields.
|
||||
* Mainly for compatibility situations where the code generator cannot generate set properties.
|
||||
*
|
||||
* @return PsrRequest
|
||||
*/
|
||||
public function getPsrRequest()
|
||||
{
|
||||
$this->assertQuery($this->query);
|
||||
|
||||
$request = clone $this;
|
||||
|
||||
$uri = $request->getUri();
|
||||
if ($this->query) {
|
||||
$uri = $uri->withQuery(http_build_query($this->query));
|
||||
}
|
||||
|
||||
if ($this->port) {
|
||||
$uri = $uri->withPort($this->port);
|
||||
}
|
||||
|
||||
if ($this->protocol) {
|
||||
$uri = $uri->withScheme($this->protocol);
|
||||
}
|
||||
|
||||
if ($this->pathname) {
|
||||
$uri = $uri->withPath($this->pathname);
|
||||
}
|
||||
|
||||
if (isset($this->headers['host'])) {
|
||||
$uri = $uri->withHost($this->headers['host']);
|
||||
}
|
||||
|
||||
$request = $request->withUri($uri);
|
||||
$request = $request->withMethod($this->method);
|
||||
|
||||
if ('' !== $this->body && null !== $this->body) {
|
||||
if ($this->body instanceof StreamInterface) {
|
||||
$request = $request->withBody($this->body);
|
||||
} else {
|
||||
$body = $this->body;
|
||||
if (Helper::isBytes($this->body)) {
|
||||
$body = Helper::toString($this->body);
|
||||
}
|
||||
if (\function_exists('\GuzzleHttp\Psr7\stream_for')) {
|
||||
// @deprecated stream_for will be removed in guzzlehttp/psr7:2.0
|
||||
$request = $request->withBody(\GuzzleHttp\Psr7\stream_for($body));
|
||||
} else {
|
||||
$request = $request->withBody(\GuzzleHttp\Psr7\Utils::streamFor($body));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->headers) {
|
||||
foreach ($this->headers as $key => $value) {
|
||||
$request = $request->withHeader($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $query
|
||||
*/
|
||||
private function assertQuery($query)
|
||||
{
|
||||
if (!\is_array($query) && $query !== null) {
|
||||
throw new InvalidArgumentException('Query must be array.');
|
||||
}
|
||||
}
|
||||
}
|
||||
379
addons/wdsxh/library/alibabacloud/darabonba/src/Response.php
Normal file
379
addons/wdsxh/library/alibabacloud/darabonba/src/Response.php
Normal file
@@ -0,0 +1,379 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
use Adbar\Dot;
|
||||
use ArrayAccess;
|
||||
use Countable;
|
||||
use GuzzleHttp\Psr7\Response as PsrResponse;
|
||||
use GuzzleHttp\TransferStats;
|
||||
use IteratorAggregate;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
use AlibabaCloud\Dara\Util\StringUtil;
|
||||
|
||||
/**
|
||||
* Class Response.
|
||||
*/
|
||||
class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Countable
|
||||
{
|
||||
public $headers = [];
|
||||
public $statusCode;
|
||||
public $statusMessage = '';
|
||||
|
||||
/**
|
||||
* @var TransferStats
|
||||
*/
|
||||
public static $info;
|
||||
|
||||
/**
|
||||
* @var StreamInterface
|
||||
*/
|
||||
public $body;
|
||||
/**
|
||||
* Instance of the Dot.
|
||||
*
|
||||
* @var Dot
|
||||
*/
|
||||
protected $dot;
|
||||
|
||||
/**
|
||||
* Response constructor.
|
||||
*/
|
||||
public function __construct(ResponseInterface $response)
|
||||
{
|
||||
parent::__construct(
|
||||
$response->getStatusCode(),
|
||||
$response->getHeaders(),
|
||||
$response->getBody(),
|
||||
$response->getProtocolVersion(),
|
||||
$response->getReasonPhrase()
|
||||
);
|
||||
$this->headers = $response->getHeaders();
|
||||
$this->body = $response->getBody();
|
||||
$this->statusCode = $response->getStatusCode();
|
||||
if ($this->body->isSeekable()) {
|
||||
$this->body->seek(0);
|
||||
}
|
||||
|
||||
$contentType = $this->getHeaderLine('Content-Type');
|
||||
|
||||
if(StringUtil::hasPrefix($contentType, 'text/event-stream')) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Helper::isJson((string) $this->getBody())) {
|
||||
$this->dot = new Dot($this->toArray());
|
||||
} else {
|
||||
$this->dot = new Dot();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return (string) $this->getBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return null|mixed
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
$data = $this->dot->all();
|
||||
if (!isset($data[$name])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return json_decode(json_encode($data))->{$name};
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function __set($name, $value)
|
||||
{
|
||||
$this->dot->set($name, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $name
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function __isset($name)
|
||||
{
|
||||
return $this->dot->has($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $offset
|
||||
*/
|
||||
public function __unset($offset)
|
||||
{
|
||||
$this->dot->delete($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
return \GuzzleHttp\json_decode((string) $this->getBody(), true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|int|string $keys
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function add($keys, $value = null)
|
||||
{
|
||||
return $this->dot->add($keys, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
return $this->dot->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|array|int|string $keys
|
||||
*/
|
||||
public function clear($keys = null)
|
||||
{
|
||||
return $this->dot->clear($keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|int|string $keys
|
||||
*/
|
||||
public function delete($keys)
|
||||
{
|
||||
return $this->dot->delete($keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $delimiter
|
||||
* @param null|array $items
|
||||
* @param string $prepend
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function flatten($delimiter = '.', $items = null, $prepend = '')
|
||||
{
|
||||
return $this->dot->flatten($delimiter, $items, $prepend);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|int|string $key
|
||||
* @param mixed $default
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($key = null, $default = null)
|
||||
{
|
||||
return $this->dot->get($key, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|int|string $keys
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function has($keys)
|
||||
{
|
||||
return $this->dot->has($keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|array|int|string $keys
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isEmpty($keys = null)
|
||||
{
|
||||
return $this->dot->isEmpty($keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|self|string $key
|
||||
* @param array|self $value
|
||||
*/
|
||||
public function merge($key, $value = [])
|
||||
{
|
||||
return $this->dot->merge($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|self|string $key
|
||||
* @param array|self $value
|
||||
*/
|
||||
public function mergeRecursive($key, $value = [])
|
||||
{
|
||||
return $this->dot->mergeRecursive($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array|self|string $key
|
||||
* @param array|self $value
|
||||
*/
|
||||
public function mergeRecursiveDistinct($key, $value = [])
|
||||
{
|
||||
return $this->dot->mergeRecursiveDistinct($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|int|string $key
|
||||
* @param mixed $default
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function pull($key = null, $default = null)
|
||||
{
|
||||
return $this->dot->pull($key, $default);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param null|int|string $key
|
||||
* @param mixed $value
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function push($key = null, $value = null)
|
||||
{
|
||||
return $this->dot->push($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace all values or values within the given key
|
||||
* with an array or Dot object.
|
||||
*
|
||||
* @param array|self|string $key
|
||||
* @param array|self $value
|
||||
*/
|
||||
public function replace($key, $value = [])
|
||||
{
|
||||
return $this->dot->replace($key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a given key / value pair or pairs.
|
||||
*
|
||||
* @param array|int|string $keys
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function set($keys, $value = null)
|
||||
{
|
||||
return $this->dot->set($keys, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace all items with a given array.
|
||||
*
|
||||
* @param mixed $items
|
||||
*/
|
||||
public function setArray($items)
|
||||
{
|
||||
return $this->dot->setArray($items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace all items with a given array as a reference.
|
||||
*/
|
||||
public function setReference(array &$items)
|
||||
{
|
||||
return $this->dot->setReference($items);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the value of a given key or all the values as JSON.
|
||||
*
|
||||
* @param mixed $key
|
||||
* @param int $options
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function toJson($key = null, $options = 0)
|
||||
{
|
||||
return $this->dot->toJson($key, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an external iterator.
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function getIterator()
|
||||
{
|
||||
return $this->dot->getIterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a offset exists.
|
||||
*
|
||||
* @param $offset
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return $this->dot->offsetExists($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Offset to retrieve.
|
||||
*
|
||||
* @param $offset
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
return $this->dot->offsetGet($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Offset to set.
|
||||
*
|
||||
* @param $offset
|
||||
* @param $value
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
$this->dot->offsetSet($offset, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Offset to unset.
|
||||
*
|
||||
* @param $offset
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
$this->dot->offsetUnset($offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Count elements of an object.
|
||||
*
|
||||
* @param null $key
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function count($key = null)
|
||||
{
|
||||
return $this->dot->count($key);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
use AlibabaCloud\Dara\RetryPolicy\EqualJitterBackoffPolicy;
|
||||
use AlibabaCloud\Dara\RetryPolicy\ExponentialBackoffPolicy;
|
||||
use AlibabaCloud\Dara\RetryPolicy\FixedBackoffPolicy;
|
||||
use AlibabaCloud\Dara\RetryPolicy\FullJitterBackoffPolicy;
|
||||
use AlibabaCloud\Dara\RetryPolicy\RandomBackoffPolic;
|
||||
|
||||
interface BackoffPolicyInterface {
|
||||
public function getDelayTime($ctx);
|
||||
}
|
||||
|
||||
abstract class BackoffPolicy implements BackoffPolicyInterface {
|
||||
|
||||
protected $policy;
|
||||
|
||||
public function __construct($option) {
|
||||
$this->policy = $option['policy'];
|
||||
}
|
||||
|
||||
abstract public function getDelayTime($ctx);
|
||||
|
||||
public static function newBackoffPolicy($option) {
|
||||
switch($option['policy']) {
|
||||
case 'Fixed':
|
||||
return new FixedBackoffPolicy($option);
|
||||
case 'Random':
|
||||
return new RandomBackoffPolicy($option);
|
||||
case 'Exponential':
|
||||
return new ExponentialBackoffPolicy($option);
|
||||
case 'EqualJitter':
|
||||
case 'ExponentialWithEqualJitter':
|
||||
return new EqualJitterBackoffPolicy($option);
|
||||
case 'FullJitter':
|
||||
case 'ExponentialWithFullJitter':
|
||||
return new FullJitterBackoffPolicy($option);
|
||||
default:
|
||||
throw new DaraException([], "Invalid backoff policy");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
|
||||
|
||||
class EqualJitterBackoffPolicy extends BackoffPolicy {
|
||||
private $period;
|
||||
private $cap;
|
||||
|
||||
public function __construct(array $option) {
|
||||
parent::__construct($option);
|
||||
if (!isset($option['period'])) {
|
||||
throw new InvalidArgumentException("Period must be specified.");
|
||||
}
|
||||
$this->period = $option['period'];
|
||||
// 默认值: 3 天
|
||||
$this->cap = isset($option['cap']) ? $option['cap'] : 3 * 24 * 60 * 60 * 1000;
|
||||
}
|
||||
|
||||
public function getDelayTime($ctx) {
|
||||
$ceil = min(pow(2, $ctx->getRetryCount() * $this->period), $this->cap);
|
||||
return $ceil / 2 + mt_rand(0, $ceil / 2);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
|
||||
|
||||
class ExponentialBackoffPolicy extends BackoffPolicy {
|
||||
private $period;
|
||||
private $cap;
|
||||
|
||||
public function __construct(array $option) {
|
||||
parent::__construct($option);
|
||||
if (!isset($option['period'])) {
|
||||
throw new DaraException("Period must be specified.");
|
||||
}
|
||||
$this->period = $option['period'];
|
||||
// 默认值: 3 天
|
||||
$this->cap = isset($option['cap']) ? $option['cap'] : 3 * 24 * 60 * 60 * 1000;
|
||||
}
|
||||
|
||||
public function getDelayTime($ctx) {
|
||||
$randomTime = pow(2, $ctx->getRetryCount() * $this->period);
|
||||
return ($randomTime > $this->cap) ? $this->cap : $randomTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
|
||||
|
||||
class FixedBackoffPolicy extends BackoffPolicy {
|
||||
private $period;
|
||||
|
||||
public function __construct(array $option) {
|
||||
parent::__construct($option);
|
||||
if (!isset($option['period'])) {
|
||||
throw new DaraException([], "Period must be specified.");
|
||||
}
|
||||
$this->period = $option['period'];
|
||||
}
|
||||
|
||||
public function getDelayTime($ctx) {
|
||||
return $this->period;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
|
||||
|
||||
class FullJitterBackoffPolicy extends BackoffPolicy {
|
||||
private $period;
|
||||
private $cap;
|
||||
|
||||
public function __construct(array $option) {
|
||||
parent::__construct($option);
|
||||
if (!isset($option['period'])) {
|
||||
throw new DaraException("Period must be specified.");
|
||||
}
|
||||
$this->period = $option['period'];
|
||||
// 默认值: 3 天
|
||||
$this->cap = isset($option['cap']) ? $option['cap'] : 3 * 24 * 60 * 60 * 1000;
|
||||
}
|
||||
|
||||
public function getDelayTime($ctx) {
|
||||
$ceil = min(pow(2, $ctx->getRetryCount() * $this->period), $this->cap);
|
||||
return mt_rand(0, $ceil);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
|
||||
|
||||
class RandomBackoffPolicy extends BackoffPolicy {
|
||||
private $period;
|
||||
private $cap;
|
||||
|
||||
public function __construct(array $option) {
|
||||
parent::__construct($option);
|
||||
if (!isset($option['period'])) {
|
||||
throw new DaraException([], "Period must be specified.");
|
||||
}
|
||||
$this->period = $option['period'];
|
||||
$this->cap = isset($option['cap']) ? $option['cap'] : 20000;
|
||||
}
|
||||
|
||||
public function getDelayTime($ctx) {
|
||||
$randomTime = mt_rand(0, $ctx->getRetryCount() * $this->period);
|
||||
return ($randomTime > $this->cap) ? $this->cap : $randomTime;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
|
||||
class RetryCondition {
|
||||
private $maxAttempts;
|
||||
private $backoff = null;
|
||||
private $exception = [];
|
||||
private $errorCode = [];
|
||||
private $maxDelay;
|
||||
|
||||
public function __construct($condition) {
|
||||
|
||||
if(isset($condition['maxAttempts'])) {
|
||||
$this->maxAttempts = $condition['maxAttempts'];
|
||||
}
|
||||
|
||||
$this->backoff = isset($condition['backoff']) ? $condition['backoff'] : null;
|
||||
$this->exception = isset($condition['exception']) ? $condition['exception'] : [];
|
||||
$this->errorCode = isset($condition['errorCode']) ? $condition['errorCode'] : [];
|
||||
$this->maxDelay = isset($condition['maxDelay']) ? $condition['maxDelay'] : [];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getMaxAttempts() {
|
||||
return $this->maxAttempts;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return BackoffPolicy
|
||||
*/
|
||||
public function getBackoff() {
|
||||
return $this->backoff;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getException() {
|
||||
return $this->exception;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getErrorCode() {
|
||||
return $this->errorCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getMaxDelay() {
|
||||
return $this->maxDelay;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
use AlibabaCloud\Dara\RetryPolicy\RetryCondition;
|
||||
|
||||
class RetryOptions {
|
||||
private $retryable;
|
||||
private $retryCondition;
|
||||
private $noRetryCondition;
|
||||
|
||||
public function __construct($options) {
|
||||
$this->retryable = $options['retryable'];
|
||||
$this->retryCondition = array_map(function ($condition) {
|
||||
if($condition instanceof RetryCondition) {
|
||||
return $condition;
|
||||
}
|
||||
return new RetryCondition($condition);
|
||||
}, isset($options['retryCondition']) ? $options['retryCondition'] : []);
|
||||
|
||||
$this->noRetryCondition = array_map(function ($condition) {
|
||||
if($condition instanceof RetryCondition) {
|
||||
return $condition;
|
||||
}
|
||||
return new RetryCondition($condition);
|
||||
}, isset($options['noRetryCondition']) ? $options['noRetryCondition'] : []);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function getRetryable() {
|
||||
return $this->retryable;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RetryCondition[]
|
||||
*/
|
||||
public function getRetryCondition() {
|
||||
return $this->retryCondition;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return RetryCondition[]
|
||||
*/
|
||||
public function getNoRetryCondition() {
|
||||
return $this->noRetryCondition;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\RetryPolicy;
|
||||
|
||||
use AlibabaCloud\Dara\RetryPolicy\BackoffPolicy;
|
||||
use AlibabaCloud\Dara\Request;
|
||||
use AlibabaCloud\Dara\Response;
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
|
||||
class RetryPolicyContext {
|
||||
private $key;
|
||||
private $retriesAttempted;
|
||||
private $httpRequest;
|
||||
private $httpResponse;
|
||||
private $exception;
|
||||
|
||||
public function __construct($options) {
|
||||
$this->key = isset($options['key']) ? $options['key'] : '';
|
||||
$this->retriesAttempted = isset($options['retriesAttempted']) ? $options['retriesAttempted'] : 0;
|
||||
$this->httpRequest = isset($options['httpRequest']) ? $options['httpRequest'] : null;
|
||||
$this->httpResponse = isset($options['httpResponse']) ? $options['httpResponse'] : null;
|
||||
$this->exception = isset($options['exception']) ? $options['exception'] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getRetryCount(){
|
||||
return $this->retriesAttempted;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getKey() {
|
||||
return $this->key;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Request
|
||||
*/
|
||||
public function getHttpRequest() {
|
||||
return $this->httpRequest;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function getHttpResponse() {
|
||||
return $this->httpResponse;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return DaraException
|
||||
*/
|
||||
public function getException() {
|
||||
return $this->exception;
|
||||
}
|
||||
}
|
||||
152
addons/wdsxh/library/alibabacloud/darabonba/src/Url.php
Normal file
152
addons/wdsxh/library/alibabacloud/darabonba/src/Url.php
Normal file
@@ -0,0 +1,152 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara;
|
||||
|
||||
class Url
|
||||
{
|
||||
|
||||
private $url = '';
|
||||
|
||||
private $path = '';
|
||||
|
||||
private $pathname = '';
|
||||
|
||||
private $protocol = '';
|
||||
|
||||
private $hostname = '';
|
||||
|
||||
private $host = '';
|
||||
|
||||
private $port = '';
|
||||
|
||||
private $hash = '';
|
||||
|
||||
private $search = '';
|
||||
|
||||
private $auth = '';
|
||||
|
||||
public function __construct($str) {
|
||||
$this->url = $str;
|
||||
}
|
||||
|
||||
public function path() {
|
||||
if(empty($this->path)) {
|
||||
return ;
|
||||
}
|
||||
$pathname = $this->pathname();
|
||||
$query = $this->search();
|
||||
$this->path = $pathname . '?' . $query;
|
||||
return $this->path;
|
||||
}
|
||||
|
||||
public function pathname() {
|
||||
if(empty($this->pathname)) {
|
||||
return $this->pathname;
|
||||
}
|
||||
$this->pathname = parse_url($ref, PHP_URL_PATH);
|
||||
return $this->pathname;
|
||||
}
|
||||
|
||||
public function protocol() {
|
||||
if(empty($this->protocol)) {
|
||||
return $this->protocol;
|
||||
}
|
||||
$this->protocol = parse_url($ref, PHP_URL_SCHEME);
|
||||
return $this->protocol;
|
||||
}
|
||||
|
||||
public function hostname() {
|
||||
if(empty($this->hostname)) {
|
||||
return $this->hostname;
|
||||
}
|
||||
$this->hostname = parse_url($ref, PHP_URL_HOST);
|
||||
return $this->hostname;
|
||||
}
|
||||
|
||||
public function host() {
|
||||
if(empty($this->host)) {
|
||||
return ;
|
||||
}
|
||||
$hostname = $this->hostname();
|
||||
$port = $this->port();
|
||||
$this->host = $hostname . $port;
|
||||
return $this->host;
|
||||
}
|
||||
|
||||
public function port() {
|
||||
if(empty($this->port)) {
|
||||
return $this->port;
|
||||
}
|
||||
$this->port = parse_url($ref, PHP_URL_PORT);
|
||||
return $this->port;
|
||||
}
|
||||
|
||||
public function hash() {
|
||||
if(empty($this->hash)) {
|
||||
return $this->hash;
|
||||
}
|
||||
$this->hash = parse_url($ref, PHP_URL_FRAGMENT);
|
||||
return $this->hash;
|
||||
}
|
||||
|
||||
public function search() {
|
||||
if(empty($this->search)) {
|
||||
return $this->search;
|
||||
}
|
||||
$this->search = parse_url($ref, PHP_URL_QUERY);
|
||||
return $this->search;
|
||||
}
|
||||
|
||||
public function href() {
|
||||
return $this->href;
|
||||
}
|
||||
|
||||
public function auth() {
|
||||
if(empty($this->auth)) {
|
||||
return $this->auth;
|
||||
}
|
||||
$username = parse_url($ref, PHP_URL_USER);
|
||||
$password = parse_url($ref, PHP_URL_PASS);
|
||||
$this->auth = $username . ':' . $password;
|
||||
return $this->auth;
|
||||
}
|
||||
|
||||
public static function parse($url) {
|
||||
return new self($url);
|
||||
}
|
||||
|
||||
public static function urlEncode($url) {
|
||||
if (empty($raw)) {
|
||||
throw new \InvalidArgumentException('not a valid value for parameter');
|
||||
}
|
||||
$str = urlencode($raw);
|
||||
$str = str_replace("%20", "+", $str);
|
||||
$str = str_replace("%2A", "*", $str);
|
||||
return $str;
|
||||
}
|
||||
|
||||
public static function percentEncode($raw) {
|
||||
if($raw === null) {
|
||||
return null;
|
||||
}
|
||||
$encoded = urlencode($raw);
|
||||
$encoded = str_replace('+', '%20', $encoded);
|
||||
$encoded = str_replace('*', '%2A', $encoded);
|
||||
$encoded = str_replace('%7E', '~', $encoded);
|
||||
return $encoded;
|
||||
}
|
||||
|
||||
public static function pathEncode($path) {
|
||||
if (empty($raw) || $raw === '/') {
|
||||
return $raw;
|
||||
}
|
||||
$arr = explode('/', $raw);
|
||||
$ret = '';
|
||||
foreach ($arr as $i => $path) {
|
||||
$str = self::percentEncode($path);
|
||||
$ret .= "$str/";
|
||||
}
|
||||
return substr($ret, 0, -1);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,151 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use XmlWriter;
|
||||
|
||||
/**
|
||||
* Based on: http://stackoverflow.com/questions/99350/passing-php-associative-arrays-to-and-from-xml.
|
||||
*/
|
||||
class ArrayToXml
|
||||
{
|
||||
private $version;
|
||||
private $encoding;
|
||||
|
||||
/**
|
||||
* Construct ArrayToXML object with selected version and encoding
|
||||
* for available values check XmlWriter docs http://www.php.net/manual/en/function.xmlwriter-start-document.php.
|
||||
*
|
||||
* @param string $xmlVersion XML Version, default 1.0
|
||||
* @param string $xmlEncoding XML Encoding, default UTF-8
|
||||
*/
|
||||
public function __construct($xmlVersion = '1.0', $xmlEncoding = 'utf-8')
|
||||
{
|
||||
$this->version = $xmlVersion;
|
||||
$this->encoding = $xmlEncoding;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an XML Data Set.
|
||||
*
|
||||
* @param array $data Associative Array containing values to be parsed into an XML Data Set(s)
|
||||
* @param string $startElement Root Opening Tag, default data
|
||||
*
|
||||
* @return string XML String containing values
|
||||
* @return mixed Boolean false on failure, string XML result on success
|
||||
*/
|
||||
public function buildXML($data, $startElement = 'data')
|
||||
{
|
||||
if (!\is_array($data)) {
|
||||
$err = 'Invalid variable type supplied, expected array not found on line ' . __LINE__ . ' in Class: ' . __CLASS__ . ' Method: ' . __METHOD__;
|
||||
trigger_error($err);
|
||||
|
||||
return false; //return false error occurred
|
||||
}
|
||||
$xml = new XmlWriter();
|
||||
$xml->openMemory();
|
||||
$xml->startDocument($this->version, $this->encoding);
|
||||
$xml->startElement($startElement);
|
||||
$data = $this->writeAttr($xml, $data);
|
||||
$this->writeEl($xml, $data);
|
||||
$xml->endElement(); //write end element
|
||||
//returns the XML results
|
||||
return $xml->outputMemory(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write keys in $data prefixed with @ as XML attributes, if $data is an array.
|
||||
* When an @ prefixed key is found, a '%' key is expected to indicate the element itself,
|
||||
* and '#' prefixed key indicates CDATA content.
|
||||
*
|
||||
* @param XMLWriter $xml object
|
||||
* @param array $data with attributes filtered out
|
||||
*
|
||||
* @return array $data | $nonAttributes
|
||||
*/
|
||||
protected function writeAttr(XMLWriter $xml, $data)
|
||||
{
|
||||
if (\is_array($data)) {
|
||||
$nonAttributes = [];
|
||||
foreach ($data as $key => $val) {
|
||||
//handle an attribute with elements
|
||||
if ('@' == $key[0]) {
|
||||
$xml->writeAttribute(substr($key, 1), $val);
|
||||
} elseif ('%' == $key[0]) {
|
||||
if (\is_array($val)) {
|
||||
$nonAttributes = $val;
|
||||
} else {
|
||||
$xml->text($val);
|
||||
}
|
||||
} elseif ('#' == $key[0]) {
|
||||
if (\is_array($val)) {
|
||||
$nonAttributes = $val;
|
||||
} else {
|
||||
$xml->startElement(substr($key, 1));
|
||||
$xml->writeCData($val);
|
||||
$xml->endElement();
|
||||
}
|
||||
} elseif ('!' == $key[0]) {
|
||||
if (\is_array($val)) {
|
||||
$nonAttributes = $val;
|
||||
} else {
|
||||
$xml->writeCData($val);
|
||||
}
|
||||
} //ignore normal elements
|
||||
else {
|
||||
$nonAttributes[$key] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
return $nonAttributes;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write XML as per Associative Array.
|
||||
*
|
||||
* @param XMLWriter $xml object
|
||||
* @param array $data Associative Data Array
|
||||
*/
|
||||
protected function writeEl(XMLWriter $xml, $data)
|
||||
{
|
||||
foreach ($data as $key => $value) {
|
||||
if (\is_array($value) && !$this->isAssoc($value)) { //numeric array
|
||||
foreach ($value as $itemValue) {
|
||||
if (\is_array($itemValue)) {
|
||||
$xml->startElement($key);
|
||||
$itemValue = $this->writeAttr($xml, $itemValue);
|
||||
$this->writeEl($xml, $itemValue);
|
||||
$xml->endElement();
|
||||
} else {
|
||||
$itemValue = $this->writeAttr($xml, $itemValue);
|
||||
$xml->writeElement($key, "{$itemValue}");
|
||||
}
|
||||
}
|
||||
} elseif (\is_array($value)) { //associative array
|
||||
$xml->startElement($key);
|
||||
$value = $this->writeAttr($xml, $value);
|
||||
$this->writeEl($xml, $value);
|
||||
$xml->endElement();
|
||||
} else { //scalar
|
||||
$value = $this->writeAttr($xml, $value);
|
||||
$xml->writeElement($key, "{$value}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if array is associative with string based keys
|
||||
* FROM: http://stackoverflow.com/questions/173400/php-arrays-a-good-way-to-check-if-an-array-is-associative-or-sequential/4254008#4254008.
|
||||
*
|
||||
* @param array $array Array to check
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isAssoc($array)
|
||||
{
|
||||
return (bool) \count(array_filter(array_keys($array), 'is_string'));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
|
||||
class BytesUtil
|
||||
{
|
||||
private static function is_bytes($value)
|
||||
{
|
||||
if (!\is_array($value)) {
|
||||
return false;
|
||||
}
|
||||
$i = 0;
|
||||
foreach ($value as $k => $ord) {
|
||||
if ($k !== $i) {
|
||||
return false;
|
||||
}
|
||||
if (!\is_int($ord)) {
|
||||
return false;
|
||||
}
|
||||
if ($ord < 0 || $ord > 255) {
|
||||
return false;
|
||||
}
|
||||
++$i;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function from($input, $encoding = 'utf-8')
|
||||
{
|
||||
$buffer = '';
|
||||
|
||||
if (self::is_bytes($input)) {
|
||||
return $input;
|
||||
} elseif (is_string($input)) {
|
||||
switch (strtolower($encoding)) {
|
||||
case 'utf-8':
|
||||
case 'utf8':
|
||||
$buffer = $input;
|
||||
break;
|
||||
case 'base64':
|
||||
$decoded = base64_decode($input);
|
||||
if ($decoded === false) {
|
||||
throw new DaraException([], 'Invalid base64 input.');
|
||||
}
|
||||
$buffer = $decoded;
|
||||
break;
|
||||
case 'hex':
|
||||
$decoded = hex2bin($input);
|
||||
if ($decoded === false) {
|
||||
throw new DaraException([], 'Invalid hex input.');
|
||||
}
|
||||
$buffer = $decoded;
|
||||
break;
|
||||
default:
|
||||
throw new DaraException([], 'Unsupported encoding type.');
|
||||
}
|
||||
} else {
|
||||
throw new DaraException([], 'Input must be an bytes or a string.');
|
||||
}
|
||||
|
||||
$result = [];
|
||||
for ($i = 0, $len = strlen($buffer); $i < $len; $i++) {
|
||||
$result[] = ord($buffer[$i]);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param int[] $bytes
|
||||
* @return string
|
||||
*/
|
||||
public static function toString($bytes, $type = 'utf8')
|
||||
{
|
||||
if (\is_string($bytes)) {
|
||||
return $bytes;
|
||||
}
|
||||
$str = '';
|
||||
foreach ($bytes as $ch) {
|
||||
$str .= \chr($ch);
|
||||
}
|
||||
|
||||
if($type == 'hex') {
|
||||
return bin2hex($str);
|
||||
}
|
||||
|
||||
if($type == 'base64') {
|
||||
return base64_encode($str);
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
109
addons/wdsxh/library/alibabacloud/darabonba/src/Util/Console.php
Normal file
109
addons/wdsxh/library/alibabacloud/darabonba/src/Util/Console.php
Normal file
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use Monolog\Handler\AbstractProcessingHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Logger;
|
||||
|
||||
/**
|
||||
* This is a console module.
|
||||
*/
|
||||
class Console
|
||||
{
|
||||
/**
|
||||
* @var Logger
|
||||
*/
|
||||
private static $loggerDriver;
|
||||
|
||||
/**
|
||||
* Console val with log level into stdout.
|
||||
*
|
||||
* @param string $val the printing string
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @example \[LOG\] tea console example
|
||||
*/
|
||||
public static function log($val)
|
||||
{
|
||||
self::logger()->log(200, $val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Console val with info level into stdout.
|
||||
*
|
||||
* @param string $val the printing string
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @example \[INFO\] tea console example
|
||||
*/
|
||||
public static function info($val)
|
||||
{
|
||||
self::logger()->info($val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Console val with warning level into stdout.
|
||||
*
|
||||
* @param string $val the printing string
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @example \[WARNING\] tea console example
|
||||
*/
|
||||
public static function warning($val)
|
||||
{
|
||||
self::logger()->warning($val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Console val with debug level into stdout.
|
||||
*
|
||||
* @param string $val the printing string
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @example \[DEBUG\] tea console example
|
||||
*/
|
||||
public static function debug($val)
|
||||
{
|
||||
self::logger()->debug($val);
|
||||
}
|
||||
|
||||
/**
|
||||
* Console val with error level into stderr.
|
||||
*
|
||||
* @param string $val the printing string
|
||||
*
|
||||
* @throws \Exception
|
||||
*
|
||||
* @example \[ERROR\] tea console example
|
||||
*/
|
||||
public static function error($val)
|
||||
{
|
||||
self::logger()->error($val);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param AbstractProcessingHandler $handler
|
||||
*/
|
||||
public static function pushHandler($handler)
|
||||
{
|
||||
self::$loggerDriver->pushHandler($handler);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Logger
|
||||
*/
|
||||
public static function logger()
|
||||
{
|
||||
if (null === self::$loggerDriver) {
|
||||
self::$loggerDriver = new Logger('tea-console-log');
|
||||
self::$loggerDriver->pushHandler(new StreamHandler('php://stderr', 0));
|
||||
}
|
||||
|
||||
return self::$loggerDriver;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,330 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use AlibabaCloud\Dara\Models\FileField;
|
||||
use GuzzleHttp\Psr7\Stream;
|
||||
use Psr\Http\Message\StreamInterface;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class FileFormStream implements StreamInterface
|
||||
{
|
||||
/**
|
||||
* @var resource
|
||||
*/
|
||||
private $stream;
|
||||
private $index = 0;
|
||||
private $form = [];
|
||||
private $boundary = '';
|
||||
private $streaming = false;
|
||||
private $keys = [];
|
||||
|
||||
/**
|
||||
* @var Stream
|
||||
*/
|
||||
private $currStream;
|
||||
|
||||
private $size;
|
||||
private $uri;
|
||||
private $seekable;
|
||||
private $readable = true;
|
||||
private $writable = true;
|
||||
|
||||
public function __construct($map, $boundary)
|
||||
{
|
||||
$this->stream = fopen('php://memory', 'a+');
|
||||
$this->form = $map;
|
||||
$this->boundary = $boundary;
|
||||
$this->keys = array_keys($map);
|
||||
do {
|
||||
$read = $this->readForm(1024);
|
||||
} while (null !== $read);
|
||||
$meta = stream_get_meta_data($this->stream);
|
||||
$this->seekable = $meta['seekable'];
|
||||
$this->uri = $this->getMetadata('uri');
|
||||
$this->seek(0);
|
||||
$this->seek(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the stream when the destructed.
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
$this->close();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
try {
|
||||
$this->seek(0);
|
||||
|
||||
return (string) stream_get_contents($this->stream);
|
||||
} catch (\Exception $e) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $length
|
||||
*
|
||||
* @return false|int|string
|
||||
*/
|
||||
public function readForm($length)
|
||||
{
|
||||
if ($this->streaming) {
|
||||
if (null !== $this->currStream) {
|
||||
// @var string $content
|
||||
$content = $this->currStream->read($length);
|
||||
if (false !== $content && '' !== $content) {
|
||||
fwrite($this->stream, $content);
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
return $this->next("\r\n");
|
||||
}
|
||||
|
||||
return $this->next();
|
||||
}
|
||||
$keysCount = \count($this->keys);
|
||||
if ($this->index > $keysCount) {
|
||||
return null;
|
||||
}
|
||||
if ($keysCount > 0) {
|
||||
if ($this->index < $keysCount) {
|
||||
$this->streaming = true;
|
||||
|
||||
$name = $this->keys[$this->index];
|
||||
$field = $this->form[$name];
|
||||
if (!empty($field) && $field instanceof FileField) {
|
||||
if (!empty($field->content)) {
|
||||
$this->currStream = $field->content;
|
||||
|
||||
$str = '--' . $this->boundary . "\r\n" .
|
||||
'Content-Disposition: form-data; name="' . $name . '"; filename="' . $field->filename . "\"\r\n" .
|
||||
'Content-Type: ' . $field->contentType . "\r\n\r\n";
|
||||
$this->write($str);
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
return $this->next();
|
||||
}
|
||||
$val = $field;
|
||||
$str = '--' . $this->boundary . "\r\n" .
|
||||
'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n" .
|
||||
$val . "\r\n";
|
||||
fwrite($this->stream, $str);
|
||||
|
||||
return $str;
|
||||
}
|
||||
if ($this->index == $keysCount) {
|
||||
return $this->next('--' . $this->boundary . "--\r\n");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getContents()
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
throw new \RuntimeException('Stream is detached');
|
||||
}
|
||||
|
||||
$contents = stream_get_contents($this->stream);
|
||||
|
||||
if (false === $contents) {
|
||||
throw new \RuntimeException('Unable to read stream contents');
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function close()
|
||||
{
|
||||
if (isset($this->stream)) {
|
||||
if (\is_resource($this->stream)) {
|
||||
fclose($this->stream);
|
||||
}
|
||||
$this->detach();
|
||||
}
|
||||
}
|
||||
|
||||
public function detach()
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$result = $this->stream;
|
||||
unset($this->stream);
|
||||
$this->size = $this->uri = null;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getSize()
|
||||
{
|
||||
if (null !== $this->size) {
|
||||
return $this->size;
|
||||
}
|
||||
|
||||
if (!isset($this->stream)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Clear the stat cache if the stream has a URI
|
||||
if ($this->uri) {
|
||||
clearstatcache(true, $this->uri);
|
||||
}
|
||||
|
||||
$stats = fstat($this->stream);
|
||||
if (isset($stats['size'])) {
|
||||
$this->size = $stats['size'];
|
||||
|
||||
return $this->size;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public function isReadable()
|
||||
{
|
||||
return $this->readable;
|
||||
}
|
||||
|
||||
public function isWritable()
|
||||
{
|
||||
return $this->writable;
|
||||
}
|
||||
|
||||
public function isSeekable()
|
||||
{
|
||||
return $this->seekable;
|
||||
}
|
||||
|
||||
public function eof()
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
throw new \RuntimeException('Stream is detached');
|
||||
}
|
||||
|
||||
return feof($this->stream);
|
||||
}
|
||||
|
||||
public function tell()
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
throw new \RuntimeException('Stream is detached');
|
||||
}
|
||||
|
||||
$result = ftell($this->stream);
|
||||
|
||||
if (false === $result) {
|
||||
throw new \RuntimeException('Unable to determine stream position');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function rewind()
|
||||
{
|
||||
$this->seek(0);
|
||||
}
|
||||
|
||||
public function seek($offset, $whence = SEEK_SET)
|
||||
{
|
||||
$whence = (int) $whence;
|
||||
|
||||
if (!isset($this->stream)) {
|
||||
throw new \RuntimeException('Stream is detached');
|
||||
}
|
||||
if (!$this->seekable) {
|
||||
throw new \RuntimeException('Stream is not seekable');
|
||||
}
|
||||
if (-1 === fseek($this->stream, $offset, $whence)) {
|
||||
throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . var_export($whence, true));
|
||||
}
|
||||
}
|
||||
|
||||
public function read($length)
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
throw new \RuntimeException('Stream is detached');
|
||||
}
|
||||
if (!$this->readable) {
|
||||
throw new \RuntimeException('Cannot read from non-readable stream');
|
||||
}
|
||||
if ($length < 0) {
|
||||
throw new \RuntimeException('Length parameter cannot be negative');
|
||||
}
|
||||
|
||||
if (0 === $length) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$string = fread($this->stream, $length);
|
||||
if (false === $string) {
|
||||
throw new \RuntimeException('Unable to read from stream');
|
||||
}
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
public function write($string)
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
throw new \RuntimeException('Stream is detached');
|
||||
}
|
||||
if (!$this->writable) {
|
||||
throw new \RuntimeException('Cannot write to a non-writable stream');
|
||||
}
|
||||
|
||||
// We can't know the size after writing anything
|
||||
$this->size = null;
|
||||
$result = fwrite($this->stream, $string);
|
||||
|
||||
if (false === $result) {
|
||||
throw new \RuntimeException('Unable to write to stream');
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getMetadata($key = null)
|
||||
{
|
||||
if (!isset($this->stream)) {
|
||||
return $key ? null : [];
|
||||
}
|
||||
|
||||
$meta = stream_get_meta_data($this->stream);
|
||||
|
||||
return isset($meta[$key]) ? $meta[$key] : null;
|
||||
}
|
||||
|
||||
private function next($endStr = '')
|
||||
{
|
||||
$this->streaming = false;
|
||||
++$this->index;
|
||||
$this->write($endStr);
|
||||
$this->currStream = null;
|
||||
|
||||
return $endStr;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class FormUtil
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @param array $query
|
||||
* @return string
|
||||
*/
|
||||
public static function toFormString($query)
|
||||
{
|
||||
if (null === $query) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if ($query instanceof Model) {
|
||||
$query = $query->toArray();
|
||||
}
|
||||
|
||||
return str_replace('+', '%20', http_build_query($query));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function getBoundary()
|
||||
{
|
||||
return (string) (mt_rand(10000000000000, 99999999999999));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param array $map
|
||||
* @param string $boundary
|
||||
* @return string
|
||||
*/
|
||||
public static function toFileForm($map, $boundary)
|
||||
{
|
||||
return new FileFormStream($map, $boundary);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
class MathUtil
|
||||
{
|
||||
/**
|
||||
*
|
||||
* @return double
|
||||
*/
|
||||
public static function random()
|
||||
{
|
||||
return rand(0, getrandmax() - 1) / getrandmax();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use GuzzleHttp\Psr7\Stream;
|
||||
use AlibabaCloud\Dara\Util\StringUtil;
|
||||
use AlibabaCloud\Dara\Models\SSEEvent;
|
||||
|
||||
class StreamUtil
|
||||
{
|
||||
/**
|
||||
* @param Stream $stream
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public static function readAsBytes($stream)
|
||||
{
|
||||
$str = self::readAsString($stream);
|
||||
|
||||
return StringUtil::toBytes($str);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Stream $stream
|
||||
*
|
||||
* @return array the parsed result
|
||||
*/
|
||||
public static function readAsJSON($stream)
|
||||
{
|
||||
$jsonString = self::readAsString($stream);
|
||||
|
||||
return json_decode($jsonString, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Stream $stream
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function readAsString($stream)
|
||||
{
|
||||
if ($stream->isSeekable()) {
|
||||
$stream->rewind();
|
||||
}
|
||||
|
||||
return $stream->getContents();
|
||||
}
|
||||
|
||||
private static function tryGetEvents($head, $chunk) {
|
||||
$all = $head . $chunk;
|
||||
if(empty($all)) {
|
||||
return [];
|
||||
}
|
||||
$start = 0;
|
||||
$events = [];
|
||||
$lines = explode("\n", $all);
|
||||
$event = new SSEEvent();
|
||||
for ($i = 0; $i < strlen($all) - 1; $i++) {
|
||||
$c = $all[$i];
|
||||
$c2 = $all[$i + 1];
|
||||
if ($c === "\n" && $c2 === "\n") {
|
||||
$part = substr($all, $start, $i - $start);
|
||||
$lines = explode("\n", $part);
|
||||
$event = new SSEEvent();
|
||||
|
||||
foreach ($lines as $line) {
|
||||
if ('' === trim($line)) {
|
||||
continue;
|
||||
} elseif (0 === strpos($line, 'data:')) {
|
||||
$data = substr($line, 5);
|
||||
$event->data .= trim($data);
|
||||
} elseif (0 === strpos($line, 'event:')) {
|
||||
$eventLine = substr($line, 6);
|
||||
$event->event = trim($eventLine);
|
||||
} elseif (0 === strpos($line, 'id:')) {
|
||||
$id = substr($line, 3);
|
||||
$event->id = trim($id);
|
||||
} elseif (0 === strpos($line, 'retry:')) {
|
||||
$retry = substr($line, 6);
|
||||
$retry = trim($retry);
|
||||
if (ctype_digit($retry)) {
|
||||
$event->retry = intval($retry, 10);
|
||||
}
|
||||
} elseif (isset($line[0]) && $line[0] === ':') {
|
||||
// Lines starting with ':' are comments and ignored.
|
||||
}
|
||||
}
|
||||
array_push($events, $event);
|
||||
$start = $i + 2;
|
||||
}
|
||||
}
|
||||
$remain = substr($all, $start);
|
||||
return ['events' => $events, 'remain' => $remain];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Stream $stream
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function readAsSSE($stream)
|
||||
{
|
||||
$rest = '';
|
||||
while (!$stream->eof()) {
|
||||
$chunk = $stream->read(4096);
|
||||
$result = self::tryGetEvents($rest, $chunk);
|
||||
if(empty($result)) {
|
||||
continue;
|
||||
}
|
||||
$events = $result['events'];
|
||||
$rest = $result['remain'];
|
||||
|
||||
foreach ($events as $event) {
|
||||
yield $event;
|
||||
}
|
||||
}
|
||||
|
||||
// If there is any remaining data that qualifies as an event, yield it as well
|
||||
if ($rest !== '' && $rest !== false) {
|
||||
$lastEvent = new SSEEvent();
|
||||
$lastEvent->data = $rest;
|
||||
yield $lastEvent;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixin $str
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function streamFor($str)
|
||||
{
|
||||
if (!\is_array($value)) {
|
||||
return false;
|
||||
}
|
||||
$i = 0;
|
||||
foreach ($value as $k => $ord) {
|
||||
if ($k !== $i) {
|
||||
return false;
|
||||
}
|
||||
if (!\is_int($ord)) {
|
||||
return false;
|
||||
}
|
||||
if ($ord < 0 || $ord > 255) {
|
||||
return false;
|
||||
}
|
||||
++$i;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use AlibabaCloud\Dara\Exception\DaraException;
|
||||
use AlibabaCloud\Dara\Util\BytesUtil;
|
||||
|
||||
class StringUtil
|
||||
{
|
||||
|
||||
/**
|
||||
* @param string $string
|
||||
* @param string $type
|
||||
*
|
||||
* @return int[]
|
||||
*/
|
||||
public static function toBytes($string, $type = 'utf8')
|
||||
{
|
||||
return BytesUtil::from($string, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $str
|
||||
* @param string $prefix
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasPrefix($str, $prefix)
|
||||
{
|
||||
if(!is_string($prefix) || !is_string($str)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$length = strlen($prefix);
|
||||
|
||||
if ($length == 0) {
|
||||
return true;
|
||||
}
|
||||
return substr($str, 0, $length) === $prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $str
|
||||
* @param string $suffix
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function hasSuffix($str, $suffix)
|
||||
{
|
||||
if(!is_string($suffix) || !is_string($str)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$length = strlen($suffix);
|
||||
if ($length == 0) {
|
||||
return true;
|
||||
}
|
||||
return substr($str, -$length) === $suffix;
|
||||
}
|
||||
|
||||
}
|
||||
61
addons/wdsxh/library/alibabacloud/darabonba/src/Util/XML.php
Normal file
61
addons/wdsxh/library/alibabacloud/darabonba/src/Util/XML.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
namespace AlibabaCloud\Dara\Util;
|
||||
|
||||
use AlibabaCloud\Dara\Util\ArrayToXml;
|
||||
|
||||
class XML
|
||||
{
|
||||
public static function parseXml($xmlStr, $response)
|
||||
{
|
||||
$res = self::parse($xmlStr);
|
||||
if ($response === null) {
|
||||
return $res;
|
||||
} else {
|
||||
if (\is_string($response)) {
|
||||
$response = new $response();
|
||||
}
|
||||
$prop = get_object_vars($response);
|
||||
$target = [];
|
||||
|
||||
foreach ($res as $k => $v) {
|
||||
if (isset($prop[$k])) {
|
||||
$target[$k] = $v;
|
||||
}
|
||||
}
|
||||
return $target;
|
||||
}
|
||||
}
|
||||
|
||||
public static function toXML($array)
|
||||
{
|
||||
$arrayToXml = new ArrayToXml();
|
||||
if (\is_object($array)) {
|
||||
$tmp = explode('\\', \get_class($array));
|
||||
$rootName = $tmp[\count($tmp) - 1];
|
||||
$data = json_decode(json_encode($array), true);
|
||||
} else {
|
||||
$tmp = $array;
|
||||
reset($tmp);
|
||||
$rootName = key($tmp);
|
||||
$data = $array[$rootName];
|
||||
}
|
||||
ksort($data);
|
||||
|
||||
return $arrayToXml->buildXML($data, $rootName);
|
||||
}
|
||||
|
||||
private static function parse($xml)
|
||||
{
|
||||
if (\PHP_VERSION_ID < 80000) {
|
||||
libxml_disable_entity_loader(true);
|
||||
}
|
||||
|
||||
return json_decode(
|
||||
json_encode(
|
||||
simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)
|
||||
),
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
15
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/.gitignore
vendored
Normal file
15
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
composer.phar
|
||||
/vendor/
|
||||
|
||||
# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
|
||||
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
|
||||
composer.lock
|
||||
|
||||
.vscode/
|
||||
.idea
|
||||
.DS_Store
|
||||
|
||||
cache/
|
||||
*.cache
|
||||
runtime/
|
||||
.php_cs.cache
|
||||
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This document has been generated with
|
||||
* https://mlocati.github.io/php-cs-fixer-configurator/#version:2.15|configurator
|
||||
* you can change this configuration by importing this file.
|
||||
*/
|
||||
|
||||
use PhpCsFixer\Config;
|
||||
use PhpCsFixer\Finder;
|
||||
|
||||
return (new Config())
|
||||
->setRiskyAllowed(true)
|
||||
->setIndent(' ')
|
||||
->setRules([
|
||||
'@PSR2' => true,
|
||||
'@PhpCsFixer' => true,
|
||||
'@Symfony:risky' => true,
|
||||
'concat_space' => ['spacing' => 'one'],
|
||||
'array_syntax' => ['syntax' => 'short'],
|
||||
'array_indentation' => true,
|
||||
'combine_consecutive_unsets' => true,
|
||||
'phpdoc_separation' => true,
|
||||
'single_quote' => true,
|
||||
'declare_equal_normalize' => true,
|
||||
'function_typehint_space' => true,
|
||||
'include' => true,
|
||||
'lowercase_cast' => true,
|
||||
'no_leading_import_slash' => true,
|
||||
'no_multiline_whitespace_around_double_arrow' => true,
|
||||
'no_spaces_around_offset' => true,
|
||||
'no_unneeded_control_parentheses' => true,
|
||||
'no_unused_imports' => true,
|
||||
'no_whitespace_before_comma_in_array' => true,
|
||||
'no_whitespace_in_blank_line' => true,
|
||||
'object_operator_without_whitespace' => true,
|
||||
'blank_lines_before_namespace' => true,
|
||||
'single_class_element_per_statement' => true,
|
||||
'space_after_semicolon' => true,
|
||||
'standardize_not_equals' => true,
|
||||
'ternary_operator_spaces' => true,
|
||||
'trailing_comma_in_multiline' => true,
|
||||
'trim_array_spaces' => true,
|
||||
'unary_operator_spaces' => true,
|
||||
'whitespace_after_comma_in_array' => true,
|
||||
'no_extra_blank_lines' => [
|
||||
'tokens' => [
|
||||
'curly_brace_block',
|
||||
'extra',
|
||||
'parenthesis_brace_block',
|
||||
'square_brace_block',
|
||||
'throw',
|
||||
'use',
|
||||
]
|
||||
],
|
||||
'braces' => [
|
||||
'allow_single_line_closure' => true,
|
||||
],
|
||||
])
|
||||
->setFinder(
|
||||
(new Finder())
|
||||
->exclude('vendor')
|
||||
->exclude('tests')
|
||||
->in(__DIR__)
|
||||
)
|
||||
;
|
||||
141
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/ChangeLog.md
Normal file
141
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/ChangeLog.md
Normal file
@@ -0,0 +1,141 @@
|
||||
2025-04-23 Version: 4.1.0
|
||||
- Support API DeleteSmsQualification.
|
||||
- Support API QuerySingleSmsQualification.
|
||||
- Support API QuerySmsQualificationRecord.
|
||||
- Support API RequiredPhoneCode.
|
||||
- Support API SubmitSmsQualification.
|
||||
- Support API UpdateSmsQualification.
|
||||
- Support API ValidPhoneCode.
|
||||
|
||||
|
||||
2025-04-22 Version: 4.0.0
|
||||
- Support API ChangeSignatureQualification.
|
||||
- Support API CreateSmsAuthorizationLetter.
|
||||
- Support API GetQualificationOssInfo.
|
||||
- Support API QuerySmsAuthorizationLetter.
|
||||
- Update API CreateSmsSign: update request parameters AuthorizationLetterId' type has changed.
|
||||
- Update API CreateSmsSign: update request parameters AuthorizationLetterId' format has changed.
|
||||
- Update API GetSmsSign: update response parameters Body.AuthorizationLetterId' type has changed.
|
||||
- Update API GetSmsSign: update response parameters Body.AuthorizationLetterId' format has changed.
|
||||
- Update API QuerySmsSignList: update response parameters Body.SmsSignList.$.AuthorizationLetterId' type has changed.
|
||||
- Update API QuerySmsSignList: update response parameters Body.SmsSignList.$.AuthorizationLetterId' format has changed.
|
||||
- Update API UpdateSmsSign: update request parameters AuthorizationLetterId' type has changed.
|
||||
- Update API UpdateSmsSign: update request parameters AuthorizationLetterId' format has changed.
|
||||
|
||||
|
||||
2025-04-16 Version: 3.1.3
|
||||
- Update API CreateSmsSign: add request parameters AuthorizationLetterId.
|
||||
- Update API GetSmsSign: add response parameters Body.AuthorizationLetterAuditPass.
|
||||
- Update API GetSmsSign: add response parameters Body.AuthorizationLetterId.
|
||||
- Update API QuerySmsSignList: add response parameters Body.SmsSignList.$.AuthorizationLetterId.
|
||||
- Update API QuerySmsSignList: add response parameters Body.SmsSignList.$.authorizationLetterAuditPass.
|
||||
- Update API UpdateSmsSign: add request parameters AuthorizationLetterId.
|
||||
|
||||
|
||||
2025-03-26 Version: 3.1.2
|
||||
- Update API GetSmsTemplate: add response parameters Body.VendorAuditStatus.
|
||||
|
||||
|
||||
2025-01-03 Version: 3.1.1
|
||||
- Update API GetSmsSign: update response param.
|
||||
- Update API QueryExtCodeSign: update param ExtCode.
|
||||
- Update API QueryExtCodeSign: update param SignName.
|
||||
|
||||
|
||||
2024-10-24 Version: 3.1.0
|
||||
- Support API AddExtCodeSign.
|
||||
- Support API DeleteExtCodeSign.
|
||||
- Support API GetCardSmsDetails.
|
||||
- Support API QueryExtCodeSign.
|
||||
- Support API UpdateExtCodeSign.
|
||||
|
||||
|
||||
2024-06-25 Version: 3.0.0
|
||||
- Support API CreateSmsSign.
|
||||
- Support API CreateSmsTemplate.
|
||||
- Support API GetOSSInfoForUploadFile.
|
||||
- Support API GetSmsSign.
|
||||
- Support API GetSmsTemplate.
|
||||
- Support API UpdateSmsSign.
|
||||
- Support API UpdateSmsTemplate.
|
||||
- Update API CreateSmartShortUrl: add param OutId.
|
||||
- Update API CreateSmartShortUrl: delete param Expiration.
|
||||
- Update API CreateSmartShortUrl: delete param SourceName.
|
||||
- Update API CreateSmartShortUrl: update param PhoneNumbers.
|
||||
- Update API CreateSmartShortUrl: update param SourceUrl.
|
||||
- Update API QueryPageSmartShortUrlLog: delete param ClickState.
|
||||
- Update API QueryPageSmartShortUrlLog: delete param EndId.
|
||||
- Update API QueryPageSmartShortUrlLog: delete param ShortName.
|
||||
- Update API QueryPageSmartShortUrlLog: delete param StartId.
|
||||
- Update API QueryPageSmartShortUrlLog: update param CreateDateEnd.
|
||||
- Update API QueryPageSmartShortUrlLog: update param CreateDateStart.
|
||||
- Update API QueryPageSmartShortUrlLog: update param PageNo.
|
||||
- Update API QueryPageSmartShortUrlLog: update param PageSize.
|
||||
|
||||
|
||||
2023-07-04 Version: 2.0.24
|
||||
- Add CreateSmartShortUrl api.
|
||||
|
||||
2022-11-29 Version: 2.0.23
|
||||
- Add custom content for QueryCardSmsTemplateReport.
|
||||
|
||||
2022-10-11 Version: 2.0.22
|
||||
- Add custom content for QueryCardSmsTemplateReport.
|
||||
|
||||
2022-09-30 Version: 2.0.21
|
||||
- Add custom content for SendBatchSms.
|
||||
|
||||
2022-09-29 Version: 2.0.20
|
||||
- Add outId for SendBatchSms.
|
||||
|
||||
2022-09-28 Version: 2.0.19
|
||||
- Upgrade formdata for CheckMobilesCardTemplateSupport.
|
||||
|
||||
2022-08-11 Version: 2.0.18
|
||||
- Upgrade formdata for SendBatchSms.
|
||||
|
||||
2022-08-03 Version: 2.0.17
|
||||
- Upgrade Service for SmsStatistics.
|
||||
|
||||
2022-07-14 Version: 2.0.16
|
||||
- Upgrade Service for SmsTemplate.
|
||||
|
||||
2022-07-06 Version: 2.0.15
|
||||
- Upgrade Service for SmsSign.
|
||||
|
||||
2022-07-06 Version: 2.0.14
|
||||
- Upgrade Service for SmsSign.
|
||||
|
||||
2022-07-04 Version: 2.0.13
|
||||
- Upgrade Service for CardSms.
|
||||
|
||||
2022-06-29 Version: 2.0.12
|
||||
- Upgrade Service for Template and Sign.
|
||||
|
||||
2022-06-17 Version: 2.0.10
|
||||
- Upgrade Service for CARDSMS.
|
||||
|
||||
2022-01-24 Version: 2.0.9
|
||||
- Generated php 2017-05-25 for Dysmsapi.
|
||||
|
||||
2021-11-29 Version: 2.0.8
|
||||
- Upgrade Service for SMS.
|
||||
|
||||
2021-11-16 Version: 2.0.7
|
||||
- Upgrade Service for SMS.
|
||||
|
||||
2021-10-26 Version: 2.0.6
|
||||
- Support Short Url for SMS.
|
||||
|
||||
2021-09-01 Version: 1.0.3
|
||||
- Generated php 2017-05-25 for Dysmsapi.
|
||||
|
||||
2021-07-15 Version: 1.0.2
|
||||
- Generated php 2017-05-25 for Dysmsapi.
|
||||
|
||||
2021-01-04 Version: 1.0.1
|
||||
- AMP Version Change.
|
||||
|
||||
2020-12-29 Version: 1.0.0
|
||||
- AMP Version Change.
|
||||
|
||||
201
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/LICENSE
Normal file
201
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/LICENSE
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,35 @@
|
||||
[English](README.md) | 简体中文
|
||||
|
||||

|
||||
|
||||
# Alibaba Cloud Dysmsapi SDK for PHP
|
||||
|
||||
## 安装
|
||||
|
||||
### Composer
|
||||
|
||||
```bash
|
||||
composer require alibabacloud/dysmsapi-20170525
|
||||
```
|
||||
|
||||
## 问题
|
||||
|
||||
[提交 Issue](https://github.com/aliyun/alibabacloud-php-sdk/issues/new),不符合指南的问题可能会立即关闭。
|
||||
|
||||
## 使用说明
|
||||
|
||||
[快速使用](https://github.com/aliyun/alibabacloud-php-sdk/blob/master/docs/0-Examples-CN.md#%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8)
|
||||
|
||||
## 发行说明
|
||||
|
||||
每个版本的详细更改记录在[发行说明](./ChangeLog.txt)中。
|
||||
|
||||
## 相关
|
||||
|
||||
* [最新源码](https://github.com/aliyun/alibabacloud-php-sdk/)
|
||||
|
||||
## 许可证
|
||||
|
||||
[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
@@ -0,0 +1,35 @@
|
||||
English | [简体中文](README-CN.md)
|
||||
|
||||

|
||||
|
||||
# Alibaba Cloud Dysmsapi SDK for PHP
|
||||
|
||||
## Installation
|
||||
|
||||
### Composer
|
||||
|
||||
```bash
|
||||
composer require alibabacloud/dysmsapi-20170525
|
||||
```
|
||||
|
||||
## Issues
|
||||
|
||||
[Opening an Issue](https://github.com/aliyun/alibabacloud-php-sdk/issues/new), Issues not conforming to the guidelines may be closed immediately.
|
||||
|
||||
## Usage
|
||||
|
||||
[Quick Examples](https://github.com/aliyun/alibabacloud-php-sdk/blob/master/docs/0-Examples-EN.md#quick-examples)
|
||||
|
||||
## Changelog
|
||||
|
||||
Detailed changes for each release are documented in the [release notes](./ChangeLog.txt).
|
||||
|
||||
## References
|
||||
|
||||
* [Latest Release](https://github.com/aliyun/alibabacloud-php-sdk/)
|
||||
|
||||
## License
|
||||
|
||||
[Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
||||
|
||||
Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
|
||||
@@ -0,0 +1,17 @@
|
||||
<?php
|
||||
|
||||
if (file_exists(__DIR__ . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php')) {
|
||||
require_once __DIR__ . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
|
||||
}
|
||||
|
||||
spl_autoload_register(function ($class) {
|
||||
$name = str_replace('AlibabaCloud\SDK\Dysmsapi\V20170525\\', '', $class);
|
||||
$file = __DIR__ . \DIRECTORY_SEPARATOR . 'src' . \DIRECTORY_SEPARATOR . str_replace('\\', \DIRECTORY_SEPARATOR, $name) . '.php';
|
||||
if (file_exists($file)) {
|
||||
require_once $file;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
|
||||
require dirname(__DIR__) . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "alibabacloud/dysmsapi-20170525",
|
||||
"type": "library",
|
||||
"description": "Alibaba Cloud Dysmsapi (20170525) SDK Library for PHP",
|
||||
"github": "https://github.com/aliyun/alibabacloud-php-sdk",
|
||||
"main": "src/Client.php",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Alibaba Cloud SDK",
|
||||
"email": "sdk-team@alibabacloud.com"
|
||||
}
|
||||
],
|
||||
"license": "Apache-2.0",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"AlibabaCloud\\SDK\\Dysmsapi\\V20170525\\": "src"
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"fixer": "php-cs-fixer fix ./"
|
||||
},
|
||||
"config": {
|
||||
"sort-packages": true,
|
||||
"preferred-install": "dist",
|
||||
"optimize-autoloader": true
|
||||
},
|
||||
"require": {
|
||||
"php": ">5.5",
|
||||
"alibabacloud/darabonba": "^1.0.0",
|
||||
"alibabacloud/openapi-core": "^1.0.0"
|
||||
},
|
||||
"prefer-stable": true
|
||||
}
|
||||
5347
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/src/Dysmsapi.php
Normal file
5347
addons/wdsxh/library/alibabacloud/dysmsapi-20170525/src/Dysmsapi.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
|
||||
namespace AlibabaCloud\SDK\Dysmsapi\V20170525\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class AddExtCodeSignRequest extends Model
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $extCode;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $ownerId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $resourceOwnerAccount;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $resourceOwnerId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $signName;
|
||||
protected $_name = [
|
||||
'extCode' => 'ExtCode',
|
||||
'ownerId' => 'OwnerId',
|
||||
'resourceOwnerAccount' => 'ResourceOwnerAccount',
|
||||
'resourceOwnerId' => 'ResourceOwnerId',
|
||||
'signName' => 'SignName',
|
||||
];
|
||||
|
||||
public function validate()
|
||||
{
|
||||
parent::validate();
|
||||
}
|
||||
|
||||
public function toArray($noStream = false)
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->extCode) {
|
||||
$res['ExtCode'] = $this->extCode;
|
||||
}
|
||||
|
||||
if (null !== $this->ownerId) {
|
||||
$res['OwnerId'] = $this->ownerId;
|
||||
}
|
||||
|
||||
if (null !== $this->resourceOwnerAccount) {
|
||||
$res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
|
||||
}
|
||||
|
||||
if (null !== $this->resourceOwnerId) {
|
||||
$res['ResourceOwnerId'] = $this->resourceOwnerId;
|
||||
}
|
||||
|
||||
if (null !== $this->signName) {
|
||||
$res['SignName'] = $this->signName;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap($noStream = false)
|
||||
{
|
||||
return $this->toArray($noStream);
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['ExtCode'])) {
|
||||
$model->extCode = $map['ExtCode'];
|
||||
}
|
||||
|
||||
if (isset($map['OwnerId'])) {
|
||||
$model->ownerId = $map['OwnerId'];
|
||||
}
|
||||
|
||||
if (isset($map['ResourceOwnerAccount'])) {
|
||||
$model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
|
||||
}
|
||||
|
||||
if (isset($map['ResourceOwnerId'])) {
|
||||
$model->resourceOwnerId = $map['ResourceOwnerId'];
|
||||
}
|
||||
|
||||
if (isset($map['SignName'])) {
|
||||
$model->signName = $map['SignName'];
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
|
||||
namespace AlibabaCloud\SDK\Dysmsapi\V20170525\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class AddExtCodeSignResponse extends Model
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
public $headers;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $statusCode;
|
||||
|
||||
/**
|
||||
* @var AddExtCodeSignResponseBody
|
||||
*/
|
||||
public $body;
|
||||
protected $_name = [
|
||||
'headers' => 'headers',
|
||||
'statusCode' => 'statusCode',
|
||||
'body' => 'body',
|
||||
];
|
||||
|
||||
public function validate()
|
||||
{
|
||||
if (\is_array($this->headers)) {
|
||||
Model::validateArray($this->headers);
|
||||
}
|
||||
if (null !== $this->body) {
|
||||
$this->body->validate();
|
||||
}
|
||||
parent::validate();
|
||||
}
|
||||
|
||||
public function toArray($noStream = false)
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->headers) {
|
||||
if (\is_array($this->headers)) {
|
||||
$res['headers'] = [];
|
||||
foreach ($this->headers as $key1 => $value1) {
|
||||
$res['headers'][$key1] = $value1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (null !== $this->statusCode) {
|
||||
$res['statusCode'] = $this->statusCode;
|
||||
}
|
||||
|
||||
if (null !== $this->body) {
|
||||
$res['body'] = null !== $this->body ? $this->body->toArray($noStream) : $this->body;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap($noStream = false)
|
||||
{
|
||||
return $this->toArray($noStream);
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['headers'])) {
|
||||
if (!empty($map['headers'])) {
|
||||
$model->headers = [];
|
||||
foreach ($map['headers'] as $key1 => $value1) {
|
||||
$model->headers[$key1] = $value1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($map['statusCode'])) {
|
||||
$model->statusCode = $map['statusCode'];
|
||||
}
|
||||
|
||||
if (isset($map['body'])) {
|
||||
$model->body = AddExtCodeSignResponseBody::fromMap($map['body']);
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
|
||||
namespace AlibabaCloud\SDK\Dysmsapi\V20170525\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class AddExtCodeSignResponseBody extends Model
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $accessDeniedDetail;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $code;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
public $data;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $message;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $requestId;
|
||||
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
public $success;
|
||||
protected $_name = [
|
||||
'accessDeniedDetail' => 'AccessDeniedDetail',
|
||||
'code' => 'Code',
|
||||
'data' => 'Data',
|
||||
'message' => 'Message',
|
||||
'requestId' => 'RequestId',
|
||||
'success' => 'Success',
|
||||
];
|
||||
|
||||
public function validate()
|
||||
{
|
||||
parent::validate();
|
||||
}
|
||||
|
||||
public function toArray($noStream = false)
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->accessDeniedDetail) {
|
||||
$res['AccessDeniedDetail'] = $this->accessDeniedDetail;
|
||||
}
|
||||
|
||||
if (null !== $this->code) {
|
||||
$res['Code'] = $this->code;
|
||||
}
|
||||
|
||||
if (null !== $this->data) {
|
||||
$res['Data'] = $this->data;
|
||||
}
|
||||
|
||||
if (null !== $this->message) {
|
||||
$res['Message'] = $this->message;
|
||||
}
|
||||
|
||||
if (null !== $this->requestId) {
|
||||
$res['RequestId'] = $this->requestId;
|
||||
}
|
||||
|
||||
if (null !== $this->success) {
|
||||
$res['Success'] = $this->success;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap($noStream = false)
|
||||
{
|
||||
return $this->toArray($noStream);
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['AccessDeniedDetail'])) {
|
||||
$model->accessDeniedDetail = $map['AccessDeniedDetail'];
|
||||
}
|
||||
|
||||
if (isset($map['Code'])) {
|
||||
$model->code = $map['Code'];
|
||||
}
|
||||
|
||||
if (isset($map['Data'])) {
|
||||
$model->data = $map['Data'];
|
||||
}
|
||||
|
||||
if (isset($map['Message'])) {
|
||||
$model->message = $map['Message'];
|
||||
}
|
||||
|
||||
if (isset($map['RequestId'])) {
|
||||
$model->requestId = $map['RequestId'];
|
||||
}
|
||||
|
||||
if (isset($map['Success'])) {
|
||||
$model->success = $map['Success'];
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
|
||||
namespace AlibabaCloud\SDK\Dysmsapi\V20170525\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class AddShortUrlRequest extends Model
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $effectiveDays;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $ownerId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $resourceOwnerAccount;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $resourceOwnerId;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $shortUrlName;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $sourceUrl;
|
||||
protected $_name = [
|
||||
'effectiveDays' => 'EffectiveDays',
|
||||
'ownerId' => 'OwnerId',
|
||||
'resourceOwnerAccount' => 'ResourceOwnerAccount',
|
||||
'resourceOwnerId' => 'ResourceOwnerId',
|
||||
'shortUrlName' => 'ShortUrlName',
|
||||
'sourceUrl' => 'SourceUrl',
|
||||
];
|
||||
|
||||
public function validate()
|
||||
{
|
||||
parent::validate();
|
||||
}
|
||||
|
||||
public function toArray($noStream = false)
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->effectiveDays) {
|
||||
$res['EffectiveDays'] = $this->effectiveDays;
|
||||
}
|
||||
|
||||
if (null !== $this->ownerId) {
|
||||
$res['OwnerId'] = $this->ownerId;
|
||||
}
|
||||
|
||||
if (null !== $this->resourceOwnerAccount) {
|
||||
$res['ResourceOwnerAccount'] = $this->resourceOwnerAccount;
|
||||
}
|
||||
|
||||
if (null !== $this->resourceOwnerId) {
|
||||
$res['ResourceOwnerId'] = $this->resourceOwnerId;
|
||||
}
|
||||
|
||||
if (null !== $this->shortUrlName) {
|
||||
$res['ShortUrlName'] = $this->shortUrlName;
|
||||
}
|
||||
|
||||
if (null !== $this->sourceUrl) {
|
||||
$res['SourceUrl'] = $this->sourceUrl;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap($noStream = false)
|
||||
{
|
||||
return $this->toArray($noStream);
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['EffectiveDays'])) {
|
||||
$model->effectiveDays = $map['EffectiveDays'];
|
||||
}
|
||||
|
||||
if (isset($map['OwnerId'])) {
|
||||
$model->ownerId = $map['OwnerId'];
|
||||
}
|
||||
|
||||
if (isset($map['ResourceOwnerAccount'])) {
|
||||
$model->resourceOwnerAccount = $map['ResourceOwnerAccount'];
|
||||
}
|
||||
|
||||
if (isset($map['ResourceOwnerId'])) {
|
||||
$model->resourceOwnerId = $map['ResourceOwnerId'];
|
||||
}
|
||||
|
||||
if (isset($map['ShortUrlName'])) {
|
||||
$model->shortUrlName = $map['ShortUrlName'];
|
||||
}
|
||||
|
||||
if (isset($map['SourceUrl'])) {
|
||||
$model->sourceUrl = $map['SourceUrl'];
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
|
||||
namespace AlibabaCloud\SDK\Dysmsapi\V20170525\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
|
||||
class AddShortUrlResponse extends Model
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
public $headers;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
public $statusCode;
|
||||
|
||||
/**
|
||||
* @var AddShortUrlResponseBody
|
||||
*/
|
||||
public $body;
|
||||
protected $_name = [
|
||||
'headers' => 'headers',
|
||||
'statusCode' => 'statusCode',
|
||||
'body' => 'body',
|
||||
];
|
||||
|
||||
public function validate()
|
||||
{
|
||||
if (\is_array($this->headers)) {
|
||||
Model::validateArray($this->headers);
|
||||
}
|
||||
if (null !== $this->body) {
|
||||
$this->body->validate();
|
||||
}
|
||||
parent::validate();
|
||||
}
|
||||
|
||||
public function toArray($noStream = false)
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->headers) {
|
||||
if (\is_array($this->headers)) {
|
||||
$res['headers'] = [];
|
||||
foreach ($this->headers as $key1 => $value1) {
|
||||
$res['headers'][$key1] = $value1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (null !== $this->statusCode) {
|
||||
$res['statusCode'] = $this->statusCode;
|
||||
}
|
||||
|
||||
if (null !== $this->body) {
|
||||
$res['body'] = null !== $this->body ? $this->body->toArray($noStream) : $this->body;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap($noStream = false)
|
||||
{
|
||||
return $this->toArray($noStream);
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['headers'])) {
|
||||
if (!empty($map['headers'])) {
|
||||
$model->headers = [];
|
||||
foreach ($map['headers'] as $key1 => $value1) {
|
||||
$model->headers[$key1] = $value1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($map['statusCode'])) {
|
||||
$model->statusCode = $map['statusCode'];
|
||||
}
|
||||
|
||||
if (isset($map['body'])) {
|
||||
$model->body = AddShortUrlResponseBody::fromMap($map['body']);
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
// This file is auto-generated, don't edit it. Thanks.
|
||||
|
||||
namespace AlibabaCloud\SDK\Dysmsapi\V20170525\Models;
|
||||
|
||||
use AlibabaCloud\Dara\Model;
|
||||
use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\AddShortUrlResponseBody\data;
|
||||
|
||||
class AddShortUrlResponseBody extends Model
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $code;
|
||||
|
||||
/**
|
||||
* @var data
|
||||
*/
|
||||
public $data;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $message;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public $requestId;
|
||||
protected $_name = [
|
||||
'code' => 'Code',
|
||||
'data' => 'Data',
|
||||
'message' => 'Message',
|
||||
'requestId' => 'RequestId',
|
||||
];
|
||||
|
||||
public function validate()
|
||||
{
|
||||
if (null !== $this->data) {
|
||||
$this->data->validate();
|
||||
}
|
||||
parent::validate();
|
||||
}
|
||||
|
||||
public function toArray($noStream = false)
|
||||
{
|
||||
$res = [];
|
||||
if (null !== $this->code) {
|
||||
$res['Code'] = $this->code;
|
||||
}
|
||||
|
||||
if (null !== $this->data) {
|
||||
$res['Data'] = null !== $this->data ? $this->data->toArray($noStream) : $this->data;
|
||||
}
|
||||
|
||||
if (null !== $this->message) {
|
||||
$res['Message'] = $this->message;
|
||||
}
|
||||
|
||||
if (null !== $this->requestId) {
|
||||
$res['RequestId'] = $this->requestId;
|
||||
}
|
||||
|
||||
return $res;
|
||||
}
|
||||
|
||||
public function toMap($noStream = false)
|
||||
{
|
||||
return $this->toArray($noStream);
|
||||
}
|
||||
|
||||
public static function fromMap($map = [])
|
||||
{
|
||||
$model = new self();
|
||||
if (isset($map['Code'])) {
|
||||
$model->code = $map['Code'];
|
||||
}
|
||||
|
||||
if (isset($map['Data'])) {
|
||||
$model->data = data::fromMap($map['Data']);
|
||||
}
|
||||
|
||||
if (isset($map['Message'])) {
|
||||
$model->message = $map['Message'];
|
||||
}
|
||||
|
||||
if (isset($map['RequestId'])) {
|
||||
$model->requestId = $map['RequestId'];
|
||||
}
|
||||
|
||||
return $model;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user