| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 | <?phpnamespace Aws\S3\Crypto;use Aws\Crypto\AbstractCryptoClient;use Aws\Crypto\EncryptionTrait;use Aws\Crypto\MetadataEnvelope;use Aws\Crypto\Cipher\CipherBuilderTrait;use Aws\S3\MultipartUploader;use Aws\S3\S3ClientInterface;use GuzzleHttp\Promise;/** * Encapsulates the execution of a multipart upload of an encrypted object to S3. * * Legacy implementation using older encryption workflow. Use * S3EncryptionMultipartUploaderV2 if possible. * * @deprecated */class S3EncryptionMultipartUploader extends MultipartUploader{    use CipherBuilderTrait;    use CryptoParamsTrait;    use EncryptionTrait;    use UserAgentTrait;    const CRYPTO_VERSION = '1n';    /**     * Returns if the passed cipher name is supported for encryption by the SDK.     *     * @param string $cipherName The name of a cipher to verify is registered.     *     * @return bool If the cipher passed is in our supported list.     */    public static function isSupportedCipher($cipherName)    {        return in_array($cipherName, AbstractCryptoClient::$supportedCiphers);    }    private $provider;    private $instructionFileSuffix;    private $strategy;    /**     * Creates a multipart upload for an S3 object after encrypting it.     *     * The required configuration options are as follows:     *     * - @MaterialsProvider: (MaterialsProvider) Provides Cek, Iv, and Cek     *   encrypting/decrypting for encryption metadata.     * - @CipherOptions: (array) Cipher options for encrypting data. A Cipher     *   is required. Accepts the following options:     *       - Cipher: (string) cbc|gcm     *            See also: AbstractCryptoClient::$supportedCiphers. Note that     *            cbc is deprecated and gcm should be used when possible.     *       - KeySize: (int) 128|192|256     *            See also: MaterialsProvider::$supportedKeySizes     *       - Aad: (string) Additional authentication data. This option is     *            passed directly to OpenSSL when using gcm. It is ignored when     *            using cbc.     * - bucket: (string) Name of the bucket to which the object is     *   being uploaded.     * - key: (string) Key to use for the object being uploaded.     *     * The optional configuration arguments are as follows:     *     * - @MetadataStrategy: (MetadataStrategy|string|null) Strategy for storing     *   MetadataEnvelope information. Defaults to using a     *   HeadersMetadataStrategy. Can either be a class implementing     *   MetadataStrategy, a class name of a predefined strategy, or empty/null     *   to default.     * - @InstructionFileSuffix: (string|null) Suffix used when writing to an     *   instruction file if an using an InstructionFileMetadataHandler was     *   determined.     * - acl: (string) ACL to set on the object being upload. Objects are     *   private by default.     * - before_complete: (callable) Callback to invoke before the     *   `CompleteMultipartUpload` operation. The callback should have a     *   function signature like `function (Aws\Command $command) {...}`.     * - before_initiate: (callable) Callback to invoke before the     *   `CreateMultipartUpload` operation. The callback should have a function     *   signature like `function (Aws\Command $command) {...}`.     * - before_upload: (callable) Callback to invoke before any `UploadPart`     *   operations. The callback should have a function signature like     *   `function (Aws\Command $command) {...}`.     * - concurrency: (int, default=int(5)) Maximum number of concurrent     *   `UploadPart` operations allowed during the multipart upload.     * - params: (array) An array of key/value parameters that will be applied     *   to each of the sub-commands run by the uploader as a base.     *   Auto-calculated options will override these parameters. If you need     *   more granularity over parameters to each sub-command, use the before_*     *   options detailed above to update the commands directly.     * - part_size: (int, default=int(5242880)) Part size, in bytes, to use when     *   doing a multipart upload. This must between 5 MB and 5 GB, inclusive.     * - state: (Aws\Multipart\UploadState) An object that represents the state     *   of the multipart upload and that is used to resume a previous upload.     *   When this option is provided, the `bucket`, `key`, and `part_size`     *   options are ignored.     *     * @param S3ClientInterface $client Client used for the upload.     * @param mixed             $source Source of the data to upload.     * @param array             $config Configuration used to perform the upload.     */    public function __construct(        S3ClientInterface $client,        $source,        array $config = []    ) {        $this->appendUserAgent($client, 'feat/s3-encrypt/' . self::CRYPTO_VERSION);        $this->client = $client;        $config['params'] = [];        if (!empty($config['bucket'])) {            $config['params']['Bucket'] = $config['bucket'];        }        if (!empty($config['key'])) {            $config['params']['Key'] = $config['key'];        }        $this->provider = $this->getMaterialsProvider($config);        unset($config['@MaterialsProvider']);        $this->instructionFileSuffix = $this->getInstructionFileSuffix($config);        unset($config['@InstructionFileSuffix']);        $this->strategy = $this->getMetadataStrategy(            $config,            $this->instructionFileSuffix        );        if ($this->strategy === null) {            $this->strategy = self::getDefaultStrategy();        }        unset($config['@MetadataStrategy']);        $config['prepare_data_source'] = $this->getEncryptingDataPreparer();        parent::__construct($client, $source, $config);    }    private static function getDefaultStrategy()    {        return new HeadersMetadataStrategy();    }    private function getEncryptingDataPreparer()    {        return function() {            // Defer encryption work until promise is executed            $envelope = new MetadataEnvelope();            list($this->source, $params) = Promise\Create::promiseFor($this->encrypt(                $this->source,                $this->config['@cipheroptions'] ?: [],                $this->provider,                $envelope            ))->then(                function ($bodyStream) use ($envelope) {                    $params = $this->strategy->save(                        $envelope,                        $this->config['params']                    );                    return [$bodyStream, $params];                }            )->wait();            $this->source->rewind();            $this->config['params'] = $params;        };    }}
 |