Changeset View
Changeset View
Standalone View
Standalone View
src/applications/files/engine/PhabricatorS3FileStorageEngine.php
| Show All 22 Lines | /* -( Engine Metadata )---------------------------------------------------- */ | ||||
| public function getEnginePriority() { | public function getEnginePriority() { | ||||
| return 100; | return 100; | ||||
| } | } | ||||
| public function canWriteFiles() { | public function canWriteFiles() { | ||||
| $bucket = PhabricatorEnv::getEnvConfig('storage.s3.bucket'); | $bucket = PhabricatorEnv::getEnvConfig('storage.s3.bucket'); | ||||
| $access_key = PhabricatorEnv::getEnvConfig('amazon-s3.access-key'); | $access_key = PhabricatorEnv::getEnvConfig('amazon-s3.access-key'); | ||||
| $secret_key = PhabricatorEnv::getEnvConfig('amazon-s3.secret-key'); | $secret_key = PhabricatorEnv::getEnvConfig('amazon-s3.secret-key'); | ||||
| $endpoint = PhabricatorEnv::getEnvConfig('amazon-s3.endpoint'); | |||||
| $region = PhabricatorEnv::getEnvConfig('amazon-s3.region'); | |||||
| return (strlen($bucket) && strlen($access_key) && strlen($secret_key)); | return (strlen($bucket) && | ||||
| strlen($access_key) && | |||||
| strlen($secret_key) && | |||||
| strlen($endpoint) && | |||||
| strlen($region)); | |||||
| } | } | ||||
| /* -( Managing File Data )------------------------------------------------- */ | /* -( Managing File Data )------------------------------------------------- */ | ||||
| /** | /** | ||||
| * Writes file data into Amazon S3. | * Writes file data into Amazon S3. | ||||
| Show All 22 Lines | public function writeFile($data, array $params) { | ||||
| AphrontWriteGuard::willWrite(); | AphrontWriteGuard::willWrite(); | ||||
| $profiler = PhutilServiceProfiler::getInstance(); | $profiler = PhutilServiceProfiler::getInstance(); | ||||
| $call_id = $profiler->beginServiceCall( | $call_id = $profiler->beginServiceCall( | ||||
| array( | array( | ||||
| 'type' => 's3', | 'type' => 's3', | ||||
| 'method' => 'putObject', | 'method' => 'putObject', | ||||
| )); | )); | ||||
| $s3->putObject( | |||||
| $data, | $s3 | ||||
| $this->getBucketName(), | ->setParametersForPutObject($name, $data) | ||||
| $name, | ->resolve(); | ||||
| $acl = 'private'); | |||||
| $profiler->endServiceCall($call_id, array()); | $profiler->endServiceCall($call_id, array()); | ||||
| return $name; | return $name; | ||||
| } | } | ||||
| /** | /** | ||||
| * Load a stored blob from Amazon S3. | * Load a stored blob from Amazon S3. | ||||
| */ | */ | ||||
| public function readFile($handle) { | public function readFile($handle) { | ||||
| $s3 = $this->newS3API(); | $s3 = $this->newS3API(); | ||||
| $profiler = PhutilServiceProfiler::getInstance(); | $profiler = PhutilServiceProfiler::getInstance(); | ||||
| $call_id = $profiler->beginServiceCall( | $call_id = $profiler->beginServiceCall( | ||||
| array( | array( | ||||
| 'type' => 's3', | 'type' => 's3', | ||||
| 'method' => 'getObject', | 'method' => 'getObject', | ||||
| )); | )); | ||||
| $result = $s3->getObject( | |||||
| $this->getBucketName(), | $result = $s3 | ||||
| $handle); | ->setParametersForGetObject($handle) | ||||
| ->resolve(); | |||||
| $profiler->endServiceCall($call_id, array()); | $profiler->endServiceCall($call_id, array()); | ||||
| // NOTE: The implementation of the API that we're using may respond with | return $result; | ||||
| // a successful result that has length 0 and no body property. | |||||
| if (isset($result->body)) { | |||||
| return $result->body; | |||||
| } else { | |||||
| return ''; | |||||
| } | |||||
| } | } | ||||
| /** | /** | ||||
| * Delete a blob from Amazon S3. | * Delete a blob from Amazon S3. | ||||
| */ | */ | ||||
| public function deleteFile($handle) { | public function deleteFile($handle) { | ||||
| AphrontWriteGuard::willWrite(); | |||||
| $s3 = $this->newS3API(); | $s3 = $this->newS3API(); | ||||
| AphrontWriteGuard::willWrite(); | |||||
| $profiler = PhutilServiceProfiler::getInstance(); | $profiler = PhutilServiceProfiler::getInstance(); | ||||
| $call_id = $profiler->beginServiceCall( | $call_id = $profiler->beginServiceCall( | ||||
| array( | array( | ||||
| 'type' => 's3', | 'type' => 's3', | ||||
| 'method' => 'deleteObject', | 'method' => 'deleteObject', | ||||
| )); | )); | ||||
| $s3->deleteObject( | |||||
| $this->getBucketName(), | $s3 | ||||
| $handle); | ->setParametersForDeleteObject($handle) | ||||
| ->resolve(); | |||||
| $profiler->endServiceCall($call_id, array()); | $profiler->endServiceCall($call_id, array()); | ||||
| } | } | ||||
| /* -( Internals )---------------------------------------------------------- */ | /* -( Internals )---------------------------------------------------------- */ | ||||
| /** | /** | ||||
| Show All 11 Lines | private function getBucketName() { | ||||
| } | } | ||||
| return $bucket; | return $bucket; | ||||
| } | } | ||||
| /** | /** | ||||
| * Create a new S3 API object. | * Create a new S3 API object. | ||||
| * | * | ||||
| * @task internal | * @task internal | ||||
| * @phutil-external-symbol class S3 | |||||
| */ | */ | ||||
| private function newS3API() { | private function newS3API() { | ||||
| $libroot = dirname(phutil_get_library_root('phabricator')); | |||||
| require_once $libroot.'/externals/s3/S3.php'; | |||||
| $access_key = PhabricatorEnv::getEnvConfig('amazon-s3.access-key'); | $access_key = PhabricatorEnv::getEnvConfig('amazon-s3.access-key'); | ||||
| $secret_key = PhabricatorEnv::getEnvConfig('amazon-s3.secret-key'); | $secret_key = PhabricatorEnv::getEnvConfig('amazon-s3.secret-key'); | ||||
| $region = PhabricatorEnv::getEnvConfig('amazon-s3.region'); | |||||
| $endpoint = PhabricatorEnv::getEnvConfig('amazon-s3.endpoint'); | $endpoint = PhabricatorEnv::getEnvConfig('amazon-s3.endpoint'); | ||||
| if (!$access_key || !$secret_key) { | return id(new PhutilAWSS3Future()) | ||||
| throw new PhabricatorFileStorageConfigurationException( | ->setAccessKey($access_key) | ||||
| pht( | ->setSecretKey(new PhutilOpaqueEnvelope($secret_key)) | ||||
| "Specify '%s' and '%s'!", | ->setRegion($region) | ||||
| 'amazon-s3.access-key', | ->setEndpoint($endpoint) | ||||
| 'amazon-s3.secret-key')); | ->setBucket($this->getBucketName()); | ||||
| } | |||||
| if ($endpoint !== null) { | |||||
| $s3 = new S3($access_key, $secret_key, $use_ssl = true, $endpoint); | |||||
| } else { | |||||
| $s3 = new S3($access_key, $secret_key, $use_ssl = true); | |||||
| } | |||||
| $s3->setExceptions(true); | |||||
| return $s3; | |||||
| } | } | ||||
| } | } | ||||