Test Failed
Push — master ( 65e413...7f39d5 )
by frey
08:23
created

CDN::signatureB()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
cc 3
eloc 7
nc 1
nop 3
dl 0
loc 11
ccs 0
cts 3
cp 0
crap 12
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Freyo\Flysystem\QcloudCOSv5\Plugins;
4
5
use League\Flysystem\Plugin\AbstractPlugin;
6
7
class CDN extends AbstractPlugin
8
{
9
    /**
10
     * Get the method name.
11
     *
12
     * @return string
13
     */
14
    public function getMethod()
15
    {
16
        return 'cdn';
17
    }
18
19
    /**
20
     * @return $this
21
     */
22
    public function handle()
23
    {
24
        return $this;
25
    }
26
27
    /**
28
     * @param string $url
29
     * @param string $key
30
     * @param int    $timestamp
31
     * @param string $signName
32
     * @param string $timeName
33
     *
34
     * @return string
35
     */
36
    public function signature($url, $key = null, $timestamp = null, $signName = 'sign', $timeName = 't')
37
    {
38
        $key = $key ?: $this->getConfig()->get('cdn_key');
39
        $timestamp = dechex($timestamp ?: time());
40
41
        $parsed = parse_url($url);
42
        $signature = md5($key.$parsed['path'].$timestamp);
43
        $query = http_build_query([$signName => $signature, $timeName => $timestamp]);
44
        $separator = empty($parsed['query']) ? '?' : '&';
45
46
        return $url.$separator.$query;
47
    }
48
49
    /**
50
     * @param string $url
51
     * @param string $key
52
     * @param int    $timestamp
53
     * @param string $random
54
     * @param string $signName
55
     *
56
     * @return string
57
     */
58
    public function signatureA($url, $key = null, $timestamp = null, $random = null, $signName = 'sign')
59
    {
60
        $key = $key ?: $this->getConfig()->get('cdn_key');
61
        $timestamp = $timestamp ?: time();
62
        $random = $random ?: sha1(uniqid('', true));
63
64
        $parsed = parse_url($url);
65
        $hash = md5(sprintf('%s-%s-%s-%s-%s', $parsed['path'], $timestamp, $random, 0, $key));
66
        $signature = sprintf('%s-%s-%s-%s', $timestamp, $random, 0, $hash);
67
        $query = http_build_query([$signName => $signature]);
68
        $separator = empty($parsed['query']) ? '?' : '&';
69
70
        return $url.$separator.$query;
71
    }
72
73
    /**
74
     * @param string $url
75
     * @param string $key
76
     * @param int    $timestamp
77
     *
78
     * @return string
79
     */
80
    public function signatureB($url, $key = null, $timestamp = null)
81
    {
82
        $key = $key ?: $this->getConfig()->get('cdn_key');
83
        $timestamp = date('YmdHi', $timestamp ?: time());
84
85
        $parsed = parse_url($url);
86
        $hash = md5($key.$timestamp.$parsed['path']);
87
88
        return sprintf(
89
            '%s://%s/%s/%s%s',
90
            $parsed['scheme'], $parsed['host'], $timestamp, $hash, $parsed['path']
91
        );
92
    }
93
94
    /**
95
     * @param string $url
96
     * @param string $key
97
     * @param int    $timestamp
98
     *
99
     * @return string
100
     */
101
    public function signatureC($url, $key = null, $timestamp = null)
102
    {
103
        $key = $key ?: $this->getConfig()->get('cdn_key');
104
        $timestamp = dechex($timestamp ?: time());
105
106
        $parsed = parse_url($url);
107
        $hash = md5($key.$parsed['path'].$timestamp);
108
109
        return sprintf(
110
            '%s://%s/%s/%s%s',
111
            $parsed['scheme'], $parsed['host'], $hash, $timestamp, $parsed['path']
112
        );
113
    }
114
115
    /**
116
     * @param string $url
117
     * @param string $key
118
     * @param int    $timestamp
119
     * @param string $signName
120
     * @param string $timeName
121
     *
122
     * @return string
123
     */
124
    public function signatureD($url, $key = null, $timestamp = null, $signName = 'sign', $timeName = 't')
125
    {
126
        return $this->signature($url, $key, $timestamp, $signName, $timeName);
127
    }
128
129
    /**
130
     * @param $url
131
     *
132
     * @return array
133
     */
134
    public function pushUrl($url)
135
    {
136
        $urls = is_array($url) ? $url : func_get_args();
137
138
        return $this->request($urls, 'urls', 'CdnUrlPusher');
139
    }
140
141
    /**
142
     * @param $url
143
     *
144
     * @return array
145
     */
146
    public function pushUrlV2($url)
147
    {
148
        $urls = is_array($url) ? $url : func_get_args();
149
150
        return $this->request($urls, 'urls', 'CdnPusherV2');
151
    }
152
153
    /**
154
     * @param $url
155
     *
156
     * @return array
157
     */
158
    public function refreshUrl($url)
159
    {
160
        $urls = is_array($url) ? $url : func_get_args();
161
162
        return $this->request($urls, 'urls', 'RefreshCdnUrl');
163
    }
164
165
    /**
166
     * @param $dir
167
     *
168
     * @return array
169
     */
170
    public function refreshDir($dir)
171
    {
172
        $dirs = is_array($dir) ? $dir : func_get_args();
173
174
        return $this->request($dirs, 'dirs', 'RefreshCdnDir');
175
    }
176
177
    /**
178
     * @param array  $args
179
     * @param string $key
180
     * @param string $action
181
     *
182
     * @return array
183
     */
184
    protected function request(array $args, $key, $action)
185
    {
186
        $client = $this->getHttpClient();
187
188
        $response = $client->post('/v2/index.php', [
189
            'form_params' => $this->buildFormParams($args, $key, $action),
190
        ]);
191
192
        $contents = $response->getBody()->getContents();
193
194
        return $this->normalize($contents);
195
    }
196
197
    /**
198
     * @return \GuzzleHttp\Client
199
     */
200
    protected function getHttpClient()
201
    {
202
        return new \GuzzleHttp\Client([
203
            'base_uri' => 'https://cdn.api.qcloud.com',
204
        ]);
205
    }
206
207
    /**
208
     * @param array  $values
209
     * @param string $key
210
     * @param string $action
211
     *
212
     * @return array
213
     */
214
    protected function buildFormParams(array $values, $key, $action)
215
    {
216
        $keys = array_map(function ($n) use ($key) {
217
            return sprintf("{$key}.%d", $n);
218
        }, range(0, count($values) - 1));
219
220
        $params = array_combine($keys, $values);
221
222
        $params = $this->addCommonParams($params, $action);
223
224
        return $this->addSignature($params);
225
    }
226
227
    /**
228
     * @param array  $params
229
     * @param string $action
230
     *
231
     * @return array
232
     */
233
    protected function addCommonParams(array $params, $action)
234
    {
235
        return array_merge([
236
            'Action'    => $action,
237
            'SecretId'  => $this->getCredentials()['secretId'],
238
            'Timestamp' => time(),
239
            'Nonce'     => rand(1, 65535),
240
        ], $params);
241
    }
242
243
    /**
244
     * @return array
245
     */
246
    protected function getCredentials()
247
    {
248
        return $this->getConfig()->get('credentials');
249
    }
250
251
    /**
252
     * @param array $params
253
     *
254
     * @return array
255
     */
256
    protected function addSignature(array $params)
257
    {
258
        $params['Signature'] = $this->getSignature($params);
259
260
        return $params;
261
    }
262
263
    /**
264
     * @param array $params
265
     *
266
     * @return string
267
     */
268
    protected function getSignature(array $params)
269
    {
270
        ksort($params);
271
272
        $srcStr = 'POSTcdn.api.qcloud.com/v2/index.php?'.urldecode(http_build_query($params));
273
274
        return base64_encode(hash_hmac('sha1', $srcStr, $this->getCredentials()['secretKey'], true));
275
    }
276
277
    /**
278
     * @param string $contents
279
     *
280
     * @throws \InvalidArgumentException if the JSON cannot be decoded.
281
     *
282
     * @return array
283
     */
284
    protected function normalize($contents)
285
    {
286
        return \GuzzleHttp\json_decode($contents, true);
287
    }
288
289
    /**
290
     * @return \League\Flysystem\Config
291
     */
292
    protected function getConfig()
293
    {
294
        return $this->filesystem->getConfig();
295
    }
296
}
297