zhangguidong преди 2 години
родител
ревизия
781bcf12d0
променени са 100 файла, в които са добавени 3224 реда и са изтрити 2829 реда
  1. 2 1
      composer.json
  2. 3 3
      vendor/adbario/php-dot-notation/composer.json
  3. 6 0
      vendor/adbario/php-dot-notation/src/Dot.php
  4. 1 1
      vendor/alibabacloud/tea/composer.json
  5. 1 0
      vendor/alibabacloud/tea/src/Parameter.php
  6. 6 0
      vendor/alibabacloud/tea/src/Response.php
  7. 4 1
      vendor/alibabacloud/tea/src/Tea.php
  8. 11 1
      vendor/alipaysdk/easysdk/CHANGELOG
  9. 2 9
      vendor/alipaysdk/easysdk/composer.json
  10. 0 87
      vendor/alipaysdk/easysdk/go/README.md
  11. 0 14
      vendor/alipaysdk/easysdk/go/src/kernel/AlipayConstants.go
  12. 0 246
      vendor/alipaysdk/easysdk/go/src/kernel/BaseClient.go
  13. 0 142
      vendor/alipaysdk/easysdk/go/src/kernel/client.go
  14. 0 133
      vendor/alipaysdk/easysdk/go/src/kernel/signer.go
  15. 0 37
      vendor/alipaysdk/easysdk/go/src/tea/debug.go
  16. 0 110
      vendor/alipaysdk/easysdk/go/src/tea/logger.go
  17. 0 60
      vendor/alipaysdk/easysdk/go/src/tea/progress.go
  18. 0 919
      vendor/alipaysdk/easysdk/go/src/tea/tea.go
  19. 0 44
      vendor/alipaysdk/easysdk/go/src/tea/utils.go
  20. 0 46
      vendor/alipaysdk/easysdk/go/src/test/main.go
  21. 1 1
      vendor/alipaysdk/easysdk/java/pom.xml
  22. 1 29
      vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/Factory.java
  23. 1 29
      vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/MultipleFactory.java
  24. 0 32
      vendor/alipaysdk/easysdk/java/src/test/java/com/alipay/easysdk/factory/FactoryTest.java
  25. 1 1
      vendor/alipaysdk/easysdk/php/src/Kernel/AlipayConstants.php
  26. 1 2
      vendor/alipaysdk/easysdk/php/src/Payment/Page/Client.php
  27. 5 0
      vendor/aliyuncs/oss-sdk-php/CHANGELOG.md
  28. 86 0
      vendor/aliyuncs/oss-sdk-php/samples/Bucket.php
  29. 211 0
      vendor/aliyuncs/oss-sdk-php/samples/Object.php
  30. 5 1
      vendor/aliyuncs/oss-sdk-php/src/OSS/Core/OssUtil.php
  31. 19 20
      vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectInfo.php
  32. 167 12
      vendor/aliyuncs/oss-sdk-php/src/OSS/OssClient.php
  33. 84 32
      vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientMultipartUploadTest.php
  34. 1 1
      vendor/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php
  35. 7 7
      vendor/composer/InstalledVersions.php
  36. 35 0
      vendor/composer/autoload_classmap.php
  37. 4 5
      vendor/composer/autoload_files.php
  38. 3 5
      vendor/composer/autoload_psr4.php
  39. 51 27
      vendor/composer/autoload_static.php
  40. 222 327
      vendor/composer/installed.json
  41. 133 151
      vendor/composer/installed.php
  42. 2 2
      vendor/composer/platform_check.php
  43. 22 0
      vendor/guzzlehttp/guzzle/CHANGELOG.md
  44. 14 14
      vendor/guzzlehttp/guzzle/README.md
  45. 4 1
      vendor/guzzlehttp/guzzle/composer.json
  46. 5 0
      vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
  47. 4 2
      vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
  48. 2 2
      vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
  49. 8 1
      vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
  50. 19 7
      vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
  51. 52 0
      vendor/guzzlehttp/psr7/CHANGELOG.md
  52. 33 2
      vendor/guzzlehttp/psr7/README.md
  53. 4 1
      vendor/guzzlehttp/psr7/composer.json
  54. 5 0
      vendor/guzzlehttp/psr7/src/CachingStream.php
  55. 3 0
      vendor/guzzlehttp/psr7/src/DroppingStream.php
  56. 1 0
      vendor/guzzlehttp/psr7/src/FnStream.php
  57. 85 20
      vendor/guzzlehttp/psr7/src/Header.php
  58. 3 0
      vendor/guzzlehttp/psr7/src/InflateStream.php
  59. 1 0
      vendor/guzzlehttp/psr7/src/LazyOpenStream.php
  60. 3 0
      vendor/guzzlehttp/psr7/src/LimitStream.php
  61. 3 0
      vendor/guzzlehttp/psr7/src/Message.php
  62. 38 9
      vendor/guzzlehttp/psr7/src/MessageTrait.php
  63. 1208 101
      vendor/guzzlehttp/psr7/src/MimeType.php
  64. 7 1
      vendor/guzzlehttp/psr7/src/MultipartStream.php
  65. 3 0
      vendor/guzzlehttp/psr7/src/NoSeekStream.php
  66. 1 1
      vendor/guzzlehttp/psr7/src/Query.php
  67. 1 1
      vendor/guzzlehttp/psr7/src/ServerRequest.php
  68. 9 6
      vendor/guzzlehttp/psr7/src/Stream.php
  69. 6 1
      vendor/guzzlehttp/psr7/src/Uri.php
  70. 49 2
      vendor/guzzlehttp/psr7/src/Utils.php
  71. 0 9
      vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json
  72. 0 10
      vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json
  73. 0 9
      vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json
  74. 22 0
      vendor/monolog/monolog/CHANGELOG.md
  75. 1 3
      vendor/monolog/monolog/composer.json
  76. 11 5
      vendor/monolog/monolog/src/Monolog/ErrorHandler.php
  77. 18 5
      vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
  78. 11 1
      vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
  79. 4 0
      vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
  80. 33 4
      vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
  81. 3 3
      vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
  82. 2 1
      vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
  83. 10 1
      vendor/monolog/monolog/src/Monolog/Handler/Handler.php
  84. 2 1
      vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
  85. 2 2
      vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
  86. 2 2
      vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php
  87. 5 1
      vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
  88. 1 1
      vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
  89. 52 9
      vendor/monolog/monolog/src/Monolog/Logger.php
  90. 2 0
      vendor/monolog/monolog/src/Monolog/Test/TestCase.php
  91. 1 1
      vendor/monolog/monolog/src/Monolog/Utils.php
  92. 0 6
      vendor/myclabs/php-enum/.gitattributes
  93. 0 6
      vendor/myclabs/php-enum/.gitignore
  94. 2 2
      vendor/myclabs/php-enum/LICENSE
  95. 22 12
      vendor/myclabs/php-enum/README.md
  96. 4 3
      vendor/myclabs/php-enum/composer.json
  97. 136 22
      vendor/myclabs/php-enum/src/Enum.php
  98. 2 0
      vendor/oygza/aliyun-php-sdk-afs/.gitignore
  99. 201 0
      vendor/oygza/aliyun-php-sdk-afs/LICENSE
  100. 6 0
      vendor/oygza/aliyun-php-sdk-afs/README.md

+ 2 - 1
composer.json

@@ -26,7 +26,8 @@
     "hg/apidoc": "1.1.x",
     "phpoffice/phpexcel": "^1.8",
     "alibabacloud/client": "^1.5",
-    "alipaysdk/easysdk": "^2.0"
+    "alipaysdk/easysdk": "^2.0",
+    "oygza/aliyun-php-sdk-afs": "^1.0"
   },
   "config": {
     "allow-plugins": {

+ 3 - 3
vendor/adbario/php-dot-notation/composer.json

@@ -11,12 +11,12 @@
         }
     ],
     "require": {
-        "php": ">=5.5",
+        "php": "^5.5 || ^7.0 || ^8.0",
         "ext-json": "*"
     },
     "require-dev": {
-        "phpunit/phpunit": "^4.0|^5.0|^6.0",
-        "squizlabs/php_codesniffer": "^3.0"
+        "phpunit/phpunit": "^4.8|^5.7|^6.6|^7.5|^8.5|^9.5",
+        "squizlabs/php_codesniffer": "^3.6"
     },
     "autoload": {
         "files": [

+ 6 - 0
vendor/adbario/php-dot-notation/src/Dot.php

@@ -507,6 +507,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param  int|string $key
      * @return bool
      */
+    #[\ReturnTypeWillChange]
     public function offsetExists($key)
     {
         return $this->has($key);
@@ -518,6 +519,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param  int|string $key
      * @return mixed
      */
+    #[\ReturnTypeWillChange]
     public function offsetGet($key)
     {
         return $this->get($key);
@@ -529,6 +531,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param int|string|null $key
      * @param mixed           $value
      */
+    #[\ReturnTypeWillChange]
     public function offsetSet($key, $value)
     {
         if (is_null($key)) {
@@ -545,6 +548,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      *
      * @param int|string $key
      */
+    #[\ReturnTypeWillChange]
     public function offsetUnset($key)
     {
         $this->delete($key);
@@ -562,6 +566,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param  int|string|null $key
      * @return int
      */
+    #[\ReturnTypeWillChange]
     public function count($key = null)
     {
         return count($this->get($key));
@@ -578,6 +583,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      *
      * @return \ArrayIterator
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     {
         return new ArrayIterator($this->items);

+ 1 - 1
vendor/alibabacloud/tea/composer.json

@@ -31,7 +31,7 @@
         "ext-simplexml": "*",
         "ext-xmlwriter": "*",
         "guzzlehttp/guzzle": "^6.3|^7.0",
-        "adbario/php-dot-notation": "^2.2"
+        "adbario/php-dot-notation": "^2.3"
     },
     "require-dev": {
         "symfony/dotenv": "^3.4",

+ 1 - 0
vendor/alibabacloud/tea/src/Parameter.php

@@ -15,6 +15,7 @@ abstract class Parameter implements IteratorAggregate
     /**
      * @return ArrayIterator|Traversable
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     {
         return new ArrayIterator($this->toArray());

+ 6 - 0
vendor/alibabacloud/tea/src/Response.php

@@ -302,6 +302,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
     /**
      * Retrieve an external iterator.
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     {
         return $this->dot->getIterator();
@@ -314,6 +315,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      * @return bool
      */
+    #[\ReturnTypeWillChange]
     public function offsetExists($offset)
     {
         return $this->dot->offsetExists($offset);
@@ -326,6 +328,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      * @return mixed
      */
+    #[\ReturnTypeWillChange]
     public function offsetGet($offset)
     {
         return $this->dot->offsetGet($offset);
@@ -337,6 +340,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      * @param $offset
      * @param $value
      */
+    #[\ReturnTypeWillChange]
     public function offsetSet($offset, $value)
     {
         $this->dot->offsetSet($offset, $value);
@@ -347,6 +351,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      * @param $offset
      */
+    #[\ReturnTypeWillChange]
     public function offsetUnset($offset)
     {
         $this->dot->offsetUnset($offset);
@@ -359,6 +364,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      * @return int
      */
+    #[\ReturnTypeWillChange]
     public function count($key = null)
     {
         return $this->dot->count($key);

+ 4 - 1
vendor/alibabacloud/tea/src/Tea.php

@@ -173,7 +173,10 @@ class Tea
     public static function allowRetry(array $runtime, $retryTimes, $now)
     {
         unset($now);
-        if (empty($runtime) || !isset($runtime['maxAttempts'])) {
+        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'];

+ 11 - 1
vendor/alipaysdk/easysdk/CHANGELOG

@@ -1,7 +1,11 @@
 最新变更
-修复PHP7.4及其以上环境下,根证书解析报错的问题。
+java删除Factory.getClient方法
+php删除php中多余的composer包
 
 Java版本
+2022-05-06 Version: 2.2.2
+1. 删除Factory.getClient方法
+
 2021-09-04 Version: 2.2.1
 1. 修复Okhttp Response没有主动关闭的问题。
 
@@ -114,6 +118,12 @@ Factory.Util.AES().Encrypt AES加密
 
 
 PHP版本
+2022-05-06 Version: 2.2.2
+1. php删除php中多余的composer包
+
+2021-09-24 Version: 2.2.1
+1. 修复PHP7.4及其以上环境下,根证书解析报错的问题。
+
 2021-01-18 Version: 2.2.0
 1. 增加sdkExecute功能。
 2. 增加fileExecute功能。

+ 2 - 9
vendor/alipaysdk/easysdk/composer.json

@@ -2,7 +2,7 @@
 	"name":"alipaysdk/easysdk",
 	"description":"支付宝官方 Alipay Easy SDK",
 	"type":"library",
-	"version":"2.2.1",
+	"version":"2.2.2",
 	"authors":[
 		{
 			"name":"junying.wjy",
@@ -32,15 +32,8 @@
 		"ext-simplexml":"*",
 		"ext-mbstring":"*",
 		"ext-openssl":"*",
-		"pimple/pimple": "^3.0",
-		"xin/container":"^2.0.1",
-		"guzzlehttp/guzzle":">=6.3",
-		"psr/log": "^1.1",
 		"ext-xmlwriter": "*",
-		"songshenzong/support": "^2.0",
-		"danielstjules/stringy": "^3.1",
-		"mtdowling/jmespath.php": "^2.4",
-		"adbario/php-dot-notation": "^2.2",
+		"guzzlehttp/guzzle":">=6.3",
 		"alibabacloud/tea": "^3.1",
 		"alibabacloud/tea-fileform": "^0.3.2"
     },

+ 0 - 87
vendor/alipaysdk/easysdk/go/README.md

@@ -1,87 +0,0 @@
-欢迎使用 Alipay **Easy** SDK for Go(Beta)。
-
-Alipay Esay SDK for Go让您不用复杂编程即可访支付宝开放平台开放的各项常用能力,SDK可以自动帮您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。
-
-下面向您介绍Alipay Easy SDK for Go 的基本设计理念和使用方法。
-
-## 设计理念
-
-Alipay Easy SDK主要目标是提升开发者在**服务端**集成支付宝开放平台开放的各类核心能力的效率。
-
-## 环境要求
-1. Alipay Easy SDK for Go 需要配合`Go 1.12`或其以上版本。
-
-2. 使用 Alipay Easy SDK for Go 之前 ,您需要先前往[支付宝开发平台-开发者中心](https://openhome.alipay.com/platform/developerIndex.htm)完成开发者接入的一些准备工作,包括创建应用、为应用添加功能包、设置应用的接口加签方式等。
-
-3. 准备工作完成后,注意保存如下信息,后续将作为使用SDK的输入。
-
-* 加签模式为公钥证书模式时(推荐)
-
-`AppId`、`应用的私钥`、`应用公钥证书文件`、`支付宝公钥证书文件`、`支付宝根证书文件`
-
-* 加签模式为公钥模式时
-
-`AppId`、`应用的私钥`、`支付宝公钥`
-
-## 安装
-手动下载go目录下源码集成即可
-
-## 快速使用
-以下这段代码示例向您展示了使用Alipay Easy SDK for Go调用一个API的3个主要步骤:
-
-1. 设置参数(全局只需设置一次)。
-2. 发起API调用。
-3. 处理响应或异常。
-
-```go
-package main
-
-import (
-	"encoding/json"
-	"fmt"
-	"kernel"
-	"time"
-)
-
-func init() {
-	account:= kernel.Client{}
-	account.Protocol = "https"
-	account.GatewayHost = "openapi.alipay.com"
-	account.AppId = "<-- 请填写您的AppId,例如:2019022663440152 -->"
-	account.SignType = "RSA2"
-	account.AlipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->"
-	account.MerchantPrivateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->"
-
-	kernel.InitClient(account)
-}
-
-
-func main() {
-	result, _ := kernel.Execute("alipay.trade.create", nil, getBizParams(time.Now().Format("2006-01-02 15:04:05")))
-	fmt.Println(result)
-}
-
-func getBizParams(outTradeNo string) map[string]string {
-	bizParams := map[string]string{
-		"subject":       "phone6 16G",
-		"out_trade_no":  outTradeNo,
-		"total_amount":  "0.10",
-		"buyer_id":      "2088002656718920",
-		"extend_params": getHuabeiParams(),
-	}
-	return bizParams
-}
-
-func getHuabeiParams() string {
-	extendParams := map[string]string{
-		"hb_fq_num":            "3",
-		"hb_fq_seller_percent": "3",
-	}
-	byt, _ := json.Marshal(extendParams)
-	return string(byt)
-}
-```
-
-## 文档
-
-[Alipay Easy SDK](./../README.md)

+ 0 - 14
vendor/alipaysdk/easysdk/go/src/kernel/AlipayConstants.go

@@ -1,14 +0,0 @@
-package kernel
-
-/**
- * 与网关HTTP交互中涉及到的字段值
- */
-const bizContent = "biz_content"
-const alipayCertSN = "alipay_cert_sn"
-const signField = "sign"
-const bodyField = "http_body"
-const notifyUrl = "notify_url"
-const methodField = "method"
-const response = "_response"
-const errorResponse = "error_response"
-const sdkVersion = "alipay-easysdk-go-1.0.0"

+ 0 - 246
vendor/alipaysdk/easysdk/go/src/kernel/BaseClient.go

@@ -1,246 +0,0 @@
-package kernel
-
-import (
-	"encoding/base64"
-	"encoding/json"
-	"fmt"
-	"io"
-	"io/ioutil"
-	Sort "sort"
-	"strings"
-	"tea"
-	"time"
-)
-
-var this Client
-
-func GetConfig(key string) string {
-	if key == "protocol" {
-		return this.Protocol
-	} else if key == "gatewayHost" {
-		return this.GatewayHost
-	} else if key == "appId" {
-		return this.AppId
-	} else if key == "signType" {
-		return this.SignType
-	} else if key == "alipayPublicKey" {
-		return this.AlipayPublicKey
-	} else if key == "merchantPrivateKey" {
-		return this.MerchantPrivateKey
-	} else if key == "merchantCertPath" {
-		return this.MerchantCertPath
-	} else if key == "alipayCertPath" {
-		return this.AlipayCertPath
-	} else if key == "alipayRootCertPath" {
-		return this.AlipayRootCertPath
-	} else if key == "notifyUrl" {
-		return this.NotifyUrl
-	} else if key == "encryptKey" {
-		return this.EncryptKey
-	} else {
-		panic(key + " is illegal")
-	}
-}
-
-func InitClient(config Client) {
-	this = config
-}
-
-/**
-获取时间戳,格式yyyy-MM-dd HH:mm:ss
-*/
-func GetTimestamp() string {
-	return time.Now().Format("2006-01-02 15:04:05")
-}
-
-func GetSdkVersion() string {
-	return sdkVersion
-}
-
-func GetMerchantCertSN() string {
-	return this.MerchantCertSN
-}
-
-func GetAlipayCertSN(alipayCertSN map[string]string) string {
-	return this.AlipayCertSN
-}
-
-func GetAlipayRootCertSN() string {
-	return this.AlipayRootCertSN
-}
-
-func ExtractAlipayPublicKey(alipayPublicKey string) string {
-	return this.AlipayCertSN
-}
-
-func IsCertMode() bool {
-	if len(this.AlipayCertSN) != 0 {
-		return true
-	} else {
-		return false
-	}
-}
-
-/**
-将业务参数和其他额外文本参数按www-form-urlencoded格式转换成HTTP Body中的字节数组,注意要做URL Encode
-*/
-func ToUrlEncodedRequestBody(bizParams map[string]string) string {
-	sortedMap := getSortedMap(nil, bizParams, nil)
-	if sortedMap == nil {
-		return ""
-	}
-	return buildQueryString(bizParams)
-}
-
-func buildQueryString(sortedMap map[string]string) string {
-	requestUrl := ""
-	keys := make([]string, 0)
-	for k, _ := range sortedMap {
-		keys = append(keys, k)
-	}
-	Sort.Strings(keys)
-	var pList = make([]string, 0, 0)
-	for _, key := range keys {
-		pList = append(pList, key+"="+sortedMap[key])
-	}
-	requestUrl = strings.Join(pList, "&")
-	return requestUrl
-}
-
-func getSortedMap(systemParams map[string]string, bizParams map[string]string, textParams map[string]string) map[string]string {
-	sortedMap := tea.Merge(systemParams, bizParams, textParams)
-	sortedMap = SortMap(sortedMap)
-	return sortedMap
-}
-
-func SortMap(romanNumeralDict map[string]string) map[string]string {
-	keys := make([]string, 0)
-	for k, _ := range romanNumeralDict {
-		keys = append(keys, k)
-	}
-	Sort.Strings(keys)
-	return romanNumeralDict
-}
-
-/**
-计算签名
-*/
-func Sign(systemParams map[string]string, bizParams map[string]string, textParams map[string]string, privateKey string) string {
-	if bizParams != nil {
-		byt, _ := json.Marshal(bizParams)
-		bizParams[bizContent] = string(byt)
-	}
-	sortedMap := getSortedMap(systemParams, bizParams, textParams)
-	data := buildQueryString(sortedMap)
-	var prvKey = formatKey(privateKey, `-----BEGIN RSA PRIVATE KEY-----`, `-----END RSA PRIVATE KEY-----`, 64)
-	signData := RsaSignWithSha256([]byte(data), prvKey)
-	return base64.StdEncoding.EncodeToString(signData)
-}
-
-func Verify(respMap map[string]string, alipayPublicKey string) bool {
-	resp := respMap[bodyField]
-	method := respMap[methodField]
-	content, sign := getSignSourceData(resp, method)
-	signBytes, err := base64.StdEncoding.DecodeString(sign)
-	if err != nil {
-		return false
-	}
-	pubKey := formatKey(alipayPublicKey, `-----BEGIN PUBLIC KEY-----`, `-----END PUBLIC KEY-----`, 64)
-	result := RsaVerySignWithSha256([]byte(content), signBytes, pubKey)
-	return result
-}
-
-func getSignSourceData(body string, method string) (content string, sign string) {
-	var rootNodeName = strings.Replace(method, ".", "_", -1) + response
-	var rootIndex = strings.LastIndex(body, rootNodeName)
-	var errorIndex = strings.LastIndex(body, errorResponse)
-	if rootIndex > 0 {
-		return parserJSONSource(body, rootNodeName, rootIndex)
-	} else if errorIndex > 0 {
-		return parserJSONSource(body, errorResponse, errorIndex)
-	} else {
-		return "", ""
-	}
-}
-
-func parserJSONSource(responseContent string, nodeName string, nodeIndex int) (content string, sign string) {
-	signDataStartIndex := nodeIndex + len(nodeName) + 2
-	signIndex := 0
-	if strings.LastIndex(responseContent, alipayCertSN) > 0 {
-		signIndex = strings.LastIndex(responseContent, "\""+alipayCertSN+"\"")
-	} else {
-		signIndex = strings.LastIndex(responseContent, "\""+signField+"\"")
-	}
-	signDataEndIndex := signIndex - 1
-	indexLen := signDataEndIndex - signDataStartIndex
-	if indexLen < 0 {
-		return "", ""
-	}
-	content = responseContent[signDataStartIndex:signDataEndIndex]
-	sign = responseContent[signIndex+8 : len(responseContent)-2]
-	return content, sign
-}
-
-func ToRespModel(resp map[string]string) map[string]interface{} {
-	body := resp[bodyField]
-	method := resp[methodField]
-	content, _ := getSignSourceData(body, method)
-	result := map[string]interface{}{
-		bodyField: body,
-	}
-	arg := make(map[string]interface{})
-	err := json.Unmarshal([]byte(content), &arg)
-	tmp := make(map[string]string)
-	err = json.Unmarshal([]byte(content), &tmp)
-	if err == nil {
-		for key, value := range arg {
-			if value != "" {
-				result[key] = value
-			}
-		}
-	}
-	return result
-}
-
-/**
-解析网关响应内容,同时将API的接口名称和响应原文插入到响应数组的method和body字段中
-*/
-func ReadAsJson(response io.Reader, method string) (map[string]string, error) {
-	byt, err := ioutil.ReadAll(response)
-	if err != nil {
-		return nil, err
-	}
-	err = json.Unmarshal(byt, response)
-	result := map[string]string{
-		bodyField:   string(byt),
-		methodField: method,
-	}
-	return result, err
-}
-
-func AesDecrypt(cipherText string, encryptKey string) {
-	de:=AESDecrypt([]byte(cipherText), []byte(encryptKey))
-	fmt.Println(de)
-}
-
-func AesEncrypt(plainText string, encryptKey string) {
-	en := AESEncrypt([]byte(plainText), []byte(encryptKey))
-	fmt.Println(en)
-}
-
-type Client struct {
-	Protocol           string
-	GatewayHost        string
-	AppId              string
-	SignType           string
-	AlipayPublicKey    string
-	MerchantPrivateKey string
-	MerchantCertPath   string
-	AlipayCertPath     string
-	AlipayRootCertPath string
-	NotifyUrl          string
-	EncryptKey         string
-	MerchantCertSN     string
-	AlipayCertSN       string
-	AlipayRootCertSN   string
-}

+ 0 - 142
vendor/alipaysdk/easysdk/go/src/kernel/client.go

@@ -1,142 +0,0 @@
-package kernel
-
-
-import (
-	"tea"
-)
-
-type AlipayOpenApiGenericResponse struct {
-	HttpBody *string `json:"http_body" xml:"http_body" require:"true"`
-	Code *string `json:"code" xml:"code" require:"true"`
-	Msg *string `json:"msg" xml:"msg" require:"true"`
-	SubCode *string `json:"sub_code" xml:"sub_code" require:"true"`
-	SubMsg *string `json:"sub_msg" xml:"sub_msg" require:"true"`
-}
-
-func (s AlipayOpenApiGenericResponse) String() string {
-	return tea.Prettify(s)
-}
-
-func (s AlipayOpenApiGenericResponse) GoString() string {
-	return s.String()
-}
-
-func (s *AlipayOpenApiGenericResponse) SetHttpBody(v string) *AlipayOpenApiGenericResponse {
-	s.HttpBody = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetCode(v string) *AlipayOpenApiGenericResponse {
-	s.Code = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetMsg(v string) *AlipayOpenApiGenericResponse {
-	s.Msg = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetSubCode(v string) *AlipayOpenApiGenericResponse {
-	s.SubCode = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetSubMsg(v string) *AlipayOpenApiGenericResponse {
-	s.SubMsg = &v
-	return s
-}
-
-func NewClient()(*Client, error) {
-	client := new(Client)
-	err := client.Init()
-	return client, err
-}
-
-func (client *Client)Init()(_err error) {
-	return nil
-}
-
-
-func Execute(method string, textParams map[string]string, bizParams map[string]string) (_result *AlipayOpenApiGenericResponse, _err error) {
-	_runtime := map[string]interface{}{
-		"connectTimeout": 15000,
-		"readTimeout": 15000,
-		"retry": map[string]int{
-			"maxAttempts": 0,
-		},
-	}
-
-	_resp := &AlipayOpenApiGenericResponse{}
-	for _retryTimes := 0; tea.AllowRetry(_runtime["retry"], _retryTimes); _retryTimes++ {
-		if _retryTimes > 0 {
-			_backoffTime := tea.GetBackoffTime(_runtime["backoff"], _retryTimes)
-			if _backoffTime > 0 {
-				tea.Sleep(_backoffTime)
-			}
-		}
-
-		_resp, _err = func()(*AlipayOpenApiGenericResponse, error){
-			request_ := tea.NewRequest()
-			systemParams := map[string]string{
-				"method": method,
-				"app_id": GetConfig("appId"),
-				"timestamp": GetTimestamp(),
-				"format": "json",
-				"version": "1.0",
-				"alipay_sdk": GetSdkVersion(),
-				"charset": "UTF-8",
-				"sign_type": GetConfig("signType"),
-				"app_cert_sn": GetMerchantCertSN(),
-				"alipay_root_cert_sn": GetAlipayRootCertSN(),
-			}
-			request_.Protocol = GetConfig("protocol")
-			request_.Method = "POST"
-			request_.Pathname = "/gateway.do"
-			request_.Headers = map[string]string{
-				"host": GetConfig("gatewayHost"),
-				"content-type": "application/x-www-form-urlencoded;charset=utf-8",
-			}
-			request_.Query = SortMap(tea.Merge(map[string]string{
-				"sign": Sign(systemParams, bizParams, textParams, GetConfig("merchantPrivateKey")),
-			},systemParams,
-				textParams))
-			request_.Body = tea.ToReader(ToUrlEncodedRequestBody(bizParams))
-			response_, _err := tea.DoRequest(request_, _runtime)
-			if _err != nil {
-				return nil, _err
-			}
-			respMap, _err := ReadAsJson(response_.Body, method)
-			if _err != nil {
-				return nil, _err
-			}
-
-			if IsCertMode() {
-				if Verify(respMap, ExtractAlipayPublicKey(GetAlipayCertSN(respMap))) {
-					_result = &AlipayOpenApiGenericResponse{}
-					_body := ToRespModel(respMap)
-					_err = tea.Convert(_body, &_result)
-					return _result, _err
-				}
-
-			} else {
-				if Verify(respMap, GetConfig("alipayPublicKey")) {
-					_result = &AlipayOpenApiGenericResponse{}
-					_body := ToRespModel(respMap)
-					_err = tea.Convert(_body, &_result)
-					return _result, _err
-				}
-
-			}
-
-			_err = tea.NewSDKError(map[string]interface{}{
-				"message": "验签失败,请检查支付宝公钥设置是否正确。",
-			})
-			return nil, _err
-		}()
-		if !tea.Retryable(_err) {
-			break
-		}
-	}
-
-	return _resp, _err
-}

+ 0 - 133
vendor/alipaysdk/easysdk/go/src/kernel/signer.go

@@ -1,133 +0,0 @@
-package kernel
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/rand"
-	"crypto/rsa"
-	"crypto/sha256"
-	"crypto/x509"
-	"encoding/pem"
-	"errors"
-	"fmt"
-	"strings"
-)
-
-//签名
-func RsaSignWithSha256(data []byte, keyBytes []byte) []byte {
-	h := sha256.New()
-	h.Write(data)
-	hashed := h.Sum(nil)
-	block, _ := pem.Decode(keyBytes)
-	if block == nil {
-		panic(errors.New("private key error"))
-	}
-	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		fmt.Println("ParsePKCS8PrivateKey err", err)
-		panic(err)
-	}
-
-	signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed)
-	if err != nil {
-		fmt.Printf("Error from signing: %s\n", err)
-		panic(err)
-	}
-
-	return signature
-}
-
-//验证
-func RsaVerySignWithSha256(data, signData, keyBytes []byte) bool {
-	block, _ := pem.Decode(keyBytes)
-	if block == nil {
-		panic(errors.New("public key error"))
-	}
-	pubKey, err := x509.ParsePKIXPublicKey(block.Bytes)
-	if err != nil {
-		panic(err)
-	}
-
-	hashed := sha256.Sum256(data)
-	err = rsa.VerifyPKCS1v15(pubKey.(*rsa.PublicKey), crypto.SHA256, hashed[:], signData)
-	if err != nil {
-		panic(err)
-	}
-	return true
-}
-
-func formatKey(raw, prefix, suffix string, lineCount int) []byte {
-	if raw == "" {
-		return nil
-	}
-	raw = strings.Replace(raw, prefix, "", 1)
-	raw = strings.Replace(raw, suffix, "", 1)
-	raw = strings.Replace(raw, " ", "", -1)
-	raw = strings.Replace(raw, "\n", "", -1)
-	raw = strings.Replace(raw, "\r", "", -1)
-	raw = strings.Replace(raw, "\t", "", -1)
-	var sl = len(raw)
-	var c = sl / lineCount
-	if sl%lineCount > 0 {
-		c = c + 1
-	}
-
-	var buf bytes.Buffer
-	buf.WriteString(prefix + "\n")
-	for i := 0; i < c; i++ {
-		var b = i * lineCount
-		var e = b + lineCount
-		if e > sl {
-			buf.WriteString(raw[b:])
-		} else {
-			buf.WriteString(raw[b:e])
-		}
-		buf.WriteString("\n")
-	}
-	buf.WriteString(suffix)
-	return buf.Bytes()
-}
-
-//解密
-func AESDecrypt(crypted, key []byte) []byte {
-	block, _ := aes.NewCipher(key)
-	blockSize := block.BlockSize()
-	blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
-	origData := make([]byte, len(crypted))
-	blockMode.CryptBlocks(origData, crypted)
-	origData = PKCS7UnPadding(origData)
-	return origData
-}
-
-//去补码
-func PKCS7UnPadding(origData []byte) []byte {
-	length := len(origData)
-	unpadding := int(origData[length-1])
-	return origData[:length-unpadding]
-}
-
-//加密
-func AESEncrypt(origData, key []byte) []byte {
-	//获取block块
-	block, _ := aes.NewCipher(key)
-	//补码
-	origData = PKCS7Padding(origData, block.BlockSize())
-	//加密模式,
-	blockMode := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
-	//创建明文长度的数组
-	crypted := make([]byte, len(origData))
-	//加密明文
-	blockMode.CryptBlocks(crypted, origData)
-	return crypted
-}
-
-//补码
-func PKCS7Padding(origData []byte, blockSize int) []byte {
-	//计算需要补几位数
-	padding := blockSize - len(origData)%blockSize
-	//在切片后面追加char数量的byte(char)
-	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
-	return append(origData, padtext...)
-}

+ 0 - 37
vendor/alipaysdk/easysdk/go/src/tea/debug.go

@@ -1,37 +0,0 @@
-package tea
-
-
-import (
-	"fmt"
-	"os"
-	"strings"
-)
-
-type Debug func(format string, v ...interface{})
-
-var hookGetEnv = func() string {
-	return os.Getenv("DEBUG")
-}
-
-var hookPrint = func(input string) {
-	fmt.Println(input)
-}
-
-func Init(flag string) Debug {
-	enable := false
-
-	env := hookGetEnv()
-	parts := strings.Split(env, ",")
-	for _, part := range parts {
-		if part == flag {
-			enable = true
-			break
-		}
-	}
-
-	return func(format string, v ...interface{}) {
-		if enable {
-			hookPrint(fmt.Sprintf(format, v...))
-		}
-	}
-}

+ 0 - 110
vendor/alipaysdk/easysdk/go/src/tea/logger.go

@@ -1,110 +0,0 @@
-package tea
-
-
-import (
-	"io"
-	"log"
-	"strings"
-	"time"
-)
-
-type Logger struct {
-	*log.Logger
-	formatTemplate string
-	isOpen         bool
-	lastLogMsg     string
-}
-
-var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
-var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_body}", "{res_headers}", "{cost}"}
-var logChannel string
-
-func InitLogMsg(fieldMap map[string]string) {
-	for _, value := range loggerParam {
-		fieldMap[value] = ""
-	}
-}
-
-func (logger *Logger) SetFormatTemplate(template string) {
-	logger.formatTemplate = template
-
-}
-
-func (logger *Logger) GetFormatTemplate() string {
-	return logger.formatTemplate
-
-}
-
-func NewLogger(level string, channel string, out io.Writer, template string) *Logger {
-	if level == "" {
-		level = "info"
-	}
-
-	logChannel = "AlibabaCloud"
-	if channel != "" {
-		logChannel = channel
-	}
-	log := log.New(out, "["+strings.ToUpper(level)+"]", log.Lshortfile)
-	if template == "" {
-		template = defaultLoggerTemplate
-	}
-
-	return &Logger{
-		Logger:         log,
-		formatTemplate: template,
-		isOpen:         true,
-	}
-}
-
-func (logger *Logger) OpenLogger() {
-	logger.isOpen = true
-}
-
-func (logger *Logger) CloseLogger() {
-	logger.isOpen = false
-}
-
-func (logger *Logger) SetIsopen(isopen bool) {
-	logger.isOpen = isopen
-}
-
-func (logger *Logger) GetIsopen() bool {
-	return logger.isOpen
-}
-
-func (logger *Logger) SetLastLogMsg(lastLogMsg string) {
-	logger.lastLogMsg = lastLogMsg
-}
-
-func (logger *Logger) GetLastLogMsg() string {
-	return logger.lastLogMsg
-}
-
-func SetLogChannel(channel string) {
-	logChannel = channel
-}
-
-func (logger *Logger) PrintLog(fieldMap map[string]string, err error) {
-	if err != nil {
-		fieldMap["{error}"] = err.Error()
-	}
-	fieldMap["{time}"] = time.Now().Format("2006-01-02 15:04:05")
-	fieldMap["{ts}"] = getTimeInFormatISO8601()
-	fieldMap["{channel}"] = logChannel
-	if logger != nil {
-		logMsg := logger.formatTemplate
-		for key, value := range fieldMap {
-			logMsg = strings.Replace(logMsg, key, value, -1)
-		}
-		logger.lastLogMsg = logMsg
-		if logger.isOpen == true {
-			logger.Output(2, logMsg)
-		}
-	}
-}
-
-func getTimeInFormatISO8601() (timeStr string) {
-	gmt := time.FixedZone("GMT", 0)
-
-	return time.Now().In(gmt).Format("2006-01-02T15:04:05Z")
-}

+ 0 - 60
vendor/alipaysdk/easysdk/go/src/tea/progress.go

@@ -1,60 +0,0 @@
-package tea
-
-// ProgressEventType defines transfer progress event type
-type ProgressEventType int
-
-const (
-	// TransferStartedEvent transfer started, set TotalBytes
-	TransferStartedEvent ProgressEventType = 1 + iota
-	// TransferDataEvent transfer data, set ConsumedBytes anmd TotalBytes
-	TransferDataEvent
-	// TransferCompletedEvent transfer completed
-	TransferCompletedEvent
-	// TransferFailedEvent transfer encounters an error
-	TransferFailedEvent
-)
-
-// ProgressEvent defines progress event
-type ProgressEvent struct {
-	ConsumedBytes int64
-	TotalBytes    int64
-	RwBytes       int64
-	EventType     ProgressEventType
-}
-
-// ProgressListener listens progress change
-type ProgressListener interface {
-	ProgressChanged(event *ProgressEvent)
-}
-
-// -------------------- Private --------------------
-
-func NewProgressEvent(eventType ProgressEventType, consumed, total int64, rwBytes int64) *ProgressEvent {
-	return &ProgressEvent{
-		ConsumedBytes: consumed,
-		TotalBytes:    total,
-		RwBytes:       rwBytes,
-		EventType:     eventType}
-}
-
-// publishProgress
-func PublishProgress(listener ProgressListener, event *ProgressEvent) {
-	if listener != nil && event != nil {
-		listener.ProgressChanged(event)
-	}
-}
-
-func GetProgressListener(obj interface{}) ProgressListener {
-	if obj == nil {
-		return nil
-	}
-	listener, ok := obj.(ProgressListener)
-	if !ok {
-		return nil
-	}
-	return listener
-}
-
-type ReaderTracker struct {
-	CompletedBytes int64
-}

+ 0 - 919
vendor/alipaysdk/easysdk/go/src/tea/tea.go

@@ -1,919 +0,0 @@
-package tea
-
-
-import (
-	"bytes"
-	"context"
-	"crypto/tls"
-	"encoding/base64"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"math"
-	"math/rand"
-	"net"
-	"net/http"
-	"net/url"
-	"os"
-	"reflect"
-	"regexp"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-
-	"golang.org/x/net/proxy"
-)
-
-var debugLog = Init("tea")
-
-var hookDo = func(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) {
-	return fn
-}
-
-var basicTypes = []string{
-	"int", "int64", "float32", "float64", "string", "bool", "uint64",
-}
-
-// Verify whether the parameters meet the requirements
-var validateParams = []string{"require", "pattern", "maxLength"}
-
-// CastError is used for cast type fails
-type CastError struct {
-	Message string
-}
-
-// Request is used wrap http request
-type Request struct {
-	Protocol string
-	Port     int
-	Method   string
-	Pathname string
-	Domain   string
-	Headers  map[string]string
-	Query    map[string]string
-	Body     io.Reader
-}
-
-// Response is use d wrap http response
-type Response struct {
-	Body          io.ReadCloser
-	StatusCode    int
-	StatusMessage string
-	Headers       map[string]string
-}
-
-// SDKError struct is used save error code and message
-type SDKError struct {
-	Code    string
-	Message string
-	Data    string
-}
-
-// RuntimeObject is used for converting http configuration
-type RuntimeObject struct {
-	IgnoreSSL      bool                   `json:"ignoreSSL" xml:"ignoreSSL"`
-	ReadTimeout    int                    `json:"readTimeout" xml:"readTimeout"`
-	ConnectTimeout int                    `json:"connectTimeout" xml:"connectTimeout"`
-	LocalAddr      string                 `json:"localAddr" xml:"localAddr"`
-	HttpProxy      string                 `json:"httpProxy" xml:"httpProxy"`
-	HttpsProxy     string                 `json:"httpsProxy" xml:"httpsProxy"`
-	NoProxy        string                 `json:"noProxy" xml:"noProxy"`
-	MaxIdleConns   int                    `json:"maxIdleConns" xml:"maxIdleConns"`
-	Socks5Proxy    string                 `json:"socks5Proxy" xml:"socks5Proxy"`
-	Socks5NetWork  string                 `json:"socks5NetWork" xml:"socks5NetWork"`
-	Listener       ProgressListener       `json:"listener" xml:"listener"`
-	Tracker        *ReaderTracker          `json:"tracker" xml:"tracker"`
-	Logger         *Logger                 `json:"logger" xml:"logger"`
-}
-
-type teaClient struct {
-	sync.Mutex
-	httpClient *http.Client
-	ifInit     bool
-}
-
-var clientPool = &sync.Map{}
-
-func (r *RuntimeObject) getClientTag(domain string) string {
-	return strconv.FormatBool(r.IgnoreSSL) + strconv.Itoa(r.ReadTimeout) +
-		strconv.Itoa(r.ConnectTimeout) + r.LocalAddr + r.HttpProxy +
-		r.HttpsProxy + r.NoProxy + r.Socks5Proxy + r.Socks5NetWork + domain
-}
-
-// NewRuntimeObject is used for shortly create runtime object
-func NewRuntimeObject(runtime map[string]interface{}) *RuntimeObject {
-	if runtime == nil {
-		return &RuntimeObject{}
-	}
-
-	runtimeObject := &RuntimeObject{
-		IgnoreSSL:      TransInterfaceToBool(runtime["ignoreSSL"]),
-		ReadTimeout:    TransInterfaceToInt(runtime["readTimeout"]),
-		ConnectTimeout: TransInterfaceToInt(runtime["connectTimeout"]),
-		LocalAddr:      TransInterfaceToString(runtime["localAddr"]),
-		HttpProxy:      TransInterfaceToString(runtime["httpProxy"]),
-		HttpsProxy:     TransInterfaceToString(runtime["httpsProxy"]),
-		NoProxy:        TransInterfaceToString(runtime["noProxy"]),
-		MaxIdleConns:   TransInterfaceToInt(runtime["maxIdleConns"]),
-		Socks5Proxy:    TransInterfaceToString(runtime["socks5Proxy"]),
-		Socks5NetWork:  TransInterfaceToString(runtime["socks5NetWork"]),
-	}
-	if runtime["listener"] != nil {
-		runtimeObject.Listener = runtime["listener"].(ProgressListener)
-	}
-	if runtime["tracker"] != nil {
-		runtimeObject.Tracker = runtime["tracker"].(*ReaderTracker)
-	}
-	if runtime["logger"] != nil {
-		runtimeObject.Logger = runtime["logger"].(*Logger)
-	}
-	return runtimeObject
-}
-
-// NewCastError is used for cast type fails
-func NewCastError(message string) (err error) {
-	return &CastError{
-		Message: message,
-	}
-}
-
-// NewRequest is used shortly create Request
-func NewRequest() (req *Request) {
-	return &Request{
-		Headers: map[string]string{},
-		Query:   map[string]string{},
-	}
-}
-
-// NewResponse is create response with http response
-func NewResponse(httpResponse *http.Response) (res *Response) {
-	res = &Response{}
-	res.Body = httpResponse.Body
-	res.Headers = make(map[string]string)
-	res.StatusCode = httpResponse.StatusCode
-	res.StatusMessage = httpResponse.Status
-	return
-}
-
-// NewSDKError is used for shortly create SDKError object
-func NewSDKError(obj map[string]interface{}) *SDKError {
-	err := &SDKError{}
-	if val, ok := obj["code"].(int); ok {
-		err.Code = strconv.Itoa(val)
-	} else if val, ok := obj["code"].(string); ok {
-		err.Code = val
-	}
-
-	if obj["message"] != nil {
-		err.Message = obj["message"].(string)
-	}
-	if data := obj["data"]; data != nil {
-		byt, _ := json.Marshal(data)
-		err.Data = string(byt)
-	}
-	return err
-}
-
-// Return message of CastError
-func (err *CastError) Error() string {
-	return err.Message
-}
-
-// Convert is use convert map[string]interface object to struct
-func Convert(in interface{}, out interface{}) error {
-	byt, _ := json.Marshal(in)
-	err := json.Unmarshal(byt, out)
-	return err
-}
-
-// ReadBody is used read response body
-func (response *Response) ReadBody() (body []byte, err error) {
-	defer response.Body.Close()
-	var buffer [512]byte
-	result := bytes.NewBuffer(nil)
-
-	for {
-		n, err := response.Body.Read(buffer[0:])
-		result.Write(buffer[0:n])
-		if err != nil && err == io.EOF {
-			break
-		} else if err != nil {
-			return nil, err
-		}
-	}
-	return result.Bytes(), nil
-}
-
-func getTeaClient(tag string) *teaClient {
-	client, ok := clientPool.Load(tag)
-	if client == nil && !ok {
-		client = &teaClient{
-			httpClient: &http.Client{},
-			ifInit:     false,
-		}
-		clientPool.Store(tag, client)
-	}
-	return client.(*teaClient)
-}
-
-// DoRequest is used send request to server
-func DoRequest(request *Request, requestRuntime map[string]interface{}) (response *Response, err error) {
-	runtimeObject := NewRuntimeObject(requestRuntime)
-	fieldMap := make(map[string]string)
-	InitLogMsg(fieldMap)
-	defer func() {
-		if runtimeObject.Logger != nil {
-			runtimeObject.Logger.PrintLog(fieldMap, err)
-		}
-	}()
-	if request.Method == "" {
-		request.Method = "GET"
-	}
-
-	if request.Protocol == "" {
-		request.Protocol = "http"
-	} else {
-		request.Protocol = strings.ToLower(request.Protocol)
-	}
-
-	if request.Protocol == "http" {
-		request.Port = 80
-	} else if request.Protocol == "https" {
-		request.Port = 443
-	}
-
-	requestURL := ""
-	request.Domain = request.Headers["host"]
-	matched, _ := regexp.MatchString(":", request.Domain)
-	if matched {
-		requestURL = fmt.Sprintf("%s://%s%s", request.Protocol, request.Domain, request.Pathname)
-	} else {
-		requestURL = fmt.Sprintf("%s://%s:%d%s", request.Protocol, request.Domain, request.Port, request.Pathname)
-	}
-	queryParams := request.Query
-	// sort QueryParams by key
-	q := url.Values{}
-	for key, value := range queryParams {
-		q.Add(key, value)
-	}
-	querystring := q.Encode()
-	if len(querystring) > 0 {
-		if strings.Contains(requestURL, "?") {
-			requestURL = fmt.Sprintf("%s&%s", requestURL, querystring)
-		} else {
-			requestURL = fmt.Sprintf("%s?%s", requestURL, querystring)
-		}
-	}
-	debugLog("> %s %s", request.Method, requestURL)
-
-	httpRequest, err := http.NewRequest(request.Method, requestURL, request.Body)
-	if err != nil {
-		return
-	}
-	httpRequest.Host = request.Domain
-
-	client := getTeaClient(runtimeObject.getClientTag(request.Domain))
-	client.Lock()
-	if !client.ifInit {
-		trans, err := getHttpTransport(request, runtimeObject)
-		if err != nil {
-			return nil, err
-		}
-		client.httpClient.Timeout = time.Duration(runtimeObject.ConnectTimeout) * time.Second
-		client.httpClient.Transport = trans
-		client.ifInit = true
-	}
-	client.Unlock()
-	for key, value := range request.Headers {
-		if value == "" || key == "content-length" {
-			continue
-		} else if key == "host" {
-			httpRequest.Header["Host"] = []string{value}
-		} else {
-			httpRequest.Header[key] = []string{value}
-		}
-		debugLog("> %s: %s", key, value)
-	}
-	contentlength, _ := strconv.Atoi(request.Headers["content-length"])
-	event := NewProgressEvent(TransferStartedEvent, 0, int64(contentlength), 0)
-	PublishProgress(runtimeObject.Listener, event)
-
-	putMsgToMap(fieldMap, httpRequest)
-	startTime := time.Now()
-	fieldMap["{start_time}"] = startTime.Format("2006-01-02 15:04:05")
-	res, err := hookDo(client.httpClient.Do)(httpRequest)
-	fieldMap["{cost}"] = time.Since(startTime).String()
-	completedBytes := int64(0)
-	if runtimeObject.Tracker != nil {
-		completedBytes = runtimeObject.Tracker.CompletedBytes
-	}
-	if err != nil {
-		event = NewProgressEvent(TransferFailedEvent, completedBytes, int64(contentlength), 0)
-		PublishProgress(runtimeObject.Listener, event)
-		return
-	}
-
-	event = NewProgressEvent(TransferCompletedEvent, completedBytes, int64(contentlength), 0)
-	PublishProgress(runtimeObject.Listener, event)
-
-	response = NewResponse(res)
-	fieldMap["{code}"] = strconv.Itoa(res.StatusCode)
-	fieldMap["{res_headers}"] = TransToString(res.Header)
-	debugLog("< HTTP/1.1 %s", res.Status)
-	for key, value := range res.Header {
-		debugLog("< %s: %s", key, strings.Join(value, ""))
-		if len(value) != 0 {
-			response.Headers[strings.ToLower(key)] = value[0]
-		}
-	}
-	return
-}
-
-func getHttpTransport(req *Request, runtime *RuntimeObject) (*http.Transport, error) {
-	trans := new(http.Transport)
-	httpProxy, err := getHttpProxy(req.Protocol, req.Domain, runtime)
-	if err != nil {
-		return nil, err
-	}
-	trans.TLSClientConfig = &tls.Config{
-		InsecureSkipVerify: runtime.IgnoreSSL,
-	}
-	if httpProxy != nil {
-		trans.Proxy = http.ProxyURL(httpProxy)
-		if httpProxy.User != nil {
-			password, _ := httpProxy.User.Password()
-			auth := httpProxy.User.Username() + ":" + password
-			basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
-			req.Headers["Proxy-Authorization"] = basic
-		}
-	}
-	if runtime.Socks5Proxy != "" {
-		socks5Proxy, err := getSocks5Proxy(runtime)
-		if err != nil {
-			return nil, err
-		}
-		if socks5Proxy != nil {
-			var auth *proxy.Auth
-			if socks5Proxy.User != nil {
-				password, _ := socks5Proxy.User.Password()
-				auth = &proxy.Auth{
-					User:     socks5Proxy.User.Username(),
-					Password: password,
-				}
-			}
-			dialer, err := proxy.SOCKS5(strings.ToLower(runtime.Socks5NetWork), socks5Proxy.String(), auth,
-				&net.Dialer{
-					Timeout:   time.Duration(runtime.ConnectTimeout) * time.Second,
-					DualStack: true,
-					LocalAddr: getLocalAddr(runtime.LocalAddr, req.Port),
-				})
-			if err != nil {
-				return nil, err
-			}
-			trans.Dial = dialer.Dial
-		}
-	} else {
-		trans.DialContext = setDialContext(runtime, req.Port)
-	}
-	return trans, nil
-}
-
-func TransToString(object interface{}) string {
-	byt, _ := json.Marshal(object)
-	return string(byt)
-}
-
-func putMsgToMap(fieldMap map[string]string, request *http.Request) {
-	fieldMap["{host}"] = request.Host
-	fieldMap["{method}"] = request.Method
-	fieldMap["{uri}"] = request.URL.RequestURI()
-	fieldMap["{pid}"] = strconv.Itoa(os.Getpid())
-	fieldMap["{version}"] = strings.Split(request.Proto, "/")[1]
-	hostname, _ := os.Hostname()
-	fieldMap["{hostname}"] = hostname
-	fieldMap["{req_headers}"] = TransToString(request.Header)
-	fieldMap["{target}"] = request.URL.Path + request.URL.RawQuery
-}
-
-func getNoProxy(protocol string, runtime *RuntimeObject) []string {
-	var urls []string
-	if runtime.NoProxy != "" {
-		urls = strings.Split(runtime.NoProxy, ",")
-	} else if rawurl := os.Getenv("NO_PROXY"); rawurl != "" {
-		urls = strings.Split(rawurl, ",")
-	} else if rawurl := os.Getenv("no_proxy"); rawurl != "" {
-		urls = strings.Split(rawurl, ",")
-	}
-
-	return urls
-}
-
-func ToReader(obj interface{}) io.Reader {
-	switch obj.(type) {
-	case string:
-		return strings.NewReader(obj.(string))
-	case []byte:
-		return strings.NewReader(string(obj.([]byte)))
-	case io.Reader:
-		return obj.(io.Reader)
-	default:
-		panic("Invalid Body. Please set a valid Body.")
-	}
-}
-
-func ToString(val interface{}) string {
-	return fmt.Sprintf("%v", val)
-}
-
-func getHttpProxy(protocol, host string, runtime *RuntimeObject) (proxy *url.URL, err error) {
-	urls := getNoProxy(protocol, runtime)
-	for _, url := range urls {
-		if url == host {
-			return nil, nil
-		}
-	}
-	if protocol == "https" {
-		if runtime.HttpsProxy != "" {
-			proxy, err = url.Parse(runtime.HttpsProxy)
-		} else if rawurl := os.Getenv("HTTPS_PROXY"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		} else if rawurl := os.Getenv("https_proxy"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		}
-	} else {
-		if runtime.HttpProxy != "" {
-			proxy, err = url.Parse(runtime.HttpProxy)
-		} else if rawurl := os.Getenv("HTTP_PROXY"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		} else if rawurl := os.Getenv("http_proxy"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		}
-	}
-
-	return proxy, err
-}
-
-func getSocks5Proxy(runtime *RuntimeObject) (proxy *url.URL, err error) {
-	if runtime.Socks5Proxy != "" {
-		proxy, err = url.Parse(runtime.Socks5Proxy)
-	}
-	return proxy, err
-}
-
-func getLocalAddr(localAddr string, port int) (addr *net.TCPAddr) {
-	if localAddr != "" {
-		addr = &net.TCPAddr{
-			Port: port,
-			IP:   []byte(localAddr),
-		}
-	}
-	return addr
-}
-
-func setDialContext(runtime *RuntimeObject, port int) func(cxt context.Context, net, addr string) (c net.Conn, err error) {
-	return func(ctx context.Context, network, address string) (net.Conn, error) {
-		if runtime.LocalAddr != "" {
-			netAddr := &net.TCPAddr{
-				Port: port,
-				IP:   []byte(runtime.LocalAddr),
-			}
-			return (&net.Dialer{
-				Timeout:   time.Duration(runtime.ConnectTimeout) * time.Second,
-				DualStack: true,
-				LocalAddr: netAddr,
-			}).DialContext(ctx, network, address)
-		}
-		return (&net.Dialer{
-			Timeout:   time.Duration(runtime.ConnectTimeout) * time.Second,
-			DualStack: true,
-		}).DialContext(ctx, network, address)
-	}
-}
-
-func (err *SDKError) Error() string {
-	return fmt.Sprintf("SDKError: %s %s %s", err.Code, err.Message, err.Data)
-}
-
-func ToObject(obj interface{}) map[string]interface{} {
-	result := make(map[string]interface{})
-	byt, _ := json.Marshal(obj)
-	err := json.Unmarshal(byt, &result)
-	if err != nil {
-		return nil
-	}
-	return result
-}
-
-func AllowRetry(retry interface{}, retryTimes int) bool {
-	if retryTimes == 0 {
-		return true
-	}
-	retryMap, ok := retry.(map[string]interface{})
-	if !ok {
-		return false
-	}
-	retryable, ok := retryMap["retryable"].(bool)
-	if !ok || !retryable {
-		return false
-	}
-
-	maxAttempts, ok := retryMap["maxAttempts"].(int)
-	if !ok || maxAttempts < retryTimes {
-		return false
-	}
-	return true
-}
-
-func Merge(args ...interface{}) map[string]string {
-	finalArg := make(map[string]string)
-	for _, obj := range args {
-		switch obj.(type) {
-		case map[string]string:
-			arg := obj.(map[string]string)
-			for key, value := range arg {
-				if value != "" {
-					finalArg[key] = value
-				}
-			}
-		default:
-			byt, _ := json.Marshal(obj)
-			arg := make(map[string]string)
-			err := json.Unmarshal(byt, &arg)
-			if err != nil {
-				return finalArg
-			}
-			for key, value := range arg {
-				if value != "" {
-					finalArg[key] = value
-				}
-			}
-		}
-	}
-
-	return finalArg
-}
-
-func isNil(a interface{}) bool {
-	defer func() {
-		recover()
-	}()
-	vi := reflect.ValueOf(a)
-	return vi.IsNil()
-}
-
-func ToMap(args ...interface{}) map[string]interface{} {
-	isNotNil := false
-	finalArg := make(map[string]interface{})
-	for _, obj := range args {
-		if obj == nil {
-			continue
-		}
-
-		if isNil(obj) {
-			continue
-		}
-		isNotNil = true
-
-		switch obj.(type) {
-		case map[string]string:
-			arg := obj.(map[string]string)
-			for key, value := range arg {
-				if value != "" {
-					finalArg[key] = value
-				}
-			}
-		case map[string]interface{}:
-			arg := obj.(map[string]interface{})
-			for key, value := range arg {
-				if value != nil {
-					finalArg[key] = value
-				}
-			}
-		case string:
-			str := obj.(string)
-			arg := make(map[string]interface{})
-			err := json.Unmarshal([]byte(str), &arg)
-			if err == nil {
-				for key, value := range arg {
-					if value != nil {
-						finalArg[key] = value
-					}
-				}
-			}
-			tmp := make(map[string]string)
-			err = json.Unmarshal([]byte(str), &tmp)
-			if err == nil {
-				for key, value := range arg {
-					if value != "" {
-						finalArg[key] = value
-					}
-				}
-			}
-		case []byte:
-			byt := obj.([]byte)
-			arg := make(map[string]interface{})
-			err := json.Unmarshal(byt, &arg)
-			if err == nil {
-				for key, value := range arg {
-					if value != nil {
-						finalArg[key] = value
-					}
-				}
-				break
-			}
-		default:
-			val := reflect.ValueOf(obj)
-			res := structToMap(val)
-			for key, value := range res {
-				if value != nil {
-					finalArg[key] = value
-				}
-			}
-		}
-	}
-
-	if !isNotNil {
-		return nil
-	}
-	return finalArg
-}
-
-func structToMap(dataValue reflect.Value) map[string]interface{} {
-	out := make(map[string]interface{})
-	if !dataValue.IsValid() {
-		return out
-	}
-	if dataValue.Kind().String() == "ptr" {
-		dataValue = dataValue.Elem()
-	}
-	if !dataValue.IsValid() {
-		return out
-	}
-	dataType := dataValue.Type()
-	if dataType.Kind().String() != "struct" {
-		return out
-	}
-	for i := 0; i < dataType.NumField(); i++ {
-		field := dataType.Field(i)
-		name, containsNameTag := field.Tag.Lookup("json")
-		if !containsNameTag {
-			name = field.Name
-		}
-		fieldValue := dataValue.FieldByName(field.Name)
-		if !fieldValue.IsValid() {
-			continue
-		}
-		if field.Type.Kind().String() == "struct" {
-			out[name] = structToMap(fieldValue)
-		} else if field.Type.Kind().String() == "ptr" &&
-			field.Type.Elem().Kind().String() == "struct" {
-			if fieldValue.Elem().IsValid() {
-				out[name] = structToMap(fieldValue)
-			}
-		} else if field.Type.Kind().String() == "ptr" {
-			if fieldValue.IsValid() && !fieldValue.IsNil() {
-				out[name] = fieldValue.Elem().Interface()
-			}
-		} else if field.Type.Kind().String() == "slice" {
-			tmp := make([]interface{}, 0)
-			num := fieldValue.Len()
-			for i := 0; i < num; i++ {
-				value := fieldValue.Index(i)
-				if !value.IsValid() {
-					continue
-				}
-				if value.Type().Kind().String() == "ptr" &&
-					value.Type().Elem().Kind().String() == "struct" {
-					if value.IsValid() && !value.IsNil() {
-						tmp = append(tmp, structToMap(value))
-					}
-				} else if value.Type().Kind().String() == "struct" {
-					tmp = append(tmp, structToMap(value))
-				} else if value.Type().Kind().String() == "ptr" {
-					if value.IsValid() && !value.IsNil() {
-						tmp = append(tmp, value.Elem().Interface())
-					}
-				} else {
-					tmp = append(tmp, value.Interface())
-				}
-			}
-			if len(tmp) > 0 {
-				out[name] = tmp
-			}
-		} else {
-			out[name] = fieldValue.Interface()
-		}
-
-	}
-	return out
-}
-
-func Retryable(err error) bool {
-	if err == nil {
-		return false
-	}
-	if realErr, ok := err.(*SDKError); ok {
-		code, err := strconv.Atoi(realErr.Code)
-		if err != nil {
-			return true
-		}
-		return code >= http.StatusInternalServerError
-	}
-	return true
-}
-
-func GetBackoffTime(backoff interface{}, retrytimes int) int {
-	backoffMap, ok := backoff.(map[string]interface{})
-	if !ok {
-		return 0
-	}
-	policy, ok := backoffMap["policy"].(string)
-	if !ok || policy == "no" {
-		return 0
-	}
-
-	period, ok := backoffMap["period"].(int)
-	if !ok || period == 0 {
-		return 0
-	}
-
-	maxTime := math.Pow(2.0, float64(retrytimes))
-	return rand.Intn(int(maxTime-1)) * period
-}
-
-func Sleep(backoffTime int) {
-	sleeptime := time.Duration(backoffTime) * time.Second
-	time.Sleep(sleeptime)
-}
-
-func Validate(params interface{}) error {
-	requestValue := reflect.ValueOf(params).Elem()
-	err := validate(requestValue)
-	return err
-}
-
-// Verify whether the parameters meet the requirements
-func validate(dataValue reflect.Value) error {
-	if strings.HasPrefix(dataValue.Type().String(), "*") { // Determines whether the input is a structure object or a pointer object
-		if dataValue.IsNil() {
-			return nil
-		}
-		dataValue = dataValue.Elem()
-	}
-	dataType := dataValue.Type()
-	for i := 0; i < dataType.NumField(); i++ {
-		field := dataType.Field(i)
-		valueField := dataValue.Field(i)
-		for _, value := range validateParams {
-			err := validateParam(field, valueField, value)
-			if err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-func validateParam(field reflect.StructField, valueField reflect.Value, tagName string) error {
-	tag, containsTag := field.Tag.Lookup(tagName) // Take out the checked regular expression
-	if containsTag && tagName == "require" {
-		err := checkRequire(field, valueField)
-		if err != nil {
-			return err
-		}
-	}
-	if strings.HasPrefix(field.Type.String(), "[]") { // Verify the parameters of the array type
-		err := validateSlice(valueField, containsTag, tag, tagName)
-		if err != nil {
-			return err
-		}
-	} else if valueField.Kind() == reflect.Ptr { // Determines whether it is a pointer object
-		err := validatePtr(valueField, containsTag, tag, tagName)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func validateSlice(valueField reflect.Value, containsregexpTag bool, tag, tagName string) error {
-	if valueField.IsValid() && !valueField.IsNil() { // Determines whether the parameter has a value
-		for m := 0; m < valueField.Len(); m++ {
-			elementValue := valueField.Index(m)
-			if elementValue.Type().Kind() == reflect.Ptr { // Determines whether the child elements of an array are of a basic type
-				err := validatePtr(elementValue, containsregexpTag, tag, tagName)
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	return nil
-}
-
-func validatePtr(elementValue reflect.Value, containsregexpTag bool, tag, tagName string) error {
-	if elementValue.IsNil() {
-		return nil
-	}
-
-	if isFilterType(elementValue.Elem().Type().String(), basicTypes) {
-		if containsregexpTag {
-			if tagName == "pattern" {
-				err := checkPattern(elementValue.Elem(), tag)
-				if err != nil {
-					return err
-				}
-			}
-
-			if tagName == "maxLength" {
-				err := checkMaxLength(elementValue.Elem(), tag)
-				if err != nil {
-					return err
-				}
-			}
-		}
-	} else {
-		err := validate(elementValue)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func checkRequire(field reflect.StructField, valueField reflect.Value) error {
-	name, _ := field.Tag.Lookup("json")
-	if !valueField.IsNil() && valueField.IsValid() {
-		return nil
-	}
-	return errors.New(name + " should be setted")
-}
-
-func checkPattern(valueField reflect.Value, tag string) error {
-	if valueField.IsValid() && valueField.String() != "" {
-		value := valueField.String()
-		if match, _ := regexp.MatchString(tag, value); !match { // Determines whether the parameter value satisfies the regular expression or not, and throws an error
-			return errors.New(value + " is not matched " + tag)
-		}
-	}
-	return nil
-}
-
-func checkMaxLength(valueField reflect.Value, tag string) error {
-	if valueField.IsValid() && valueField.String() != "" {
-		maxLength, err := strconv.Atoi(tag)
-		if err != nil {
-			return err
-		}
-		length := valueField.Len()
-		if valueField.Kind().String() == "string" {
-			length = strings.Count(valueField.String(), "") - 1
-		}
-		if maxLength < length {
-			errMsg := fmt.Sprintf("Length of %s is more than %d", valueField.String(), maxLength)
-			return errors.New(errMsg)
-		}
-	}
-	return nil
-}
-
-// Determines whether realType is in filterTypes
-func isFilterType(realType string, filterTypes []string) bool {
-	for _, value := range filterTypes {
-		if value == realType {
-			return true
-		}
-	}
-	return false
-}
-
-func TransInterfaceToBool(val interface{}) bool {
-	if val == nil {
-		return false
-	}
-
-	return val.(bool)
-}
-
-func TransInterfaceToInt(val interface{}) int {
-	if val == nil {
-		return 0
-	}
-
-	return val.(int)
-}
-
-func TransInterfaceToString(val interface{}) string {
-	if val == nil {
-		return ""
-	}
-
-	return val.(string)
-}
-
-func Prettify(i interface{}) string {
-	resp, _ := json.MarshalIndent(i, "", "   ")
-	return string(resp)
-}

+ 0 - 44
vendor/alipaysdk/easysdk/go/src/tea/utils.go

@@ -1,44 +0,0 @@
-package tea
-
-
-import (
-	"reflect"
-	"strings"
-	"testing"
-)
-
-func containsKind(kinds []reflect.Kind, kind reflect.Kind) bool {
-	for i := 0; i < len(kinds); i++ {
-		if kind == kinds[i] {
-			return true
-		}
-	}
-
-	return false
-}
-
-func AssertEqual(t *testing.T, a, b interface{}) {
-	if !reflect.DeepEqual(a, b) {
-		t.Errorf("%v != %v", a, b)
-	}
-}
-
-func AssertNil(t *testing.T, object interface{}) {
-	if !isNil(object) {
-		t.Errorf("%v is not nil", object)
-	}
-}
-
-func AssertNotNil(t *testing.T, object interface{}) {
-	if isNil(object) {
-		t.Errorf("%v is nil", object)
-	}
-}
-
-func AssertContains(t *testing.T, contains string, msgAndArgs ...string) {
-	for _, value := range msgAndArgs {
-		if ok := strings.Contains(contains, value); !ok {
-			t.Errorf("%s does not contain %s", contains, value)
-		}
-	}
-}

+ 0 - 46
vendor/alipaysdk/easysdk/go/src/test/main.go

@@ -1,46 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"fmt"
-	"kernel"
-	"time"
-)
-
-func init() {
-	account:= kernel.Client{}
-	account.Protocol = "https"
-	account.GatewayHost = "openapi.alipay.com"
-	account.AppId = "<-- 请填写您的AppId,例如:2019022663440152 -->"
-	account.SignType = "RSA2"
-	account.AlipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->"
-	account.MerchantPrivateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->"
-
-	kernel.InitClient(account)
-}
-
-
-func main() {
-	result, _ := kernel.Execute("alipay.trade.create", nil, getBizParams(time.Now().Format("2006-01-02 15:04:05")))
-	fmt.Println(result)
-}
-
-func getBizParams(outTradeNo string) map[string]string {
-	bizParams := map[string]string{
-		"subject":       "phone6 16G",
-		"out_trade_no":  outTradeNo,
-		"total_amount":  "0.10",
-		"buyer_id":      "2088002656718920",
-		"extend_params": getHuabeiParams(),
-	}
-	return bizParams
-}
-
-func getHuabeiParams() string {
-	extendParams := map[string]string{
-		"hb_fq_num":            "3",
-		"hb_fq_seller_percent": "3",
-	}
-	byt, _ := json.Marshal(extendParams)
-	return string(byt)
-}

+ 1 - 1
vendor/alipaysdk/easysdk/java/pom.xml

@@ -3,7 +3,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-easysdk</artifactId>
-  <version>2.2.1</version>
+  <version>2.2.2</version>
   <name>Alipay Easy SDK</name>
   <url>https://open.alipay.com</url>
   <description>Alipay Easy SDK for Java

+ 1 - 29
vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/Factory.java

@@ -11,8 +11,6 @@ import com.alipay.easysdk.kms.aliyun.AliyunKMSClient;
 import com.alipay.easysdk.kms.aliyun.AliyunKMSSigner;
 import com.aliyun.tea.TeaModel;
 
-import java.lang.reflect.Constructor;
-
 /**
  * 客户端工厂,用于快速配置和访问各种场景下的API Client
  *
@@ -23,7 +21,7 @@ import java.lang.reflect.Constructor;
  */
 public class Factory {
 
-    public static final String SDK_VERSION = "alipay-easysdk-java-2.1.2";
+    public static final String SDK_VERSION = "alipay-easysdk-java-2.2.2";
 
     /**
      * 将一些初始化耗时较多的信息缓存在上下文中
@@ -49,32 +47,6 @@ public class Factory {
     }
 
     /**
-     * 获取调用OpenAPI所需的客户端实例
-     * 本方法用于调用SDK扩展包中的API Client下的方法
-     *
-     * 注:返回的实例不可重复使用,只可用于单次调用
-     *
-     * @param client API Client的类型对象
-     * @return client实例,用于发起单次调用
-     */
-    public static <T> T getClient(Class<T> client) {
-        try {
-            Constructor<T> constructor = client.getConstructor(Client.class);
-            context.setSdkVersion(getSdkVersion(client));
-            return constructor.newInstance(new Client(context));
-        } catch (Exception e) {
-            throw new RuntimeException("" + e.getMessage(), e);
-        }
-    }
-
-    private static <T> String getSdkVersion(Class<T> client) {
-        return context.getSdkVersion() + "-" + client.getCanonicalName()
-                .replace("com.alipay.easysdk.", "")
-                .replace(".Client", "")
-                .replace(".", "-");
-    }
-
-    /**
      * 支付能力相关
      */
     public static class Payment {

+ 1 - 29
vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/MultipleFactory.java

@@ -12,15 +12,13 @@ import com.alipay.easysdk.kms.aliyun.AliyunKMSClient;
 import com.alipay.easysdk.kms.aliyun.AliyunKMSSigner;
 import com.aliyun.tea.TeaModel;
 
-import java.lang.reflect.Constructor;
-
 /**
  * @author junying
  * @version : MultipleFactory.java, v 0.1 2020年12月23日 2:14 下午 junying Exp $
  */
 public class MultipleFactory {
 
-    public final String SDK_VERSION = "alipay-easysdk-java-2.1.2";
+    public final String SDK_VERSION = "alipay-easysdk-java-2.2.2";
 
     /**
      * 将一些初始化耗时较多的信息缓存在上下文中
@@ -46,32 +44,6 @@ public class MultipleFactory {
     }
 
     /**
-     * 获取调用OpenAPI所需的客户端实例
-     * 本方法用于调用SDK扩展包中的API Client下的方法
-     * <p>
-     * 注:返回的实例不可重复使用,只可用于单次调用
-     *
-     * @param client API Client的类型对象
-     * @return client实例,用于发起单次调用
-     */
-    public <T> T getClient(Class<T> client) {
-        try {
-            Constructor<T> constructor = client.getConstructor(Client.class);
-            context.setSdkVersion(getSdkVersion(client));
-            return constructor.newInstance(new Client(context));
-        } catch (Exception e) {
-            throw new RuntimeException("" + e.getMessage(), e);
-        }
-    }
-
-    private <T> String getSdkVersion(Class<T> client) {
-        return context.getSdkVersion() + "-" + client.getCanonicalName()
-                .replace("com.alipay.easysdk.", "")
-                .replace(".Client", "")
-                .replace(".", "-");
-    }
-
-    /**
      * 获取支付通用API Client
      *
      * @return 支付通用API Client

+ 0 - 32
vendor/alipaysdk/easysdk/java/src/test/java/com/alipay/easysdk/factory/FactoryTest.java

@@ -1,32 +0,0 @@
-package com.alipay.easysdk.factory;
-
-import com.alipay.easysdk.TestAccount.Mini;
-import com.alipay.easysdk.payment.common.Client;
-import com.alipay.easysdk.payment.common.models.AlipayTradeRefundResponse;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-public class FactoryTest {
-    @Before
-    public void setUp() {
-        Factory.setOptions(Mini.CONFIG);
-    }
-
-    @Test
-    public void testGetClient() throws Exception {
-        AlipayTradeRefundResponse response = Factory.getClient(Client.class).refund(
-                "64628156-f784-4572-9540-485b7c91b850", "0.01");
-
-        assertThat(response.code, is("10000"));
-        assertThat(response.msg, is("Success"));
-        assertThat(response.subCode, is(nullValue()));
-        assertThat(response.subMsg, is(nullValue()));
-        assertThat(response.httpBody, not(nullValue()));
-        assertThat(response.refundFee, is("0.01"));
-    }
-}

+ 1 - 1
vendor/alipaysdk/easysdk/php/src/Kernel/AlipayConstants.php

@@ -28,7 +28,7 @@ class AlipayConstants
     const METHOD_FIELD         = "method";
     const RESPONSE_SUFFIX      = "_response";
     const ERROR_RESPONSE       = "error_response";
-    const SDK_VERSION          = "alipay-easysdk-php-2.2.0";
+    const SDK_VERSION          = "alipay-easysdk-php-2.2.2";
 
     /**
      * 默认字符集编码,EasySDK统一固定使用UTF-8编码,无需用户感知编码,用户面对的总是String而不是bytes

+ 1 - 2
vendor/alipaysdk/easysdk/php/src/Payment/Page/Client.php

@@ -23,8 +23,7 @@ class Client {
      */
     public function pay($subject, $outTradeNo, $totalAmount, $returnUrl){
         $systemParams = [
-            //"method" => "alipay.trade.page.pay",
-            "method" => "alipay.trade.wap.pay",
+            "method" => "alipay.trade.page.pay",
             "app_id" => $this->_kernel->getConfig("appId"),
             "timestamp" => $this->_kernel->getTimestamp(),
             "format" => "json",

+ 5 - 0
vendor/aliyuncs/oss-sdk-php/CHANGELOG.md

@@ -1,5 +1,10 @@
 # ChangeLog - Aliyun OSS SDK for PHP
 
+## v2.5.0 / 2022-05-13
+* Added: support bucket transfer acceleration.
+* Added: support bucket cname token.
+* Added: support listobjectsV2.
+
 ## v2.4.3 / 2021-08-25
 * Fixed: integer overflow in PHP5.x.
 

+ 86 - 0
vendor/aliyuncs/oss-sdk-php/samples/Bucket.php

@@ -18,6 +18,24 @@ Common::println("bucket $bucket created");
 $doesExist = $ossClient->doesBucketExist($bucket);
 Common::println("bucket $bucket exist? " . ($doesExist ? "yes" : "no"));
 
+// Get the region of bucket
+$regions = $ossClient->getBucketLocation($bucket);
+Common::println("bucket $bucket region: " .print_r($regions,true));
+
+// Get the meta of a bucket
+$metas  = $ossClient->getBucketMeta($bucket);
+Common::println("bucket $bucket meta: " .print_r($metas,true));
+
+// Get the info of bucket
+$info = $ossClient->getBucketInfo($bucket);
+Common::println("bucket name:".$info->getName()."\n");
+Common::println("bucket location:". $info->getLocation()."\n");
+Common::println("bucket creation time:".$info->getCreateDate()."\n");
+Common::println("bucket storage class:".$info->getStorageClass()."\n");
+Common::println("bucket extranet endpoint:".$info->getExtranetEndpoint()."\n");
+Common::println("bucket intranet endpoint:".$info->getIntranetEndpoint()."\n");
+
+
 // Get the bucket list
 $bucketListInfo = $ossClient->listBuckets();
 
@@ -33,6 +51,9 @@ Common::println("bucket $bucket acl get: " . $acl);
 
 createBucket($ossClient, $bucket);
 doesBucketExist($ossClient, $bucket);
+getBucketLocation($ossClient, $bucket);
+getBucketMeta($ossClient,$bucket);
+getBucketInfo($ossClient, $bucket);
 deleteBucket($ossClient, $bucket);
 putBucketAcl($ossClient, $bucket);
 getBucketAcl($ossClient, $bucket);
@@ -83,6 +104,71 @@ function doesBucketExist($ossClient, $bucket)
 }
 
 /**
+ * Get the info of bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketInfo($ossClient, $bucket)
+{
+	try {
+		$info = $ossClient->getBucketInfo($bucket);
+		printf("bucket name:%s\n", $info->getName());
+		printf("bucket location:%s\n", $info->getLocation());
+		printf("bucket creation time:%s\n", $info->getCreateDate());
+		printf("bucket storage class:%s\n", $info->getStorageClass());
+		printf("bucket extranet endpoint:%s\n", $info->getExtranetEndpoint());
+		printf("bucket intranet endpoint:%s\n", $info->getIntranetEndpoint());
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Get the meta of a bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketLocation($ossClient, $bucket)
+{
+	try {
+		$regions = $ossClient->getBucketLocation($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print("bucket $bucket region: " .print_r($regions,true));
+	
+}
+
+
+/**
+ *  Get the bucket's meta
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketMeta($ossClient, $bucket)
+{
+	try {
+		$metas = $ossClient->getBucketMeta($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+	print("bucket $bucket meta: " .print_r($metas,true));
+}
+
+/**
  * Delete a bucket. If the bucket is not empty, the deletion fails.
  * A bucket which is not empty indicates that it does not contain any objects or parts that are not completely uploaded during multipart upload
  *

+ 211 - 0
vendor/aliyuncs/oss-sdk-php/samples/Object.php

@@ -3,6 +3,7 @@ require_once __DIR__ . '/Common.php';
 
 use OSS\OssClient;
 use OSS\Core\OssException;
+use OSS\Model\RestoreConfig;
 
 $bucket = Common::getBucketName();
 $ossClient = Common::getOssClient();
@@ -48,6 +49,17 @@ $ossClient->getObject($bucket, "c.file", $options);
 Common::println("b.file is fetched to the local file: c.file.localcopy");
 Common::println("b.file is created");
 
+
+// Restore Object
+$day = 3;
+$tier = 'Expedited';
+$config = new RestoreConfig($day,$tier);
+$options = array(
+	OssClient::OSS_RESTORE_CONFIG => $config
+);
+$ossClient->restoreObject($bucket, 'b.file',$options);
+
+
 // Copy an object
 $result = $ossClient->copyObject($bucket, "c.file", $bucket, "c.file.copy");
 Common::println("lastModifiedTime: " . $result[0]);
@@ -75,9 +87,37 @@ foreach($result as $object)
 sleep(2);
 unlink("c.file.localcopy");
 
+// Normal upload and download speed limit
+$object= "b.file";
+$content = "hello world";
+
+// The speed limit is 100 KB/s, which is 819200 bit/s.
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		OssClient::OSS_TRAFFIC_LIMIT => 819200,
+	));
+// Speed limit upload.
+$ossClient->putObject($bucket, $object, $content, $options);
+
+// Speed limit download.
+$ossClient->getObject($bucket, $object, $options);
+
+// Signed URL upload and download speed limit
+
+// Create a URL for uploading with a limited rate, and the validity period is 60s.
+$timeout = 60;
+$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+Common::println("b.file speed limit upload url:".$signedUrl.PHP_EOL);
+
+// Create a URL for speed-limited downloads, with a validity period of 120s.
+$timeout = 120;
+$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
+Common::println("b.file speed limit download url:".$signedUrl.PHP_EOL);
+
 //******************************* For complete usage, see the following functions ****************************************************
 
 listObjects($ossClient, $bucket);
+listObjectsV2($ossClient, $bucket);
 listAllObjects($ossClient, $bucket);
 createObjectDir($ossClient, $bucket);
 putObject($ossClient, $bucket);
@@ -92,6 +132,11 @@ deleteObjects($ossClient, $bucket);
 doesObjectExist($ossClient, $bucket);
 getSymlink($ossClient, $bucket);
 putSymlink($ossClient, $bucket);
+putObjectSpeed($ossClient, $bucket);
+getObjectSpeed($ossClient, $bucket);
+signUrlSpeedUpload($ossClient, $bucket);
+signUrlSpeedDownload($ossClient, $bucket);
+restoreObject($ossClient,$bucket);
 /**
  * Create a 'virtual' folder
  *
@@ -194,6 +239,10 @@ function listObjects($ossClient, $bucket)
         print("objectList:\n");
         foreach ($objectList as $objectInfo) {
             print($objectInfo->getKey() . "\n");
+            if($objectInfo->getOwner() != null){
+                printf("owner id:".$objectInfo->getOwner()->getId() . "\n");
+                printf("owner name:".$objectInfo->getOwner()->getDisplayName() . "\n");
+            }
         }
     }
     if (!empty($prefixList)) {
@@ -205,6 +254,55 @@ function listObjects($ossClient, $bucket)
 }
 
 /**
+ * Lists all files and folders in the bucket.
+ * Note if there's more items than the max-keys specified, the caller needs to use the nextMarker returned as the value for the next call's maker paramter.
+ * Loop through all the items returned from ListObjects.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function listObjectsV2($ossClient, $bucket)
+{
+	$prefix = 'oss-php-sdk-test/';
+	$delimiter = '/';
+	$maxkeys = 1000;
+	$options = array(
+		'delimiter' => $delimiter,
+		'prefix' => $prefix,
+		'max-keys' => $maxkeys,
+		'start-after' =>'test-object',
+		'fetch-owner' =>'true',
+	);
+	try {
+		$listObjectInfo = $ossClient->listObjectsV2($bucket, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+	$objectList = $listObjectInfo->getObjectList(); // object list
+	$prefixList = $listObjectInfo->getPrefixList(); // directory list
+	if (!empty($objectList)) {
+		print("objectList:\n");
+		foreach ($objectList as $objectInfo) {
+			print($objectInfo->getKey() . "\n");
+			if($objectInfo->getOwner() != null){
+				printf("owner id:".$objectInfo->getOwner()->getId() . "\n");
+				printf("owner name:".$objectInfo->getOwner()->getDisplayName() . "\n");
+			}
+		}
+	}
+	if (!empty($prefixList)) {
+		print("prefixList: \n");
+		foreach ($prefixList as $prefixInfo) {
+			print($prefixInfo->getPrefix() . "\n");
+		}
+	}
+}
+
+/**
  * Lists all folders and files under the bucket. Use nextMarker repeatedly to get all objects.
  *
  * @param OssClient $ossClient OssClient instance
@@ -516,3 +614,116 @@ function doesObjectExist($ossClient, $bucket)
     var_dump($exist);
 }
 
+/**
+ * Speed limit upload.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putObjectSpeed($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$content = file_get_contents(__FILE__);
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			OssClient::OSS_TRAFFIC_LIMIT => 819200,
+		));
+	try {
+		$ossClient->putObject($bucket, $object, $content, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getObjectSpeed($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			OssClient::OSS_TRAFFIC_LIMIT => 819200,
+		));
+	try {
+		$ossClient->getObject($bucket, $object, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function signUrlSpeedUpload($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$timeout = 120;
+	$options = array(
+		OssClient::OSS_TRAFFIC_LIMIT => 819200,
+	);
+	$timeout = 60;
+	$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+	print($signedUrl);
+}
+
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function signUrlSpeedDownload($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$timeout = 120;
+	$options = array(
+		OssClient::OSS_TRAFFIC_LIMIT => 819200,
+	);
+	$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
+	print($signedUrl);
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Restore object
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function restoreObject($ossClient, $bucket)
+{
+	$object = "oss-php-sdk-test/upload-test-object-name.txt";
+	$day = 3;
+	$tier = 'Expedited';
+	$config = new RestoreConfig($day,$tier);
+	$options = array(
+		OssClient::OSS_RESTORE_CONFIG => $config
+	);
+	try {
+		$ossClient->restoreObject($bucket, $object,$options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}

+ 5 - 1
vendor/aliyuncs/oss-sdk-php/src/OSS/Core/OssUtil.php

@@ -31,7 +31,11 @@ class OssUtil
         uksort($options, 'strnatcasecmp');
         foreach ($options as $key => $value) {
             if (is_string($key) && !is_array($value)) {
-                $temp[] = rawurlencode($key) . '=' . rawurlencode($value);
+                if (strlen($value) > 0) {
+                    $temp[] = rawurlencode($key) . '=' . rawurlencode($value);
+                } else {
+                    $temp[] = rawurlencode($key);
+                }
             }
         }
         return implode('&', $temp);

+ 19 - 20
vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectInfo.php

@@ -1,7 +1,6 @@
 <?php
 
 namespace OSS\Model;
-
 /**
  *
  * Class ObjectInfo
@@ -67,25 +66,25 @@ class ObjectInfo
     {
         return $this->type;
     }
-	
-	/**
-	 * php7 && 64bit can use it
-	 * @return int
-	 */
-	public function getSize()
-	{
-		return (int)$this->size;
-	}
-	
-	
-	/**
-	 * php5.x or 32bit must use it
-	 * @return string
-	 */
-	public function getSizeStr()
-	{
-		return $this->size;
-	}
+    
+    /**
+     * php7 && 64bit can use it
+     * @return int
+     */
+    public function getSize()
+    {
+        return (int)$this->size;
+    }
+    
+    
+    /**
+     * php5.x or 32bit must use it
+     * @return string
+     */
+    public function getSizeStr()
+    {
+        return $this->size;
+    }
     
     /**
      * @return string

+ 167 - 12
vendor/aliyuncs/oss-sdk-php/src/OSS/OssClient.php

@@ -12,6 +12,7 @@ use OSS\Model\LoggingConfig;
 use OSS\Model\LiveChannelConfig;
 use OSS\Model\LiveChannelInfo;
 use OSS\Model\LiveChannelListInfo;
+use OSS\Model\ObjectListInfoV2;
 use OSS\Model\StorageCapacityConfig;
 use OSS\Result\AclResult;
 use OSS\Result\BodyResult;
@@ -29,6 +30,7 @@ use OSS\Result\ListBucketsResult;
 use OSS\Result\ListMultipartUploadResult;
 use OSS\Model\ListMultipartUploadInfo;
 use OSS\Result\ListObjectsResult;
+use OSS\Result\ListObjectsV2Result;
 use OSS\Result\ListPartsResult;
 use OSS\Result\PutSetDeleteResult;
 use OSS\Result\DeleteObjectsResult;
@@ -72,6 +74,11 @@ use OSS\Result\ListObjectVersionsResult;
 use OSS\Model\DeleteObjectInfo;
 use OSS\Model\DeletedObjectInfo;
 use OSS\Result\DeleteObjectVersionsResult;
+use OSS\Model\TransferAccelerationConfig;
+use OSS\Result\GetBucketTransferAccelerationResult;
+use OSS\Model\CnameTokenInfo;
+use OSS\Result\CreateBucketCnameTokenResult;
+use OSS\Result\GetBucketCnameTokenResult;
 
 /**
  * Class OssClient
@@ -542,12 +549,12 @@ class OssClient
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
         $options[self::OSS_OBJECT] = '/';
-        $options[self::OSS_SUB_RESOURCE] = 'cname';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $cnameConfig = new CnameConfig();
         $cnameConfig->addCname($cname);
         $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
         $options[self::OSS_COMP] = 'add';
+        $options[self::OSS_CNAME] = '';
 
         $response = $this->auth($options);
         $result = new PutSetDeleteResult($response);
@@ -568,7 +575,7 @@ class OssClient
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
         $options[self::OSS_OBJECT] = '/';
-        $options[self::OSS_SUB_RESOURCE] = 'cname';
+        $options[self::OSS_CNAME] = '';
         $response = $this->auth($options);
         $result = new GetCnameResult($response);
         return $result->getData();
@@ -589,12 +596,12 @@ class OssClient
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
         $options[self::OSS_OBJECT] = '/';
-        $options[self::OSS_SUB_RESOURCE] = 'cname';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $cnameConfig = new CnameConfig();
         $cnameConfig->addCname($cname);
         $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
         $options[self::OSS_COMP] = 'delete';
+        $options[self::OSS_CNAME] = '';
 
         $response = $this->auth($options);
         $result = new PutSetDeleteResult($response);
@@ -602,6 +609,52 @@ class OssClient
     }
 
     /**
+     * create a cname token for a bucket
+     *
+     * @param string $bucket bucket name
+     * @param array $options
+     * @throws OssException
+     * @return CnameToken
+     */
+    public function createBucketCnameToken($bucket, $cname, $options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_CONTENT_TYPE] = 'application/xml';
+        $cnameConfig = new CnameConfig();
+        $cnameConfig->addCname($cname);
+        $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
+        $options[self::OSS_COMP] = 'token';
+        $options[self::OSS_CNAME] = '';
+        $response = $this->auth($options);
+        $result = new CreateBucketCnameTokenResult($response);
+        return $result->getData();
+    }
+
+    /**
+     * get a cname token for a bucket
+     *
+     * @param string $bucket bucket name
+     * @param array $options
+     * @throws OssException
+     * @return CnameToken
+     */
+    public function getBucketCnameToken($bucket, $cname, $options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_COMP] = 'token';
+        $options[self::OSS_CNAME] = $cname;
+        $response = $this->auth($options);
+        $result = new GetBucketCnameTokenResult($response);
+        return $result->getData();
+    }
+
+    /**
      * Creates a Live Channel under a bucket
      *
      * @param string $bucket bucket name
@@ -1493,6 +1546,52 @@ class OssClient
         return $result->getData();
     }
 
+
+    /**
+     * Put Bucket TransferAcceleration
+     * @param $bucket
+     * @param $enabled boolean
+     * @param null $options
+     * @return null
+     * @throws OssException
+     */
+
+    public function putBucketTransferAcceleration($bucket,$enabled,$options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_PUT;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_SUB_RESOURCE] = 'transferAcceleration';
+        $options[self::OSS_CONTENT_TYPE] = 'application/xml';
+        $config = new TransferAccelerationConfig();
+        $config->setEnabled($enabled);
+        $options[self::OSS_CONTENT] = $config->serializeToXml();
+        $response = $this->auth($options);
+        $result = new HeaderResult($response);
+        return $result->getData();
+    }
+
+    /**
+     * Put Bucket TransferAcceleration
+     * @param $bucket
+     * @param null $options
+     * @return enabled boolean
+     * @throws OssException
+     */
+    public function getBucketTransferAcceleration($bucket,$options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_SUB_RESOURCE] = 'transferAcceleration';
+        $options[self::OSS_CONTENT_TYPE] = 'application/xml';
+        $response = $this->auth($options);
+        $result = new GetBucketTransferAccelerationResult($response);
+        return $result->getData();
+    }
+
     /**
      * Lists the bucket's object list (in ObjectListInfo)
      *
@@ -1528,6 +1627,52 @@ class OssClient
         $result = new ListObjectsResult($response);
         return $result->getData();
     }
+    
+    
+    /**
+     * Lists the bucket's object list v2 (in ObjectListInfoV2)
+     *
+     * @param string $bucket
+     * @param array $options are defined below:
+     * $options = array(
+     *      'max-keys'    => specifies max object count to return. By default is 100 and max value could be 1000.
+     *      'prefix'      => specifies the key prefix the returned objects must have. Note that the returned keys still contain the prefix.
+     *      'delimiter'   => The delimiter of object name for grouping object. When it's specified, listObjects will differeniate the object and folder. And it will return subfolder's objects.
+     *      'start-after' => The key of returned object must be greater than the 'start-after'.
+     *      'continuation-token' => The token from which the list operation must start.
+     *)
+     * Prefix, start-after and continuation-token are for filtering and paging. Their length must be less than 256 bytes
+     * @throws OssException
+     * @return ObjectListInfoV2
+     */
+    public function listObjectsV2($bucket, $options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
+        $options[self::OSS_OBJECT] = '/';
+        $query = isset($options[self::OSS_QUERY_STRING]) ? $options[self::OSS_QUERY_STRING] : array();
+        $temp = array(
+            self::OSS_LIST_TYPE=>2,
+            self::OSS_ENCODING_TYPE => self::OSS_ENCODING_TYPE_URL,
+            self::OSS_DELIMITER => isset($options[self::OSS_DELIMITER]) ? $options[self::OSS_DELIMITER] : '/',
+            self::OSS_PREFIX => isset($options[self::OSS_PREFIX]) ? $options[self::OSS_PREFIX] : '',
+            self::OSS_MAX_KEYS => isset($options[self::OSS_MAX_KEYS]) ? $options[self::OSS_MAX_KEYS] : self::OSS_MAX_KEYS_VALUE,
+            self::OSS_START_AFTER => isset($options[self::OSS_START_AFTER]) ? $options[self::OSS_START_AFTER] : '',
+        );
+        if(isset($options[self::OSS_CONTINUATION_TOKEN])){
+            $temp[self::OSS_CONTINUATION_TOKEN] = $options[self::OSS_CONTINUATION_TOKEN];
+        }
+        $options[self::OSS_QUERY_STRING] = array_merge(
+            $query,$temp
+        );
+        $response = $this->auth($options);
+        $result = new ListObjectsV2Result($response);
+        return $result->getData();
+    }
+    
+    
+    
 
     /**
      * Lists the bucket's object with version information (in ObjectListInfo)
@@ -1616,8 +1761,8 @@ class OssClient
 
         $is_check_md5 = $this->isCheckMD5($options);
         if ($is_check_md5) {
-        	$content_md5 = base64_encode(md5($content, true));
-        	$options[self::OSS_CONTENT_MD5] = $content_md5;
+            $content_md5 = base64_encode(md5($content, true));
+            $options[self::OSS_CONTENT_MD5] = $content_md5;
         }
         
         if (!isset($options[self::OSS_CONTENT_TYPE])) {
@@ -1784,8 +1929,8 @@ class OssClient
         
         $is_check_md5 = $this->isCheckMD5($options);
         if ($is_check_md5) {
-        	$content_md5 = base64_encode(md5($content, true));
-        	$options[self::OSS_CONTENT_MD5] = $content_md5;
+            $content_md5 = base64_encode(md5($content, true));
+            $options[self::OSS_CONTENT_MD5] = $content_md5;
         }
 
         if (!isset($options[self::OSS_CONTENT_TYPE])) {
@@ -2334,10 +2479,12 @@ class OssClient
         $options[self::OSS_OBJECT] = $object;
         $options[self::OSS_UPLOAD_ID] = $uploadId;
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
-        if (!is_array($listParts)) {
-            throw new OssException("listParts must be array type");
+        if (is_array($listParts)) {
+            $options[self::OSS_CONTENT] = OssUtil::createCompleteMultipartUploadXmlBody($listParts);
+        }  else {
+            $options[self::OSS_CONTENT] = "";
         }
-        $options[self::OSS_CONTENT] = OssUtil::createCompleteMultipartUploadXmlBody($listParts);
+
         $response = $this->auth($options);
         if (isset($options[self::OSS_CALLBACK]) && !empty($options[self::OSS_CALLBACK])) {
             $result = new CallbackResult($response);
@@ -3180,6 +3327,8 @@ class OssClient
             self::OSS_WORM_ID,
             self::OSS_TRAFFIC_LIMIT,
             self::OSS_VERSION_ID,
+            self::OSS_CONTINUATION_TOKEN,
+            self::OSS_CNAME,
         );
 
         foreach ($signableList as $item) {
@@ -3411,6 +3560,9 @@ class OssClient
     const OSS_PREFIX = 'prefix';
     const OSS_DELIMITER = 'delimiter';
     const OSS_MARKER = 'marker';
+    const OSS_FETCH_OWNER = 'fetch-owner';
+    const OSS_START_AFTER = 'start-after';
+    const OSS_CONTINUATION_TOKEN = 'continuation-token';
     const OSS_ACCEPT_ENCODING = 'Accept-Encoding';
     const OSS_CONTENT_MD5 = 'Content-Md5';
     const OSS_SELF_CONTENT_MD5 = 'x-oss-meta-md5';
@@ -3463,6 +3615,7 @@ class OssClient
     const OSS_VERSION_ID_MARKER = 'version-id-marker';
     const OSS_VERSION_ID = 'versionId';
     const OSS_HEADER_VERSION_ID = 'x-oss-version-id';
+    const OSS_CNAME = 'cname';
 
     //private URLs
     const OSS_URL_ACCESS_KEY_ID = 'OSSAccessKeyId';
@@ -3495,6 +3648,8 @@ class OssClient
     const OSS_ACL_TYPE_PUBLIC_READ_WRITE = 'public-read-write';
     const OSS_ENCODING_TYPE = "encoding-type";
     const OSS_ENCODING_TYPE_URL = "url";
+    
+    const OSS_LIST_TYPE = "list-type";
 
     // Domain Types
     const OSS_HOST_TYPE_NORMAL = "normal";//http://bucket.oss-cn-hangzhou.aliyuncs.com/object
@@ -3509,8 +3664,8 @@ class OssClient
     );
     // OssClient version information
     const OSS_NAME = "aliyun-sdk-php";
-    const OSS_VERSION = "2.4.3";
-    const OSS_BUILD = "20210825";
+    const OSS_VERSION = "2.5.0";
+    const OSS_BUILD = "20220513";
     const OSS_AUTHOR = "";
     const OSS_OPTIONS_ORIGIN = 'Origin';
     const OSS_OPTIONS_REQUEST_METHOD = 'Access-Control-Request-Method';

+ 84 - 32
vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientMultipartUploadTest.php

@@ -69,17 +69,12 @@ class OssClientMultipartUploadTest extends TestOssClientBase
         $object = "mpu/multipart-test.txt";
         $copiedObject = "mpu/multipart-test.txt.copied";
         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
             $this->assertFalse(true);
         }
-        /*
-         * step 2. uploadPartCopy
-         */
+
         $copyId = 1;
         $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id);
         $upload_parts[] = array(
@@ -94,9 +89,6 @@ class OssClientMultipartUploadTest extends TestOssClientBase
             $this->assertTrue(false);
         }
 
-        /**
-         * step 3.
-         */
         try {
             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
         } catch (OssException $e) {
@@ -113,9 +105,6 @@ class OssClientMultipartUploadTest extends TestOssClientBase
         $object = "mpu/multipart-test.txt";
         $copiedObject = "mpu/multipart-test.txt.range.copied";
         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
@@ -142,9 +131,6 @@ class OssClientMultipartUploadTest extends TestOssClientBase
             $this->assertTrue(false);
         }
 
-        /**
-         * step 3.
-         */
         try {
             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
         } catch (OssException $e) {
@@ -159,17 +145,11 @@ class OssClientMultipartUploadTest extends TestOssClientBase
     public function testAbortMultipartUpload()
     {
         $object = "mpu/multipart-test.txt";
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
             $this->assertFalse(true);
         }
-        /*
-         * step 2. 上传分片
-         */
         $part_size = 10 * 1024 * 1024;
         $upload_file = __FILE__;
         $upload_filesize = sprintf('%u',filesize($upload_file));
@@ -244,17 +224,11 @@ class OssClientMultipartUploadTest extends TestOssClientBase
     public function testPutObjectByRawApis()
     {
         $object = "mpu/multipart-test.txt";
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
             $this->assertFalse(true);
         }
-        /*
-         * step 2. 上传分片
-         */
         $part_size = 10 * 1024 * 1024;
         $upload_file = __FILE__;
         $upload_filesize = sprintf('%u',filesize($upload_file));
@@ -416,11 +390,89 @@ class OssClientMultipartUploadTest extends TestOssClientBase
             $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, null);
             $this->assertTrue(false);
         } catch (OssException $e) {
-            $this->assertTrue(true);
-            if (strpos($e, "listParts must be array type") == false)
-            {
-                $this->assertTrue(false);
-            }   
+            $this->assertEquals('NoSuchUpload', $e->getErrorCode());
         }
     }
+
+    public function testCompleteMultipartUploadWithEmptyArray(){
+        $object = 'multipart-test-complete.txt';
+        try {
+            $uploadId = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
+            $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, array());
+            var_dump($listMultipartUploadInfo);
+            $this->assertNotNull($listMultipartUploadInfo);
+        } catch (OssException $e) {
+            $this->assertFalse(true);
+        }
+
+    }
+
+
+    public function testCompleteMultipartUploadWithNull(){
+        $object = "mpu/multipart-test.txt";
+        try {
+            $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
+        } catch (OssException $e) {
+            $this->assertFalse(true);
+        }
+
+        $part_size = 5 * 1024 * 1024;
+        $upload_file = __FILE__;
+        $upload_filesize = sprintf('%u',filesize($upload_file));
+        $pieces = $this->ossClient->generateMultiuploadParts($upload_filesize, $part_size);
+        $response_upload_part = array();
+        $upload_position = 0;
+        $is_check_md5 = true;
+        foreach ($pieces as $i => $piece) {
+            $from_pos = $upload_position + (integer)$piece[OssClient::OSS_SEEK_TO];
+            $to_pos = (integer)$piece[OssClient::OSS_LENGTH] + $from_pos - 1;
+            $up_options = array(
+                OssClient::OSS_FILE_UPLOAD => $upload_file,
+                OssClient::OSS_PART_NUM => ($i + 1),
+                OssClient::OSS_SEEK_TO => $from_pos,
+                OssClient::OSS_LENGTH => $to_pos - $from_pos + 1,
+                OssClient::OSS_CHECK_MD5 => $is_check_md5,
+            );
+            if ($is_check_md5) {
+                $content_md5 = OssUtil::getMd5SumForFile($upload_file, $from_pos, $to_pos);
+                $up_options[OssClient::OSS_CONTENT_MD5] = $content_md5;
+            }
+            try {
+                $response_upload_part[] = $this->ossClient->uploadPart($this->bucket, $object, $upload_id, $up_options);
+            } catch (OssException $e) {
+                $this->assertFalse(true);
+            }
+        }
+        $upload_parts = array();
+        foreach ($response_upload_part as $i => $eTag) {
+            $upload_parts[] = array(
+                'PartNumber' => ($i + 1),
+                'ETag' => $eTag,
+            );
+        }
+
+        try {
+            $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id);
+            $this->assertNotNull($listPartsInfo);
+        } catch (OssException $e) {
+            $this->assertTrue(false);
+        }
+
+        $options['headers'] = array(
+            'x-oss-forbid-overwrite' => 'false',
+            'x-oss-complete-all'=> 'yes'
+        );
+
+        try {
+            $result = $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, null,$options);
+            var_dump($result);
+            $this->assertNotNull($result);
+        } catch (OssException $e) {
+            $this->assertTrue(false);
+        }
+
+    }
+
+
+
 }

+ 1 - 1
vendor/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php

@@ -33,6 +33,6 @@ final class CompositeEye implements EyeInterface
 
     public function getInternalPath() : Path
     {
-        return $this->externalEye->getInternalPath();
+        return $this->internalEye->getInternalPath();
     }
 }

+ 7 - 7
vendor/composer/InstalledVersions.php

@@ -28,7 +28,7 @@ class InstalledVersions
 {
     /**
      * @var mixed[]|null
-     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
+     * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
      */
     private static $installed;
 
@@ -39,7 +39,7 @@ class InstalledVersions
 
     /**
      * @var array[]
-     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
      */
     private static $installedByVendor = array();
 
@@ -243,7 +243,7 @@ class InstalledVersions
 
     /**
      * @return array
-     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+     * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
      */
     public static function getRootPackage()
     {
@@ -257,7 +257,7 @@ class InstalledVersions
      *
      * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
      * @return array[]
-     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+     * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
      */
     public static function getRawData()
     {
@@ -280,7 +280,7 @@ class InstalledVersions
      * Returns the raw data of all installed.php which are currently loaded for custom implementations
      *
      * @return array[]
-     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
      */
     public static function getAllRawData()
     {
@@ -303,7 +303,7 @@ class InstalledVersions
      * @param  array[] $data A vendor/composer/installed.php data set
      * @return void
      *
-     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+     * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
      */
     public static function reload($data)
     {
@@ -313,7 +313,7 @@ class InstalledVersions
 
     /**
      * @return array[]
-     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
      */
     private static function getInstalled()
     {

+ 35 - 0
vendor/composer/autoload_classmap.php

@@ -6,14 +6,49 @@ $vendorDir = dirname(__DIR__);
 $baseDir = dirname($vendorDir);
 
 return array(
+    'AcsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsRequest.php',
+    'AcsResponse' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsResponse.php',
     'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+    'Autoloader' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Autoloader/Autoloader.php',
+    'BaseTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BaseTest.php',
+    'ClientException' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ClientException.php',
     'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+    'Credential' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/Credential.php',
+    'CredentialTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/CredentialTest.php',
+    'DefaultAcsClient' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/DefaultAcsClient.php',
+    'DefaultAcsClientTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/DefaultAcsClientTest.php',
+    'DefaultProfile' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/DefaultProfile.php',
+    'DefaultProfileTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Profile/DefaultProfileTest.php',
+    'DescribeEndpointRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
+    'EndPointByLocationTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndPointByLocationTest.php',
+    'Endpoint' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/Endpoint.php',
+    'EndpointProvider' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/EndpointProvider.php',
+    'EndpointProviderTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndpointProviderTest.php',
+    'HttpHelper' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpHelper.php',
+    'HttpHelperTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Http/HttpHelperTest.php',
+    'HttpResponse' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpResponse.php',
+    'IAcsClient' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/IAcsClient.php',
+    'IClientProfile' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/IClientProfile.php',
+    'ISigner' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ISigner.php',
     'Ip2Region' => $vendorDir . '/zoujingli/ip2region/Ip2Region.php',
     'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
+    'LocationService' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
     'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
     'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+    'ProductDomain' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/ProductDomain.php',
+    'RoaAcsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RoaAcsRequest.php',
+    'RpcAcsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RpcAcsRequest.php',
+    'ServerException' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ServerException.php',
+    'ShaHmac1Signer' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac1Signer.php',
+    'ShaHmac1SignerTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac1SignerTest.php',
+    'ShaHmac256Signer' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac256Signer.php',
+    'ShaHmac256SignerTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac256SignerTest.php',
     'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
     'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+    'UnitTest\\BatchCompute\\Request\\ListImagesRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BatchCompute/ListImagesRequest.php',
+    'UnitTest\\Ecs\\Request\\DescribeRegionsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ecs/Rquest/DescribeRegionsRequest.php',
+    'UnitTest\\Ft\\TestRoaApiRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRoaApiRequest.php',
+    'UnitTest\\Ft\\TestRpcApiRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRpcApiRequest.php',
     'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
     'We' => $vendorDir . '/zoujingli/wechat-developer/We.php',
 );

+ 4 - 5
vendor/composer/autoload_files.php

@@ -7,25 +7,24 @@ $baseDir = dirname($vendorDir);
 
 return array(
     '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
-    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
     'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
+    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
     '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
     '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
     'd767e4fc2dc52fe66584ab8c6684783e' => $vendorDir . '/adbario/php-dot-notation/src/helpers.php',
-    '65fec9ebcfbb3cbb4fd0d519687aea01' => $vendorDir . '/danielstjules/stringy/src/Create.php',
     '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
     'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
     '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
     'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
-    'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php',
+    '65fec9ebcfbb3cbb4fd0d519687aea01' => $vendorDir . '/danielstjules/stringy/src/Create.php',
     'a9ed0d27b5a698798a89181429f162c5' => $vendorDir . '/khanamiryan/qrcode-detector-decoder/lib/Common/customFunctions.php',
+    'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php',
     '841780ea2e1d6545ea3a253239d59c05' => $vendorDir . '/qiniu/php-sdk/src/Qiniu/functions.php',
-    '0d0b82117c23db94c492fee02b2ed01f' => $vendorDir . '/songshenzong/support/src/StringsHelpers.php',
-    'd96a90b43bcdea846705672ffd4e9294' => $vendorDir . '/songshenzong/support/src/BashEchoHelpers.php',
     '66453932bc1be9fb2f910a27947d11b6' => $vendorDir . '/alibabacloud/client/src/Functions.php',
     'f0e7e63bbb278a92db02393536748c5f' => $vendorDir . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
     '6747f579ad6817f318cc3a7e7a0abb93' => $vendorDir . '/overtrue/wechat/src/Kernel/Helpers.php',
+    'e362541fe9d65ccecc6d310665f82822' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Config.php',
     '8dafcc6956460bc297e00381fed53e11' => $vendorDir . '/zoujingli/think-library/src/common.php',
 );

+ 3 - 5
vendor/composer/autoload_psr4.php

@@ -6,18 +6,17 @@ $vendorDir = dirname(__DIR__);
 $baseDir = dirname($vendorDir);
 
 return array(
-    'xin\\helper\\' => array($vendorDir . '/xin/helper/src'),
-    'xin\\container\\' => array($vendorDir . '/xin/container/src'),
     'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
     'library\\' => array($vendorDir . '/zoujingli/think-library/src'),
     'hg\\apidoc\\' => array($vendorDir . '/hg/apidoc/src'),
     'clagiordano\\weblibs\\configmanager\\' => array($vendorDir . '/clagiordano/weblibs-configmanager/src'),
+    'aliyun\\afs\\' => array($vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/afs'),
     'Zxing\\' => array($vendorDir . '/khanamiryan/qrcode-detector-decoder/lib'),
     'WePay\\' => array($vendorDir . '/zoujingli/wechat-developer/WePay'),
     'WePayV3\\' => array($vendorDir . '/zoujingli/wechat-developer/WePayV3'),
     'WeOpen\\' => array($vendorDir . '/zoujingli/weopen-developer/WeOpen'),
-    'WeMini\\' => array($vendorDir . '/zoujingli/wechat-developer/WeMini', $vendorDir . '/zoujingli/weopen-developer/WeMini'),
-    'WeChat\\' => array($vendorDir . '/zoujingli/wechat-developer/WeChat', $vendorDir . '/zoujingli/weopen-developer/WeChat'),
+    'WeMini\\' => array($vendorDir . '/zoujingli/weopen-developer/WeMini', $vendorDir . '/zoujingli/wechat-developer/WeMini'),
+    'WeChat\\' => array($vendorDir . '/zoujingli/weopen-developer/WeChat', $vendorDir . '/zoujingli/wechat-developer/WeChat'),
     'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
     'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
@@ -38,7 +37,6 @@ return array(
     'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
     'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
     'Stringy\\' => array($vendorDir . '/danielstjules/stringy/src'),
-    'Songshenzong\\Support\\' => array($vendorDir . '/songshenzong/support/src'),
     'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu'),
     'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),

+ 51 - 27
vendor/composer/autoload_static.php

@@ -8,35 +8,29 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
 {
     public static $files = array (
         '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
-        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
         'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
+        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
         '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
         '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
         'd767e4fc2dc52fe66584ab8c6684783e' => __DIR__ . '/..' . '/adbario/php-dot-notation/src/helpers.php',
-        '65fec9ebcfbb3cbb4fd0d519687aea01' => __DIR__ . '/..' . '/danielstjules/stringy/src/Create.php',
         '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
         'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
         '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
         'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
-        'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php',
+        '65fec9ebcfbb3cbb4fd0d519687aea01' => __DIR__ . '/..' . '/danielstjules/stringy/src/Create.php',
         'a9ed0d27b5a698798a89181429f162c5' => __DIR__ . '/..' . '/khanamiryan/qrcode-detector-decoder/lib/Common/customFunctions.php',
+        'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php',
         '841780ea2e1d6545ea3a253239d59c05' => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu/functions.php',
-        '0d0b82117c23db94c492fee02b2ed01f' => __DIR__ . '/..' . '/songshenzong/support/src/StringsHelpers.php',
-        'd96a90b43bcdea846705672ffd4e9294' => __DIR__ . '/..' . '/songshenzong/support/src/BashEchoHelpers.php',
         '66453932bc1be9fb2f910a27947d11b6' => __DIR__ . '/..' . '/alibabacloud/client/src/Functions.php',
         'f0e7e63bbb278a92db02393536748c5f' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
         '6747f579ad6817f318cc3a7e7a0abb93' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Helpers.php',
+        'e362541fe9d65ccecc6d310665f82822' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Config.php',
         '8dafcc6956460bc297e00381fed53e11' => __DIR__ . '/..' . '/zoujingli/think-library/src/common.php',
     );
 
     public static $prefixLengthsPsr4 = array (
-        'x' => 
-        array (
-            'xin\\helper\\' => 11,
-            'xin\\container\\' => 14,
-        ),
         't' => 
         array (
             'think\\composer\\' => 15,
@@ -53,6 +47,10 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         array (
             'clagiordano\\weblibs\\configmanager\\' => 34,
         ),
+        'a' => 
+        array (
+            'aliyun\\afs\\' => 11,
+        ),
         'Z' => 
         array (
             'Zxing\\' => 6,
@@ -87,7 +85,6 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
             'Symfony\\Component\\Cache\\' => 24,
             'Symfony\\Bridge\\PsrHttpMessage\\' => 30,
             'Stringy\\' => 8,
-            'Songshenzong\\Support\\' => 21,
         ),
         'Q' => 
         array (
@@ -153,14 +150,6 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
     );
 
     public static $prefixDirsPsr4 = array (
-        'xin\\helper\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/xin/helper/src',
-        ),
-        'xin\\container\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/xin/container/src',
-        ),
         'think\\composer\\' => 
         array (
             0 => __DIR__ . '/..' . '/topthink/think-installer/src',
@@ -177,6 +166,10 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         array (
             0 => __DIR__ . '/..' . '/clagiordano/weblibs-configmanager/src',
         ),
+        'aliyun\\afs\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/afs',
+        ),
         'Zxing\\' => 
         array (
             0 => __DIR__ . '/..' . '/khanamiryan/qrcode-detector-decoder/lib',
@@ -195,13 +188,13 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         ),
         'WeMini\\' => 
         array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini',
-            1 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeMini',
+            0 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeMini',
+            1 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini',
         ),
         'WeChat\\' => 
         array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat',
-            1 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeChat',
+            0 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeChat',
+            1 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat',
         ),
         'Symfony\\Polyfill\\Php80\\' => 
         array (
@@ -283,10 +276,6 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         array (
             0 => __DIR__ . '/..' . '/danielstjules/stringy/src',
         ),
-        'Songshenzong\\Support\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/songshenzong/support/src',
-        ),
         'Qiniu\\' => 
         array (
             0 => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu',
@@ -417,14 +406,49 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
     );
 
     public static $classMap = array (
+        'AcsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsRequest.php',
+        'AcsResponse' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsResponse.php',
         'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+        'Autoloader' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Autoloader/Autoloader.php',
+        'BaseTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BaseTest.php',
+        'ClientException' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ClientException.php',
         'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+        'Credential' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/Credential.php',
+        'CredentialTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/CredentialTest.php',
+        'DefaultAcsClient' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/DefaultAcsClient.php',
+        'DefaultAcsClientTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/DefaultAcsClientTest.php',
+        'DefaultProfile' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/DefaultProfile.php',
+        'DefaultProfileTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Profile/DefaultProfileTest.php',
+        'DescribeEndpointRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
+        'EndPointByLocationTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndPointByLocationTest.php',
+        'Endpoint' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/Endpoint.php',
+        'EndpointProvider' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/EndpointProvider.php',
+        'EndpointProviderTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndpointProviderTest.php',
+        'HttpHelper' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpHelper.php',
+        'HttpHelperTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Http/HttpHelperTest.php',
+        'HttpResponse' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpResponse.php',
+        'IAcsClient' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/IAcsClient.php',
+        'IClientProfile' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/IClientProfile.php',
+        'ISigner' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ISigner.php',
         'Ip2Region' => __DIR__ . '/..' . '/zoujingli/ip2region/Ip2Region.php',
         'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
+        'LocationService' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
         'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
         'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+        'ProductDomain' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/ProductDomain.php',
+        'RoaAcsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RoaAcsRequest.php',
+        'RpcAcsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RpcAcsRequest.php',
+        'ServerException' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ServerException.php',
+        'ShaHmac1Signer' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac1Signer.php',
+        'ShaHmac1SignerTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac1SignerTest.php',
+        'ShaHmac256Signer' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac256Signer.php',
+        'ShaHmac256SignerTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac256SignerTest.php',
         'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
         'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+        'UnitTest\\BatchCompute\\Request\\ListImagesRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BatchCompute/ListImagesRequest.php',
+        'UnitTest\\Ecs\\Request\\DescribeRegionsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ecs/Rquest/DescribeRegionsRequest.php',
+        'UnitTest\\Ft\\TestRoaApiRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRoaApiRequest.php',
+        'UnitTest\\Ft\\TestRpcApiRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRpcApiRequest.php',
         'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
         'We' => __DIR__ . '/..' . '/zoujingli/wechat-developer/We.php',
     );

Файловите разлики са ограничени, защото са твърде много
+ 222 - 327
vendor/composer/installed.json


+ 133 - 151
vendor/composer/installed.php

@@ -1,247 +1,256 @@
 <?php return array(
     'root' => array(
+        'name' => 'zoujingli/thinkadmin',
         'pretty_version' => 'dev-master',
         'version' => 'dev-master',
+        'reference' => '4afa5bd4473dd76d59ec12d4dd574ef2289d4b7e',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
-        'reference' => '450c41a76767b5def137774c8a7eb2b64e975724',
-        'name' => 'zoujingli/thinkadmin',
         'dev' => true,
     ),
     'versions' => array(
         'adbario/php-dot-notation' => array(
-            'pretty_version' => '2.2.0',
-            'version' => '2.2.0.0',
+            'pretty_version' => '2.3.0',
+            'version' => '2.3.0.0',
+            'reference' => '39ece8d385ce2f5e03718c693932d83ab0cb5972',
             'type' => 'library',
             'install_path' => __DIR__ . '/../adbario/php-dot-notation',
             'aliases' => array(),
-            'reference' => 'eee4fc81296531e6aafba4c2bbccfc5adab1676e',
             'dev_requirement' => false,
         ),
         'alibabacloud/client' => array(
             'pretty_version' => '1.5.31',
             'version' => '1.5.31.0',
+            'reference' => '19224d92fe27ab8ef501d77d4891e7660bc023c1',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alibabacloud/client',
             'aliases' => array(),
-            'reference' => '19224d92fe27ab8ef501d77d4891e7660bc023c1',
             'dev_requirement' => false,
         ),
         'alibabacloud/tea' => array(
-            'pretty_version' => '3.1.23',
-            'version' => '3.1.23.0',
+            'pretty_version' => '3.1.24',
+            'version' => '3.1.24.0',
+            'reference' => 'bb33395f47db3847d1940d6eb8ba1e56cd0623cb',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alibabacloud/tea',
             'aliases' => array(),
-            'reference' => '61fce993274edf6e7131af07256ed7723d97a85f',
             'dev_requirement' => false,
         ),
         'alibabacloud/tea-fileform' => array(
             'pretty_version' => '0.3.4',
             'version' => '0.3.4.0',
+            'reference' => '4bf0c75a045c8115aa8cb1a394bd08d8bb833181',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alibabacloud/tea-fileform',
             'aliases' => array(),
-            'reference' => '4bf0c75a045c8115aa8cb1a394bd08d8bb833181',
             'dev_requirement' => false,
         ),
         'alipaysdk/easysdk' => array(
-            'pretty_version' => '2.2.1',
-            'version' => '2.2.1.0',
+            'pretty_version' => '2.2.2',
+            'version' => '2.2.2.0',
+            'reference' => 'eac46450971d094e8cfb1c183da1080ca53d75b9',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alipaysdk/easysdk',
             'aliases' => array(),
-            'reference' => '066388d02c6f55fe0919d75b386456d80801fec2',
             'dev_requirement' => false,
         ),
         'aliyuncs/oss-sdk-php' => array(
-            'pretty_version' => 'v2.4.3',
-            'version' => '2.4.3.0',
+            'pretty_version' => 'v2.5.0',
+            'version' => '2.5.0.0',
+            'reference' => 'f0413667d765855eb0aaa728b596801464ffdb06',
             'type' => 'library',
             'install_path' => __DIR__ . '/../aliyuncs/oss-sdk-php',
             'aliases' => array(),
-            'reference' => '4ccead614915ee6685bf30016afb01aabd347e46',
             'dev_requirement' => false,
         ),
         'bacon/bacon-qr-code' => array(
-            'pretty_version' => '2.0.6',
-            'version' => '2.0.6.0',
+            'pretty_version' => '2.0.7',
+            'version' => '2.0.7.0',
+            'reference' => 'd70c840f68657ce49094b8d91f9ee0cc07fbf66c',
             'type' => 'library',
             'install_path' => __DIR__ . '/../bacon/bacon-qr-code',
             'aliases' => array(),
-            'reference' => '0069435e2a01a57193b25790f105a5d3168653c1',
             'dev_requirement' => false,
         ),
         'clagiordano/weblibs-configmanager' => array(
             'pretty_version' => 'v1.5.0',
             'version' => '1.5.0.0',
+            'reference' => '8802c7396d61a923c9a73e37ead062b24bb1b273',
             'type' => 'library',
             'install_path' => __DIR__ . '/../clagiordano/weblibs-configmanager',
             'aliases' => array(),
-            'reference' => '8802c7396d61a923c9a73e37ead062b24bb1b273',
             'dev_requirement' => false,
         ),
         'danielstjules/stringy' => array(
             'pretty_version' => '3.1.0',
             'version' => '3.1.0.0',
+            'reference' => 'df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e',
             'type' => 'library',
             'install_path' => __DIR__ . '/../danielstjules/stringy',
             'aliases' => array(),
-            'reference' => 'df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e',
             'dev_requirement' => false,
         ),
         'dasprid/enum' => array(
             'pretty_version' => '1.0.3',
             'version' => '1.0.3.0',
+            'reference' => '5abf82f213618696dda8e3bf6f64dd042d8542b2',
             'type' => 'library',
             'install_path' => __DIR__ . '/../dasprid/enum',
             'aliases' => array(),
-            'reference' => '5abf82f213618696dda8e3bf6f64dd042d8542b2',
             'dev_requirement' => false,
         ),
         'easywechat-composer/easywechat-composer' => array(
             'pretty_version' => '1.4.1',
             'version' => '1.4.1.0',
+            'reference' => '3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd',
             'type' => 'composer-plugin',
             'install_path' => __DIR__ . '/../easywechat-composer/easywechat-composer',
             'aliases' => array(),
-            'reference' => '3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd',
             'dev_requirement' => false,
         ),
         'endroid/qr-code' => array(
             'pretty_version' => '3.9.7',
             'version' => '3.9.7.0',
+            'reference' => '94563d7b3105288e6ac53a67ae720e3669fac1f6',
             'type' => 'library',
             'install_path' => __DIR__ . '/../endroid/qr-code',
             'aliases' => array(),
-            'reference' => '94563d7b3105288e6ac53a67ae720e3669fac1f6',
             'dev_requirement' => false,
         ),
         'firebase/php-jwt' => array(
             'pretty_version' => 'v5.5.1',
             'version' => '5.5.1.0',
+            'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
             'type' => 'library',
             'install_path' => __DIR__ . '/../firebase/php-jwt',
             'aliases' => array(),
-            'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
             'dev_requirement' => false,
         ),
         'guzzlehttp/guzzle' => array(
-            'pretty_version' => '7.4.1',
-            'version' => '7.4.1.0',
+            'pretty_version' => '7.4.5',
+            'version' => '7.4.5.0',
+            'reference' => '1dd98b0564cb3f6bd16ce683cb755f94c10fbd82',
             'type' => 'library',
             'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
             'aliases' => array(),
-            'reference' => 'ee0a041b1760e6a53d2a39c8c34115adc2af2c79',
             'dev_requirement' => false,
         ),
         'guzzlehttp/promises' => array(
             'pretty_version' => '1.5.1',
             'version' => '1.5.1.0',
+            'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
             'type' => 'library',
             'install_path' => __DIR__ . '/../guzzlehttp/promises',
             'aliases' => array(),
-            'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
             'dev_requirement' => false,
         ),
         'guzzlehttp/psr7' => array(
-            'pretty_version' => '2.1.0',
-            'version' => '2.1.0.0',
+            'pretty_version' => '2.4.0',
+            'version' => '2.4.0.0',
+            'reference' => '13388f00956b1503577598873fffb5ae994b5737',
             'type' => 'library',
             'install_path' => __DIR__ . '/../guzzlehttp/psr7',
             'aliases' => array(),
-            'reference' => '089edd38f5b8abba6cb01567c2a8aaa47cec4c72',
             'dev_requirement' => false,
         ),
         'hg/apidoc' => array(
             'pretty_version' => 'v1.1.2',
             'version' => '1.1.2.0',
+            'reference' => '4925ddf39c22f48acca702843d53bbb70a4687a4',
             'type' => 'think-extend',
             'install_path' => __DIR__ . '/../hg/apidoc',
             'aliases' => array(),
-            'reference' => '4925ddf39c22f48acca702843d53bbb70a4687a4',
             'dev_requirement' => false,
         ),
         'khanamiryan/qrcode-detector-decoder' => array(
             'pretty_version' => '1.0.5.2',
             'version' => '1.0.5.2',
+            'reference' => '04fdd58d86a387065f707dc6d3cc304c719910c1',
             'type' => 'library',
             'install_path' => __DIR__ . '/../khanamiryan/qrcode-detector-decoder',
             'aliases' => array(),
-            'reference' => '04fdd58d86a387065f707dc6d3cc304c719910c1',
             'dev_requirement' => false,
         ),
         'monolog/monolog' => array(
-            'pretty_version' => '2.6.0',
-            'version' => '2.6.0.0',
+            'pretty_version' => '2.8.0',
+            'version' => '2.8.0.0',
+            'reference' => '720488632c590286b88b80e62aa3d3d551ad4a50',
             'type' => 'library',
             'install_path' => __DIR__ . '/../monolog/monolog',
             'aliases' => array(),
-            'reference' => '247918972acd74356b0a91dfaa5adcaec069b6c0',
             'dev_requirement' => false,
         ),
         'mtdowling/jmespath.php' => array(
             'pretty_version' => '2.6.1',
             'version' => '2.6.1.0',
+            'reference' => '9b87907a81b87bc76d19a7fb2d61e61486ee9edb',
             'type' => 'library',
             'install_path' => __DIR__ . '/../mtdowling/jmespath.php',
             'aliases' => array(),
-            'reference' => '9b87907a81b87bc76d19a7fb2d61e61486ee9edb',
             'dev_requirement' => false,
         ),
         'myclabs/php-enum' => array(
-            'pretty_version' => '1.6.6',
-            'version' => '1.6.6.0',
+            'pretty_version' => '1.8.3',
+            'version' => '1.8.3.0',
+            'reference' => 'b942d263c641ddb5190929ff840c68f78713e937',
             'type' => 'library',
             'install_path' => __DIR__ . '/../myclabs/php-enum',
             'aliases' => array(),
-            'reference' => '32c4202886c51fbe5cc3a7c34ec5c9a4a790345e',
             'dev_requirement' => false,
         ),
         'overtrue/socialite' => array(
             'pretty_version' => '2.0.24',
             'version' => '2.0.24.0',
+            'reference' => 'ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec',
             'type' => 'library',
             'install_path' => __DIR__ . '/../overtrue/socialite',
             'aliases' => array(),
-            'reference' => 'ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec',
             'dev_requirement' => false,
         ),
         'overtrue/wechat' => array(
             'pretty_version' => '4.5.0',
             'version' => '4.5.0.0',
+            'reference' => '04a940f97d6812a67bb8d5f2dbaebf9ad78ae776',
             'type' => 'library',
             'install_path' => __DIR__ . '/../overtrue/wechat',
             'aliases' => array(),
-            'reference' => '04a940f97d6812a67bb8d5f2dbaebf9ad78ae776',
+            'dev_requirement' => false,
+        ),
+        'oygza/aliyun-php-sdk-afs' => array(
+            'pretty_version' => '1.0.0',
+            'version' => '1.0.0.0',
+            'reference' => '2b941c48755ee09fea8f58fc65ba372b830269cb',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../oygza/aliyun-php-sdk-afs',
+            'aliases' => array(),
             'dev_requirement' => false,
         ),
         'phpoffice/phpexcel' => array(
-            'pretty_version' => '1.8.1',
-            'version' => '1.8.1.0',
+            'pretty_version' => '1.8.2',
+            'version' => '1.8.2.0',
+            'reference' => '1441011fb7ecdd8cc689878f54f8b58a6805f870',
             'type' => 'library',
             'install_path' => __DIR__ . '/../phpoffice/phpexcel',
             'aliases' => array(),
-            'reference' => '372c7cbb695a6f6f1e62649381aeaa37e7e70b32',
             'dev_requirement' => false,
         ),
         'pimple/pimple' => array(
             'pretty_version' => 'v3.5.0',
             'version' => '3.5.0.0',
+            'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
             'type' => 'library',
             'install_path' => __DIR__ . '/../pimple/pimple',
             'aliases' => array(),
-            'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
             'dev_requirement' => false,
         ),
         'psr/cache' => array(
-            'pretty_version' => '2.0.0',
-            'version' => '2.0.0.0',
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/cache',
             'aliases' => array(),
-            'reference' => '213f9dbc5b9bfbc4f8db86d2838dc968752ce13b',
             'dev_requirement' => false,
         ),
         'psr/cache-implementation' => array(
@@ -251,21 +260,21 @@
             ),
         ),
         'psr/container' => array(
-            'pretty_version' => '1.1.2',
-            'version' => '1.1.2.0',
+            'pretty_version' => '2.0.1',
+            'version' => '2.0.1.0',
+            'reference' => '2ae37329ee82f91efadc282cc2d527fd6065a5ef',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/container',
             'aliases' => array(),
-            'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
             'dev_requirement' => false,
         ),
         'psr/event-dispatcher' => array(
             'pretty_version' => '1.0.0',
             'version' => '1.0.0.0',
+            'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/event-dispatcher',
             'aliases' => array(),
-            'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
             'dev_requirement' => false,
         ),
         'psr/event-dispatcher-implementation' => array(
@@ -277,10 +286,10 @@
         'psr/http-client' => array(
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
+            'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/http-client',
             'aliases' => array(),
-            'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
             'dev_requirement' => false,
         ),
         'psr/http-client-implementation' => array(
@@ -292,10 +301,10 @@
         'psr/http-factory' => array(
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
+            'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/http-factory',
             'aliases' => array(),
-            'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
             'dev_requirement' => false,
         ),
         'psr/http-factory-implementation' => array(
@@ -307,10 +316,10 @@
         'psr/http-message' => array(
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
+            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/http-message',
             'aliases' => array(),
-            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
             'dev_requirement' => false,
         ),
         'psr/http-message-implementation' => array(
@@ -322,10 +331,10 @@
         'psr/log' => array(
             'pretty_version' => '1.1.4',
             'version' => '1.1.4.0',
+            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/log',
             'aliases' => array(),
-            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
             'dev_requirement' => false,
         ),
         'psr/log-implementation' => array(
@@ -337,10 +346,10 @@
         'psr/simple-cache' => array(
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
+            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/simple-cache',
             'aliases' => array(),
-            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
             'dev_requirement' => false,
         ),
         'psr/simple-cache-implementation' => array(
@@ -350,48 +359,39 @@
             ),
         ),
         'qiniu/php-sdk' => array(
-            'pretty_version' => 'v7.5.0',
-            'version' => '7.5.0.0',
+            'pretty_version' => 'v7.4.1',
+            'version' => '7.4.1.0',
+            'reference' => '10c7ead8357743b4b987a335c14964fb07700d57',
             'type' => 'library',
             'install_path' => __DIR__ . '/../qiniu/php-sdk',
             'aliases' => array(),
-            'reference' => '0cc46e4206002d1a736dbb4abb1424b0b7fc3f22',
             'dev_requirement' => false,
         ),
         'ralouphie/getallheaders' => array(
             'pretty_version' => '3.0.3',
             'version' => '3.0.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../ralouphie/getallheaders',
-            'aliases' => array(),
             'reference' => '120b605dfeb996808c31b6477290a714d356e822',
-            'dev_requirement' => false,
-        ),
-        'songshenzong/support' => array(
-            'pretty_version' => '2.0.6',
-            'version' => '2.0.6.0',
             'type' => 'library',
-            'install_path' => __DIR__ . '/../songshenzong/support',
+            'install_path' => __DIR__ . '/../ralouphie/getallheaders',
             'aliases' => array(),
-            'reference' => 'b334d8abc99e8a85538a556e10c670c18b71c230',
             'dev_requirement' => false,
         ),
         'symfony/cache' => array(
-            'pretty_version' => 'v5.4.8',
-            'version' => '5.4.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => 'c4e387b739022fd4b20abd8edb2143c44c5daa14',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/cache',
             'aliases' => array(),
-            'reference' => '4c6747cf7e56c6b8e3094dd24852bd3e364375b1',
             'dev_requirement' => false,
         ),
         'symfony/cache-contracts' => array(
-            'pretty_version' => 'v2.5.1',
-            'version' => '2.5.1.0',
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/cache-contracts',
             'aliases' => array(),
-            'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
             'dev_requirement' => false,
         ),
         'symfony/cache-implementation' => array(
@@ -401,30 +401,30 @@
             ),
         ),
         'symfony/deprecation-contracts' => array(
-            'pretty_version' => 'v3.0.0',
-            'version' => '3.0.0.0',
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
             'aliases' => array(),
-            'reference' => 'c726b64c1ccfe2896cb7df2e1331c357ad1c8ced',
             'dev_requirement' => false,
         ),
         'symfony/event-dispatcher' => array(
-            'pretty_version' => 'v5.4.3',
-            'version' => '5.4.3.0',
+            'pretty_version' => 'v5.4.9',
+            'version' => '5.4.9.0',
+            'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/event-dispatcher',
             'aliases' => array(),
-            'reference' => 'dec8a9f58d20df252b9cd89f1c6c1530f747685d',
             'dev_requirement' => false,
         ),
         'symfony/event-dispatcher-contracts' => array(
-            'pretty_version' => 'v3.0.1',
-            'version' => '3.0.1.0',
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
             'aliases' => array(),
-            'reference' => '7bc61cc2db649b4637d331240c5346dcc7708051',
             'dev_requirement' => false,
         ),
         'symfony/event-dispatcher-implementation' => array(
@@ -434,221 +434,203 @@
             ),
         ),
         'symfony/http-foundation' => array(
-            'pretty_version' => 'v5.4.8',
-            'version' => '5.4.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => 'e7793b7906f72a8cc51054fbca9dcff7a8af1c1e',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/http-foundation',
             'aliases' => array(),
-            'reference' => 'ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2',
             'dev_requirement' => false,
         ),
         'symfony/options-resolver' => array(
             'pretty_version' => 'v5.4.3',
             'version' => '5.4.3.0',
+            'reference' => 'cc1147cb11af1b43f503ac18f31aa3bec213aba8',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/options-resolver',
             'aliases' => array(),
-            'reference' => 'cc1147cb11af1b43f503ac18f31aa3bec213aba8',
             'dev_requirement' => false,
         ),
         'symfony/polyfill-ctype' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
             'aliases' => array(),
-            'reference' => '30885182c981ab175d4d034db0f6f469898070ab',
             'dev_requirement' => false,
         ),
         'symfony/polyfill-intl-grapheme' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '433d05519ce6990bf3530fba6957499d327395c2',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',
             'aliases' => array(),
-            'reference' => '81b86b50cf841a64252b439e738e97f4a34e2783',
             'dev_requirement' => false,
         ),
         'symfony/polyfill-intl-normalizer' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '219aa369ceff116e673852dce47c3a41794c14bd',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
             'aliases' => array(),
-            'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
             'dev_requirement' => false,
         ),
         'symfony/polyfill-mbstring' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
             'aliases' => array(),
-            'reference' => '0abb51d2f102e00a4eefcf46ba7fec406d245825',
             'dev_requirement' => false,
         ),
         'symfony/polyfill-php73' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => 'e440d35fa0286f77fb45b79a03fedbeda9307e85',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-php73',
             'aliases' => array(),
-            'reference' => 'cc5db0e22b3cb4111010e48785a97f670b350ca5',
             'dev_requirement' => false,
         ),
         'symfony/polyfill-php80' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-php80',
             'aliases' => array(),
-            'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c',
             'dev_requirement' => false,
         ),
         'symfony/property-access' => array(
             'pretty_version' => 'v5.4.8',
             'version' => '5.4.8.0',
+            'reference' => 'fe501d498d6ec7e9efe928c90fabedf629116495',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/property-access',
             'aliases' => array(),
-            'reference' => 'fe501d498d6ec7e9efe928c90fabedf629116495',
             'dev_requirement' => false,
         ),
         'symfony/property-info' => array(
-            'pretty_version' => 'v6.0.7',
-            'version' => '6.0.7.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '924406e19365953870517eb7f63ac3f7bfb71875',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/property-info',
             'aliases' => array(),
-            'reference' => '0f26f0870f05d65d5c06681ecbf36e546204f4b5',
             'dev_requirement' => false,
         ),
         'symfony/psr-http-message-bridge' => array(
             'pretty_version' => 'v2.1.2',
             'version' => '2.1.2.0',
+            'reference' => '22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34',
             'type' => 'symfony-bridge',
             'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
             'aliases' => array(),
-            'reference' => '22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34',
             'dev_requirement' => false,
         ),
         'symfony/service-contracts' => array(
-            'pretty_version' => 'v2.5.1',
-            'version' => '2.5.1.0',
+            'pretty_version' => 'v1.1.2',
+            'version' => '1.1.2.0',
+            'reference' => '191afdcb5804db960d26d8566b7e9a2843cab3a0',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/service-contracts',
             'aliases' => array(),
-            'reference' => '24d9dc654b83e91aa59f9d167b131bc3b5bea24c',
             'dev_requirement' => false,
         ),
         'symfony/string' => array(
-            'pretty_version' => 'v6.0.8',
-            'version' => '6.0.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '4432bc7df82a554b3e413a8570ce2fea90e94097',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/string',
             'aliases' => array(),
-            'reference' => 'ac0aa5c2282e0de624c175b68d13f2c8f2e2649d',
             'dev_requirement' => false,
         ),
         'symfony/var-exporter' => array(
-            'pretty_version' => 'v6.0.8',
-            'version' => '6.0.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/var-exporter',
             'aliases' => array(),
-            'reference' => '74b272979a490747c6775b0228d06cf246306a99',
             'dev_requirement' => false,
         ),
         'symfony/yaml' => array(
             'pretty_version' => 'v2.8.52',
             'version' => '2.8.52.0',
+            'reference' => '02c1859112aa779d9ab394ae4f3381911d84052b',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/yaml',
             'aliases' => array(),
-            'reference' => '02c1859112aa779d9ab394ae4f3381911d84052b',
             'dev_requirement' => false,
         ),
         'topthink/framework' => array(
             'pretty_version' => 'v5.1.41',
             'version' => '5.1.41.0',
+            'reference' => '7137741a323a4a60cfca334507cd1812fac91bb2',
             'type' => 'think-framework',
             'install_path' => __DIR__ . '/../../thinkphp',
             'aliases' => array(),
-            'reference' => '7137741a323a4a60cfca334507cd1812fac91bb2',
             'dev_requirement' => false,
         ),
         'topthink/think-installer' => array(
             'pretty_version' => 'v2.0.5',
             'version' => '2.0.5.0',
+            'reference' => '38ba647706e35d6704b5d370c06f8a160b635f88',
             'type' => 'composer-plugin',
             'install_path' => __DIR__ . '/../topthink/think-installer',
             'aliases' => array(),
-            'reference' => '38ba647706e35d6704b5d370c06f8a160b635f88',
-            'dev_requirement' => false,
-        ),
-        'xin/container' => array(
-            'pretty_version' => '2.0.1',
-            'version' => '2.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../xin/container',
-            'aliases' => array(),
-            'reference' => '97bb67f87dd851545938a1f2fe0ffbd379e3ff81',
-            'dev_requirement' => false,
-        ),
-        'xin/helper' => array(
-            'pretty_version' => '1.0.0',
-            'version' => '1.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../xin/helper',
-            'aliases' => array(),
-            'reference' => '02a58132dae2aea2d1c0b8e66f55125969224747',
             'dev_requirement' => false,
         ),
         'zoujingli/ip2region' => array(
             'pretty_version' => 'v1.0.12',
             'version' => '1.0.12.0',
+            'reference' => '82cebc7a6be46524797454e98d3b165521065c26',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/ip2region',
             'aliases' => array(),
-            'reference' => '82cebc7a6be46524797454e98d3b165521065c26',
             'dev_requirement' => false,
         ),
         'zoujingli/think-library' => array(
             'pretty_version' => 'v5.1.x-dev',
             'version' => '5.1.9999999.9999999-dev',
+            'reference' => '6a5c8b7ad40d19664494522dcf9388a48df43447',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/think-library',
             'aliases' => array(),
-            'reference' => '6a5c8b7ad40d19664494522dcf9388a48df43447',
             'dev_requirement' => false,
         ),
         'zoujingli/thinkadmin' => array(
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
+            'reference' => '4afa5bd4473dd76d59ec12d4dd574ef2289d4b7e',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
-            'reference' => '450c41a76767b5def137774c8a7eb2b64e975724',
             'dev_requirement' => false,
         ),
         'zoujingli/wechat-developer' => array(
-            'pretty_version' => 'v1.2.35',
-            'version' => '1.2.35.0',
+            'pretty_version' => 'v1.2.36',
+            'version' => '1.2.36.0',
+            'reference' => 'a598aaa2b8e2470ea2120cff514df1de88bde6df',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/wechat-developer',
             'aliases' => array(),
-            'reference' => 'cfe3e83798d3c7b78855ae214acb6b14321de45d',
             'dev_requirement' => false,
         ),
         'zoujingli/weopen-developer' => array(
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
+            'reference' => '4d0d3c064e54556621453845fc65ba52de58a880',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/weopen-developer',
             'aliases' => array(
                 0 => '9999999-dev',
             ),
-            'reference' => '4d0d3c064e54556621453845fc65ba52de58a880',
             'dev_requirement' => false,
         ),
     ),

+ 2 - 2
vendor/composer/platform_check.php

@@ -4,8 +4,8 @@
 
 $issues = array();
 
-if (!(PHP_VERSION_ID >= 80002)) {
-    $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.2". You are running ' . PHP_VERSION . '.';
+if (!(PHP_VERSION_ID >= 70300)) {
+    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.';
 }
 
 if ($issues) {

+ 22 - 0
vendor/guzzlehttp/guzzle/CHANGELOG.md

@@ -2,6 +2,28 @@
 
 Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
 
+## 7.4.5 - 2022-06-20
+
+* Fix change in port should be considered a change in origin
+* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin
+
+## 7.4.4 - 2022-06-09
+
+* Fix failure to strip Authorization header on HTTP downgrade
+* Fix failure to strip the Cookie header on change in host or HTTP downgrade
+
+## 7.4.3 - 2022-05-25
+
+* Fix cross-domain cookie leakage
+
+## 7.4.2 - 2022-03-20
+
+### Fixed
+
+- Remove curl auth on cross-domain redirects to align with the Authorization HTTP header
+- Reject non-HTTP schemes in StreamHandler
+- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve`
+
 ## 7.4.1 - 2021-12-06
 
 ### Changed

+ 14 - 14
vendor/guzzlehttp/guzzle/README.md

@@ -42,9 +42,9 @@ $promise->wait();
 
 We use GitHub issues only to discuss bugs and new features. For support please refer to:
 
-- [Documentation](http://guzzlephp.org/)
-- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)
-- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](http://slack.httplug.io/)
+- [Documentation](https://docs.guzzlephp.org)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle)
+- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/)
 - [Gitter](https://gitter.im/guzzle/guzzle)
 
 
@@ -60,23 +60,23 @@ composer require guzzlehttp/guzzle
 
 ## Version Guidance
 
-| Version | Status     | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version |
-|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|
-| 3.x     | EOL        | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >= 5.3.3    |
-| 4.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >= 5.4      |
-| 5.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >= 5.4      |
-| 6.x     | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >= 5.5      |
-| 7.x     | Latest     | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes   | >= 7.2      |
+| Version | Status         | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version  |
+|---------|----------------|---------------------|--------------|---------------------|---------------------|-------|--------------|
+| 3.x     | EOL            | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >=5.3.3,<7.0 |
+| 4.x     | EOL            | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >=5.4,<7.0   |
+| 5.x     | EOL            | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >=5.4,<7.4   |
+| 6.x     | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >=5.5,<8.0   |
+| 7.x     | Latest         | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes   | >=7.2.5,<8.2 |
 
 [guzzle-3-repo]: https://github.com/guzzle/guzzle3
 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
 [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
 [guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5
 [guzzle-7-repo]: https://github.com/guzzle/guzzle
-[guzzle-3-docs]: http://guzzle3.readthedocs.org
-[guzzle-5-docs]: http://docs.guzzlephp.org/en/5.3/
-[guzzle-6-docs]: http://docs.guzzlephp.org/en/6.5/
-[guzzle-7-docs]: http://docs.guzzlephp.org/en/latest/
+[guzzle-3-docs]: https://guzzle3.readthedocs.io/
+[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/
+[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/
+[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/
 
 
 ## Security

+ 4 - 1
vendor/guzzlehttp/guzzle/composer.json

@@ -54,7 +54,7 @@
         "php": "^7.2.5 || ^8.0",
         "ext-json": "*",
         "guzzlehttp/promises": "^1.5",
-        "guzzlehttp/psr7": "^1.8.3 || ^2.1",
+        "guzzlehttp/psr7": "^1.9 || ^2.4",
         "psr/http-client": "^1.0",
         "symfony/deprecation-contracts": "^2.2 || ^3.0"
     },
@@ -74,6 +74,9 @@
         "psr/log": "Required for using the Log middleware"
     },
     "config": {
+        "allow-plugins": {
+            "bamarni/composer-bin-plugin": true
+        },
         "preferred-install": "dist",
         "sort-packages": true
     },

+ 5 - 0
vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php

@@ -241,6 +241,11 @@ class CookieJar implements CookieJarInterface
                 if (0 !== \strpos($sc->getPath(), '/')) {
                     $sc->setPath($this->getCookiePathFromRequest($request));
                 }
+                if (!$sc->matchesDomain($request->getUri()->getHost())) {
+                    continue;
+                }
+                // Note: At this point `$sc->getDomain()` being a public suffix should
+                // be rejected, but we don't want to pull in the full PSL dependency.
                 $this->setCookie($sc);
             }
         }

+ 4 - 2
vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php

@@ -379,10 +379,12 @@ class SetCookie
 
         // Remove the leading '.' as per spec in RFC 6265.
         // https://tools.ietf.org/html/rfc6265#section-5.2.3
-        $cookieDomain = \ltrim($cookieDomain, '.');
+        $cookieDomain = \ltrim(\strtolower($cookieDomain), '.');
+
+        $domain = \strtolower($domain);
 
         // Domain not set or exact match.
-        if (!$cookieDomain || !\strcasecmp($domain, $cookieDomain)) {
+        if ('' === $cookieDomain || $domain === $cookieDomain) {
             return true;
         }
 

+ 2 - 2
vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php

@@ -32,9 +32,9 @@ class CurlMultiHandler
     private $selectTimeout;
 
     /**
-     * @var resource|\CurlMultiHandle|null the currently executing resource in `curl_multi_exec`.
+     * @var int Will be higher than 0 when `curl_multi_exec` is still running.
      */
-    private $active;
+    private $active = 0;
 
     /**
      * @var array Request entry handles, indexed by handle id in `addRequest`.

+ 8 - 1
vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php

@@ -266,6 +266,10 @@ class StreamHandler
             $methods = \array_flip(\get_class_methods(__CLASS__));
         }
 
+        if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) {
+            throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request);
+        }
+
         // HTTP/1.1 streams using the PHP stream wrapper require a
         // Connection: close header
         if ($request->getProtocolVersion() == '1.1'
@@ -318,7 +322,7 @@ class StreamHandler
         return $this->createResource(
             function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) {
                 $resource = @\fopen((string) $uri, 'r', false, $contextResource);
-                $this->lastHeaders = $http_response_header;
+                $this->lastHeaders = $http_response_header ?? [];
 
                 if (false === $resource) {
                     throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context);
@@ -377,6 +381,9 @@ class StreamHandler
                 'ignore_errors'    => true,
                 'follow_location'  => 0,
             ],
+            'ssl' => [
+                'peer_name' => $request->getUri()->getHost(),
+            ],
         ];
 
         $body = (string) $request->getBody();

+ 19 - 7
vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php

@@ -88,6 +88,14 @@ class RedirectMiddleware
         $this->guardMax($request, $response, $options);
         $nextRequest = $this->modifyRequest($request, $options, $response);
 
+        // If authorization is handled by curl, unset it if URI is cross-origin.
+        if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) {
+            unset(
+                $options['curl'][\CURLOPT_HTTPAUTH],
+                $options['curl'][\CURLOPT_USERPWD]
+            );
+        }
+
         if (isset($options['allow_redirects']['on_redirect'])) {
             ($options['allow_redirects']['on_redirect'])(
                 $request,
@@ -132,7 +140,7 @@ class RedirectMiddleware
     }
 
     /**
-     * Check for too many redirects
+     * Check for too many redirects.
      *
      * @throws TooManyRedirectsException Too many redirects.
      */
@@ -168,7 +176,7 @@ class RedirectMiddleware
             $modify['body'] = '';
         }
 
-        $uri = $this->redirectUri($request, $response, $protocols);
+        $uri = self::redirectUri($request, $response, $protocols);
         if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {
             $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion'];
             $uri = Utils::idnUriConvert($uri, $idnOptions);
@@ -188,19 +196,23 @@ class RedirectMiddleware
             $modify['remove_headers'][] = 'Referer';
         }
 
-        // Remove Authorization header if host is different.
-        if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
+        // Remove Authorization and Cookie headers if URI is cross-origin.
+        if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) {
             $modify['remove_headers'][] = 'Authorization';
+            $modify['remove_headers'][] = 'Cookie';
         }
 
         return Psr7\Utils::modifyRequest($request, $modify);
     }
 
     /**
-     * Set the appropriate URL on the request based on the location header
+     * Set the appropriate URL on the request based on the location header.
      */
-    private function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols): UriInterface
-    {
+    private static function redirectUri(
+        RequestInterface $request,
+        ResponseInterface $response,
+        array $protocols
+    ): UriInterface {
         $location = Psr7\UriResolver::resolve(
             $request->getUri(),
             new Psr7\Uri($response->getHeaderLine('Location'))

+ 52 - 0
vendor/guzzlehttp/psr7/CHANGELOG.md

@@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## Unreleased
 
+## 2.4.0 - 2022-06-20
+
+### Added
+
+- Added provisional PHP 8.2 support
+- Added `UriComparator::isCrossOrigin` method
+
+## 2.3.0 - 2022-06-09
+
+### Fixed
+
+- Added `Header::splitList` method
+- Added `Utils::tryGetContents` method
+- Improved `Stream::getContents` method
+- Updated mimetype mappings
+
+## 2.2.2 - 2022-06-08
+
+### Fixed
+
+- Fix `Message::parseRequestUri` for numeric headers
+- Re-wrap exceptions thrown in `fread` into runtime exceptions
+- Throw an exception when multipart options is misformatted
+
+## 2.2.1 - 2022-03-20
+
+### Fixed
+
+- Correct header value validation
+
+## 2.2.0 - 2022-03-20
+
+### Added
+
+- A more compressive list of mime types
+- Add JsonSerializable to Uri
+- Missing return types
+
+### Fixed
+
+- Bug MultipartStream no `uri` metadata
+- Bug MultipartStream with filename for `data://` streams
+- Fixed new line handling in MultipartStream
+- Reduced RAM usage when copying streams
+- Updated parsing in `Header::normalize()`
+
+## 2.1.1 - 2022-03-20
+
+### Fixed
+
+- Validate header values properly
+
 ## 2.1.0 - 2021-10-06
 
 ### Changed

+ 33 - 2
vendor/guzzlehttp/psr7/README.md

@@ -1,6 +1,6 @@
 # PSR-7 Message Implementation
 
-This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)
+This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/)
 message implementation, several stream decorators, and some helpful
 functionality like query string parsing.
 
@@ -527,6 +527,17 @@ When fopen fails, PHP normally raises a warning. This function adds an
 error handler that checks for errors and throws an exception instead.
 
 
+## `GuzzleHttp\Psr7\Utils::tryGetContents`
+
+`public static function tryGetContents(resource $stream): string`
+
+Safely gets the contents of a given stream.
+
+When stream_get_contents fails, PHP normally raises a warning. This
+function adds an error handler that checks for errors and throws an
+exception instead.
+
+
 ## `GuzzleHttp\Psr7\Utils::uriFor`
 
 `public static function uriFor(string|UriInterface $uri): UriInterface`
@@ -658,7 +669,7 @@ manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__to
 
 `public static function fromParts(array $parts): UriInterface`
 
-Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.
+Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components.
 
 
 ### `GuzzleHttp\Psr7\Uri::withQueryValue`
@@ -683,6 +694,16 @@ associative array of key => value.
 Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
 provided key are removed.
 
+## Cross-Origin Detection
+
+`GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin.
+
+### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin`
+
+`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool`
+
+Determines if a modified URL should be considered cross-origin with respect to an original URL.
+
 ## Reference Resolution
 
 `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
@@ -808,14 +829,24 @@ This of course assumes they will be resolved against the same base URI. If this
 equivalence or difference of relative references does not mean anything.
 
 
+## Version Guidance
+
+| Version | Status         | PHP Version      |
+|---------|----------------|------------------|
+| 1.x     | Security fixes | >=5.4,<8.1       |
+| 2.x     | Latest         | ^7.2.5 \|\| ^8.0 |
+
+
 ## Security
 
 If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information.
 
+
 ## License
 
 Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.
 
+
 ## For Enterprise
 
 Available as part of the Tidelift Subscription

+ 4 - 1
vendor/guzzlehttp/psr7/composer.json

@@ -79,10 +79,13 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "2.1-dev"
+            "dev-master": "2.4-dev"
         }
     },
     "config": {
+        "allow-plugins": {
+            "bamarni/composer-bin-plugin": true
+        },
         "preferred-install": "dist",
         "sort-packages": true
     }

+ 5 - 0
vendor/guzzlehttp/psr7/src/CachingStream.php

@@ -21,6 +21,11 @@ final class CachingStream implements StreamInterface
     private $skipReadBytes = 0;
 
     /**
+     * @var StreamInterface
+     */
+    private $stream;
+
+    /**
      * We will treat the buffer object as the body of the stream
      *
      * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.

+ 3 - 0
vendor/guzzlehttp/psr7/src/DroppingStream.php

@@ -17,6 +17,9 @@ final class DroppingStream implements StreamInterface
     /** @var int */
     private $maxLength;
 
+    /** @var StreamInterface */
+    private $stream;
+
     /**
      * @param StreamInterface $stream    Underlying stream to decorate.
      * @param int             $maxLength Maximum size before dropping data.

+ 1 - 0
vendor/guzzlehttp/psr7/src/FnStream.php

@@ -12,6 +12,7 @@ use Psr\Http\Message\StreamInterface;
  * Allows for easy testing and extension of a provided stream without needing
  * to create a concrete class for a simple extension point.
  */
+#[\AllowDynamicProperties]
 final class FnStream implements StreamInterface
 {
     private const SLOTS = [

+ 85 - 20
vendor/guzzlehttp/psr7/src/Header.php

@@ -19,20 +19,22 @@ final class Header
         static $trimmed = "\"'  \n\t\r";
         $params = $matches = [];
 
-        foreach (self::normalize($header) as $val) {
-            $part = [];
-            foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
-                if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
-                    $m = $matches[0];
-                    if (isset($m[1])) {
-                        $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
-                    } else {
-                        $part[] = trim($m[0], $trimmed);
+        foreach ((array) $header as $value) {
+            foreach (self::splitList($value) as $val) {
+                $part = [];
+                foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
+                    if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
+                        $m = $matches[0];
+                        if (isset($m[1])) {
+                            $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
+                        } else {
+                            $part[] = trim($m[0], $trimmed);
+                        }
                     }
                 }
-            }
-            if ($part) {
-                $params[] = $part;
+                if ($part) {
+                    $params[] = $part;
+                }
             }
         }
 
@@ -44,23 +46,86 @@ final class Header
      * headers into an array of headers with no comma separated values.
      *
      * @param string|array $header Header to normalize.
+     *
+     * @deprecated Use self::splitList() instead.
      */
     public static function normalize($header): array
     {
-        if (!is_array($header)) {
-            return array_map('trim', explode(',', $header));
+        $result = [];
+        foreach ((array) $header as $value) {
+            foreach (self::splitList($value) as $parsed) {
+                $result[] = $parsed;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Splits a HTTP header defined to contain comma-separated list into
+     * each individual value. Empty values will be removed.
+     *
+     * Example headers include 'accept', 'cache-control' and 'if-none-match'.
+     *
+     * This method must not be used to parse headers that are not defined as
+     * a list, such as 'user-agent' or 'set-cookie'.
+     *
+     * @param string|string[] $values Header value as returned by MessageInterface::getHeader()
+     *
+     * @return string[]
+     */
+    public static function splitList($values): array
+    {
+        if (!\is_array($values)) {
+            $values = [$values];
         }
 
         $result = [];
-        foreach ($header as $value) {
-            foreach ((array) $value as $v) {
-                if (strpos($v, ',') === false) {
-                    $result[] = $v;
+        foreach ($values as $value) {
+            if (!\is_string($value)) {
+                throw new \TypeError('$header must either be a string or an array containing strings.');
+            }
+
+            $v = '';
+            $isQuoted = false;
+            $isEscaped = false;
+            for ($i = 0, $max = \strlen($value); $i < $max; $i++) {
+                if ($isEscaped) {
+                    $v .= $value[$i];
+                    $isEscaped = false;
+
                     continue;
                 }
-                foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) {
-                    $result[] = trim($vv);
+
+                if (!$isQuoted && $value[$i] === ',') {
+                    $v = \trim($v);
+                    if ($v !== '') {
+                        $result[] = $v;
+                    }
+
+                    $v = '';
+                    continue;
                 }
+
+                if ($isQuoted && $value[$i] === '\\') {
+                    $isEscaped = true;
+                    $v .= $value[$i];
+
+                    continue;
+                }
+                if ($value[$i] === '"') {
+                    $isQuoted = !$isQuoted;
+                    $v .= $value[$i];
+
+                    continue;
+                }
+
+                $v .= $value[$i];
+            }
+
+            $v = \trim($v);
+            if ($v !== '') {
+                $result[] = $v;
             }
         }
 

+ 3 - 0
vendor/guzzlehttp/psr7/src/InflateStream.php

@@ -21,6 +21,9 @@ final class InflateStream implements StreamInterface
 {
     use StreamDecoratorTrait;
 
+    /** @var StreamInterface */
+    private $stream;
+
     public function __construct(StreamInterface $stream)
     {
         $resource = StreamWrapper::getResource($stream);

+ 1 - 0
vendor/guzzlehttp/psr7/src/LazyOpenStream.php

@@ -10,6 +10,7 @@ use Psr\Http\Message\StreamInterface;
  * Lazily reads or writes to a file that is opened only after an IO operation
  * take place on the stream.
  */
+#[\AllowDynamicProperties]
 final class LazyOpenStream implements StreamInterface
 {
     use StreamDecoratorTrait;

+ 3 - 0
vendor/guzzlehttp/psr7/src/LimitStream.php

@@ -19,6 +19,9 @@ final class LimitStream implements StreamInterface
     /** @var int Limit the number of bytes that can be read */
     private $limit;
 
+    /** @var StreamInterface */
+    private $stream;
+
     /**
      * @param StreamInterface $stream Stream to wrap
      * @param int             $limit  Total number of bytes to allow to be read

+ 3 - 0
vendor/guzzlehttp/psr7/src/Message.php

@@ -175,6 +175,9 @@ final class Message
     public static function parseRequestUri(string $path, array $headers): string
     {
         $hostKey = array_filter(array_keys($headers), function ($k) {
+            // Numeric array keys are converted to int by PHP.
+            $k = (string) $k;
+
             return strtolower($k) === 'host';
         });
 

+ 38 - 9
vendor/guzzlehttp/psr7/src/MessageTrait.php

@@ -145,11 +145,9 @@ trait MessageTrait
     {
         $this->headerNames = $this->headers = [];
         foreach ($headers as $header => $value) {
-            if (is_int($header)) {
-                // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec
-                // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass.
-                $header = (string) $header;
-            }
+            // Numeric array keys are converted to int by PHP.
+            $header = (string) $header;
+
             $this->assertHeader($header);
             $value = $this->normalizeHeaderValue($value);
             $normalized = strtolower($header);
@@ -171,14 +169,14 @@ trait MessageTrait
     private function normalizeHeaderValue($value): array
     {
         if (!is_array($value)) {
-            return $this->trimHeaderValues([$value]);
+            return $this->trimAndValidateHeaderValues([$value]);
         }
 
         if (count($value) === 0) {
             throw new \InvalidArgumentException('Header value can not be an empty array.');
         }
 
-        return $this->trimHeaderValues($value);
+        return $this->trimAndValidateHeaderValues($value);
     }
 
     /**
@@ -195,7 +193,7 @@ trait MessageTrait
      *
      * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
      */
-    private function trimHeaderValues(array $values): array
+    private function trimAndValidateHeaderValues(array $values): array
     {
         return array_map(function ($value) {
             if (!is_scalar($value) && null !== $value) {
@@ -205,7 +203,10 @@ trait MessageTrait
                 ));
             }
 
-            return trim((string) $value, " \t");
+            $trimmed = trim((string) $value, " \t");
+            $this->assertValue($trimmed);
+
+            return $trimmed;
         }, array_values($values));
     }
 
@@ -232,4 +233,32 @@ trait MessageTrait
             );
         }
     }
+
+    /**
+     * @see https://tools.ietf.org/html/rfc7230#section-3.2
+     *
+     * field-value    = *( field-content / obs-fold )
+     * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
+     * field-vchar    = VCHAR / obs-text
+     * VCHAR          = %x21-7E
+     * obs-text       = %x80-FF
+     * obs-fold       = CRLF 1*( SP / HTAB )
+     */
+    private function assertValue(string $value): void
+    {
+        // The regular expression intentionally does not support the obs-fold production, because as
+        // per RFC 7230#3.2.4:
+        //
+        // A sender MUST NOT generate a message that includes
+        // line folding (i.e., that has any field-value that contains a match to
+        // the obs-fold rule) unless the message is intended for packaging
+        // within the message/http media type.
+        //
+        // Clients must not send a request with line folding and a server sending folded headers is
+        // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
+        // folding is not likely to break any legitimate use case.
+        if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/', $value)) {
+            throw new \InvalidArgumentException(sprintf('"%s" is not valid header value', $value));
+        }
+    }
 }

Файловите разлики са ограничени, защото са твърде много
+ 1208 - 101
vendor/guzzlehttp/psr7/src/MimeType.php


+ 7 - 1
vendor/guzzlehttp/psr7/src/MultipartStream.php

@@ -17,6 +17,9 @@ final class MultipartStream implements StreamInterface
     /** @var string */
     private $boundary;
 
+    /** @var StreamInterface */
+    private $stream;
+
     /**
      * @param array  $elements Array of associative arrays, each containing a
      *                         required "name" key mapping to the form field,
@@ -68,6 +71,9 @@ final class MultipartStream implements StreamInterface
         $stream = new AppendStream();
 
         foreach ($elements as $element) {
+            if (!is_array($element)) {
+                throw new \UnexpectedValueException("An array is expected");
+            }
             $this->addElement($stream, $element);
         }
 
@@ -89,7 +95,7 @@ final class MultipartStream implements StreamInterface
 
         if (empty($element['filename'])) {
             $uri = $element['contents']->getMetadata('uri');
-            if (substr($uri, 0, 6) !== 'php://') {
+            if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') {
                 $element['filename'] = $uri;
             }
         }

+ 3 - 0
vendor/guzzlehttp/psr7/src/NoSeekStream.php

@@ -13,6 +13,9 @@ final class NoSeekStream implements StreamInterface
 {
     use StreamDecoratorTrait;
 
+    /** @var StreamInterface */
+    private $stream;
+
     public function seek($offset, $whence = SEEK_SET): void
     {
         throw new \RuntimeException('Cannot seek a NoSeekStream');

+ 1 - 1
vendor/guzzlehttp/psr7/src/Query.php

@@ -43,7 +43,7 @@ final class Query
             $parts = explode('=', $kvp, 2);
             $key = $decoder($parts[0]);
             $value = isset($parts[1]) ? $decoder($parts[1]) : null;
-            if (!isset($result[$key])) {
+            if (!array_key_exists($key, $result)) {
                 $result[$key] = $value;
             } else {
                 if (!is_array($result[$key])) {

+ 1 - 1
vendor/guzzlehttp/psr7/src/ServerRequest.php

@@ -80,7 +80,7 @@ class ServerRequest extends Request implements ServerRequestInterface
     /**
      * Return an UploadedFile instance array.
      *
-     * @param array $files A array which respect $_FILES structure
+     * @param array $files An array which respect $_FILES structure
      *
      * @throws InvalidArgumentException for unrecognized values
      */

+ 9 - 6
vendor/guzzlehttp/psr7/src/Stream.php

@@ -96,13 +96,11 @@ class Stream implements StreamInterface
             throw new \RuntimeException('Stream is detached');
         }
 
-        $contents = stream_get_contents($this->stream);
-
-        if ($contents === false) {
-            throw new \RuntimeException('Unable to read stream contents');
+        if (!$this->readable) {
+            throw new \RuntimeException('Cannot read from non-readable stream');
         }
 
-        return $contents;
+        return Utils::tryGetContents($this->stream);
     }
 
     public function close(): void
@@ -229,7 +227,12 @@ class Stream implements StreamInterface
             return '';
         }
 
-        $string = fread($this->stream, $length);
+        try {
+            $string = fread($this->stream, $length);
+        } catch (\Exception $e) {
+            throw new \RuntimeException('Unable to read from stream', 0, $e);
+        }
+
         if (false === $string) {
             throw new \RuntimeException('Unable to read from stream');
         }

+ 6 - 1
vendor/guzzlehttp/psr7/src/Uri.php

@@ -14,7 +14,7 @@ use Psr\Http\Message\UriInterface;
  * @author Tobias Schultze
  * @author Matthew Weier O'Phinney
  */
-class Uri implements UriInterface
+class Uri implements UriInterface, \JsonSerializable
 {
     /**
      * Absolute http and https URIs require a host per RFC 7230 Section 2.7
@@ -525,6 +525,11 @@ class Uri implements UriInterface
         return $new;
     }
 
+    public function jsonSerialize(): string
+    {
+        return $this->__toString();
+    }
+
     /**
      * Apply parse_url parts to a URI.
      *

+ 49 - 2
vendor/guzzlehttp/psr7/src/Utils.php

@@ -131,7 +131,7 @@ final class Utils
             hash_update($ctx, $stream->read(1048576));
         }
 
-        $out = hash_final($ctx, (bool) $rawOutput);
+        $out = hash_final($ctx, $rawOutput);
         $stream->seek($pos);
 
         return $out;
@@ -304,7 +304,7 @@ final class Utils
                 /** @var resource $resource */
                 if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') {
                     $stream = self::tryFopen('php://temp', 'w+');
-                    fwrite($stream, stream_get_contents($resource));
+                    stream_copy_to_stream($resource, $stream);
                     fseek($stream, 0);
                     $resource = $stream;
                 }
@@ -387,6 +387,53 @@ final class Utils
     }
 
     /**
+     * Safely gets the contents of a given stream.
+     *
+     * When stream_get_contents fails, PHP normally raises a warning. This
+     * function adds an error handler that checks for errors and throws an
+     * exception instead.
+     *
+     * @param resource $stream
+     *
+     * @throws \RuntimeException if the stream cannot be read
+     */
+    public static function tryGetContents($stream): string
+    {
+        $ex = null;
+        set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool {
+            $ex = new \RuntimeException(sprintf(
+                'Unable to read stream contents: %s',
+                $errstr
+            ));
+
+            return true;
+        });
+
+        try {
+            /** @var string|false $contents */
+            $contents = stream_get_contents($stream);
+
+            if ($contents === false) {
+                $ex = new \RuntimeException('Unable to read stream contents');
+            }
+        } catch (\Throwable $e) {
+            $ex = new \RuntimeException(sprintf(
+                'Unable to read stream contents: %s',
+                $e->getMessage()
+            ), 0, $e);
+        }
+
+        restore_error_handler();
+
+        if ($ex) {
+            /** @var $ex \RuntimeException */
+            throw $ex;
+        }
+
+        return $contents;
+    }
+
+    /**
      * Returns a UriInterface for the given value.
      *
      * This function accepts a string or UriInterface and returns a

+ 0 - 9
vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json

@@ -1,9 +0,0 @@
-{
-    "require": {
-        "php": "^7.2.5 || ^8.0",
-        "friendsofphp/php-cs-fixer": "3.2.1"
-    },
-    "config": {
-        "preferred-install": "dist"
-    }
-}

+ 0 - 10
vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json

@@ -1,10 +0,0 @@
-{
-    "require": {
-        "php": "^7.2.5 || ^8.0",
-        "phpstan/phpstan": "0.12.81",
-        "phpstan/phpstan-deprecation-rules": "0.12.6"
-    },
-    "config": {
-        "preferred-install": "dist"
-    }
-}

+ 0 - 9
vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json

@@ -1,9 +0,0 @@
-{
-    "require": {
-        "php": "^7.2.5 || ^8.0",
-        "psalm/phar": "4.6.2"
-    },
-    "config": {
-        "preferred-install": "dist"
-    }
-}

+ 22 - 0
vendor/monolog/monolog/CHANGELOG.md

@@ -1,3 +1,25 @@
+### 2.8.0 (2022-07-24)
+
+  * Deprecated `CubeHandler` and `PHPConsoleHandler` as both projects are abandoned and those should not be used anymore (#1734)
+  * Added RFC 5424 level (`7` to `0`) support to `Logger::log` and `Logger::addRecord` to increase interoperability (#1723)
+  * Added support for `__toString` for objects which are not json serializable in `JsonFormatter` (#1733)
+  * Added `GoogleCloudLoggingFormatter` (#1719)
+  * Added support for Predis 2.x (#1732)
+  * Added `AmqpHandler->setExtraAttributes` to allow configuring attributes when using an AMQPExchange (#1724)
+  * Fixed serialization/unserialization of handlers to make sure private properties are included (#1727)
+  * Fixed allowInlineLineBreaks in LineFormatter causing issues with windows paths containing `\n` or `\r` sequences (#1720)
+  * Fixed max normalization depth not being taken into account when formatting exceptions with a deep chain of previous exceptions (#1726)
+  * Fixed PHP 8.2 deprecation warnings (#1722)
+  * Fixed rare race condition or filesystem issue where StreamHandler is unable to create the directory the log should go into yet it exists already (#1678)
+
+### 2.7.0 (2022-06-09)
+
+  * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682)
+  * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681)
+  * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670)
+  * Marked the reusable `Monolog\Test\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677)
+  * Fixed RotatingFileHandler issue when the date format contained slashes (#1671)
+
 ### 2.6.0 (2022-05-10)
 
   * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead

+ 1 - 3
vendor/monolog/monolog/composer.json

@@ -26,11 +26,10 @@
         "guzzlehttp/psr7": "^2.2",
         "mongodb/mongodb": "^1.8",
         "php-amqplib/php-amqplib": "~2.4 || ^3",
-        "php-console/php-console": "^3.1.3",
         "phpspec/prophecy": "^1.15",
         "phpstan/phpstan": "^0.12.91",
         "phpunit/phpunit": "^8.5.14",
-        "predis/predis": "^1.1",
+        "predis/predis": "^1.1 || ^2.0",
         "rollbar/rollbar": "^1.3 || ^2 || ^3",
         "ruflin/elastica": "^7",
         "swiftmailer/swiftmailer": "^5.3|^6.0",
@@ -48,7 +47,6 @@
         "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
         "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
         "rollbar/rollbar": "Allow sending log messages to Rollbar",
-        "php-console/php-console": "Allow sending log messages to Google Chrome",
         "ext-mbstring": "Allow to work properly with unicode symbols",
         "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
         "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",

+ 11 - 5
vendor/monolog/monolog/src/Monolog/ErrorHandler.php

@@ -46,8 +46,8 @@ class ErrorHandler
     private $fatalLevel = LogLevel::ALERT;
     /** @var ?string */
     private $reservedMemory = null;
-    /** @var ?mixed */
-    private $lastFatalTrace;
+    /** @var ?array{type: int, message: string, file: string, line: int, trace: mixed} */
+    private $lastFatalData = null;
     /** @var int[] */
     private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
 
@@ -223,7 +223,7 @@ class ErrorHandler
         } else {
             $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
             array_shift($trace); // Exclude handleError from trace
-            $this->lastFatalTrace = $trace;
+            $this->lastFatalData = ['type' => $code, 'message' => $message, 'file' => $file, 'line' => $line, 'trace' => $trace];
         }
 
         if ($this->previousErrorHandler === true) {
@@ -242,12 +242,18 @@ class ErrorHandler
     {
         $this->reservedMemory = '';
 
-        $lastError = error_get_last();
+        if (is_array($this->lastFatalData)) {
+            $lastError = $this->lastFatalData;
+        } else {
+            $lastError = error_get_last();
+        }
+
         if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {
+            $trace = $lastError['trace'] ?? null;
             $this->logger->log(
                 $this->fatalLevel,
                 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
-                ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace]
+                ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $trace]
             );
 
             if ($this->logger instanceof Logger) {

+ 18 - 5
vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php

@@ -178,12 +178,25 @@ class JsonFormatter extends NormalizerFormatter
             return $normalized;
         }
 
-        if ($data instanceof \DateTimeInterface) {
-            return $this->formatDate($data);
-        }
+        if (is_object($data)) {
+            if ($data instanceof \DateTimeInterface) {
+                return $this->formatDate($data);
+            }
+
+            if ($data instanceof Throwable) {
+                return $this->normalizeException($data, $depth);
+            }
+
+            // if the object has specific json serializability we want to make sure we skip the __toString treatment below
+            if ($data instanceof \JsonSerializable) {
+                return $data;
+            }
+
+            if (method_exists($data, '__toString')) {
+                return $data->__toString();
+            }
 
-        if ($data instanceof Throwable) {
-            return $this->normalizeException($data, $depth);
+            return $data;
         }
 
         if (is_resource($data)) {

+ 11 - 1
vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php

@@ -153,6 +153,12 @@ class LineFormatter extends NormalizerFormatter
 
         if ($previous = $e->getPrevious()) {
             do {
+                $depth++;
+                if ($depth > $this->maxNormalizeDepth) {
+                    $str .= '\n[previous exception] Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization';
+                    break;
+                }
+
                 $str .= "\n[previous exception] " . $this->formatException($previous);
             } while ($previous = $previous->getPrevious());
         }
@@ -180,7 +186,11 @@ class LineFormatter extends NormalizerFormatter
     {
         if ($this->allowInlineLineBreaks) {
             if (0 === strpos($str, '{')) {
-                return str_replace(array('\r', '\n'), array("\r", "\n"), $str);
+                $str = preg_replace('/(?<!\\\\)\\\\[rn]/', "\n", $str);
+                if (null === $str) {
+                    $pcreErrorCode = preg_last_error();
+                    throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));
+                }
             }
 
             return $str;

+ 4 - 0
vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php

@@ -198,6 +198,10 @@ class NormalizerFormatter implements FormatterInterface
      */
     protected function normalizeException(Throwable $e, int $depth = 0)
     {
+        if ($depth > $this->maxNormalizeDepth) {
+            return ['Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'];
+        }
+
         if ($e instanceof \JsonSerializable) {
             return (array) $e->jsonSerialize();
         }

+ 33 - 4
vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php

@@ -27,6 +27,31 @@ class AmqpHandler extends AbstractProcessingHandler
      * @var AMQPExchange|AMQPChannel $exchange
      */
     protected $exchange;
+    /** @var array<string, mixed> */
+    private $extraAttributes = [];
+
+    /**
+     * @return array<string, mixed>
+     */
+    public function getExtraAttributes(): array
+    {
+        return $this->extraAttributes;
+    }
+
+    /**
+     * Configure extra attributes to pass to the AMQPExchange (if you are using the amqp extension)
+     *
+     * @param array<string, mixed> $extraAttributes  One of content_type, content_encoding,
+     *                                               message_id, user_id, app_id, delivery_mode,
+     *                                               priority, timestamp, expiration, type
+     *                                               or reply_to, headers.
+     * @return AmqpHandler
+     */
+    public function setExtraAttributes(array $extraAttributes): self
+    {
+        $this->extraAttributes = $extraAttributes;
+        return $this;
+    }
 
     /**
      * @var string
@@ -60,14 +85,18 @@ class AmqpHandler extends AbstractProcessingHandler
         $routingKey = $this->getRoutingKey($record);
 
         if ($this->exchange instanceof AMQPExchange) {
+            $attributes = [
+                'delivery_mode' => 2,
+                'content_type'  => 'application/json',
+            ];
+            if ($this->extraAttributes) {
+                $attributes = array_merge($attributes, $this->extraAttributes);
+            }
             $this->exchange->publish(
                 $data,
                 $routingKey,
                 0,
-                [
-                    'delivery_mode' => 2,
-                    'content_type' => 'application/json',
-                ]
+                $attributes
             );
         } else {
             $this->exchange->basic_publish(

+ 3 - 3
vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php

@@ -149,7 +149,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
         }
 
         $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
-        $data = base64_encode(utf8_encode($json));
+        $data = base64_encode($json);
         if (strlen($data) > 3 * 1024) {
             self::$overflowed = true;
 
@@ -163,8 +163,8 @@ class ChromePHPHandler extends AbstractProcessingHandler
                 'extra' => [],
             ];
             self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);
-            $json = Utils::jsonEncode(self::$json, null, true);
-            $data = base64_encode(utf8_encode($json));
+            $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
+            $data = base64_encode($json);
         }
 
         if (trim($data) !== '') {

+ 2 - 1
vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php

@@ -17,8 +17,9 @@ use Monolog\Utils;
 /**
  * Logs to Cube.
  *
- * @link http://square.github.com/cube/
+ * @link https://github.com/square/cube/wiki
  * @author Wan Chen <kami@kamisama.me>
+ * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4
  */
 class CubeHandler extends AbstractProcessingHandler
 {

+ 10 - 1
vendor/monolog/monolog/src/Monolog/Handler/Handler.php

@@ -48,6 +48,15 @@ abstract class Handler implements HandlerInterface
     {
         $this->close();
 
-        return array_keys(get_object_vars($this));
+        $reflClass = new \ReflectionClass($this);
+
+        $keys = [];
+        foreach ($reflClass->getProperties() as $reflProp) {
+            if (!$reflProp->isStatic()) {
+                $keys[] = $reflProp->getName();
+            }
+        }
+
+        return $keys;
     }
 }

+ 2 - 1
vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php

@@ -25,7 +25,7 @@ use PhpConsole\Helper;
  * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely
  *
  * Usage:
- * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef
+ * 1. Install Google Chrome extension [now dead and removed from the chrome store]
  * 2. See overview https://github.com/barbushin/php-console#overview
  * 3. Install PHP Console library https://github.com/barbushin/php-console#installation
  * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)
@@ -39,6 +39,7 @@ use PhpConsole\Helper;
  * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
  *
  * @phpstan-import-type Record from \Monolog\Logger
+ * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4
  */
 class PHPConsoleHandler extends AbstractProcessingHandler
 {

+ 2 - 2
vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php

@@ -30,7 +30,7 @@ use Monolog\Logger;
  */
 class RedisHandler extends AbstractProcessingHandler
 {
-    /** @var \Predis\Client|\Redis */
+    /** @var \Predis\Client<\Predis\Client>|\Redis */
     private $redisClient;
     /** @var string */
     private $redisKey;
@@ -38,7 +38,7 @@ class RedisHandler extends AbstractProcessingHandler
     protected $capSize;
 
     /**
-     * @param \Predis\Client|\Redis $redis   The redis instance
+     * @param \Predis\Client<\Predis\Client>|\Redis $redis   The redis instance
      * @param string                $key     The key name to push records to
      * @param int                   $capSize Number of entries to limit list size to, 0 = unlimited
      */

+ 2 - 2
vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php

@@ -28,13 +28,13 @@ use Monolog\Logger;
  */
 class RedisPubSubHandler extends AbstractProcessingHandler
 {
-    /** @var \Predis\Client|\Redis */
+    /** @var \Predis\Client<\Predis\Client>|\Redis */
     private $redisClient;
     /** @var string */
     private $channelKey;
 
     /**
-     * @param \Predis\Client|\Redis $redis The redis instance
+     * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance
      * @param string                $key   The channel key to publish records to
      */
     public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true)

+ 5 - 1
vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php

@@ -191,7 +191,11 @@ class RotatingFileHandler extends StreamHandler
         $fileInfo = pathinfo($this->filename);
         $glob = str_replace(
             ['{filename}', '{date}'],
-            [$fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'],
+            [$fileInfo['filename'], str_replace(
+                ['Y', 'y', 'm', 'd'],
+                ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'],
+                $this->dateFormat)
+            ],
             $fileInfo['dirname'] . '/' . $this->filenameFormat
         );
         if (isset($fileInfo['extension'])) {

+ 1 - 1
vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php

@@ -212,7 +212,7 @@ class StreamHandler extends AbstractProcessingHandler
             set_error_handler([$this, 'customErrorHandler']);
             $status = mkdir($dir, 0777, true);
             restore_error_handler();
-            if (false === $status && !is_dir($dir)) {
+            if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) {
                 throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir));
             }
         }

+ 52 - 9
vendor/monolog/monolog/src/Monolog/Logger.php

@@ -112,6 +112,22 @@ class Logger implements LoggerInterface, ResettableInterface
     ];
 
     /**
+     * Mapping between levels numbers defined in RFC 5424 and Monolog ones
+     *
+     * @phpstan-var array<int, Level> $rfc_5424_levels
+     */
+    private const RFC_5424_LEVELS = [
+        7 => self::DEBUG,
+        6 => self::INFO,
+        5 => self::NOTICE,
+        4 => self::WARNING,
+        3 => self::ERROR,
+        2 => self::CRITICAL,
+        1 => self::ALERT,
+        0 => self::EMERGENCY,
+    ];
+
+    /**
      * @var string
      */
     protected $name;
@@ -153,6 +169,13 @@ class Logger implements LoggerInterface, ResettableInterface
     private $logDepth = 0;
 
     /**
+     * @var bool Whether to detect infinite logging loops
+     *
+     * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this
+     */
+    private $detectCycles = true;
+
+    /**
      * @psalm-param array<callable(array): array> $processors
      *
      * @param string             $name       The logging channel, a simple descriptive name that is attached to all log records
@@ -284,19 +307,33 @@ class Logger implements LoggerInterface, ResettableInterface
         return $this;
     }
 
+    public function useLoggingLoopDetection(bool $detectCycles): self
+    {
+        $this->detectCycles = $detectCycles;
+
+        return $this;
+    }
+
     /**
      * Adds a log record.
      *
-     * @param  int     $level   The logging level
-     * @param  string  $message The log message
-     * @param  mixed[] $context The log context
-     * @return bool    Whether the record has been processed
+     * @param  int               $level    The logging level (a Monolog or RFC 5424 level)
+     * @param  string            $message  The log message
+     * @param  mixed[]           $context  The log context
+     * @param  DateTimeImmutable $datetime Optional log date to log into the past or future
+     * @return bool              Whether the record has been processed
      *
      * @phpstan-param Level $level
      */
-    public function addRecord(int $level, string $message, array $context = []): bool
+    public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool
     {
-        $this->logDepth += 1;
+        if (isset(self::RFC_5424_LEVELS[$level])) {
+            $level = self::RFC_5424_LEVELS[$level];
+        }
+
+        if ($this->detectCycles) {
+            $this->logDepth += 1;
+        }
         if ($this->logDepth === 3) {
             $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.');
             return false;
@@ -322,7 +359,7 @@ class Logger implements LoggerInterface, ResettableInterface
                         'level' => $level,
                         'level_name' => $levelName,
                         'channel' => $this->name,
-                        'datetime' => new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
+                        'datetime' => $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
                         'extra' => [],
                     ];
 
@@ -349,7 +386,9 @@ class Logger implements LoggerInterface, ResettableInterface
                 }
             }
         } finally {
-            $this->logDepth--;
+            if ($this->detectCycles) {
+                $this->logDepth--;
+            }
         }
 
         return null !== $record;
@@ -501,7 +540,7 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param mixed             $level   The log level
+     * @param mixed             $level   The log level (a Monolog, PSR-3 or RFC 5424 level)
      * @param string|Stringable $message The log message
      * @param mixed[]           $context The log context
      *
@@ -513,6 +552,10 @@ class Logger implements LoggerInterface, ResettableInterface
             throw new \InvalidArgumentException('$level is expected to be a string or int');
         }
 
+        if (isset(self::RFC_5424_LEVELS[$level])) {
+            $level = self::RFC_5424_LEVELS[$level];
+        }
+
         $level = static::toMonologLevel($level);
 
         $this->addRecord($level, (string) $message, $context);

+ 2 - 0
vendor/monolog/monolog/src/Monolog/Test/TestCase.php

@@ -22,6 +22,8 @@ use Monolog\Formatter\FormatterInterface;
  *
  * @phpstan-import-type Record from \Monolog\Logger
  * @phpstan-import-type Level from \Monolog\Logger
+ *
+ * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677
  */
 class TestCase extends \PHPUnit\Framework\TestCase
 {

+ 1 - 1
vendor/monolog/monolog/src/Monolog/Utils.php

@@ -211,7 +211,7 @@ final class Utils
             $data = preg_replace_callback(
                 '/[\x80-\xFF]+/',
                 function ($m) {
-                    return utf8_encode($m[0]);
+                    return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]);
                 },
                 $data
             );

+ 0 - 6
vendor/myclabs/php-enum/.gitattributes

@@ -1,6 +0,0 @@
-# Auto detect text files and perform LF normalization
-* text=auto
-
-tests/ export-ignore
-phpunit.xml export-ignore
-.travis.yml export-ignore

+ 0 - 6
vendor/myclabs/php-enum/.gitignore

@@ -1,6 +0,0 @@
-.DS_Store
-nbproject/*
-.idea/*
-vendor/*
-composer.phar
-composer.lock

+ 2 - 2
vendor/myclabs/php-enum/LICENSE

@@ -1,6 +1,6 @@
-php-enum - PHP Enum implementation http://github.com/myclabs/php-enum
+The MIT License (MIT)
 
-Copyright (C) 2015 My C-Labs
+Copyright (c) 2015 My C-Labs
 
 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,

+ 22 - 12
vendor/myclabs/php-enum/README.md

@@ -3,14 +3,18 @@
 [![Build Status](https://travis-ci.org/myclabs/php-enum.png?branch=master)](https://travis-ci.org/myclabs/php-enum)
 [![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum)
 [![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum)
+[![psalm](https://shepherd.dev/github/myclabs/php-enum/coverage.svg)](https://shepherd.dev/github/myclabs/php-enum)
+
+Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme).
 
 ## Why?
 
-First, and mainly, `SplEnum` is not integrated to PHP, you have to install it separately.
+First, and mainly, `SplEnum` is not integrated to PHP, you have to install the extension separately.
 
 Using an enum instead of class constants provides the following advantages:
 
-- You can type-hint: `function setAction(Action $action) {`
+- You can use an enum as a parameter type: `function setAction(Action $action) {`
+- You can use an enum as a return type: `function getAction() : Action {`
 - You can enrich the enum with methods (e.g. `format`, `parse`, …)
 - You can extend the enum to add new values (make your enum `final` to prevent it)
 - You can get a list of all the possible values (see below)
@@ -31,27 +35,29 @@ use MyCLabs\Enum\Enum;
 /**
  * Action enum
  */
-class Action extends Enum
+final class Action extends Enum
 {
     private const VIEW = 'view';
     private const EDIT = 'edit';
 }
 ```
 
-Note the `private` keyword requires PHP > 7.1, you can omit it on PHP 7.0.
-
 ## Usage
 
 ```php
-$action = new Action(Action::VIEW);
+$action = Action::VIEW();
 
+// or with a dynamic key:
+$action = Action::$key();
+// or with a dynamic value:
+$action = Action::from($value);
 // or
-$action = Action::VIEW();
+$action = new Action($value);
 ```
 
 As you can see, static methods are automatically implemented to provide quick access to an enum value.
 
-One advantage over using class constants is to be able to type-hint enum values:
+One advantage over using class constants is to be able to use an enum as a parameter type:
 
 ```php
 function setAction(Action $action) {
@@ -69,17 +75,19 @@ function setAction(Action $action) {
 
 Static methods:
 
+- `from()` Creates an Enum instance, checking that the value exist in the enum
 - `toArray()` method Returns all possible values as an array (constant name in key, constant value in value)
 - `keys()` Returns the names (keys) of all constants in the Enum class
 - `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
 - `isValid()` Check if tested value is valid on enum set
 - `isValidKey()` Check if tested key is valid on enum set
+- `assertValidValue()` Assert the value is valid on enum set, throwing exception otherwise
 - `search()` Return key for searched value
 
 ### Static methods
 
 ```php
-class Action extends Enum
+final class Action extends Enum
 {
     private const VIEW = 'view';
     private const EDIT = 'edit';
@@ -95,7 +103,7 @@ Static method helpers are implemented using [`__callStatic()`](http://www.php.ne
 If you care about IDE autocompletion, you can either implement the static methods yourself:
 
 ```php
-class Action extends Enum
+final class Action extends Enum
 {
     private const VIEW = 'view';
 
@@ -115,7 +123,7 @@ or you can use phpdoc (this is supported in PhpStorm for example):
  * @method static Action VIEW()
  * @method static Action EDIT()
  */
-class Action extends Enum
+final class Action extends Enum
 {
     private const VIEW = 'view';
     private const EDIT = 'edit';
@@ -125,4 +133,6 @@ class Action extends Enum
 ## Related projects
 
 - [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type)
-- [Symfony 2/3 ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
+- [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
+- [PHPStan integration](https://github.com/timeweb/phpstan-enum)
+- [Yii2 enum mapping](https://github.com/KartaviK/yii2-enum)

+ 4 - 3
vendor/myclabs/php-enum/composer.json

@@ -22,11 +22,12 @@
         }
     },
     "require": {
-        "php": ">=5.4",
+        "php": "^7.3 || ^8.0",
         "ext-json": "*"
     },
     "require-dev": {
-        "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
-        "squizlabs/php_codesniffer": "1.*"
+        "phpunit/phpunit": "^9.5",
+        "squizlabs/php_codesniffer": "1.*",
+        "vimeo/psalm": "^4.6.2"
     }
 }

+ 136 - 22
vendor/myclabs/php-enum/src/Enum.php

@@ -14,6 +14,10 @@ namespace MyCLabs\Enum;
  * @author Matthieu Napoli <matthieu@mnapoli.fr>
  * @author Daniel Costa <danielcosta@gmail.com>
  * @author Mirosław Filip <mirfilip@gmail.com>
+ *
+ * @psalm-template T
+ * @psalm-immutable
+ * @psalm-consistent-constructor
  */
 abstract class Enum implements \JsonSerializable
 {
@@ -21,40 +25,88 @@ abstract class Enum implements \JsonSerializable
      * Enum value
      *
      * @var mixed
+     * @psalm-var T
      */
     protected $value;
 
     /**
+     * Enum key, the constant name
+     *
+     * @var string
+     */
+    private $key;
+
+    /**
      * Store existing constants in a static cache per object.
      *
+     *
      * @var array
+     * @psalm-var array<class-string, array<string, mixed>>
      */
     protected static $cache = [];
 
     /**
+     * Cache of instances of the Enum class
+     *
+     * @var array
+     * @psalm-var array<class-string, array<string, static>>
+     */
+    protected static $instances = [];
+
+    /**
      * Creates a new value of some type
      *
+     * @psalm-pure
      * @param mixed $value
      *
+     * @psalm-param T $value
      * @throws \UnexpectedValueException if incompatible type is given.
      */
     public function __construct($value)
     {
         if ($value instanceof static) {
-            $this->value = $value->getValue();
-
-            return;
+           /** @psalm-var T */
+            $value = $value->getValue();
         }
 
-        if (!$this->isValid($value)) {
-            throw new \UnexpectedValueException("Value '$value' is not part of the enum " . \get_called_class());
-        }
+        /** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */
+        $this->key = static::assertValidValueReturningKey($value);
 
+        /** @psalm-var T */
         $this->value = $value;
     }
 
     /**
+     * This method exists only for the compatibility reason when deserializing a previously serialized version
+     * that didn't had the key property
+     */
+    public function __wakeup()
+    {
+        /** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */
+        if ($this->key === null) {
+            /**
+             * @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm
+             * @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed
+             */
+            $this->key = static::search($this->value);
+        }
+    }
+
+    /**
+     * @param mixed $value
+     * @return static
+     */
+    public static function from($value): self
+    {
+        $key = static::assertValidValueReturningKey($value);
+
+        return self::__callStatic($key, []);
+    }
+
+    /**
+     * @psalm-pure
      * @return mixed
+     * @psalm-return T
      */
     public function getValue()
     {
@@ -64,14 +116,17 @@ abstract class Enum implements \JsonSerializable
     /**
      * Returns the enum key (i.e. the constant name).
      *
-     * @return mixed
+     * @psalm-pure
+     * @return string
      */
     public function getKey()
     {
-        return static::search($this->value);
+        return $this->key;
     }
 
     /**
+     * @psalm-pure
+     * @psalm-suppress InvalidCast
      * @return string
      */
     public function __toString()
@@ -80,20 +135,27 @@ abstract class Enum implements \JsonSerializable
     }
 
     /**
-     * Compares one Enum with another.
+     * Determines if Enum should be considered equal with the variable passed as a parameter.
+     * Returns false if an argument is an object of different class or not an object.
      *
      * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4
      *
-     * @return bool True if Enums are equal, false if not equal
+     * @psalm-pure
+     * @psalm-param mixed $variable
+     * @return bool
      */
-    final public function equals(Enum $enum = null)
+    final public function equals($variable = null): bool
     {
-        return $enum !== null && $this->getValue() === $enum->getValue() && \get_called_class() === \get_class($enum);
+        return $variable instanceof self
+            && $this->getValue() === $variable->getValue()
+            && static::class === \get_class($variable);
     }
 
     /**
      * Returns the names (keys) of all constants in the Enum class
      *
+     * @psalm-pure
+     * @psalm-return list<string>
      * @return array
      */
     public static function keys()
@@ -104,12 +166,15 @@ abstract class Enum implements \JsonSerializable
     /**
      * Returns instances of the Enum class of all Enum constants
      *
+     * @psalm-pure
+     * @psalm-return array<string, static>
      * @return static[] Constant name in key, Enum instance in value
      */
     public static function values()
     {
         $values = array();
 
+        /** @psalm-var T $value */
         foreach (static::toArray() as $key => $value) {
             $values[$key] = new static($value);
         }
@@ -120,13 +185,20 @@ abstract class Enum implements \JsonSerializable
     /**
      * Returns all possible values as an array
      *
+     * @psalm-pure
+     * @psalm-suppress ImpureStaticProperty
+     *
+     * @psalm-return array<string, mixed>
      * @return array Constant name in key, constant value in value
      */
     public static function toArray()
     {
-        $class = \get_called_class();
+        $class = static::class;
+
         if (!isset(static::$cache[$class])) {
+            /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
             $reflection            = new \ReflectionClass($class);
+            /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
             static::$cache[$class] = $reflection->getConstants();
         }
 
@@ -137,7 +209,9 @@ abstract class Enum implements \JsonSerializable
      * Check if is valid enum value
      *
      * @param $value
-     *
+     * @psalm-param mixed $value
+     * @psalm-pure
+     * @psalm-assert-if-true T $value
      * @return bool
      */
     public static function isValid($value)
@@ -146,10 +220,40 @@ abstract class Enum implements \JsonSerializable
     }
 
     /**
+     * Asserts valid enum value
+     *
+     * @psalm-pure
+     * @psalm-assert T $value
+     * @param mixed $value
+     */
+    public static function assertValidValue($value): void
+    {
+        self::assertValidValueReturningKey($value);
+    }
+
+    /**
+     * Asserts valid enum value
+     *
+     * @psalm-pure
+     * @psalm-assert T $value
+     * @param mixed $value
+     * @return string
+     */
+    private static function assertValidValueReturningKey($value): string
+    {
+        if (false === ($key = static::search($value))) {
+            throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class);
+        }
+
+        return $key;
+    }
+
+    /**
      * Check if is valid enum key
      *
      * @param $key
-     *
+     * @psalm-param string $key
+     * @psalm-pure
      * @return bool
      */
     public static function isValidKey($key)
@@ -162,9 +266,11 @@ abstract class Enum implements \JsonSerializable
     /**
      * Return key for value
      *
-     * @param $value
+     * @param mixed $value
      *
-     * @return mixed
+     * @psalm-param mixed $value
+     * @psalm-pure
+     * @return string|false
      */
     public static function search($value)
     {
@@ -179,15 +285,21 @@ abstract class Enum implements \JsonSerializable
      *
      * @return static
      * @throws \BadMethodCallException
+     *
+     * @psalm-pure
      */
     public static function __callStatic($name, $arguments)
     {
-        $array = static::toArray();
-        if (isset($array[$name]) || \array_key_exists($name, $array)) {
-            return new static($array[$name]);
+        $class = static::class;
+        if (!isset(self::$instances[$class][$name])) {
+            $array = static::toArray();
+            if (!isset($array[$name]) && !\array_key_exists($name, $array)) {
+                $message = "No static method or enum constant '$name' in class " . static::class;
+                throw new \BadMethodCallException($message);
+            }
+            return self::$instances[$class][$name] = new static($array[$name]);
         }
-
-        throw new \BadMethodCallException("No static method or enum constant '$name' in class " . \get_called_class());
+        return clone self::$instances[$class][$name];
     }
 
     /**
@@ -196,7 +308,9 @@ abstract class Enum implements \JsonSerializable
      *
      * @return mixed
      * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
+     * @psalm-pure
      */
+    #[\ReturnTypeWillChange]
     public function jsonSerialize()
     {
         return $this->getValue();

+ 2 - 0
vendor/oygza/aliyun-php-sdk-afs/.gitignore

@@ -0,0 +1,2 @@
+.idea/
+

+ 201 - 0
vendor/oygza/aliyun-php-sdk-afs/LICENSE

@@ -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 [yyyy] [name of copyright owner]
+
+   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.

+ 6 - 0
vendor/oygza/aliyun-php-sdk-afs/README.md

@@ -0,0 +1,6 @@
+# aliyun-php-sdk-afs
+基于aliyun-php-sdk-afs( 阿里云验证 )封装composer支持
+
+* 对源文件做了重命名命名空间之外,没有做任何操作
+* 为了方便(偷懒)将源文件中的 sdk-core 与 sdk-afs 封装到一起
+* 自测可以使用

Някои файлове не бяха показани, защото твърде много файлове са промени