Current Directory: /home/astoriaah/www/old15/administrator/components/com_akeeba/engine/Postproc
Viewing File: /home/astoriaah/www/old15/administrator/components/com_akeeba/engine/Postproc/S3.php
<?php
/**
* Akeeba Engine
* The modular PHP5 site backup engine
*
* @copyright Copyright (c)2006-2015 Nicholas K. Dionysopoulos
* @license GNU GPL version 3 or, at your option, any later version
* @package akeebaengine
*
*/
namespace Akeeba\Engine\Postproc;
// Protection against direct access
defined('AKEEBAENGINE') or die();
use Psr\Log\LogLevel;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Postproc\Connector\Amazons3 as ConnectorAmazons3;
class S3 extends Base
{
public $cache = null;
public function __construct()
{
$this->can_delete = true;
$this->can_download_to_browser = true;
$this->can_download_to_file = true;
}
public function processPart($absolute_filename, $upload_as = null)
{
// Retrieve engine configuration data
$config = Factory::getConfiguration();
$accesskey = trim($config->get('engine.postproc.s3.accesskey', ''));
$secret = trim($config->get('engine.postproc.s3.secretkey', ''));
$usessl = $config->get('engine.postproc.s3.usessl', 0) == 0 ? false : true;
$bucket = $config->get('engine.postproc.s3.bucket', '');
$directory = $config->get('volatile.postproc.directory', null);
$lowercase = $config->get('engine.postproc.s3.lowercase', 1);
$rrs = $config->get('engine.postproc.s3.rrs', 1);
$endpoint = $config->get('engine.postproc.s3.customendpoint', '');
if (empty($directory))
{
$directory = $config->get('engine.postproc.s3.directory', 0);
}
if (!empty($directory))
{
$directory = str_replace('\\', '/', $directory);
$directory = rtrim($directory, '/');
}
$endpoint = trim($endpoint);
if (!empty($endpoint))
{
$protoPos = strpos($endpoint, ':\\');
if ($protoPos !== false)
{
$endpoint = substr($endpoint, $protoPos + 3);
}
$slashPos = strpos($endpoint, '/');
if ($slashPos !== false)
{
$endpoint = substr($endpoint, $slashPos + 1);
}
}
// Sanity checks
if (empty($accesskey))
{
$this->setError('You have not set up your Amazon S3 Access Key');
return false;
}
if (empty($secret))
{
$this->setError('You have not set up your Amazon S3 Secret Key');
return false;
}
if(!function_exists('curl_init'))
{
$this->setWarning('cURL is not enabled, please enable it in order to post-process your archives');
return false;
}
if (empty($bucket))
{
$this->setError('You have not set up your Amazon S3 Bucket');
return false;
}
else
{
// Remove any slashes from the bucket
$bucket = str_replace('/', '', $bucket);
if ($lowercase)
{
$bucket = strtolower($bucket);
}
}
// Create an S3 instance with the required credentials
$s3 = ConnectorAmazons3::getInstance($accesskey, $secret, $usessl);
if (!empty($endpoint))
{
$s3->defaultHost = $endpoint;
}
// Fix the directory name, if required
if (!empty($directory))
{
$directory = trim($directory);
$directory = ltrim(Factory::getFilesystemTools()->TranslateWinPath($directory), '/');
}
else
{
$directory = '';
}
// Parse tags
$directory = Factory::getFilesystemTools()->replace_archive_name_variables($directory);
$config->set('volatile.postproc.directory', $directory);
// Calculate relative remote filename
$filename = empty($upload_as) ? basename($absolute_filename) : $upload_as;
if (!empty($directory) && ($directory != '/'))
{
$filename = $directory . '/' . $filename;
}
// Store the absolute remote path in the class property
$this->remote_path = $filename;
// Do we have to upload in one go or do a multipart upload instead?
Factory::getLog()->log(LogLevel::DEBUG, "S3 -- Single part upload of " . basename($absolute_filename));
// Legacy single part uploads
$result = $s3->putObject(
ConnectorAmazons3::inputFile($absolute_filename, false), // File to read from
$bucket, // Bucket name
$filename, // Remote relative filename, including directory
ConnectorAmazons3::ACL_BUCKET_OWNER_FULL_CONTROL, // ACL (bucket owner has full control, file owner gets full control)
array(), // Meta headers
// Other request headers
array(
// Amazon storage class (support for RRS - Reduced Redundancy Storage)
'x-amz-storage-class' => $rrs ? 'REDUCED_REDUNDANCY' : 'STANDARD'
)
);
// Return the result
$this->propagateFromObject($s3);
return $result;
}
/**
* Implements object deletion
*/
public function delete($path)
{
// Retrieve engine configuration data
$config = Factory::getConfiguration();
$accesskey = trim($config->get('engine.postproc.s3.accesskey', ''));
$secret = trim($config->get('engine.postproc.s3.secretkey', ''));
$usessl = $config->get('engine.postproc.s3.usessl', 0) == 0 ? false : true;
$bucket = $config->get('engine.postproc.s3.bucket', '');
$lowercase = $config->get('engine.postproc.s3.lowercase', 1);
$endpoint = $config->get('engine.postproc.s3.customendpoint', '');
$endpoint = trim($endpoint);
if (!empty($endpoint))
{
$protoPos = strpos($endpoint, ':\\');
if ($protoPos !== false)
{
$endpoint = substr($endpoint, $protoPos + 3);
}
$slashPos = strpos($endpoint, '/');
if ($slashPos !== false)
{
$endpoint = substr($endpoint, $slashPos + 1);
}
}
// Sanity checks
if (empty($accesskey))
{
$this->setError('You have not set up your Amazon S3 Access Key');
return false;
}
if (empty($secret))
{
$this->setError('You have not set up your Amazon S3 Secret Key');
return false;
}
if (empty($bucket))
{
$this->setError('You have not set up your Amazon S3 Bucket');
return false;
}
else
{
// Remove any slashes from the bucket
$bucket = str_replace('/', '', $bucket);
if ($lowercase)
{
$bucket = strtolower($bucket);
}
}
// Create an S3 instance with the required credentials
$s3 = ConnectorAmazons3::getInstance($accesskey, $secret, $usessl);
if (!empty($endpoint))
{
$s3->defaultHost = $endpoint;
}
// Delete the file
$result = $s3->deleteObject($bucket, $path);
// Return the result
$this->propagateFromObject($s3);
return $result;
}
public function downloadToFile($remotePath, $localFile, $fromOffset = null, $length = null)
{
// Retrieve engine configuration data
$config = Factory::getConfiguration();
$accesskey = trim($config->get('engine.postproc.s3.accesskey', ''));
$secret = trim($config->get('engine.postproc.s3.secretkey', ''));
$usessl = $config->get('engine.postproc.s3.usessl', 0) == 0 ? false : true;
$bucket = $config->get('engine.postproc.s3.bucket', '');
$lowercase = $config->get('engine.postproc.s3.lowercase', 1);
$rrs = $config->get('engine.postproc.s3.rrs', 1);
$endpoint = $config->get('engine.postproc.s3.customendpoint', '');
$endpoint = trim($endpoint);
if (!empty($endpoint))
{
$protoPos = strpos($endpoint, ':\\');
if ($protoPos !== false)
{
$endpoint = substr($endpoint, $protoPos + 3);
}
$slashPos = strpos($endpoint, '/');
if ($slashPos !== false)
{
$endpoint = substr($endpoint, $slashPos + 1);
}
}
// Sanity checks
if (empty($accesskey))
{
$this->setError('You have not set up your Amazon S3 Access Key');
return false;
}
if (empty($secret))
{
$this->setError('You have not set up your Amazon S3 Secret Key');
return false;
}
if (empty($bucket))
{
$this->setError('You have not set up your Amazon S3 Bucket');
return false;
}
else
{
// Remove any slashes from the bucket
$bucket = str_replace('/', '', $bucket);
if ($lowercase)
{
$bucket = strtolower($bucket);
}
}
// Create an S3 instance with the required credentials
$s3 = ConnectorAmazons3::getInstance($accesskey, $secret, $usessl);
if (!empty($endpoint))
{
$s3->defaultHost = $endpoint;
}
if ($fromOffset && $length)
{
$toOffset = $fromOffset + $length - 1;
}
else
{
$toOffset = null;
}
$result = $s3->getObject($bucket, $remotePath, $localFile, $fromOffset, $toOffset);
// Return the result
$this->propagateFromObject($s3);
return $result;
}
public function downloadToBrowser($remotePath)
{
// Retrieve engine configuration data
$config = Factory::getConfiguration();
$accesskey = trim($config->get('engine.postproc.s3.accesskey', ''));
$secret = trim($config->get('engine.postproc.s3.secretkey', ''));
$usessl = $config->get('engine.postproc.s3.usessl', 0) == 0 ? false : true;
$bucket = $config->get('engine.postproc.s3.bucket', '');
$lowercase = $config->get('engine.postproc.s3.lowercase', 1);
$rrs = $config->get('engine.postproc.s3.rrs', 1);
$endpoint = $config->get('engine.postproc.s3.customendpoint', '');
$endpoint = trim($endpoint);
if (!empty($endpoint))
{
$protoPos = strpos($endpoint, ':\\');
if ($protoPos !== false)
{
$endpoint = substr($endpoint, $protoPos + 3);
}
$slashPos = strpos($endpoint, '/');
if ($slashPos !== false)
{
$endpoint = substr($endpoint, $slashPos + 1);
}
}
// Sanity checks
if (empty($accesskey))
{
$this->setError('You have not set up your Amazon S3 Access Key');
return false;
}
if (empty($secret))
{
$this->setError('You have not set up your Amazon S3 Secret Key');
return false;
}
if (empty($bucket))
{
$this->setError('You have not set up your Amazon S3 Bucket');
return false;
}
else
{
// Remove any slashes from the bucket
$bucket = str_replace('/', '', $bucket);
if ($lowercase)
{
$bucket = strtolower($bucket);
}
}
// Create an S3 instance with the required credentials
$s3 = ConnectorAmazons3::getInstance($accesskey, $secret, $usessl);
if (!empty($endpoint))
{
$s3->defaultHost = $endpoint;
}
$expires = time() + 10; // Should be plenty of time for a simple redirection!
$stringToSign = "GET\n\n\n$expires\n/$bucket/$remotePath";
$signature = ConnectorAmazons3::__getHash($stringToSign);
$url = $usessl ? 'https://' : 'http://';
$url .= "$bucket.s3.amazonaws.com/$remotePath?AWSAccessKeyId=" . urlencode($accesskey) . "&Expires=$expires&Signature=" . urlencode($signature);
return $url;
}
}