1 | <?php |
||||||
2 | |||||||
3 | namespace Freyo\Flysystem\QcloudCOSv5; |
||||||
4 | |||||||
5 | use Carbon\Carbon; |
||||||
6 | use DateTimeInterface; |
||||||
7 | use League\Flysystem\Adapter\AbstractAdapter; |
||||||
8 | use League\Flysystem\Adapter\CanOverwriteFiles; |
||||||
9 | use League\Flysystem\AdapterInterface; |
||||||
10 | use League\Flysystem\Config; |
||||||
11 | use Qcloud\Cos\Client; |
||||||
12 | use Qcloud\Cos\Exception\ServiceResponseException; |
||||||
13 | |||||||
14 | /** |
||||||
15 | * Class Adapter. |
||||||
16 | */ |
||||||
17 | class Adapter extends AbstractAdapter implements CanOverwriteFiles |
||||||
18 | { |
||||||
19 | /** |
||||||
20 | * @var Client |
||||||
21 | */ |
||||||
22 | protected $client; |
||||||
23 | |||||||
24 | /** |
||||||
25 | * @var array |
||||||
26 | */ |
||||||
27 | protected $config = []; |
||||||
28 | |||||||
29 | /** |
||||||
30 | * @var array |
||||||
31 | */ |
||||||
32 | protected $regionMap = [ |
||||||
33 | 'cn-east' => 'ap-shanghai', |
||||||
34 | 'cn-sorth' => 'ap-guangzhou', |
||||||
35 | 'cn-north' => 'ap-beijing-1', |
||||||
36 | 'cn-south-2' => 'ap-guangzhou-2', |
||||||
37 | 'cn-southwest' => 'ap-chengdu', |
||||||
38 | 'sg' => 'ap-singapore', |
||||||
39 | 'tj' => 'ap-beijing-1', |
||||||
40 | 'bj' => 'ap-beijing', |
||||||
41 | 'sh' => 'ap-shanghai', |
||||||
42 | 'gz' => 'ap-guangzhou', |
||||||
43 | 'cd' => 'ap-chengdu', |
||||||
44 | 'sgp' => 'ap-singapore', |
||||||
45 | ]; |
||||||
46 | |||||||
47 | /** |
||||||
48 | * Adapter constructor. |
||||||
49 | * |
||||||
50 | * @param Client $client |
||||||
51 | * @param array $config |
||||||
52 | */ |
||||||
53 | public function __construct(Client $client, array $config) |
||||||
54 | { |
||||||
55 | $this->client = $client; |
||||||
56 | $this->config = $config; |
||||||
57 | |||||||
58 | $this->setPathPrefix($config['cdn']); |
||||||
59 | } |
||||||
60 | |||||||
61 | /** |
||||||
62 | * @return string |
||||||
63 | */ |
||||||
64 | 20 | public function getBucketWithAppId() |
|||||
65 | { |
||||||
66 | 20 | return $this->getBucket().'-'.$this->getAppId(); |
|||||
67 | } |
||||||
68 | |||||||
69 | /** |
||||||
70 | * @return string |
||||||
71 | */ |
||||||
72 | 20 | public function getBucket() |
|||||
73 | { |
||||||
74 | 20 | return preg_replace( |
|||||
75 | 20 | "/-{$this->getAppId()}$/", |
|||||
76 | 20 | '', |
|||||
77 | 20 | $this->config['bucket'] |
|||||
78 | 20 | ); |
|||||
79 | } |
||||||
80 | |||||||
81 | /** |
||||||
82 | * @return string |
||||||
83 | */ |
||||||
84 | 20 | public function getAppId() |
|||||
85 | { |
||||||
86 | 20 | return $this->config['credentials']['appId']; |
|||||
87 | } |
||||||
88 | |||||||
89 | /** |
||||||
90 | * @return string |
||||||
91 | */ |
||||||
92 | 2 | public function getRegion() |
|||||
93 | { |
||||||
94 | 2 | return array_key_exists($this->config['region'], $this->regionMap) |
|||||
95 | 2 | ? $this->regionMap[$this->config['region']] : $this->config['region']; |
|||||
96 | } |
||||||
97 | |||||||
98 | /** |
||||||
99 | * @param $path |
||||||
100 | * |
||||||
101 | * @return string |
||||||
102 | */ |
||||||
103 | 2 | public function getSourcePath($path) |
|||||
104 | { |
||||||
105 | 2 | return sprintf('%s.cos.%s.myqcloud.com/%s', |
|||||
106 | 2 | $this->getBucketWithAppId(), $this->getRegion(), $path |
|||||
107 | 2 | ); |
|||||
108 | } |
||||||
109 | |||||||
110 | /** |
||||||
111 | * @param $path |
||||||
112 | * |
||||||
113 | * @return string |
||||||
114 | */ |
||||||
115 | public function getPicturePath($path) |
||||||
116 | { |
||||||
117 | return sprintf('%s.pic.%s.myqcloud.com/%s', |
||||||
118 | $this->getBucketWithAppId(), $this->getRegion(), $path |
||||||
119 | ); |
||||||
120 | } |
||||||
121 | |||||||
122 | /** |
||||||
123 | * @param string $path |
||||||
124 | * |
||||||
125 | * @return string |
||||||
126 | */ |
||||||
127 | 1 | public function getUrl($path) |
|||||
128 | { |
||||||
129 | 1 | if ($this->config['cdn']) { |
|||||
130 | return $this->applyPathPrefix($path); |
||||||
131 | } |
||||||
132 | |||||||
133 | $options = [ |
||||||
134 | 1 | 'Scheme' => isset($this->config['scheme']) ? $this->config['scheme'] : 'http', |
|||||
135 | 1 | ]; |
|||||
136 | |||||||
137 | /** @var \GuzzleHttp\Psr7\Uri $objectUrl */ |
||||||
138 | 1 | $objectUrl = $this->client->getObjectUrl( |
|||||
139 | 1 | $this->getBucketWithAppId(), $path, "+30 minutes", $options |
|||||
140 | 1 | ); |
|||||
141 | |||||||
142 | 1 | return (string) $objectUrl; |
|||||
143 | } |
||||||
144 | |||||||
145 | /** |
||||||
146 | * @param string $path |
||||||
147 | * @param \DateTimeInterface $expiration |
||||||
148 | * @param array $options |
||||||
149 | * |
||||||
150 | * @return string |
||||||
151 | */ |
||||||
152 | 2 | public function getTemporaryUrl($path, DateTimeInterface $expiration, array $options = []) |
|||||
153 | { |
||||||
154 | 2 | $options = array_merge( |
|||||
155 | 2 | $options, |
|||||
156 | 2 | ['Scheme' => isset($this->config['scheme']) ? $this->config['scheme'] : 'http'] |
|||||
157 | 2 | ); |
|||||
158 | |||||||
159 | /** @var \GuzzleHttp\Psr7\Uri $objectUrl */ |
||||||
160 | 2 | $objectUrl = $this->client->getObjectUrl( |
|||||
161 | 2 | $this->getBucketWithAppId(), $path, $expiration->format('c'), $options |
|||||
162 | 2 | ); |
|||||
163 | |||||||
164 | 2 | return (string) $objectUrl; |
|||||
165 | } |
||||||
166 | |||||||
167 | /** |
||||||
168 | * @param string $path |
||||||
169 | * @param string $contents |
||||||
170 | * @param Config $config |
||||||
171 | * |
||||||
172 | * @return array|false |
||||||
173 | */ |
||||||
174 | 2 | public function write($path, $contents, Config $config) |
|||||
175 | { |
||||||
176 | try { |
||||||
177 | 2 | return $this->client->upload( |
|||||
178 | 2 | $this->getBucketWithAppId(), |
|||||
179 | 2 | $path, |
|||||
180 | 2 | $contents, |
|||||
181 | 2 | $this->prepareUploadConfig($config) |
|||||
182 | 2 | ); |
|||||
183 | } catch (ServiceResponseException $e) { |
||||||
184 | return false; |
||||||
185 | } |
||||||
186 | } |
||||||
187 | |||||||
188 | /** |
||||||
189 | * @param string $path |
||||||
190 | * @param resource $resource |
||||||
191 | * @param Config $config |
||||||
192 | * |
||||||
193 | * @return array|false |
||||||
194 | */ |
||||||
195 | 2 | public function writeStream($path, $resource, Config $config) |
|||||
196 | { |
||||||
197 | try { |
||||||
198 | 2 | return $this->client->upload( |
|||||
199 | 2 | $this->getBucketWithAppId(), |
|||||
200 | 2 | $path, |
|||||
201 | 2 | stream_get_contents($resource, -1, 0), |
|||||
202 | 2 | $this->prepareUploadConfig($config) |
|||||
203 | 2 | ); |
|||||
204 | } catch (ServiceResponseException $e) { |
||||||
205 | return false; |
||||||
206 | } |
||||||
207 | } |
||||||
208 | |||||||
209 | /** |
||||||
210 | * @param string $path |
||||||
211 | * @param string $contents |
||||||
212 | * @param Config $config |
||||||
213 | * |
||||||
214 | * @return array|false |
||||||
215 | */ |
||||||
216 | 1 | public function update($path, $contents, Config $config) |
|||||
217 | { |
||||||
218 | 1 | return $this->write($path, $contents, $config); |
|||||
219 | } |
||||||
220 | |||||||
221 | /** |
||||||
222 | * @param string $path |
||||||
223 | * @param resource $resource |
||||||
224 | * @param Config $config |
||||||
225 | * |
||||||
226 | * @return array|false |
||||||
227 | */ |
||||||
228 | 1 | public function updateStream($path, $resource, Config $config) |
|||||
229 | { |
||||||
230 | 1 | return $this->writeStream($path, $resource, $config); |
|||||
231 | } |
||||||
232 | |||||||
233 | /** |
||||||
234 | * @param string $path |
||||||
235 | * @param string $newpath |
||||||
236 | * |
||||||
237 | * @return bool |
||||||
238 | */ |
||||||
239 | 1 | public function rename($path, $newpath) |
|||||
240 | { |
||||||
241 | try { |
||||||
242 | 1 | if ($result = $this->copy($path, $newpath)) { |
|||||
243 | 1 | $this->delete($path); |
|||||
244 | 1 | } |
|||||
245 | |||||||
246 | 1 | return $result; |
|||||
247 | } catch (ServiceResponseException $e) { |
||||||
248 | return false; |
||||||
249 | } |
||||||
250 | } |
||||||
251 | |||||||
252 | /** |
||||||
253 | * @param string $path |
||||||
254 | * @param string $newpath |
||||||
255 | * |
||||||
256 | * @return bool |
||||||
257 | */ |
||||||
258 | 2 | public function copy($path, $newpath) |
|||||
259 | { |
||||||
260 | try { |
||||||
261 | 2 | return (bool) $this->client->copyObject([ |
|||||
0 ignored issues
–
show
|
|||||||
262 | 2 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
263 | 2 | 'Key' => $newpath, |
|||||
264 | 2 | 'CopySource' => $this->getSourcePath($path), |
|||||
265 | 2 | ]); |
|||||
266 | } catch (ServiceResponseException $e) { |
||||||
267 | return false; |
||||||
268 | } |
||||||
269 | } |
||||||
270 | |||||||
271 | /** |
||||||
272 | * @param string $path |
||||||
273 | * |
||||||
274 | * @return bool |
||||||
275 | */ |
||||||
276 | 2 | public function delete($path) |
|||||
277 | { |
||||||
278 | try { |
||||||
279 | 2 | return (bool) $this->client->deleteObject([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::DeleteObject() has too many arguments starting with array('Bucket' => $this-...ppId(), 'Key' => $path) .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
280 | 2 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
281 | 2 | 'Key' => $path, |
|||||
282 | 2 | ]); |
|||||
283 | } catch (ServiceResponseException $e) { |
||||||
284 | return false; |
||||||
285 | } |
||||||
286 | } |
||||||
287 | |||||||
288 | /** |
||||||
289 | * @param string $dirname |
||||||
290 | * |
||||||
291 | * @return bool |
||||||
292 | */ |
||||||
293 | 1 | public function deleteDir($dirname) |
|||||
294 | { |
||||||
295 | try { |
||||||
296 | 1 | return (bool) $this->client->deleteObject([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::DeleteObject() has too many arguments starting with array('Bucket' => $this-...Key' => $dirname . '/') .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
297 | 1 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
298 | 1 | 'Key' => $dirname.'/', |
|||||
299 | 1 | ]); |
|||||
300 | } catch (ServiceResponseException $e) { |
||||||
301 | return false; |
||||||
302 | } |
||||||
303 | } |
||||||
304 | |||||||
305 | /** |
||||||
306 | * @param string $dirname |
||||||
307 | * @param Config $config |
||||||
308 | * |
||||||
309 | * @return array|false |
||||||
310 | */ |
||||||
311 | 1 | public function createDir($dirname, Config $config) |
|||||
312 | { |
||||||
313 | try { |
||||||
314 | 1 | return $this->client->putObject([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::PutObject() has too many arguments starting with array('Bucket' => $this-...me . '/', 'Body' => '') .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
315 | 1 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
316 | 1 | 'Key' => $dirname.'/', |
|||||
317 | 1 | 'Body' => '', |
|||||
318 | 1 | ]); |
|||||
319 | } catch (ServiceResponseException $e) { |
||||||
320 | return false; |
||||||
321 | } |
||||||
322 | } |
||||||
323 | |||||||
324 | /** |
||||||
325 | * @param string $path |
||||||
326 | * @param string $visibility |
||||||
327 | * |
||||||
328 | * @return bool |
||||||
329 | */ |
||||||
330 | 1 | public function setVisibility($path, $visibility) |
|||||
331 | { |
||||||
332 | try { |
||||||
333 | 1 | return (bool) $this->client->putObjectAcl([ |
|||||
0 ignored issues
–
show
The expression
return (bool)$this->clie...sibility($visibility))) returns the type boolean which is incompatible with the return type mandated by League\Flysystem\AdapterInterface::setVisibility() of array|false .
In the issue above, the returned value is violating the contract defined by the mentioned interface. Let's take a look at an example: interface HasName {
/** @return string */
public function getName();
}
class Name {
public $name;
}
class User implements HasName {
/** @return string|Name */
public function getName() {
return new Name('foo'); // This is a violation of the ``HasName`` interface
// which only allows a string value to be returned.
}
}
![]() The call to
Qcloud\Cos\Client::PutObjectAcl() has too many arguments starting with array('Bucket' => $this-...isibility($visibility)) .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
334 | 1 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
335 | 1 | 'Key' => $path, |
|||||
336 | 1 | 'ACL' => $this->normalizeVisibility($visibility), |
|||||
337 | 1 | ]); |
|||||
338 | } catch (ServiceResponseException $e) { |
||||||
339 | return false; |
||||||
340 | } |
||||||
341 | } |
||||||
342 | |||||||
343 | /** |
||||||
344 | * @param string $path |
||||||
345 | * |
||||||
346 | * @return bool |
||||||
347 | */ |
||||||
348 | 1 | public function has($path) |
|||||
349 | { |
||||||
350 | try { |
||||||
351 | 1 | return (bool) $this->getMetadata($path); |
|||||
352 | } catch (ServiceResponseException $e) { |
||||||
353 | return false; |
||||||
354 | } |
||||||
355 | } |
||||||
356 | |||||||
357 | /** |
||||||
358 | * @param string $path |
||||||
359 | * |
||||||
360 | * @return array|bool |
||||||
361 | */ |
||||||
362 | 1 | public function read($path) |
|||||
363 | { |
||||||
364 | try { |
||||||
365 | 1 | $response = $this->forceReadFromCDN() |
|||||
366 | 1 | ? $this->readFromCDN($path) |
|||||
367 | 1 | : $this->readFromSource($path); |
|||||
368 | |||||||
369 | 1 | return ['contents' => (string) $response]; |
|||||
370 | } catch (ServiceResponseException $e) { |
||||||
371 | return false; |
||||||
372 | } |
||||||
373 | } |
||||||
374 | |||||||
375 | /** |
||||||
376 | * @return bool |
||||||
377 | */ |
||||||
378 | 1 | protected function forceReadFromCDN() |
|||||
379 | { |
||||||
380 | 1 | return $this->config['cdn'] |
|||||
381 | 1 | && isset($this->config['read_from_cdn']) |
|||||
382 | 1 | && $this->config['read_from_cdn']; |
|||||
383 | } |
||||||
384 | |||||||
385 | /** |
||||||
386 | * @param $path |
||||||
387 | * |
||||||
388 | * @return string |
||||||
389 | */ |
||||||
390 | protected function readFromCDN($path) |
||||||
391 | { |
||||||
392 | return $this->getHttpClient() |
||||||
393 | ->get($this->applyPathPrefix($path)) |
||||||
394 | ->getBody() |
||||||
395 | ->getContents(); |
||||||
396 | } |
||||||
397 | |||||||
398 | /** |
||||||
399 | * @param $path |
||||||
400 | * |
||||||
401 | * @return string |
||||||
402 | */ |
||||||
403 | 1 | protected function readFromSource($path) |
|||||
404 | { |
||||||
405 | try { |
||||||
406 | 1 | $response = $this->client->getObject([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::GetObject() has too many arguments starting with array('Bucket' => $this-...ppId(), 'Key' => $path) .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
407 | 1 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
408 | 1 | 'Key' => $path, |
|||||
409 | 1 | ]); |
|||||
410 | |||||||
411 | 1 | return $response['Body']; |
|||||
412 | } catch (ServiceResponseException $e) { |
||||||
413 | return false; |
||||||
0 ignored issues
–
show
|
|||||||
414 | } |
||||||
415 | } |
||||||
416 | |||||||
417 | /** |
||||||
418 | * @return \GuzzleHttp\Client |
||||||
419 | */ |
||||||
420 | 1 | public function getHttpClient() |
|||||
421 | { |
||||||
422 | 1 | return new \GuzzleHttp\Client([ |
|||||
423 | 1 | 'timeout' => $this->config['timeout'], |
|||||
424 | 1 | 'connect_timeout' => $this->config['connect_timeout'], |
|||||
425 | 1 | ]); |
|||||
426 | } |
||||||
427 | |||||||
428 | /** |
||||||
429 | * @param string $path |
||||||
430 | * |
||||||
431 | * @return array|bool |
||||||
432 | */ |
||||||
433 | 1 | public function readStream($path) |
|||||
434 | { |
||||||
435 | try { |
||||||
436 | 1 | $temporaryUrl = $this->getTemporaryUrl($path, Carbon::now()->addMinutes(5)); |
|||||
437 | |||||||
438 | 1 | $stream = $this->getHttpClient() |
|||||
439 | 1 | ->get($temporaryUrl, ['stream' => true]) |
|||||
440 | 1 | ->getBody() |
|||||
441 | 1 | ->detach(); |
|||||
442 | |||||||
443 | 1 | return ['stream' => $stream]; |
|||||
444 | } catch (ServiceResponseException $e) { |
||||||
445 | return false; |
||||||
446 | } |
||||||
447 | } |
||||||
448 | |||||||
449 | /** |
||||||
450 | * @param string $directory |
||||||
451 | * @param bool $recursive |
||||||
452 | * |
||||||
453 | * @return array|bool |
||||||
454 | */ |
||||||
455 | 1 | public function listContents($directory = '', $recursive = false) |
|||||
456 | { |
||||||
457 | 1 | $list = []; |
|||||
458 | |||||||
459 | 1 | $marker = ''; |
|||||
460 | 1 | while (true) { |
|||||
461 | 1 | $response = $this->listObjects($directory, $recursive, $marker); |
|||||
462 | |||||||
463 | 1 | foreach ((array) $response['Contents'] as $content) { |
|||||
464 | 1 | $list[] = $this->normalizeFileInfo($content); |
|||||
465 | 1 | } |
|||||
466 | |||||||
467 | 1 | if (!$response['IsTruncated']) { |
|||||
468 | 1 | break; |
|||||
469 | } |
||||||
470 | $marker = $response['NextMarker'] ?: ''; |
||||||
471 | } |
||||||
472 | |||||||
473 | 1 | return $list; |
|||||
474 | } |
||||||
475 | |||||||
476 | /** |
||||||
477 | * @param string $path |
||||||
478 | * |
||||||
479 | * @return array|bool |
||||||
480 | */ |
||||||
481 | 5 | public function getMetadata($path) |
|||||
482 | { |
||||||
483 | try { |
||||||
484 | 5 | return $this->client->headObject([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::HeadObject() has too many arguments starting with array('Bucket' => $this-...ppId(), 'Key' => $path) .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
485 | 5 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
486 | 5 | 'Key' => $path, |
|||||
487 | 5 | ]); |
|||||
488 | } catch (ServiceResponseException $e) { |
||||||
489 | return false; |
||||||
490 | } |
||||||
491 | } |
||||||
492 | |||||||
493 | /** |
||||||
494 | * @param string $path |
||||||
495 | * |
||||||
496 | * @return array|bool |
||||||
497 | */ |
||||||
498 | 1 | public function getSize($path) |
|||||
499 | { |
||||||
500 | 1 | $meta = $this->getMetadata($path); |
|||||
501 | |||||||
502 | 1 | return isset($meta['ContentLength']) |
|||||
503 | 1 | ? ['size' => $meta['ContentLength']] : false; |
|||||
504 | } |
||||||
505 | |||||||
506 | /** |
||||||
507 | * @param string $path |
||||||
508 | * |
||||||
509 | * @return array|bool |
||||||
510 | */ |
||||||
511 | 1 | public function getMimetype($path) |
|||||
512 | { |
||||||
513 | 1 | $meta = $this->getMetadata($path); |
|||||
514 | |||||||
515 | 1 | return isset($meta['ContentType']) |
|||||
516 | 1 | ? ['mimetype' => $meta['ContentType']] : false; |
|||||
517 | } |
||||||
518 | |||||||
519 | /** |
||||||
520 | * @param string $path |
||||||
521 | * |
||||||
522 | * @return array|bool |
||||||
523 | */ |
||||||
524 | 1 | public function getTimestamp($path) |
|||||
525 | { |
||||||
526 | 1 | $meta = $this->getMetadata($path); |
|||||
527 | |||||||
528 | 1 | return isset($meta['LastModified']) |
|||||
529 | 1 | ? ['timestamp' => strtotime($meta['LastModified'])] : false; |
|||||
530 | } |
||||||
531 | |||||||
532 | /** |
||||||
533 | * @param string $path |
||||||
534 | * |
||||||
535 | * @return array|bool |
||||||
536 | */ |
||||||
537 | 1 | public function getVisibility($path) |
|||||
538 | { |
||||||
539 | try { |
||||||
540 | 1 | $meta = $this->client->getObjectAcl([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::GetObjectAcl() has too many arguments starting with array('Bucket' => $this-...ppId(), 'Key' => $path) .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
541 | 1 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
542 | 1 | 'Key' => $path, |
|||||
543 | 1 | ]); |
|||||
544 | |||||||
545 | 1 | foreach ($meta['Grants'] as $grant) { |
|||||
546 | 1 | if (isset($grant['Grantee']['URI']) |
|||||
547 | 1 | && $grant['Permission'] === 'READ' |
|||||
548 | 1 | && strpos($grant['Grantee']['URI'], 'global/AllUsers') !== false |
|||||
549 | 1 | ) { |
|||||
550 | return ['visibility' => AdapterInterface::VISIBILITY_PUBLIC]; |
||||||
551 | } |
||||||
552 | 1 | } |
|||||
553 | |||||||
554 | 1 | return ['visibility' => AdapterInterface::VISIBILITY_PRIVATE]; |
|||||
555 | } catch (ServiceResponseException $e) { |
||||||
556 | return false; |
||||||
557 | } |
||||||
558 | } |
||||||
559 | |||||||
560 | /** |
||||||
561 | * @param array $content |
||||||
562 | * |
||||||
563 | * @return array |
||||||
564 | */ |
||||||
565 | 1 | private function normalizeFileInfo(array $content) |
|||||
566 | { |
||||||
567 | 1 | $path = pathinfo($content['Key']); |
|||||
568 | |||||||
569 | return [ |
||||||
570 | 1 | 'type' => substr($content['Key'], -1) === '/' ? 'dir' : 'file', |
|||||
571 | 1 | 'path' => $content['Key'], |
|||||
572 | 1 | 'timestamp' => Carbon::parse($content['LastModified'])->getTimestamp(), |
|||||
573 | 1 | 'size' => (int) $content['Size'], |
|||||
574 | 1 | 'dirname' => $path['dirname'] === '.' ? '' : (string) $path['dirname'], |
|||||
575 | 1 | 'basename' => (string) $path['basename'], |
|||||
576 | 1 | 'extension' => isset($path['extension']) ? $path['extension'] : '', |
|||||
577 | 1 | 'filename' => (string) $path['filename'], |
|||||
578 | 1 | ]; |
|||||
579 | } |
||||||
580 | |||||||
581 | /** |
||||||
582 | * @param string $directory |
||||||
583 | * @param bool $recursive |
||||||
584 | * @param string $marker max return 1000 record, if record greater than 1000 |
||||||
585 | * you should set the next marker to get the full list |
||||||
586 | * |
||||||
587 | * @return \GuzzleHttp\Command\Result|array |
||||||
588 | */ |
||||||
589 | 1 | private function listObjects($directory = '', $recursive = false, $marker = '') |
|||||
590 | { |
||||||
591 | try { |
||||||
592 | 1 | return $this->client->listObjects([ |
|||||
0 ignored issues
–
show
The call to
Qcloud\Cos\Client::ListObjects() has too many arguments starting with array('Bucket' => $this-...ker, 'MaxKeys' => 1000) .
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue. If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above. ![]() |
|||||||
593 | 1 | 'Bucket' => $this->getBucketWithAppId(), |
|||||
594 | 1 | 'Prefix' => ((string) $directory === '') ? '' : ($directory.'/'), |
|||||
595 | 1 | 'Delimiter' => $recursive ? '' : '/', |
|||||
596 | 1 | 'Marker' => $marker, |
|||||
597 | 1 | 'MaxKeys' => 1000, |
|||||
598 | 1 | ]); |
|||||
599 | } catch (ServiceResponseException $e) { |
||||||
600 | return [ |
||||||
601 | 'Contents' => [], |
||||||
602 | 'IsTruncated' => false, |
||||||
603 | 'NextMarker' => '', |
||||||
604 | ]; |
||||||
605 | } |
||||||
606 | } |
||||||
607 | |||||||
608 | /** |
||||||
609 | * @param Config $config |
||||||
610 | * |
||||||
611 | * @return array |
||||||
612 | */ |
||||||
613 | 4 | private function prepareUploadConfig(Config $config) |
|||||
614 | { |
||||||
615 | 4 | $options = []; |
|||||
616 | |||||||
617 | 4 | if (isset($this->config['encrypt']) && $this->config['encrypt']) { |
|||||
618 | $options['ServerSideEncryption'] = 'AES256'; |
||||||
619 | } |
||||||
620 | |||||||
621 | 4 | if ($config->has('params')) { |
|||||
622 | $options = array_merge($options, $config->get('params')); |
||||||
0 ignored issues
–
show
It seems like
$config->get('params') can also be of type null ; however, parameter $arrays of array_merge() does only seem to accept array , maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
![]() |
|||||||
623 | } |
||||||
624 | |||||||
625 | 4 | if ($config->has('visibility')) { |
|||||
626 | $options['ACL'] = $this->normalizeVisibility($config->get('visibility')); |
||||||
627 | } |
||||||
628 | |||||||
629 | 4 | return $options; |
|||||
630 | } |
||||||
631 | |||||||
632 | /** |
||||||
633 | * @param $visibility |
||||||
634 | * |
||||||
635 | * @return string |
||||||
636 | */ |
||||||
637 | 1 | private function normalizeVisibility($visibility) |
|||||
638 | { |
||||||
639 | switch ($visibility) { |
||||||
640 | 1 | case AdapterInterface::VISIBILITY_PUBLIC: |
|||||
641 | $visibility = 'public-read'; |
||||||
642 | break; |
||||||
643 | } |
||||||
644 | |||||||
645 | 1 | return $visibility; |
|||||
646 | } |
||||||
647 | |||||||
648 | /** |
||||||
649 | * @return Client |
||||||
650 | */ |
||||||
651 | public function getCOSClient() |
||||||
652 | { |
||||||
653 | return $this->client; |
||||||
654 | } |
||||||
655 | |||||||
656 | /** |
||||||
657 | * @param $method |
||||||
658 | * @param $url |
||||||
659 | * |
||||||
660 | * @return string |
||||||
661 | */ |
||||||
662 | public function getAuthorization($method, $url) |
||||||
663 | { |
||||||
664 | $cosRequest = new \GuzzleHttp\Psr7\Request($method, $url); |
||||||
665 | |||||||
666 | $signature = new \Qcloud\Cos\Signature( |
||||||
667 | $this->config['credentials']['secretId'], |
||||||
668 | $this->config['credentials']['secretKey'] |
||||||
669 | ); |
||||||
670 | |||||||
671 | return $signature->createAuthorization($cosRequest); |
||||||
672 | } |
||||||
673 | } |
||||||
674 |
This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.
If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.