PluginProbe
Media Cloud Sync / 1.2.6
Media Cloud Sync v1.2.6
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.6, at includes/base/services/s3compatible.php

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