PluginProbe
Media Cloud Sync / 1.2.9
Media Cloud Sync v1.2.9
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 / gcloud.php

gcloud.php in Media Cloud Sync 1.2.9, at includes/base/services/gcloud.php

833 lines 31.7 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\Google\Cloud\Storage\StorageClient;
8 use Dudlewebs\WPMCS\Google\Cloud\Core\Exception\ServiceException;
9
10 use Exception;
11
12 class GCloud {
13 private $assets_url;
14 private $version;
15 private $token;
16
17 protected $config;
18 protected $bucketConfig;
19 protected $settings;
20 protected $credentials;
21 protected $bucket_name;
22 protected $bucket; // Object
23 protected $cdnConfig;
24
25 public $service = 'gcloud';
26 public $gcloudClient = false;
27
28 /**
29 * Admin constructor.
30 * @since 1.0.0
31 */
32 public function __construct() {
33 $this->assets_url = WPMCS_ASSETS_URL;
34 $this->version = WPMCS_VERSION;
35 $this->token = WPMCS_TOKEN;
36
37 // Initialize setup
38 $this->init();
39 }
40
41 /**
42 * Initialise Client
43 */
44 public function init() {
45 $this->settings = Utils::get_settings();
46 $this->credentials = Utils::get_credentials();
47 $this->config = isset($this->credentials['config']) && !empty($this->credentials['config'])
48 ? $this->credentials['config']
49 : [];
50 $this->bucketConfig = isset($this->credentials['bucketConfig']) && !empty($this->credentials['bucketConfig'])
51 ? $this->credentials['bucketConfig']
52 : [];
53 $this->bucket_name = isset($this->bucketConfig['bucket_name']) && !empty($this->bucketConfig['bucket_name'])
54 ? $this->bucketConfig['bucket_name']
55 : '';
56 $this->cdnConfig = isset($this->credentials['cdn']) && !empty($this->credentials['cdn'])
57 ? $this->credentials['cdn']
58 : [];
59
60 if (
61 isset($this->config['config_json']) && !empty($this->config['config_json']) &&
62 isset($this->config['config_json']['path']) && !empty($this->config['config_json']['path']) &&
63 isset($this->bucket_name) && !empty($this->bucket_name)
64 ) {
65 if(file_exists($this->config['config_json']['path'])){
66 // Set google client
67 $this->gcloudClient = new StorageClient([
68 'keyFilePath' => $this->config['config_json']['path'],
69 ]);
70 // Set bucket object
71 $this->bucket = $this->gcloudClient->bucket($this->bucket_name);
72 } else {
73 add_action('admin_notices', function (){
74 echo wp_kses_post(sprintf( "<div class='error'><p><strong>%s: </strong><br>Google Cloud Storage configuration file missing from the directory.
75 It may break the media url's as well as media uploads.<br>
76 <a href='%s'>Re-configure</a> plugin to fix the issue.
77 </p></div>",
78 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
79 admin_url('admin.php?page='.$this->token . '-admin-ui#/configure')
80 ));
81 });
82 }
83 }
84 }
85
86 /**
87 * Verify Credentials
88 * @since 1.0.0
89 * @return boolean
90 */
91 public function verifyCredentials( $config_file ){
92 if (
93 isset($config_file) && !empty($config_file) &&
94 isset($config_file['path']) && !empty($config_file['path']) &&
95 file_exists($config_file['path'])
96 ) {
97 try {
98 $googleClient = new StorageClient([
99 'keyFilePath' => $config_file['path'],
100 ]);
101
102 $result = [
103 'success' => false,
104 'code' => 200,
105 'message' => esc_html__('Please check the authorization details', 'media-cloud-sync'),
106 ];
107
108 try {
109 $bucket = $googleClient->bucket($this->token . '_dummy-bucket-for-auth-check');
110 $exists = $bucket->exists(); // Triggers the API call
111
112 // If we reach here, the credentials are valid
113 $result = [
114 'success' => true,
115 'code' => 200,
116 'message' => esc_html__('Credentials are valid', 'media-cloud-sync'),
117 ];
118 } catch (ServiceException $e) {
119 $statusCode = $e->getCode();
120
121 $validErrors = [200, 403, 404];
122
123 if (in_array($statusCode, $validErrors)) {
124 // If we reach here, the credentials are valid
125 $result = [
126 'success' => true,
127 'code' => 200,
128 'message' => esc_html__('Credentials are valid', 'media-cloud-sync'),
129 ];
130 }
131 }
132
133 if($result['success'] == false) {
134 return $result;
135 }
136
137
138 try {
139 $buckets = $googleClient->buckets();
140 $newBucketFormat = [];
141 if(isset($buckets) && !empty($buckets)){
142 foreach($buckets as $bucket) {
143 $name = $bucket->name();
144 if(!empty($name)) {
145 // Fetch the bucket's metadata
146 $bucketInfo = $bucket->info();
147 $newBucketFormat[] = ['Name' => $name, 'CreationDate' => $bucketInfo['timeCreated']];
148 }
149 }
150 }
151 $result['buckets_data']['buckets'] = $newBucketFormat;
152 $result['buckets_data']['message'] = esc_html__('Buckets listed successfully', 'media-cloud-sync');
153 $result['buckets_data']['status'] = true;
154 } catch (Exception $e) {
155 $result ['buckets_data']['buckets'] = [];
156 $result ['buckets_data']['message'] = esc_html__('Unable to list buckets, Please check the bucket listing permission', 'media-cloud-sync');
157 $result ['buckets_data']['status'] = false;
158 }
159 return $result;
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 /**
169 * Verify Bucket Exists
170 * @since 1.0.0
171 * @return boolean
172 */
173 public function verifyBucketExist( $config_file, $bucket_name ){
174 if ( !( isset($config_file['path']) && !empty($config_file['path']) && file_exists($config_file['path']) && !empty($bucket_name) ) ) {
175 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
176 }
177
178 try {
179 $googleClient = new StorageClient([
180 'keyFilePath' => $config_file['path'],
181 ]);
182
183 try {
184 $bucket = $googleClient->bucket($bucket_name);
185
186 if ($bucket->exists()) {
187 return [
188 'message' => esc_html__('Bucket exists', 'media-cloud-sync'),
189 'code' => 200,
190 'success' => true,
191 ];
192 } else {
193 return [
194 'message' => esc_html__('Bucket does not exist', 'media-cloud-sync'),
195 'code' => 200,
196 'success' => false,
197 ];
198 }
199 } catch (ServiceException $e) {
200 return [
201 'message' => esc_html__('Bucket does not exist or credentials are invalid: ', 'media-cloud-sync') . $e->getMessage(),
202 'code' => 200,
203 'success' => false,
204 ];
205 }
206
207
208 if($bucket_found) {
209 return array('message' => esc_html__('Bucket exist', 'media-cloud-sync'), 'code' => 200, 'success' => true);
210 } else {
211 return array('message' => esc_html__("Bucket choosen does not exist / does not have read permission", 'media-cloud-sync'), 'code' => 200, 'success' => false);
212 }
213 } catch (Exception $ex) {
214 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
215 }
216 }
217
218
219 /**
220 * Create Bucket
221 * @since 1.0.0
222 * @return boolean
223 */
224 public function createBucket( $config_file, $region, $bucket_name ){
225 if ( !( isset($config_file['path']) && !empty($config_file['path']) && file_exists($config_file['path']) && !empty($region) && !empty($bucket_name) ) ) {
226 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
227 }
228
229 try {
230 $googleClient = new StorageClient([
231 'keyFilePath' => $config_file['path'],
232 ]);
233
234 // Create Bucket
235 $bucket = $googleClient->createBucket($bucket_name, [
236 'location' => $region,
237 'iamConfiguration' => [
238 'uniformBucketLevelAccess' => [
239 'enabled' => true
240 ]
241 ]
242 ]);
243
244 // Fetch the bucket's IAM
245 try {
246 $iam = $bucket->iam();
247
248 $policy = $iam->policy();
249
250 // Add allUsers as a Storage Object Viewer
251 $policy['bindings'][] = [
252 'role' => 'roles/storage.objectViewer',
253 'members' => ['allUsers'],
254 ];
255
256 // Set the updated policy
257 $iam->setPolicy($policy);
258
259 } catch (ServiceException $e) {
260 return [
261 'message' => esc_html__('Bucket created successfully. But failed to set IAM policy.', 'media-cloud-sync'),
262 'data' => [
263 'Name' => $bucket_name,
264 'CreationDate' => date('Y-m-d\TH:i:s\Z'),
265 ],
266 'code' => 200,
267 'success' => true,
268 ];
269 } catch (Exception $e) {
270 return [
271 'message' => esc_html__('Bucket created successfully. But failed to set IAM policy.', 'media-cloud-sync'),
272 'data' => [
273 'Name' => $bucket_name,
274 'CreationDate' => date('Y-m-d\TH:i:s\Z'),
275 ],
276 'code' => 200,
277 'success' => true,
278 ];
279 }
280
281 return [
282 'message' => esc_html__('Bucket created successfully.', 'media-cloud-sync'),
283 'data' => [
284 'Name' => $bucket_name,
285 'CreationDate' => date('Y-m-d\TH:i:s\Z'),
286 ],
287 'code' => 200,
288 'success' => true,
289 ];
290
291 } catch (Exception $ex) {
292 return ['message' => $e->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
293 }
294 }
295
296 /**
297 * Check Bucket Write Permission
298 * @since 1.0.0
299 */
300 public function verifyObjectWritePermission($config_file, $bucket_name){
301 if ( !( isset($config_file['path']) && !empty($config_file['path']) && file_exists($config_file['path']) && !empty($bucket_name) ) ) {
302 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
303 }
304
305 try {
306 $googleClient = new StorageClient([
307 'keyFilePath' => $config_file['path'],
308 ]);
309
310 $bucket = $googleClient->bucket($bucket_name);
311 if ($bucket->exists()) {
312 $bucket_found = true;
313 } else {
314 return ['message' => esc_html__('No Buckets found', 'media-cloud-sync'), 'code' => 200, 'success' => false];
315 }
316 if ($bucket_found) {
317 $object_key = Utils::generate_object_key($this->token . '_dummy-object-for-bucket-permission-check', '');
318
319 // Prepare a temporary file with content to check write permission
320 $stream = fopen('php://temp', 'r+');
321 fwrite($stream, 'This is a test object to check write permission.');
322 rewind($stream);
323
324 // Upload the object to the bucket
325 $object = $bucket->upload(
326 $stream,
327 [
328 'name' => $object_key,
329 ]
330 );
331 if(is_resource($stream)) {
332 fclose($stream);
333 }
334
335 if ($object->exists()) {
336 return ['message' => esc_html__('Bucket write permission verified successfully', 'media-cloud-sync'), 'code' => 200, 'success' => true];
337 } else {
338 return ['message' => esc_html__('Bucket write permission not verified', 'media-cloud-sync'), 'code' => 200, 'success' => false];
339 }
340 }
341 } catch (Exception $ex) {
342 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
343 }
344 }
345
346 /**
347 * Check Bucket Delete Permission
348 * @since 1.0.0
349 */
350 public function verifyObjectDeletePermission($config_file, $bucket_name){
351 if ( !( isset($config_file['path']) && !empty($config_file['path']) && file_exists($config_file['path']) && !empty($bucket_name) ) ) {
352 return ['message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'), 'code' => 200, 'success' => false];
353 }
354
355 try {
356 $googleClient = new StorageClient([
357 'keyFilePath' => $config_file['path'],
358 ]);
359
360 $bucket = $googleClient->bucket($bucket_name);
361 try {
362 $object_key = Utils::generate_object_key($this->token . '_dummy-object-for-bucket-permission-check', '');
363
364 // Try fetching a dummy object to test access
365 $object = $bucket->object($object_key);
366 if ($object->exists()) {
367 $object->delete();
368 if (!$object->exists()) {
369 return [
370 'message' => esc_html__('Bucket exists', 'media-cloud-sync'),
371 'code' => 200,
372 'success' => true,
373 ];
374 } else {
375 return [
376 'message' => esc_html__('You do not have permission to delete object', 'media-cloud-sync'),
377 'code' => 200,
378 'success' => false,
379 ];
380 }
381 } else {
382 return [
383 'message' => esc_html__('Object does not exist', 'media-cloud-sync'),
384 'code' => 200,
385 'success' => false,
386 ];
387 }
388 } catch (Exception $ex) {
389 return [
390 'message' => esc_html__('Object does not exist or credentials are invalid: ', 'media-cloud-sync') . $e->getMessage(),
391 'code' => 200,
392 'success' => false,
393 ];
394 }
395
396 } catch (Exception $ex) {
397 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
398 }
399 }
400
401 /**
402 * Check Bucket Read Permission
403 * @since 1.2.4
404 */
405 public function verifyObjectReadPermission() {
406 $result = [
407 'status' => false,
408 'message' => '',
409 'lastChecked' => time(),
410 ];
411 if (empty($this->gcloudClient) || empty($this->bucket_name)) {
412 $result['message'] = esc_html__('Please check the authorization details', 'media-cloud-sync');
413 Utils::set_status('cdnRead', $result);
414 return [
415 'message' => $result['message'],
416 'code' => 200,
417 'success' => false,
418 'lastChecked' => $result['lastChecked'],
419 ];
420 }
421
422 try {
423 $object_key = Utils::generate_object_key($this->token . '_dummy-object-for-bucket-permission-check', '');
424
425 // Check if the object was created successfully
426 if (!$this->bucket->object($object_key)->exists()) {
427 // Create a dummy object to check write permission
428 $stream = fopen('php://temp', 'r+');
429 fwrite($stream, 'This is a test object to check read permission.');
430 rewind($stream);
431 $this->bucket->upload(
432 $stream,
433 [
434 'name' => $object_key,
435 ]
436 );
437 if (is_resource($stream)) {
438 fclose($stream);
439 }
440 // Re-check if the object was created successfully
441 if (!$this->bucket->object($object_key)->exists()) {
442 $result['status'] = false;
443 $result['message'] = esc_html__('Failed to create an object for read permission check, please check service configuration', 'media-cloud-sync');
444 Utils::set_status('cdnRead', $result);
445 return [
446 'message' => $result['message'],
447 'code' => 200,
448 'success' => false,
449 'lastChecked' => $result['lastChecked'],
450 ];
451 }
452 }
453
454 $url = $this->generate_file_url($object_key);
455 $cdn_url = Cdn::may_generate_cdn_url($url, $object_key);
456
457 $headers = @get_headers($cdn_url);
458 if (strpos($headers[0], '200') !== false) {
459 $result['status'] = true;
460 $result['message'] = esc_html__('Objects are accessible to Read', 'media-cloud-sync');
461 } else if (strpos($headers[0], '403') !== false) {
462 $result['status'] = false;
463 if($this->cdnConfig['service'] == $this->service) {
464 $result['message'] = esc_html__('Access Denied. Please check your bucket policy. Public Read Access is required.', 'media-cloud-sync');
465 } else {
466 $result['message'] = esc_html__('Access Denied. Please check your bucket policy', 'media-cloud-sync');
467 }
468 $result['message'] = esc_html__('Access Denied. Please check your bucket policy', 'media-cloud-sync');
469 } else if (strpos($headers[0], '404') !== false) {
470 $result['status'] = false;
471 $result['message'] = esc_html__('Object not found. Please check your bucket policy', 'media-cloud-sync');
472 } else if (strpos($headers[0], '500') !== false) {
473 $result['status'] = false;
474 $result['message'] = esc_html__('Internal Server error. Please check your bucket policy', 'media-cloud-sync');
475 } else {
476 $result['status'] = false;
477 $result['message'] = esc_html__('Objects are not accessible to read', 'media-cloud-sync');
478 }
479 Utils::set_status('cdnRead', $result);
480 $this->deleteSingle($object_key);
481 return [
482 'message' => $result['message'],
483 'code' => 200,
484 'success' => $result['status'],
485 'lastChecked' => $result['lastChecked'],
486 ];
487 } catch (ServiceException $ex) {
488 return ['message' => $ex->getMessage(), 'code' => 200, 'success' => false];
489 } catch (Exception $ex) {
490 return ['message' => $ex->getMessage() ?? esc_html__('Please check the authorization details', 'media-cloud-sync'), 'code' => 200, 'success' => false];
491 }
492 }
493
494 /**
495 * isConfigured Function To Identify the congfigurations are correct
496 * @since 1.0.0
497 */
498 public function isConfigured(){
499 if ($this->gcloudClient) {
500 try {
501 $bucket = $this->gcloudClient->bucket($this->token . '_dummy-bucket-for-auth-check');
502 $exists = $bucket->exists(); // Triggers the API call
503 return false;
504 } catch (ServiceException $e) {
505 $statusCode = $e->getCode();
506
507 $validErrors = [200, 403, 404];
508
509 if (in_array($statusCode, $validErrors)) {
510 // If we reach here, the credentials are valid
511 return true;
512 } else {
513 // If we reach here, the credentials are not valid
514 return false;
515 }
516 }
517 }
518 return false;
519 }
520
521 /**
522 * Make Object Private
523 * @since 1.0.0
524 *
525 */
526 public function toPrivate($key) {
527 if(!$key) return false;
528
529 try {
530 $object = $this->bucket->object($key);
531 if ($object->exists()) {
532 $object->update(['acl' => []], ['predefinedAcl' => 'private']);
533 return true;
534 }
535 } catch (ServiceException $e) {
536 // Handle exception if needed
537 return false;
538 } catch (Exception $e) {
539 // Handle other exceptions if needed
540 return false;
541 }
542 return false;
543 }
544
545
546 /**
547 * Make Object Public
548 * @since 1.0.0
549 *
550 */
551 public function toPublic($key) {
552 if(!$key) return false;
553
554 try {
555 $object = $this->bucket->object($key);
556 if ($object->exists()) {
557 $object->update(['acl' => []], ['predefinedAcl' => 'publicRead']);
558 return true;
559 }
560 return false;
561 } catch (ServiceException $e) {
562 // Handle exception if needed
563 return false;
564 } catch (Exception $e) {
565 // Handle other exceptions if needed
566 return false;
567 }
568 }
569
570
571 /**
572 * Check the object exist
573 * @since 1.1.8
574 */
575 public function exists($key) {
576 if(!$key) return false;
577
578 try {
579 $object = $this->bucket->object($key);
580 if ($object->exists()) {
581 return true;
582 } else {
583 return false;
584 }
585 } catch (ServiceException $e) {
586 // Handle exception if needed
587 return false;
588 } catch (Exception $e) {
589 // Handle other exceptions if needed
590 return false;
591 }
592
593 return false;
594 }
595
596
597 /**
598 * Upload Single
599 * @since 1.0.0
600 * @return boolean
601 */
602 public function uploadSingle($media_absolute_path, $media_path, $prefix=''){
603 $result = array();
604 if (
605 isset($media_absolute_path) && !empty($media_absolute_path) &&
606 isset($media_path) && !empty($media_path)
607 ) {
608 $file_name = wp_basename( $media_path );
609 if ($file_name) {
610 $upload_path = Utils::generate_object_key($media_path, $prefix);
611
612 // Decide Multipart upload or normal put object
613 if (filesize($media_absolute_path) <= Schema::getConstant('GCLOUD_MULTIPART_MIN_FILE_SIZE')) {
614 // Upload a publicly accessible file. The file size and type are determined by the SDK.
615 try {
616
617 $upload = $this->bucket->upload(
618 fopen($media_absolute_path, 'r'),
619 [
620 'name' => $upload_path,
621 ]
622 );
623
624 $object = $this->bucket->object($upload_path);
625
626 if ($object->exists()) {
627 $result = array(
628 'success' => true,
629 'code' => 200,
630 'file_url' => $this->generate_file_url($upload_path),
631 'key' => $upload_path,
632 'message' => esc_html__('File Uploaded Successfully', 'media-cloud-sync'),
633 );
634 } else {
635 $result = array(
636 'success' => false,
637 'code' => 200,
638 'message' => esc_html__('Object not found at server.', 'media-cloud-sync'),
639 );
640 }
641 } catch (Exception $e) {
642 $result = array(
643 'success' => false,
644 'code' => 200,
645 'message' => $e->getMessage(),
646 );
647 }
648 } else {
649 try {
650 $upload = $this->bucket->upload(
651 fopen($media_absolute_path, 'r'),
652 [
653 'name' => $upload_path,
654 'chunkSize' => 262144 * 2,
655 ]
656 );
657
658 $object = $this->bucket->object($upload_path);
659
660 if ($object->exists()) {
661 $result = array(
662 'success' => true,
663 'code' => 200,
664 'file_url' => $this->generate_file_url($upload_path),
665 'key' => $upload_path,
666 'message' => esc_html__('File Uploaded Successfully', 'media-cloud-sync'),
667 );
668 } else {
669 $result = array(
670 'success' => false,
671 'code' => 200,
672 'message' => esc_html__('Something happened while uploading to server', 'media-cloud-sync'),
673 );
674 }
675 } catch (Exception $e) {
676 $result = array(
677 'success' => false,
678 'code' => 200,
679 'message' => $e->getMessage(),
680 );
681 }
682 }
683 } else {
684 $result = array(
685 'success' => false,
686 'code' => 200,
687 'message' => esc_html__('Check the file you are trying to upload. Please try again', 'media-cloud-sync'),
688 );
689 }
690 } else {
691 $result = array(
692 'success' => false,
693 'code' => 200,
694 'message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'),
695 );
696 }
697 return $result;
698 }
699
700
701 /**
702 * Save object to server
703 * @since 1.0.0
704 */
705 public function object_to_server($key, $save_path){
706 try {
707 $object = $this->bucket->object($key);
708 if ($object->exists()) {
709 $object->downloadToFile($save_path);
710 if (file_exists($save_path)) {
711 return true;
712 }
713 }
714 } catch (Exception $e) {
715 return false;
716 }
717 return false;
718 }
719
720
721 /**
722 * Delete Single
723 * @since 1.0.0
724 * @return boolean
725 */
726 public function deleteSingle($key){
727 $result = array();
728 if (isset($key) && !empty($key)) {
729 try {
730 $object = $this->bucket->object($key);
731 $object->delete();
732
733 if (!$object->exists()) {
734 $result = array(
735 'success' => true,
736 'code' => 200,
737 'message' => esc_html__('Deleted Successfully', 'media-cloud-sync'),
738 );
739 } else {
740 $result = array(
741 'success' => false,
742 'code' => 200,
743 'message' => esc_html__('File not deleted', 'media-cloud-sync'),
744 );
745 }
746 } catch (Exception $e) {
747 $result = array(
748 'success' => false,
749 'code' => 200,
750 'message' => $e->getMessage(),
751 );
752 }
753 } else {
754 $result = array(
755 'success' => false,
756 'code' => 200,
757 'message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'),
758 );
759 }
760 return $result;
761 }
762
763
764 /**
765 * get presigned URL
766 * @since 1.0.0
767 * @return boolean
768 */
769 public function get_presigned_url($key) {
770 $result = array();
771 if (isset($key) && !empty($key)) {
772 try {
773 $object = $this->bucket->object($key);
774
775 $expires = isset($this->settings['presigned_expire']) ? $this->settings['presigned_expire'] : 20;
776
777 $presignedUrl = $object->signedUrl(new \DateTime(sprintf('+%s minutes', $expires)));
778
779 if ($presignedUrl) {
780 $result = array(
781 'success' => true,
782 'code' => 200,
783 'file_url' => $presignedUrl,
784 'message' => esc_html__('Got Presigned URL Successfully', 'media-cloud-sync'),
785 );
786 } else {
787 $result = array(
788 'success' => false,
789 'code' => 200,
790 'message' => esc_html__('Error getting presigned URL', 'media-cloud-sync'),
791 );
792 }
793 } catch (Exception $e) {
794 $result = array(
795 'success' => false,
796 'code' => 200,
797 'message' => $e->getMessage(),
798 );
799 }
800 } else {
801 $result = array(
802 'success' => false,
803 'code' => 200,
804 'message' => esc_html__('Insufficient Data. Please try again', 'media-cloud-sync'),
805 );
806 }
807 return $result;
808 }
809
810
811 /**
812 * Generate file URL
813 */
814 private function generate_file_url($key){
815 $domain = $this->get_domain();
816
817 return apply_filters('wpmcs_generate_google_file_url',
818 $domain . '/' . $this->bucket_name . '/' . $key,
819 $domain, $key,
820 $this->bucket_name
821 );
822 }
823
824
825 /**
826 * Get domain URL
827 */
828 public function get_domain() {
829 $url_base = 'https://storage.googleapis.com';
830
831 return $url_base;
832 }
833 }