HEX
Server: nginx/1.27.1
System: Linux in-4 5.15.0-131-generic #141-Ubuntu SMP Fri Jan 10 21:18:28 UTC 2025 x86_64
User: ilikadirect (1186)
PHP: 7.4.33
Disabled: exec,passthru,shell_exec,system,proc_open,popen,parse_ini_file,show_source
Upload Files
File: /storage/v6964/duplicatefoodfactor/public_html/wp-content/plugins/wp-time-capsule/S3/class.s3.php
<?php

use AwsWPTC\S3\S3Client;

#[AllowDynamicProperties]
class WPTC_S3{

	private $s3_client,
			$bucket_name,
			$site_url,
			$config,
			$cached_lifecycle_revision_days,
			$bucket_region;

	public function __construct(){
		$this->config  		 = WPTC_Factory::get('config');
		$this->site_url      = $this->config->get_cloud_root_dir();
	}

	public function init_connection($credentials, $bucket_name){

		$this->bucket_name 	 = $bucket_name;
		$this->bucket_region = $credentials['region'];
		
		if (!empty($this->bucket_region)) {
			$credentials['signature'] = 'v4';
		}

		try {
			$this->s3_client = new S3Client($credentials);
		} catch (Exception $e) {
			wptc_log($e->getMessage(),'-----------$e->getMessage()---init_connection-------------');
			return array( 'error' => $e->getMessage() );
		}
	}

	public function force_init($s3_client, $bucket_name, $region){
		$this->s3_client 	 = $s3_client;
		$this->bucket_name 	 = $bucket_name;
		$this->bucket_region = $region;
	}

	public function is_bucket_exist(){
		wptc_log(func_get_args(), "--------" . __FUNCTION__ . "--------");
		try{

			wptc_log($this->bucket_name,'-----------$this->bucket_name----------------');

			$headBucket = $this->s3_client->headBucket(array(
				'Bucket' => $this->bucket_name,
			));

			wptc_log($headBucket,'-----------$headBucket----------------');

		} catch (Exception $e) {

			$err_msg = $e->getMessage();


			wptc_log($err_msg,'-----------$err_msg----------------');

			if (empty($err_msg)) {
				return array('error' => 'Cannot access bucket.' );
			}

			if (stristr($err_msg, '404 Not Found')) {
				return false;
			}

			return array('error' => $err_msg );
		}

		return true;
	}

	public function is_object_exist($key){
		try{

			$headObject = $this->s3_client->headObject(array(
				'Bucket' => $this->bucket_name,
				'Key' => $key,
			));

			wptc_log($headObject,'-----------$headObject----------------');

		} catch (Exception $e) {

			$err_msg = $e->getMessage();


			wptc_log($err_msg,'-----------$err_msg-------headObject---------');

			if (empty($err_msg)) {
				return array('error' => 'Cannot access bucket.' );
			}

			if (stristr($err_msg, '404 Not Found')) {
				return false;
			}

			return array('error' => $err_msg );
		}

		return true;
	}

	public function enable_versioning(){
		try{
			$response = $this->s3_client->putBucketVersioning(
				array(
					'Bucket' => $this->bucket_name,
					// 'Status' => 'Enabled',
					'VersioningConfiguration' => [
						'MFADelete' => 'Disabled',
						'Status' => 'Enabled',
					],
				)
			);
			wptc_log($response,'-----------$response enable_versioning----------------');
		} catch (Exception $e) {
			$err_msg = $e->getMessage();

			if (empty($err_msg)) {
				return array('error' => 'Failed to enable versioning' );
			}

			return array('error' => $err_msg );
		}

		return true;
	}

	public function get_bucket_lifecycle(){
		wptc_log(func_get_args(), "--------" . __FUNCTION__ . "--------");

		try{

			$response = $this->s3_client->getBucketLifecycleConfiguration(array(
				'Bucket' =>  $this->bucket_name,
			));

			// wptc_log($response,'-----------$response----------------');
		} catch (Exception $e) {

			$err_msg = $e->getMessage();

			wptc_log($err_msg,'-----------$err_msg----------------');

			if (empty($err_msg)) {
				return array('error' => 'Failed to get lifecycle' );
			}

			return array();

			// if ($err_msg === 'The lifecycle configuration does not exist') {
			// 	return array();
			// }

			// return array('error' => $err_msg );
		}

		return $response;
	}

	public function upsert_site_life_cycle($revision_days = false){

		wptc_log('', 'Trying to upsert life cycle rules');

		// return true;

		if (!$revision_days) {
			// Validate
			$response = $this->is_site_life_cycle_present();

			if (isset($response['error'])) {
				return $response;
			}
		}

		$existing_rules = $this->get_existing_life_cycle_rules();
		$new_rule       = $this->get_this_site_rule($revision_days);

		$this->merge_rules($existing_rules, $new_rule);

		$new_rules = [];
		$new_rules['Bucket'] = $this->bucket_name;
		$new_rules['LifecycleConfiguration'] = [];
		$new_rules['LifecycleConfiguration']['Rules']  = $existing_rules;

		wptc_log($new_rules,'-----------$new_rules----------------');

		// return true;

		try{
			$response = $this->s3_client->putBucketLifecycleConfiguration($new_rules);

			do_action('set_revision_limit_wptc', $this->cached_lifecycle_revision_days);

			wptc_log($response,'-----------$response----------------');

			return $response;

		} catch (Exception $e) {

			$err_msg = $e->getMessage();

			wptc_log($err_msg,'-----------$err_msg----------------');

			if (empty($err_msg)) {
				return array('error' => 'Failed to upsert lifecycle.' );
			}

			return array('error' => $err_msg );
		}
	}

	private function get_this_site_rule($revision_days){

		$revision_days = empty($revision_days) ? $this->config->get_option('eligible_revision_limit') : $revision_days;

		$this->cached_lifecycle_revision_days = $revision_days;

		return array(
			'ID'     => $this->site_url,
			'Status' => 'Enabled',
			//Not  required in new version of SDK so overided SDK schema to support empty string.
			'Prefix' => 'wp-time-capsule/' . $this->site_url . '/',
			'NoncurrentVersionExpiration' => array(
				'NoncurrentDays' => $revision_days,
			),
			//Supports available for AbortIncompleteMultipartUpload only after < 3.0 SDK so overrided SDK schema.
			'AbortIncompleteMultipartUpload' => array(
				'DaysAfterInitiation' => '5',
	        ),
		);
	}

	private function merge_rules(&$existing_rules, $new_rule){

		if ( empty($existing_rules) || is_string($existing_rules) ) {
			$existing_rules = array();
			return $existing_rules[] = $new_rule;
		}

		foreach ($existing_rules as $key => $rule) {
			if ($rule['ID'] === 'WPTC') {
				unset($existing_rules[$key]);
			}
			if ($rule['ID'] === $this->site_url) {
				$existing_rules[$key] = $new_rule;
				return;
			}
		}

		$existing_rules[] = $new_rule;
	}

	public function is_site_life_cycle_present($return = false){

		$site_rule = $this->get_existing_life_cycle_rules($this_site_only = true);

		if(!empty($site_rule) && $site_rule['Status'] !== 'Enabled' ){
			return false;
		}

		if(empty($site_rule['NoncurrentVersionExpiration']['NoncurrentDays'])){
			return false;
		}

		return ($return) ? $site_rule['NoncurrentVersionExpiration']['NoncurrentDays'] : true;
	}

	public function get_existing_life_cycle_rules($this_site_only = false){
		$response  = $this->get_bucket_lifecycle();

		if (empty($response)) {
			return array();
		}

		if (!empty($response['error'])) {
			return $response['error'];
		}

		$rules = $response->get('Rules');

		// wptc_log($rules,'-----------$rules----------------');

		if (empty($rules)) {
			return array();
		}

		if (!$this_site_only) {
			return $rules;
		}

		$site_rule = array();

		foreach ($rules as $key => $rule) {
			if ($rule['ID'] === $this->site_url) {
				$site_rule = $rule;
				break;
			}
		}

		if (empty($site_rule)) {
			return array();
		}

		return $site_rule;
	}

	public function create_verification_file(){
		try {
			$response = $this->s3_client->putObject(array(
				'Body' => '',
				'Bucket' => $this->bucket_name,
				'Key' => 'wp-time-capsule/' .  $this->site_url . '/' . WPTC_S3_VERIFICATION_FILE,
			));

			$response = wptc_get_result_array_s3($response);
			wptc_log($response,'-----------$response createVerificationFile----------------');

			return $response;
		} catch (Exception $e) {

			$err_msg = $e->getMessage();

			if (empty($err_msg)) {
				return array('error' => 'Failed to create Backup Storage Space in cloud' );
			}

			return array('error' => $err_msg );
		}
	}

	public function create_bucket(){

		$response = $this->is_bucket_exist();

		wptc_log($response,'-----------$response----------------');

		if(!empty($response['error'])){
			return $response;
		}

		if ($response) {
			return true;
		}

		try{



			$config = array(
				'Bucket'  			 => $this->bucket_name,
			);

			if ($this->bucket_region !== 'us-east-1') {
				$config['LocationConstraint'] = $this->bucket_region ;
			}

			wptc_log($config,'-----------$config----------------');

			$response =  $this->s3_client->createBucket($config);
			wptc_log($response,'-----------$response----------------');
		} catch (Exception $e) {

			$err_msg = $e->getMessage();

			if (empty($err_msg)) {
				return array('error' => 'Failed to create bucket' );
			}

			$neat_err_msg = $e->getAwsErrorMessage();

			wptc_log($neat_err_msg,'-----------$neat_err_msg----------------');

			if(!empty($neat_err_msg)){
				
				return array('error' => $neat_err_msg );
			}
			

			return array('error' => $err_msg );
		}
	}

	public function delete_all_lifecycles(){
		try {
			$response = $this->s3_client->deleteBucketLifecycle(array(
				'Bucket' => $this->bucket_name,
			));

			return $response;
		} catch (Exception $e) {

			$err_msg = $e->getMessage();

			if (empty($err_msg)) {
				return array('error' => 'Failed to delete all lifecycles' );
			}

			return array('error' => $err_msg );
		}
	}
}