PluginProbe
Media Cloud Sync / 1.2.11
Media Cloud Sync v1.2.11
1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 All 34 releases
media-cloud-sync / includes / base / services / gcloud.php

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

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