From dad18baec8274995ff384789ccc2577aabc6dde8 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 20 Apr 2017 17:08:22 +0200 Subject: [PATCH] update aws sdk and move it to 3rdparty Signed-off-by: Robin Appelman --- 3rdparty | 2 +- .../lib/Lib/Storage/AmazonS3.php | 36 ++++++++++-------- lib/private/Files/ObjectStore/S3.php | 38 +++++-------------- .../Files/ObjectStore/S3ConnectionTrait.php | 24 ++++++------ 4 files changed, 42 insertions(+), 58 deletions(-) diff --git a/3rdparty b/3rdparty index 2bae53c7cf..15c606831c 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 2bae53c7cfe022361de2cad6a9f2d6062aa30ca4 +Subproject commit 15c606831ca86d895facfb443ada73fdc163aeac diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php index 9dab25f719..edcc084ae4 100644 --- a/apps/files_external/lib/Lib/Storage/AmazonS3.php +++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php @@ -36,10 +36,6 @@ namespace OCA\Files_External\Lib\Storage; -set_include_path(get_include_path() . PATH_SEPARATOR . - \OC_App::getAppPath('files_external') . '/3rdparty/aws-sdk-php'); -require_once 'aws-autoloader.php'; - use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; use Icewind\Streams\CallbackWrapper; @@ -230,21 +226,29 @@ class AmazonS3 extends \OC\Files\Storage\Common { try { $files = array(); - $result = $this->getConnection()->getIterator('ListObjects', array( + $results = $this->getConnection()->getPaginator('ListObjects', [ 'Bucket' => $this->bucket, 'Delimiter' => '/', - 'Prefix' => $path - ), array('return_prefixes' => true)); + 'Prefix' => $path, + ]); - foreach ($result as $object) { - if (isset($object['Key']) && $object['Key'] === $path) { - // it's the directory itself, skip - continue; + foreach ($results as $result) { + // sub folders + if (is_array($result['CommonPrefixes'])) { + foreach ($result['CommonPrefixes'] as $prefix) { + $files[] = substr(trim($prefix['Prefix'], '/'), strlen($path)); + } + } + foreach ($result['Contents'] as $object) { + if (isset($object['Key']) && $object['Key'] === $path) { + // it's the directory itself, skip + continue; + } + $file = basename( + isset($object['Key']) ? $object['Key'] : $object['Prefix'] + ); + $files[] = $file; } - $file = basename( - isset($object['Key']) ? $object['Key'] : $object['Prefix'] - ); - $files[] = $file; } return IteratorDirectory::wrap($files); @@ -270,7 +274,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { )); $stat['size'] = $result['ContentLength'] ? $result['ContentLength'] : 0; - if ($result['Metadata']['lastmodified']) { + if (isset($result['Metadata']['lastmodified'])) { $stat['mtime'] = strtotime($result['Metadata']['lastmodified']); } else { $stat['mtime'] = strtotime($result['LastModified']); diff --git a/lib/private/Files/ObjectStore/S3.php b/lib/private/Files/ObjectStore/S3.php index 6f37492271..17caf1cb12 100644 --- a/lib/private/Files/ObjectStore/S3.php +++ b/lib/private/Files/ObjectStore/S3.php @@ -22,11 +22,7 @@ namespace OC\Files\ObjectStore; use OCP\Files\ObjectStore\IObjectStore; - -// TODO: proper composer -set_include_path(get_include_path() . PATH_SEPARATOR . - \OC_App::getAppPath('files_external') . '/3rdparty/aws-sdk-php'); -require_once 'aws-autoloader.php'; +use Psr\Http\Message\StreamInterface; class S3 implements IObjectStore { use S3ConnectionTrait; @@ -49,32 +45,18 @@ class S3 implements IObjectStore { * @throws \Exception when something goes wrong, message will be logged * @since 7.0.0 */ - public function readObject($urn) { - // Create the command and serialize the request - $request = $this->getConnection()->getCommand('GetObject', [ + function readObject($urn) { + $client = $this->getConnection(); + $command = $client->getCommand('GetObject', [ 'Bucket' => $this->bucket, 'Key' => $urn - ])->prepare(); + ]); + $command['@http']['stream'] = true; + $result = $client->execute($command); + /** @var StreamInterface $body */ + $body = $result['Body']; - $request->dispatch('request.before_send', array( - 'request' => $request - )); - - $headers = $request->getHeaderLines(); - $headers[] = 'Connection: close'; - - $opts = [ - 'http' => [ - 'method' => "GET", - 'header' => $headers - ], - 'ssl' => [ - 'verify_peer' => true - ] - ]; - - $context = stream_context_create($opts); - return fopen($request->getUrl(), 'r', false, $context); + return $body->detach(); } /** diff --git a/lib/private/Files/ObjectStore/S3ConnectionTrait.php b/lib/private/Files/ObjectStore/S3ConnectionTrait.php index a8b57cb18d..f665bc2e7c 100644 --- a/lib/private/Files/ObjectStore/S3ConnectionTrait.php +++ b/lib/private/Files/ObjectStore/S3ConnectionTrait.php @@ -53,7 +53,7 @@ trait S3ConnectionTrait { $this->bucket = $params['bucket']; $this->timeout = (!isset($params['timeout'])) ? 15 : $params['timeout']; $params['region'] = empty($params['region']) ? 'eu-west-1' : $params['region']; - $params['hostname'] = empty($params['hostname']) ? 's3.amazonaws.com' : $params['hostname']; + $params['hostname'] = empty($params['hostname']) ? 's3.' . $params['region'] . '.amazonaws.com' : $params['hostname']; if (!isset($params['port']) || $params['port'] === '') { $params['port'] = (isset($params['use_ssl']) && $params['use_ssl'] === false) ? 80 : 443; } @@ -76,20 +76,23 @@ trait S3ConnectionTrait { $base_url = $scheme . '://' . $this->params['hostname'] . ':' . $this->params['port'] . '/'; $options = [ - 'key' => $this->params['key'], - 'secret' => $this->params['secret'], - 'base_url' => $base_url, + 'version' => isset($this->params['version']) ? $this->params['version'] : 'latest', + 'credentials' => [ + 'key' => $this->params['key'], + 'secret' => $this->params['secret'], + ], + 'endpoint' => $base_url, 'region' => $this->params['region'], - S3Client::COMMAND_PARAMS => [ + 'command.params' => [ 'PathStyle' => isset($this->params['use_path_style']) ? $this->params['use_path_style'] : false, ] ]; if (isset($this->params['proxy'])) { - $options[S3Client::REQUEST_OPTIONS] = ['proxy' => $this->params['proxy']]; + $options['request.options'] = ['proxy' => $this->params['proxy']]; } - $this->connection = S3Client::factory($options); + $this->connection = new S3Client($options); - if (!$this->connection->isValidBucketName($this->bucket)) { + if (!S3Client::isBucketDnsCompatible($this->bucket)) { throw new \Exception("The configured bucket name is invalid."); } @@ -98,11 +101,6 @@ trait S3ConnectionTrait { $this->connection->createBucket(array( 'Bucket' => $this->bucket )); - $this->connection->waitUntilBucketExists(array( - 'Bucket' => $this->bucket, - 'waiter.interval' => 1, - 'waiter.max_attempts' => 15 - )); $this->testTimeout(); } catch (S3Exception $e) { \OCP\Util::logException('files_external', $e);