PluginProbe
Media Cloud Sync / 1.2.11
Media Cloud Sync v1.2.11
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 1.3.0 All 34 releases
media-cloud-sync / includes / base / services / s3compatible.php

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

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