| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | <?phpnamespace Aws\S3;use Aws\CommandInterface;use Psr\Http\Message\RequestInterface;/** * Simplifies the SSE-C process by encoding and hashing the key. * @internal */class SSECMiddleware{    private $endpointScheme;    private $nextHandler;    /**     * Provide the URI scheme of the client sending requests.     *     * @param string $endpointScheme URI scheme (http/https).     *     * @return callable     */    public static function wrap($endpointScheme)    {        return function (callable $handler) use ($endpointScheme) {            return new self($endpointScheme, $handler);        };    }    public function __construct($endpointScheme, callable $nextHandler)    {        $this->nextHandler = $nextHandler;        $this->endpointScheme = $endpointScheme;    }    public function __invoke(        CommandInterface $command,        RequestInterface $request = null    ) {        // Allows only HTTPS connections when using SSE-C        if (($command['SSECustomerKey'] || $command['CopySourceSSECustomerKey'])            && $this->endpointScheme !== 'https'        ) {            throw new \RuntimeException('You must configure your S3 client to '                . 'use HTTPS in order to use the SSE-C features.');        }        // Prepare the normal SSE-CPK headers        if ($command['SSECustomerKey']) {            $this->prepareSseParams($command);        }        // If it's a copy operation, prepare the SSE-CPK headers for the source.        if ($command['CopySourceSSECustomerKey']) {            $this->prepareSseParams($command, 'CopySource');        }        $f = $this->nextHandler;        return $f($command, $request);    }    private function prepareSseParams(CommandInterface $command, $prefix = '')    {        // Base64 encode the provided key        $key = $command[$prefix . 'SSECustomerKey'];        $command[$prefix . 'SSECustomerKey'] = base64_encode($key);        // Base64 the provided MD5 or, generate an MD5 if not provided        if ($md5 = $command[$prefix . 'SSECustomerKeyMD5']) {            $command[$prefix . 'SSECustomerKeyMD5'] = base64_encode($md5);        } else {            $command[$prefix . 'SSECustomerKeyMD5'] = base64_encode(md5($key, true));        }    }}
 |