PluginProbe
Media Cloud Sync / 1.2.5
Media Cloud Sync v1.2.5
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 / docean.php

docean.php in Media Cloud Sync 1.2.5, at includes/base/services/docean.php

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