summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2016-08-08 15:50:15 +0200
committerRobin Appelman <robin@icewind.nl>2016-11-16 15:30:36 +0100
commiteefd0597166b26b85690fba784d843486badefef (patch)
treea5219f4337ead2e52edf749692e6cbf41d2d1e45 /lib/private
parent64e896cc0d9624718ec4e8753b6b58b242a7a2d5 (diff)
downloadnextcloud-server-eefd0597166b26b85690fba784d843486badefef.tar.gz
nextcloud-server-eefd0597166b26b85690fba784d843486badefef.zip
add amazon s3 objectstore backend
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/Files/ObjectStore/S3.php116
1 files changed, 116 insertions, 0 deletions
diff --git a/lib/private/Files/ObjectStore/S3.php b/lib/private/Files/ObjectStore/S3.php
new file mode 100644
index 00000000000..641c1722b58
--- /dev/null
+++ b/lib/private/Files/ObjectStore/S3.php
@@ -0,0 +1,116 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Files\ObjectStore;
+
+use Guzzle\Http\EntityBody;
+use Guzzle\Http\Message\RequestInterface;
+use Guzzle\Service\Command\CommandInterface;
+use Guzzle\Stream\PhpStreamRequestFactory;
+use Icewind\Streams\CallbackWrapper;
+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';
+
+class S3 implements IObjectStore {
+ use S3ConnectionTrait;
+
+ public function __construct($parameters) {
+ $this->parseParams($parameters);
+ }
+
+ /**
+ * @return string the container or bucket name where objects are stored
+ * @since 7.0.0
+ */
+ function getStorageId() {
+ return $this->id;
+ }
+
+ /**
+ * Serialize and sign a command, returning a request object
+ *
+ * @param CommandInterface $command Command to sign
+ *
+ * @return RequestInterface
+ */
+ protected function getSignedRequest($command) {
+ $request = $command->prepare();
+ $request->dispatch('request.before_send', array('request' => $request));
+
+ return $request;
+ }
+
+ /**
+ * @param string $urn the unified resource name used to identify the object
+ * @return resource stream with the read data
+ * @throws \Exception when something goes wrong, message will be logged
+ * @since 7.0.0
+ */
+ function readObject($urn) {
+ // Create the command and serialize the request
+ $request = $this->getSignedRequest($this->getConnection()->getCommand('GetObject', [
+ 'Bucket' => $this->bucket,
+ 'Key' => $urn
+ ]));
+ // Create a stream that uses the EntityBody object
+ $factory = new PhpStreamRequestFactory();
+ /** @var EntityBody $body */
+ $body = $factory->fromRequest($request, array(), array('stream_class' => 'Guzzle\Http\EntityBody'));
+ $stream = $body->getStream();
+
+ // we need to keep the guzzle request in scope untill the stream is closed
+ return CallbackWrapper::wrap($stream, null, null, function () use ($body) {
+ $body->close();
+ });
+ }
+
+ /**
+ * @param string $urn the unified resource name used to identify the object
+ * @param resource $stream stream with the data to write
+ * @throws \Exception when something goes wrong, message will be logged
+ * @since 7.0.0
+ */
+ function writeObject($urn, $stream) {
+ $this->getConnection()->putObject([
+ 'Bucket' => $this->bucket,
+ 'Key' => $urn,
+ 'Body' => $stream
+ ]);
+ }
+
+ /**
+ * @param string $urn the unified resource name used to identify the object
+ * @return void
+ * @throws \Exception when something goes wrong, message will be logged
+ * @since 7.0.0
+ */
+ function deleteObject($urn) {
+ $this->getConnection()->deleteObject([
+ 'Bucket' => $this->bucket,
+ 'Key' => $urn
+ ]);
+ }
+
+}