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

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

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