| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | <?phpnamespace Aws\S3\Crypto;use \Aws\Crypto\MetadataStrategyInterface;use \Aws\Crypto\MetadataEnvelope;use \Aws\S3\S3Client;/** * Stores and reads encryption MetadataEnvelope information in a file on Amazon * S3. * * A file with the contents of a MetadataEnvelope will be created or read from * alongside the base file on Amazon S3. The provided client will be used for * reading or writing this object. A specified suffix (default of '.instruction' * will be applied to each of the operations involved with the instruction file. * * If there is a failure after an instruction file has been uploaded, it will * not be automatically deleted. */class InstructionFileMetadataStrategy implements MetadataStrategyInterface{    const DEFAULT_FILE_SUFFIX = '.instruction';    private $client;    private $suffix;    /**     * @param S3Client $client Client for use in uploading the instruction file.     * @param string|null $suffix Optional override suffix for instruction file     *                            object keys.     */    public function __construct(S3Client $client, $suffix = null)    {        $this->suffix = empty($suffix)            ? self::DEFAULT_FILE_SUFFIX            : $suffix;        $this->client = $client;    }    /**     * Places the information in the MetadataEnvelope to a location on S3.     *     * @param MetadataEnvelope $envelope Encryption data to save according to     *                                   the strategy.     * @param array $args Starting arguments for PutObject, used for saving     *                    extra the instruction file.     *     * @return array Updated arguments for PutObject.     */    public function save(MetadataEnvelope $envelope, array $args)    {        $this->client->putObject([            'Bucket' => $args['Bucket'],            'Key' => $args['Key'] . $this->suffix,            'Body' => json_encode($envelope)        ]);        return $args;    }    /**     * Uses the strategy's client to retrieve the instruction file from S3 and generates     * a MetadataEnvelope from its contents.     *     * @param array $args Arguments from Command and Result that contains     *                    S3 Object information, relevant headers, and command     *                    configuration.     *     * @return MetadataEnvelope     */    public function load(array $args)    {        $result = $this->client->getObject([            'Bucket' => $args['Bucket'],            'Key' => $args['Key'] . $this->suffix        ]);        $metadataHeaders = json_decode($result['Body'], true);        $envelope = new MetadataEnvelope();        $constantValues = MetadataEnvelope::getConstantValues();        foreach ($constantValues as $constant) {            if (!empty($metadataHeaders[$constant])) {                $envelope[$constant] = $metadataHeaders[$constant];            }        }        return $envelope;    }}
 |