PluginProbe
Media Cloud Sync / 1.3.0
Media Cloud Sync v1.3.0
1.4.1 1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 All 35 releases
media-cloud-sync / includes / base / services / s3compatible.php

s3compatible.php in Media Cloud Sync 1.3.0, at includes/base/services/s3compatible.php

852 lines 34.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Dudlewebs\WPMCS;
3
4 defined('ABSPATH') || exit;
5
6 // Libraries
7 use Dudlewebs\WPMCS\s3\Aws\S3\S3Client;
8 use Dudlewebs\WPMCS\s3\Aws\Exception\AwsException;
9 use Dudlewebs\WPMCS\s3\Aws\S3\Exception\S3Exception;
10 use Dudlewebs\WPMCS\s3\Aws\S3\MultipartUploader;
11 use Dudlewebs\WPMCS\s3\Aws\Exception\MultipartUploadException;
12 use Exception;
13
14 class S3Compatible {
15 private $assets_url;
16 private $version;
17 private $token;
18
19 protected $config;
20 protected $bucketConfig;
21 protected $settings;
22 protected $credentials;
23 protected $bucket_name;
24 protected $cdnConfig;
25
26 public $service = 's3compatible';
27 public $S3CompatibleClient = false;
28
29 /**
30 * Admin constructor.
31 * @since 1.0.0
32 */
33 public function __construct() {
34 $this->assets_url = WPMCS_ASSETS_URL;
35 $this->version = WPMCS_VERSION;
36 $this->token = WPMCS_TOKEN;
37
38 // Initialize setup
39 $this->init();
40 }
41
42 /**
43 * Initialise Client
44 */
45 public function init() {
46 $this->settings = Utils::get_settings();
47 $this->credentials = Utils::get_credentials();
48 $this->config = isset($this->credentials['config']) && !empty($this->credentials['config'])
49 ? $this->credentials['config']
50 : [];
51 $this->bucketConfig = isset($this->credentials['bucketConfig']) && !empty($this->credentials['bucketConfig'])
52 ? $this->credentials['bucketConfig']
53 : [];
54 $this->bucket_name = isset($this->bucketConfig['bucket_name']) && !empty($this->bucketConfig['bucket_name'])
55 ? $this->bucketConfig['bucket_name']
56 : '';
57 $this->cdnConfig = isset($this->credentials['cdn']) && !empty($this->credentials['cdn'])
58 ? $this->credentials['cdn']
59 : [];
60
61 if (
62 isset($this->config['access_key']) && !empty($this->config['access_key']) &&
63 isset($this->config['secret_key']) && !empty($this->config['secret_key']) &&
64 isset($this->config['endpoint']) && !empty($this->config['endpoint'])
65 ) {
66 $this->S3CompatibleClient = new S3Client([
67 'version' => '2006-03-01',
68 'region' => $this->config['region'] ? $this->config['region'] : 'us-east-1',
69 'endpoint' => $this->config['endpoint'], // DigitalOcean Spaces requires a custom endpoint
70 'use_accelerate_endpoint' => isset($this->bucketConfig['transfer_acceleration'])
71 ? $this->bucketConfig['transfer_acceleration'] : false,
72 'use_path_style_endpoint' => true, // DigitalOcean Spaces often requires path-style endpoints
73 'use_aws_shared_config_files' => false,
74 'credentials' => [
75 'key' => $this->config['access_key'],
76 'secret' => $this->config['secret_key'],
77 ],
78 ]);
79 }
80
81 }
82
83
84 /**
85 * Verify Credentials
86 * @since 1.0.0
87 * @return boolean
88 */
89 public function verifyCredentials($endpoint, $access_key, $secret_key, $region = false){
90 if (
91 isset($access_key) && !empty($access_key) &&
92 isset($secret_key) && !empty($secret_key) &&
93 isset($endpoint) && !empty($endpoint)
94 ) {
95 try {
96 $S3CompatibleClient = new S3Client([
97 'version' => '2006-03-01',
98 'region' => $region ? $region : 'us-east-1',
99 'endpoint' => $endpoint,
100 'use_path_style_endpoint' => true, // Required for DigitalOcean Spaces
101 'use_accelerate_endpoint' => false,
102 'use_aws_shared_config_files' => false,
103 'credentials' => [
104 'key' => $access_key,
105 'secret' => $secret_key,
106 ],
107 ]);
108
109 $result = [
110 'success' => false,
111 'code' => 200,
112 'message' => esc_html__('Please check the authorization details', 'media-cloud-sync'),
113 ];
114
115 try {
116 $S3CompatibleClient->listObjectsV2([
117 'Bucket' => $this->token . '_dummy-bucket-for-auth-check'
118 ]);
119
120 // If we reach here, the credentials are valid
121 $result = [
122 'success' => true,
123 'code' => 200,
124 'message' => esc_html__('Credentials are valid', 'media-cloud-sync'),
125 ];
126 } catch (AwsException $e) {
127 $code = $e->getAwsErrorCode();
128
129 $validErrors = [
130 'AccessDenied',
131 'NoSuchBucket',
132 'AllAccessDisabled',
133 'AuthorizationHeaderMalformed',
134 'PermanentRedirect',
135 'InvalidBucketName',
136 ];
137
138 if (in_array($code, $validErrors)) {
139 // If we reach here, the credentials are valid
140 $result = [
141 'success' => true,
142 'code' => 200,
143 'message' => esc_html__('Credentials are valid', 'media-cloud-sync'),
144 ];
145 }
146 }
147
148 if($result['success'] == false) {
149 return $result;
150 }
151 $result['buckets_data']['buckets'] = [];
152 $result['buckets_data']['message'] = esc_html__('Buckets listed successfully', 'media-cloud-sync');
153 $result['buckets_data']['status'] = true;
154 return $result;
155 } catch (S3Exception $ex) {
156 return array('message' => $ex->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false);
157 } catch (Exception $ex) {
158 return array('message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false);
159 }
160 }
161 return array('message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false);
162 }
163
164 /**
165 * Verify Bucket
166 * @since 1.0.0
167 * @return boolean
168 */
169 public function verifyBucketExist($endpoint, $access_key, $secret_key, $bucket_name, $region = false){
170 if (
171 isset($endpoint) && !empty($endpoint) &&
172 isset($access_key) && !empty($access_key) &&
173 isset($secret_key) && !empty($secret_key) &&
174 isset($bucket_name) && !empty($bucket_name)
175 ) {
176 try {
177 $S3CompatibleClient = new S3Client([
178 'version' => '2006-03-01',
179 'region' => $region ? $region : 'us-east-1',
180 'endpoint' => $endpoint,
181 'use_path_style_endpoint' => true, // Required for DigitalOcean Spaces
182 'use_accelerate_endpoint' => false,
183 'use_aws_shared_config_files' => false,
184 'credentials' => [
185 'key' => $access_key,
186 'secret' => $secret_key,
187 ],
188 ]);
189
190 //get S3 object
191 $bucket_found = false;
192 try {
193 $S3CompatibleClient->getObject([
194 'Bucket' => $bucket_name,
195 'Key' => $this->token . '_dummy-object-for-bucket-exist-check'
196 ]);
197 $bucket_found = true;
198 } catch (AwsException $e) {
199 $code = $e->getAwsErrorCode();
200 if ($code === 'NoSuchKey') {
201 $bucket_found = true;
202 }
203 }
204
205 if($bucket_found) {
206 return array('message' => esc_html__('Bucket exist', 'media-cloud-sync'), 'code' => 200, 'success' => true);
207 } else {
208 return array('message' => esc_html__("Bucket choosen does not exist / does not have read permission", 'media-cloud-sync'), 'code' => 200, 'success' => false);
209 }
210 }
211 catch (S3Exception $ex) {
212 return array('message' => $ex->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false);
213 } catch (Exception $ex) {
214 return array('message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false);
215 }
216 }
217 return array('message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false);
218 }
219
220 /**
221 * Create Bucket
222 * @since 1.0.0
223 * @return boolean
224 */
225 public function createBucket($endpoint, $access_key, $secret_key, $bucket_name, $region = false){
226 if (empty($endpoint) || empty($access_key) || empty($secret_key) || empty($bucket_name)) {
227 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
228 }
229
230 try {
231 $S3CompatibleClient = new S3Client([
232 'version' => '2006-03-01',
233 'region' => $region ? $region : 'us-east-1',
234 'endpoint' => $endpoint,
235 'use_path_style_endpoint' => true, // Required for DigitalOcean Spaces
236 'use_accelerate_endpoint' => false,
237 'use_aws_shared_config_files' => false,
238 'credentials' => [
239 'key' => $access_key,
240 'secret' => $secret_key,
241 ],
242 ]);
243
244 // Create Bucket
245 $S3CompatibleClient->createBucket([
246 'Bucket' => $bucket_name,
247 ]);
248
249 // Optionally wait for bucket existence (recommended)
250 $S3CompatibleClient->waitUntil('BucketExists', ['Bucket' => $bucket_name]);
251
252 try {
253 $this->putBucketPolicy($bucket_name, $S3CompatibleClient);
254
255 return [
256 'message' => esc_html__('Bucket created successfully.', 'media-cloud-sync'),
257 'data' => [
258 'Name' => $bucket_name,
259 'CreationDate' => date('Y-m-d\TH:i:s\Z'),
260 ],
261 'code' => 200,
262 'success' => true,
263 ];
264
265 } catch (AwsException $ex) {
266 return ['message' => esc_html__('Bucket created. But the following error happened while setting the public access,', 'media-cloud-sync') . ' ' . $ex->getAwsErrorMessage(), 'code' => 200, 'success' => false];
267 }
268 } catch (AwsException $ex) {
269 return ['message' => $ex->getAwsErrorMessage(), 'code' => 200, 'success' => false];
270 } catch (S3Exception $ex) {
271 return ['message' => $ex->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
272 } catch (Exception $ex) {
273 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
274 }
275 }
276
277
278 /**
279 * Add Bucket Policy
280 */
281 private function putBucketPolicy($bucket, $S3CompatibleClient = false) {
282 if($S3CompatibleClient == false) {
283 $S3CompatibleClient = $this->S3CompatibleClient;
284 }
285
286 if(empty($bucket)) return false;
287
288 $policy = json_encode([
289 "Version" => "2012-10-17",
290 "Statement" => [
291 [
292 "Effect" => "Allow",
293 "Principal" => "*",
294 "Action" => [
295 "s3:DeleteObjectTagging",
296 "s3:ListBucketMultipartUploads",
297 "s3:DeleteObjectVersion",
298 "s3:ListBucket",
299 "s3:DeleteObjectVersionTagging",
300 "s3:GetBucketAcl",
301 "s3:ListMultipartUploadParts",
302 "s3:PutObject",
303 "s3:GetObjectAcl",
304 "s3:GetObject",
305 "s3:AbortMultipartUpload",
306 "s3:DeleteObject",
307 "s3:GetBucketLocation",
308 "s3:PutObjectAcl",
309 "s3:putBucketOwnershipControls",
310 "s3:putBucketPolicy"
311 ],
312 "Resource" => [
313 "arn:aws:s3:::$bucket/*",
314 "arn:aws:s3:::$bucket"
315 ]
316 ]
317 ]
318 ]);
319
320 try {
321 // Add bucket policy
322 $S3CompatibleClient->putBucketPolicy(['Bucket' => $bucket, 'Policy' => $policy]);
323
324 return true;
325 } catch (AwsException $ex) {
326 return false;
327 } catch (S3Exception $ex) {
328 return false;
329 } catch (Exception $ex) {
330 return false;
331 }
332 }
333
334
335
336 /**
337 * Check Bucket Write Permission
338 * @since 1.0.0
339 */
340 public function verifyObjectWritePermission($endpoint, $access_key, $secret_key, $bucket_name, $region = false){
341 if (empty($endpoint) || empty($access_key) || empty($secret_key) || empty($bucket_name)) {
342 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
343 }
344
345 try {
346 $S3CompatibleClient = new S3Client([
347 'version' => '2006-03-01',
348 'region' => $region ? $region : 'us-east-1',
349 'endpoint' => $endpoint,
350 'use_path_style_endpoint' => true, // Required for DigitalOcean Spaces
351 'use_accelerate_endpoint' => false,
352 'use_aws_shared_config_files' => false,
353 'credentials' => [
354 'key' => $access_key,
355 'secret' => $secret_key,
356 ],
357 ]);
358
359 $object_key = Utils::generate_object_key($this->token . '_dummy-object-for-bucket-permission-check', '');
360
361
362 // Create a dummy object to check write permission
363 $S3CompatibleClient->putObject([
364 'Bucket' => $bucket_name,
365 'Key' => $object_key,
366 'Body' => 'This is a test object to check write permission.',
367 ]);
368 // Check if the object was created successfully
369 if ($S3CompatibleClient->doesObjectExist($bucket_name, $object_key)) {
370 return ['message' => esc_html__('Bucket write permission verified successfully', 'media-cloud-sync'), 'code' => 200, 'success' => true];
371 } else {
372 return ['message' => esc_html__('Bucket write permission not verified', 'media-cloud-sync'), 'code' => 200, 'success' => false];
373 }
374
375 } catch (AwsException $ex) {
376 return ['message' => $ex->getAwsErrorMessage(), 'code' => 200, 'success' => false];
377 } catch (S3Exception $ex) {
378 return ['message' => $ex->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
379 } catch (Exception $ex) {
380 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
381 }
382 }
383
384
385
386 /**
387 * Check Bucket Delete Permission
388 * @since 1.0.0
389 */
390 public function verifyObjectDeletePermission($endpoint, $access_key, $secret_key, $bucket_name, $region = false){
391 if (empty($endpoint) || empty($access_key) || empty($secret_key) || empty($bucket_name)) {
392 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
393 }
394
395 try {
396 $S3CompatibleClient = new S3Client([
397 'version' => '2006-03-01',
398 'region' => $region ? $region : 'us-east-1',
399 'endpoint' => $endpoint,
400 'use_path_style_endpoint' => true, // Required for DigitalOcean Spaces
401 'use_accelerate_endpoint' => false,
402 'use_aws_shared_config_files' => false,
403 'credentials' => [
404 'key' => $access_key,
405 'secret' => $secret_key,
406 ],
407 ]);
408
409 $object_key = Utils::generate_object_key($this->token . '_dummy-object-for-bucket-permission-check', '');
410
411 // Create a dummy object to check dlete permission
412 $S3CompatibleClient->deleteObject([
413 'Bucket' => $bucket_name,
414 'Key' => $object_key,
415 ]);
416
417 // Check if the object was created successfully
418 if (!$S3CompatibleClient->doesObjectExist($bucket_name, $object_key)) {
419 return ['message' => esc_html__('Bucket delete permission verified successfully', 'media-cloud-sync'), 'code' => 200, 'success' => true];
420 } else {
421 return ['message' => esc_html__('Bucket delete permission not verified', 'media-cloud-sync'), 'code' => 200, 'success' => false];
422 }
423
424 } catch (AwsException $ex) {
425 return ['message' => $ex->getAwsErrorMessage(), 'code' => 200, 'success' => false];
426 } catch (S3Exception $ex) {
427 return ['message' => $ex->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
428 } catch (Exception $ex) {
429 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
430 }
431 }
432
433
434 /**
435 * Check Bucket Read Permission
436 * @since 1.2.4
437 */
438 public function verifyObjectReadPermission() {
439 if (empty($this->S3CompatibleClient) || empty($this->bucket_name)) {
440 return ['message' => esc_html__('Invalid Request', 'media-cloud-sync'), 'code' => 200, 'success' => false];
441 }
442
443 try {
444 $object_key = Utils::generate_object_key($this->token . '_dummy-object-for-bucket-permission-check', '');
445
446 // Check if the object was created successfully
447 if (!$this->S3CompatibleClient->doesObjectExist($this->bucket_name, $object_key)) {
448 // Create a dummy object to check write permission
449 $this->S3CompatibleClient->putObject([
450 'Bucket' => $this->bucket_name,
451 'Key' => $object_key,
452 'Body' => 'This is a test object to check permission.',
453 ]);
454 }
455
456
457 $url = $this->generate_file_url($object_key);
458 $cdn_url = Cdn::may_generate_cdn_url($url, $object_key);
459 $headers = @get_headers($cdn_url);
460 $result = [
461 'status' => false,
462 'message' => '',
463 'lastChecked' => time(),
464 ];
465 if (strpos($headers[0], '200') !== false) {
466 $result['status'] = true;
467 $result['message'] = esc_html__('Objects are accessible to Read', 'media-cloud-sync');
468 } else if (strpos($headers[0], '403') !== false) {
469 $result['status'] = false;
470 if($this->cdnConfig['service'] == $this->service) {
471 $result['message'] = esc_html__('Access Denied. Please check your bucket policy. Public Read Access is required.', 'media-cloud-sync');
472 } else {
473 $result['message'] = esc_html__('Access Denied. Please check your bucket policy', 'media-cloud-sync');
474 }
475 $result['message'] = esc_html__('Access Denied. Please check your bucket policy', 'media-cloud-sync');
476 } else if (strpos($headers[0], '404') !== false) {
477 $result['status'] = false;
478 $result['message'] = esc_html__('Object not found. Please check your bucket policy', 'media-cloud-sync');
479 } else if (strpos($headers[0], '500') !== false) {
480 $result['status'] = false;
481 $result['message'] = esc_html__('Internal Server error. Please check your bucket policy', 'media-cloud-sync');
482 } else {
483 $result['status'] = false;
484 $result['message'] = esc_html__('Objects are not accessible to read', 'media-cloud-sync');
485 }
486 Utils::set_status('cdnRead', $result);
487
488 $this->deleteSingle($object_key);
489 return [
490 'message' => $result['message'],
491 'code' => 200,
492 'success' => $result['status'],
493 'lastChecked' => $result['lastChecked'],
494 ];
495 } catch (AwsException $ex) {
496 return ['message' => $ex->getAwsErrorMessage(), 'code' => 200, 'success' => false];
497 } catch (S3Exception $ex) {
498 return ['message' => $ex->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
499 } catch (Exception $ex) {
500 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
501 }
502 }
503
504
505 /**
506 * isConfigured Function To Identify the congfigurations are correct
507 * @since 1.0.0
508 */
509 public function isConfigured(){
510 if ($this->S3CompatibleClient) {
511 try {
512 $this->S3CompatibleClient->listObjectsV2([
513 'Bucket' => $this->token . '_dummy-bucket-for-auth-check'
514 ]);
515
516 // If we reach here, the credentials are valid
517 return true;
518 } catch (AwsException $ex) {
519 $code = $e->getAwsErrorCode();
520
521 $validErrors = [
522 'AccessDenied',
523 'NoSuchBucket',
524 'AllAccessDisabled',
525 'AuthorizationHeaderMalformed',
526 'PermanentRedirect',
527 'InvalidBucketName'
528 ];
529
530 if (in_array($code, $validErrors)) {
531 // If we reach here, the credentials are valid
532 return true;
533 } else {
534 return false;
535 }
536 } catch (S3Exception $ex) {
537 return false;
538 } catch (Exception $ex) {
539 return false;
540 }
541 }
542 return false;
543 }
544
545 /**
546 * Make Object Private
547 * @since 1.0.0
548 *
549 */
550 public function toPrivate($key) {
551 if(!$key) return false;
552 try {
553 $this->S3CompatibleClient->putObjectAcl([
554 'Bucket' => $this->bucket_name,
555 'Key' => $key,
556 'ACL' => 'private'
557 ]);
558 return true;
559 } catch (AwsException $ex) {
560 return false;
561 }
562 return false;
563 }
564
565
566
567 /**
568 * Make Object Public
569 * @since 1.0.0
570 *
571 */
572 public function toPublic($key) {
573 if(!$key) return false;
574 try {
575 $this->S3CompatibleClient->putObjectAcl([
576 'Bucket' => $this->bucket_name,
577 'Key' => $key,
578 'ACL' => 'public-read'
579 ]);
580 return true;
581 } catch (AwsException $ex) {
582 return false;
583 }
584 return false;
585 }
586
587
588
589 /**
590 * Check the object exist
591 * @since 1.1.8
592 */
593 public function exists($key) {
594 if(!$key) return false;
595
596 try {
597 if($this->S3CompatibleClient->doesObjectExist($this->bucket_name, $key)) {
598 return true;
599 }
600 } catch (AwsException $ex) {
601 return false;
602 } catch (S3Exception $ex) {
603 return false;
604 } catch (Exception $ex) {
605 return false;
606 }
607 }
608
609 /**
610 * Upload Single
611 * @since 1.0.0
612 * @return boolean
613 */
614 public function uploadSingle($media_absolute_path, $media_path, $prefix='') {
615 $result = array();
616 if (
617 isset($media_absolute_path) && !empty($media_absolute_path) &&
618 isset($media_path) && !empty($media_path)
619 ) {
620 $file_name = wp_basename( $media_path );
621 if ($file_name) {
622 $upload_path = Utils::generate_object_key($media_path, $prefix);
623
624 // Decide Multipart upload or normal put object
625 if (filesize($media_absolute_path) <= Schema::getConstant('DOCEAN_MULTIPART_MIN_FILE_SIZE')) {
626 // Upload a publicly accessible file. The file size and type are determined by the SDK.
627 try {
628 $upload = $this->S3CompatibleClient->putObject([
629 'Bucket' => $this->bucket_name,
630 'Key' => $upload_path,
631 'Body' => fopen($media_absolute_path, 'r'),
632 ]);
633
634 $result = array(
635 'success' => true,
636 'code' => 200,
637 'file_url' => $this->generate_file_url($upload_path),
638 'key' => $upload_path,
639 'message' => esc_html__('File Uploaded Successfully', 'media-cloud-sync')
640 );
641 } catch (AwsException $e) {
642 $result = array(
643 'success' => false,
644 'code' => 200,
645 'message' => $e->getMessage()
646 );
647 }
648 } else {
649 $multiUploader = new MultipartUploader($this->S3CompatibleClient, $media_absolute_path, [
650 'bucket' => $this->bucket_name,
651 'key' => $upload_path
652 ]);
653
654 try {
655 do {
656 try {
657 $uploaded = $multiUploader->upload();
658 } catch (MultipartUploadException $e) {
659 $multiUploader = new MultipartUploader($this->S3CompatibleClient, $media_absolute_path, [
660 'state' => $e->getState(),
661 ]);
662 }
663 } while (!isset($uploaded));
664
665 if (isset($uploaded['ObjectURL']) && !empty($uploaded['ObjectURL'])) {
666 $result = array(
667 'success' => true,
668 'code' => 200,
669 'file_url' => $this->generate_file_url($upload_path),
670 'key' => $upload_path,
671 'message' => esc_html__('File Uploaded Successfully', 'media-cloud-sync')
672 );
673 } else {
674 $result = array(
675 'success' => false,
676 'code' => 200,
677 'message' => esc_html__('Something happened while uploading to server', 'media-cloud-sync')
678 );
679 }
680 } catch (MultipartUploadException $e) {
681 $result = array(
682 'success' => false,
683 'code' => 200,
684 'message' => $e->getMessage()
685 );
686 }
687 }
688 } else {
689 $result = array(
690 'success' => false,
691 'code' => 200,
692 'message' => esc_html__('Check the file you are trying to upload. Please try again', 'media-cloud-sync')
693 );
694 }
695 } else {
696 $result = array(
697 'success' => false,
698 'code' => 200,
699 'message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync')
700 );
701 }
702 return $result;
703 }
704
705 /**
706 * Save object to server
707 * @since 1.0.0
708 */
709 public function object_to_server($key, $save_path) {
710 try {
711 $getObject = $this->S3CompatibleClient->GetObject([
712 'Bucket' => $this->bucket_name,
713 'Key' => $key,
714 'SaveAs' => $save_path
715 ]);
716 if (file_exists($save_path)) {
717 return true;
718 }
719 } catch (AwsException $e) {
720 return false;
721 }
722 return false;
723 }
724
725
726 /**
727 * Delete Single
728 * @since 1.0.0
729 * @return boolean
730 */
731 public function deleteSingle($key) {
732 $result = array();
733 if (isset($key) && !empty($key)) {
734 try {
735 $this->S3CompatibleClient->deleteObject([
736 'Bucket' => $this->bucket_name,
737 'Key' => $key
738 ]);
739
740 if (!$this->S3CompatibleClient->doesObjectExist($this->bucket_name, $key)) {
741 $result = array(
742 'success' => true,
743 'code' => 200,
744 'message' => esc_html__('Deleted Successfully', 'media-cloud-sync')
745 );
746 } else {
747 $result = array(
748 'success' => false,
749 'code' => 200,
750 'message' => esc_html__('File not deleted', 'media-cloud-sync')
751 );
752 }
753 } catch (AwsException $e) {
754 $result = array(
755 'success' => false,
756 'code' => 200,
757 'message' => $e->getMessage()
758 );
759 }
760 } else {
761 $result = array(
762 'success' => false,
763 'code' => 200,
764 'message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync')
765 );
766 }
767 return $result;
768 }
769
770 /**
771 * get presigned URL
772 * @since 1.0.0
773 * @return boolean
774 */
775 public function get_presigned_url($key) {
776 $result = array();
777 if (isset($key) && !empty($key)) {
778 try {
779 $cmd = $this->S3CompatibleClient->getCommand('GetObject', [
780 'Bucket' => $this->bucket_name,
781 'Key' => $key
782 ]);
783
784 $expires = isset($this->settings['presigned_expire']) ? $this->settings['presigned_expire'] : 20;
785
786 $request = $this->S3CompatibleClient->createPresignedRequest($cmd, sprintf('+%s minutes', $expires));
787
788 if ($presignedUrl = (string)$request->getUri()) {
789 $result = array(
790 'success' => true,
791 'code' => 200,
792 'file_url' => $presignedUrl,
793 'message' => esc_html__('Got Presigned URL Successfully', 'media-cloud-sync')
794 );
795 } else {
796 $result = array(
797 'success' => false,
798 'code' => 200,
799 'message' => esc_html__('Error getting presigned URL', 'media-cloud-sync')
800 );
801 }
802 } catch (AwsException $e) {
803 $result = array(
804 'success' => false,
805 'code' => 200,
806 'message' => $e->getMessage()
807 );
808 } catch (S3Exception $e) {
809 $result = array(
810 'success' => false,
811 'code' => 200,
812 'message' => $e->getAwsErrorMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync')
813 );
814 } catch (Exception $e) {
815 $result = array(
816 'success' => false,
817 'code' => 200,
818 'message' => $e->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync')
819 );
820 }
821 } else {
822 $result = array(
823 'success' => false,
824 'code' => 200,
825 'message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync')
826 );
827 }
828 return $result;
829 }
830
831 /**
832 * Generate file URL
833 */
834 private function generate_file_url($key){
835 $domain = $this->get_domain();
836
837 return apply_filters('wpmcs_generate_do_file_url',
838 $domain . '/' . $this->bucket_name . '/' . $key,
839 $domain,
840 $this->bucket_name,
841 $key
842 );
843 }
844
845 /**
846 * Get domain URL
847 */
848 public function get_domain($region = '') {
849 return $this->config['endpoint'];
850 }
851
852 }