client = $client; $this->tempUrlGenerator = $tempUrlGenerator; } public function read(StoredObject $document): string { try { $response = $this ->client ->request( Request::METHOD_GET, $this ->tempUrlGenerator ->generate( Request::METHOD_GET, $document->getFilename() ) ->url ); } catch (Throwable $e) { throw StoredObjectManagerException::errorDuringHttpRequest($e); } if ($response->getStatusCode() !== Response::HTTP_OK) { throw StoredObjectManagerException::invalidStatusCode($response->getStatusCode()); } try { $data = $response->getContent(); } catch (Throwable $e) { throw StoredObjectManagerException::unableToGetResponseContent($e); } if (false === $this->hasKeysAndIv($document)) { return $data; } $clearData = openssl_decrypt( $data, self::ALGORITHM, // TODO: Why using this library and not use base64_decode() ? Base64Url::decode($document->getKeyInfos()['k']), OPENSSL_RAW_DATA, pack('C*', ...$document->getIv()) ); if (false === $clearData) { throw StoredObjectManagerException::unableToDecrypt(openssl_error_string()); } return $clearData; } public function write(StoredObject $document, string $clearContent): void { $encryptedContent = $this->hasKeysAndIv($document) ? openssl_encrypt( $clearContent, self::ALGORITHM, // TODO: Why using this library and not use base64_decode() ? Base64Url::decode($document->getKeyInfos()['k']), OPENSSL_RAW_DATA, pack('C*', ...$document->getIv()) ) : $clearContent; try { $response = $this ->client ->request( Request::METHOD_PUT, $this ->tempUrlGenerator ->generate( Request::METHOD_PUT, $document->getFilename() ) ->url, [ 'body' => $encryptedContent, ] ); } catch (TransportExceptionInterface $exception) { throw StoredObjectManagerException::errorDuringHttpRequest($exception); } if ($response->getStatusCode() !== Response::HTTP_CREATED) { throw StoredObjectManagerException::invalidStatusCode($response->getStatusCode()); } } private function hasKeysAndIv(StoredObject $storedObject): bool { return ([] !== $storedObject->getKeyInfos()) && ([] !== $storedObject->getIv()); } }