getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $filesize = 25 * 1024 + 123; $filename = self::getTempFileName(); $this->generateFile($filename, $filesize); $content = file_get_contents($filename); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); // put object $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->contentMd5 = base64_encode(md5_file($filename, true)); $putObjRequest->contentLength = $filesize; $putObjRequest->body = Oss\Utils::streamFor($content); $result = $eclient->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); // undec content $unDecContent = $this->object_get_contents($client, $bucketName, $key); $this->assertEquals($filesize, strlen($unDecContent)); $this->assertNotEquals($content, $unDecContent); // get object $result = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key )); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertEquals($content, $result->body->getContents()); $this->assertEquals($filesize, $result->contentLength); $this->assertEquals(strval($filesize), $result->headers['Content-Length']); $this->assertNull($result->contentRange); foreach ([0, 1, 2, 3, 4, 5, 7, 16, 17, 32, 63, 64, 79] as $offset) { $request = new Oss\Models\GetObjectRequest( $bucketName, $key ); $request->rangeHeader = "bytes=$offset-"; $result = $eclient->getObject($request); $this->assertEquals(206, $result->statusCode); $this->assertEquals('Partial Content', $result->status); $this->assertEquals(substr($content, $offset), $result->body->getContents()); $this->assertEquals($filesize - $offset, $result->contentLength); $this->assertEquals(strval($filesize - $offset), $result->headers['Content-Length']); $contentRange = sprintf("bytes %d-%d/%d", $offset, $filesize - 1, $filesize); $this->assertEquals($contentRange, $result->contentRange); $this->assertEquals($contentRange, $result->headers['Content-Range']); } foreach ([0, 1, 2, 17, 32, 63, 79] as $offset) { $gotSize = 1234; $rangeEnd = $offset + $gotSize - 1; $request = new Oss\Models\GetObjectRequest( $bucketName, $key ); $request->rangeHeader = "bytes=$offset-$rangeEnd"; $result = $eclient->getObject($request); $this->assertEquals(206, $result->statusCode); $this->assertEquals('Partial Content', $result->status); $this->assertEquals(substr($content, $offset, $gotSize), $result->body->getContents()); $this->assertEquals($gotSize, $result->contentLength); $this->assertEquals(strval($gotSize), $result->headers['Content-Length']); $contentRange = sprintf("bytes %d-%d/%d", $offset, $rangeEnd, $filesize); $this->assertEquals($contentRange, $result->contentRange); $this->assertEquals($contentRange, $result->headers['Content-Range']); } } public function testPutAndGetObjectWithManyRsa() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $filesize = 25 * 1024 + 123; $filename = self::getTempFileName(); $this->generateFile($filename, $filesize); $content = file_get_contents($filename); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['demo1'] ); $masterCipher2 = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY1, self::RSA_PRIVATE_KEY1, ['demo2'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher2, [$masterCipher, $masterCipher2]); // put object $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->contentMd5 = base64_encode(md5_file($filename, true)); $putObjRequest->contentLength = $filesize; $putObjRequest->body = Oss\Utils::streamFor($content); $result = $eclient->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); // undec content $unDecContent = $this->object_get_contents($client, $bucketName, $key); $this->assertEquals($filesize, strlen($unDecContent)); $this->assertNotEquals($content, $unDecContent); // get object $result = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key )); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertEquals($content, $result->body->getContents()); $this->assertEquals($filesize, $result->contentLength); $this->assertEquals(strval($filesize), $result->headers['Content-Length']); $this->assertNull($result->contentRange); foreach ([0, 1, 2, 3, 4, 5, 7, 16, 17, 32, 63, 64, 79] as $offset) { $request = new Oss\Models\GetObjectRequest( $bucketName, $key ); $request->rangeHeader = "bytes=$offset-"; $result = $eclient->getObject($request); $this->assertEquals(206, $result->statusCode); $this->assertEquals('Partial Content', $result->status); $this->assertEquals(substr($content, $offset), $result->body->getContents()); $this->assertEquals($filesize - $offset, $result->contentLength); $this->assertEquals(strval($filesize - $offset), $result->headers['Content-Length']); $contentRange = sprintf("bytes %d-%d/%d", $offset, $filesize - 1, $filesize); $this->assertEquals($contentRange, $result->contentRange); $this->assertEquals($contentRange, $result->headers['Content-Range']); } foreach ([0, 1, 2, 17, 32, 63, 79] as $offset) { $gotSize = 1234; $rangeEnd = $offset + $gotSize - 1; $request = new Oss\Models\GetObjectRequest( $bucketName, $key ); $request->rangeHeader = "bytes=$offset-$rangeEnd"; $result = $eclient->getObject($request); $this->assertEquals(206, $result->statusCode); $this->assertEquals('Partial Content', $result->status); $this->assertEquals(substr($content, $offset, $gotSize), $result->body->getContents()); $this->assertEquals($gotSize, $result->contentLength); $this->assertEquals(strval($gotSize), $result->headers['Content-Length']); $contentRange = sprintf("bytes %d-%d/%d", $offset, $rangeEnd, $filesize); $this->assertEquals($contentRange, $result->contentRange); $this->assertEquals($contentRange, $result->headers['Content-Range']); } } public function testGetObjectStreamMode() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $filesize = 250 * 1024 + 123; $filename = self::getTempFileName(); $this->generateFile($filename, $filesize); $content = file_get_contents($filename); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); // put object $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->body = Oss\Utils::streamFor($content); $result = $eclient->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertNotEquals($content, $this->object_get_contents($client, $bucketName, $key)); // get object $args = [ 'request_options' => ['stream' => true] ]; $result = $eclient->getObject( new Oss\Models\GetObjectRequest( $bucketName, $key ), $args ); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertFalse($result->body->isSeekable()); $this->assertInstanceOf(Oss\Crypto\ReadDecryptStream::class, $result->body); $this->assertEquals($content, $result->body->getContents()); $this->assertEquals($filesize, $result->contentLength); $this->assertEquals(strval($filesize), $result->headers['Content-Length']); $this->assertNull($result->contentRange); $this->assertCount(1, $args['request_options']); // range get $args = [ 'request_options' => ['stream' => true] ]; $request = new Oss\Models\GetObjectRequest( $bucketName, $key ); $offset = 12345; $gotSize = 22234; $rangeEnd = $offset + $gotSize - 1; $request->rangeHeader = sprintf("bytes=%d-%d", $offset, $rangeEnd); $result = $eclient->getObject($request, $args); $this->assertEquals(206, $result->statusCode); $this->assertEquals('Partial Content', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertFalse($result->body->isSeekable()); $this->assertInstanceOf(Oss\Crypto\ReadDecryptStream::class, $result->body); $this->assertEquals(substr($content, $offset, $gotSize), $result->body->getContents()); $this->assertEquals($gotSize, $result->contentLength); $this->assertEquals(strval($gotSize), $result->headers['Content-Length']); $contentRange = sprintf("bytes %d-%d/%d", $offset, $rangeEnd, $filesize); $this->assertEquals($contentRange, $result->contentRange); $this->assertCount(1, $args['request_options']); } public function testHeadObject() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $filesize = 25 * 1024 + 123; $filename = self::getTempFileName(); $this->generateFile($filename, $filesize); $content = file_get_contents($filename); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); // put object $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->body = Oss\Utils::streamFor($content); $result = $eclient->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); // head object $result = $eclient->headObject(new Oss\Models\HeadObjectRequest( $bucketName, $key )); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertNotEmpty($result->metadata['client-side-encryption-key']); $this->assertNotEmpty($result->metadata['client-side-encryption-start']); $this->assertEquals('AES/CTR/NoPadding', $result->metadata['client-side-encryption-cek-alg']); $this->assertEquals('RSA/NONE/PKCS1Padding', $result->metadata['client-side-encryption-wrap-alg']); $this->assertEquals('{"key":"value"}', $result->metadata['client-side-encryption-matdesc']); } public function testGetObjectMeta() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $filesize = 25 * 1024 + 123; $filename = self::getTempFileName(); $this->generateFile($filename, $filesize); $content = file_get_contents($filename); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); // put object $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->body = Oss\Utils::streamFor($content); $result = $eclient->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); // get object meta $result = $eclient->getObjectMeta(new Oss\Models\GetObjectMetaRequest( $bucketName, $key )); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertEquals(strlen($content), $result->contentLength); } public function testObjectMultipart() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName() . '-multipart'; $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); $partSize = 200 * 1024; $length = 500 * 1024; $bigFileName = self::getTempFileName() . "-bigfile.tmp"; $this->generateFile($bigFileName, $length); try { $initRequest = new Oss\Models\InitiateMultipartUploadRequest( $bucketName, $key, ); $initRequest->cseDataSize = $length; $initRequest->csePartSize = $partSize; $initRequest->contentMd5 = base64_encode(md5_file($bigFileName, true)); $initRequest->contentLength = $length; $initResult = $eclient->initiateMultipartUpload( $initRequest ); $this->assertEquals(200, $initResult->statusCode); $this->assertNotEmpty($initResult->uploadId); $file = fopen($bigFileName, 'r'); $parts = array(); if ($file) { $i = 1; while (!feof($file)) { $chunk = fread($file, $partSize); $partRequest = new Oss\Models\UploadPartRequest( $bucketName, $key, $i, $initResult->uploadId, strlen($chunk), null, null, null, Oss\Utils::streamFor($chunk) ); $partRequest->encryptionMultipartContext = $initResult->encryptionMultipartContext; $partResult = $eclient->uploadPart($partRequest); $this->assertEquals(200, $partResult->statusCode); $part = new Oss\Models\UploadPart( $i, $partResult->etag, ); array_push($parts, $part); $i++; } fclose($file); } $comResult = $eclient->completeMultipartUpload( new Oss\Models\CompleteMultipartUploadRequest( $bucketName, $key, $initResult->uploadId, null, new Oss\Models\CompleteMultipartUpload( $parts ), ) ); $this->assertEquals(200, $comResult->statusCode); $this->assertEquals($bucketName, $comResult->bucket); $this->assertEquals($key, $comResult->key); $this->assertNotEmpty($comResult->etag); $this->assertNotEmpty($comResult->location); $getObj = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key, )); $this->assertEquals(base64_encode(md5(file_get_contents($bigFileName), true)), base64_encode(md5($getObj->body, true))); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } try { $initRequest = new Oss\Models\InitiateMultipartUploadRequest( $bucketName, $key, ); $initRequest->cseDataSize = $length; $initRequest->csePartSize = $partSize; $initResult = $eclient->initiateMultipartUpload( $initRequest ); $this->assertEquals(200, $initResult->statusCode); $this->assertNotEmpty($initResult->uploadId); $file = fopen($bigFileName, 'r'); $parts = array(); if ($file) { $i = 1; while (!feof($file)) { $chunk = fread($file, $partSize); $partRequest = new Oss\Models\UploadPartRequest( $bucketName, $key, $i, $initResult->uploadId, strlen($chunk), null, null, null, Oss\Utils::streamFor($chunk) ); $partRequest->contentMd5 = base64_encode(md5($chunk, true)); $partRequest->encryptionMultipartContext = $initResult->encryptionMultipartContext; $partResult = $eclient->uploadPart($partRequest); $this->assertEquals(200, $partResult->statusCode); $part = new Oss\Models\UploadPart( $i, $partResult->etag, ); array_push($parts, $part); $i++; } fclose($file); } $listResult = $eclient->listParts( new Oss\Models\ListPartsRequest( $bucketName, $key, $initResult->uploadId, ) ); $this->assertEquals(200, $listResult->statusCode); $this->assertEquals($bucketName, $listResult->bucket); $this->assertEquals($key, $listResult->key); $this->assertCount(3, $listResult->parts); $abort = $eclient->abortMultipartUpload( new Oss\Models\AbortMultipartUploadRequest( self::$bucketName, $key, $initResult->uploadId, ) ); $this->assertEquals(204, $abort->statusCode); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } } public function testUploader() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName() . '-multipart-uploader'; $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); $partSize = 200 * 1024; $length = 500 * 1024; $filename = self::getTempFileName(); $this->generateFile($filename, $length); try { $u = $eclient->newUploader(); $u->uploadFile(new \AlibabaCloud\Oss\V2\Models\PutObjectRequest( $bucketName, $key, ), $filename); $getObj = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key, )); $this->assertEquals(base64_encode(md5(file_get_contents($filename), true)), base64_encode(md5($getObj->body, true))); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } try { $u = $eclient->newUploader(array( 'part_size' => $partSize, 'total_size' => $length, )); $u->uploadFile(new \AlibabaCloud\Oss\V2\Models\PutObjectRequest( $bucketName, $key, ), $filename); $getObj = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key, )); $this->assertEquals(base64_encode(md5(file_get_contents($filename), true)), base64_encode(md5($getObj->body, true))); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } try { $u = $eclient->newUploader(array( 'part_size' => $partSize, 'total_size' => $length, )); $u->uploadFrom(new \AlibabaCloud\Oss\V2\Models\PutObjectRequest( $bucketName, $key, ), new LazyOpenStream($filename, 'rb'), [ 'part_size' => $partSize, ]); $getObj = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key, )); $this->assertEquals(base64_encode(md5(file_get_contents($filename), true)), base64_encode(md5($getObj->body, true))); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } unlink($filename); } public function testDownloader() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName() . '-multipart-uploader'; $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ); $length = 500 * 1024; $partSize = 200 * 1024; $eclient = new Oss\EncryptionClient($client, $masterCipher); $downFileName = self::getTempFileName() . "-download.tmp"; $bigFileName = self::getTempFileName() . "-bigfile.tmp"; $this->generateFile($bigFileName, $length); $content = \file_get_contents($bigFileName); $u = $eclient->newUploader(); $u->uploadFile(new \AlibabaCloud\Oss\V2\Models\PutObjectRequest( $bucketName, $key, ), $bigFileName); try { $d = $eclient->newDownloader(); $d->downloadFile(new Oss\Models\GetObjectRequest($bucketName, $key), $downFileName); $this->assertEquals(md5_file($bigFileName), md5_file($downFileName)); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } try { $d = $eclient->newDownloader( [ 'part_size' => $partSize, 'parallel_num' => 1, ] ); $d->downloadFile(new Oss\Models\GetObjectRequest($bucketName, $key), $downFileName); $this->assertEquals(md5_file($bigFileName), md5_file($downFileName)); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } try { $d = $eclient->newDownloader( [ 'part_size' => $partSize, 'parallel_num' => 2, ] ); $d->downloadFile(new Oss\Models\GetObjectRequest($bucketName, $key), $downFileName); $this->assertEquals(md5_file($bigFileName), md5_file($downFileName)); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } try { $d = $eclient->newDownloader( [ 'part_size' => $partSize, 'parallel_num' => 1, ] ); $stream = new BufferStream(1 * 1024 * 1024); $result = $d->downloadTo( new Oss\Models\GetObjectRequest( $bucketName, $key ), $stream, ); $gotContent = $stream->getContents(); $this->assertEquals($length, $result->written); $this->assertEquals($length, strlen($gotContent)); $this->assertEquals($content, $gotContent); $this->assertEquals(md5_file($bigFileName), md5_file($downFileName)); } catch (\Throwable $e) { $this->assertTrue(false, "should not here"); } } public function testEncryptionCompatibility() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = 'example.jpg'; $filename = self::getDataPath() . DIRECTORY_SEPARATOR . 'example.jpg'; $filesize = filesize($filename); $content = file_get_contents($filename); $encFilename = self::getDataPath() . DIRECTORY_SEPARATOR . 'enc-example.jpg'; $encFilesize = filesize($encFilename); $encContent = file_get_contents($encFilename); $this->assertEquals($filesize, $encFilesize); $this->assertNotEquals($content, $encContent); // decrypt only $masterCipher = new Oss\Crypto\MasterRsaCipher( null, self::RSA_PRIVATE_KEY, ); $eclient = new Oss\EncryptionClient($client, $masterCipher); // put test encrypted data $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->body = Oss\Utils::streamFor($encContent); $putObjRequest->metadata = [ "client-side-encryption-key" => "nyXOp7delQ/MQLjKQMhHLaT0w7u2yQoDLkSnK8MFg/MwYdh4na4/LS8LLbLcM18m8I/ObWUHU775I50sJCpdv+f4e0jLeVRRiDFWe+uo7Puc9j4xHj8YB3QlcIOFQiTxHIB6q+C+RA6lGwqqYVa+n3aV5uWhygyv1MWmESurppg=", "client-side-encryption-start" => "De/S3T8wFjx7QPxAAFl7h7TeI2EsZlfCwox4WhLGng5DK2vNXxULmulMUUpYkdc9umqmDilgSy5Z3Foafw+v4JJThfw68T/9G2gxZLrQTbAlvFPFfPM9Ehk6cY4+8WpY32uN8w5vrHyoSZGr343NxCUGIp6fQ9sSuOLMoJg7hNw=", "client-side-encryption-cek-alg" => "AES/CTR/NoPadding", "client-side-encryption-wrap-alg" => "RSA/NONE/PKCS1Padding", ]; $result = $client->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); // use non-encryption client to get object $result = $client->getObject(new Oss\Models\GetObjectRequest($bucketName, $key)); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertEquals($encContent, $result->body->getContents()); // use encryption client to get object $result = $eclient->getObject(new Oss\Models\GetObjectRequest($bucketName, $key)); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertEquals($content, $result->body->getContents()); $this->assertInstanceOf(GuzzleHttp\Psr7\Stream::class, $result->body); // use encryption client to get object into filepath $filenameSave = self::getTempFileName(); $result = $eclient->getObject( new Oss\Models\GetObjectRequest($bucketName, $key), [ 'request_options' => ['sink' => $filenameSave] ] ); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertFileEquals($filename, $filenameSave); $this->assertNull($result->body); } public function testGetObjectInvalidArgument() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $filesize = 25 * 1024 + 123; $filename = self::getTempFileName(); $this->generateFile($filename, $filesize); $content = file_get_contents($filename); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ); $eclient = new Oss\EncryptionClient($client, $masterCipher); // put object $putObjRequest = new Oss\Models\PutObjectRequest( $bucketName, $key, ); $putObjRequest->contentMd5 = base64_encode(md5_file($filename, true)); $putObjRequest->contentLength = $filesize; $putObjRequest->body = Oss\Utils::streamFor($content); $result = $eclient->putObject($putObjRequest); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); // get object $result = $eclient->getObject(new Oss\Models\GetObjectRequest( $bucketName, $key )); $this->assertEquals(200, $result->statusCode); $this->assertEquals('OK', $result->status); $this->assertEquals(True, count($result->headers) > 0); $this->assertEquals(24, strlen($result->requestId)); $this->assertEquals($content, $result->body->getContents()); $this->assertEquals($filesize, $result->contentLength); $this->assertEquals(strval($filesize), $result->headers['Content-Length']); try { $offset = 0; $request = new Oss\Models\GetObjectRequest( $bucketName, $key ); $request->rangeHeader = "2bytes=$offset-"; $result = $eclient->getObject($request); $this->assertTrue(false, 'should not here'); } catch (\InvalidArgumentException $e) { $this->assertStringContainsString('request.rangeHeader is invalid, got', $e->getMessage()); } } public function testInitiateMultipartUploadInvalidArgument() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName(); $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ); $eclient = new Oss\EncryptionClient($client, $masterCipher); try { $result = $eclient->initiateMultipartUpload(new Oss\Models\InitiateMultipartUploadRequest( $bucketName, $key )); $this->assertTrue(false, 'should not here'); } catch (\InvalidArgumentException $e) { $this->assertStringContainsString('request.csePartSize is invalid.', $e->getMessage()); } try { $request = new Oss\Models\InitiateMultipartUploadRequest( $bucketName, $key ); $request->csePartSize = 1; $result = $eclient->initiateMultipartUpload($request); $this->assertTrue(false, 'should not here'); } catch (\InvalidArgumentException $e) { $this->assertStringContainsString('request.cseDataSize is invalid.', $e->getMessage()); } try { $request = new Oss\Models\InitiateMultipartUploadRequest( $bucketName, $key ); $request->csePartSize = 1; $request->cseDataSize = 200; $result = $eclient->initiateMultipartUpload($request); $this->assertTrue(false, 'should not here'); } catch (\InvalidArgumentException $e) { $this->assertStringContainsString('request.csePartSize must be aligned to', $e->getMessage()); } } public function testUploadPartInvalidArgument() { $client = $this->getDefaultClient(); $bucketName = self::$bucketName; $key = self::randomObjectName() . '-multipart'; $masterCipher = new Oss\Crypto\MasterRsaCipher( self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value'] ); $eclient = new Oss\EncryptionClient($client, $masterCipher); $partSize = 200 * 1024; $length = 500 * 1024; $bigFileName = self::getTempFileName() . "-bigfile.tmp"; $this->generateFile($bigFileName, $length); try { $file = fopen($bigFileName, 'r'); $parts = array(); if ($file) { $i = 1; while (!feof($file)) { $chunk = fread($file, $partSize); $partRequest = new Oss\Models\UploadPartRequest( $bucketName, $key, $i, '123', strlen($chunk), null, null, null, Oss\Utils::streamFor($chunk) ); $partResult = $eclient->uploadPart($partRequest); $part = new Oss\Models\UploadPart( $i, $partResult->etag, ); array_push($parts, $part); $i++; } fclose($file); } $this->assertTrue(false, "should not here"); } catch (\Throwable $e) { $this->assertStringContainsString('request.encryptionMultiPart is null.', $e->getMessage()); } try { $file = fopen($bigFileName, 'r'); $parts = array(); if ($file) { $i = 1; while (!feof($file)) { $chunk = fread($file, $partSize); $partRequest = new Oss\Models\UploadPartRequest( $bucketName, $key, $i, '123', strlen($chunk), null, null, null, Oss\Utils::streamFor($chunk) ); $partRequest->encryptionMultipartContext = new Oss\Models\EncryptionMultipartContext(); $partResult = $eclient->uploadPart($partRequest); $part = new Oss\Models\UploadPart( $i, $partResult->etag, ); array_push($parts, $part); $i++; } fclose($file); } $this->assertTrue(false, "should not here"); } catch (\Throwable $e) { $this->assertStringContainsString('request.encryptionMultiPart is invalid.', $e->getMessage()); } try { $file = fopen($bigFileName, 'r'); $builder = new Oss\Crypto\AesCtrCipherBuilder($masterCipher); $cc = $builder->fromCipherData(); $cc->getCipherData(); $parts = array(); if ($file) { $i = 1; while (!feof($file)) { $chunk = fread($file, $partSize); $partRequest = new Oss\Models\UploadPartRequest( $bucketName, $key, $i, '123', strlen($chunk), null, null, null, Oss\Utils::streamFor($chunk) ); $partRequest->encryptionMultipartContext = new Oss\Models\EncryptionMultipartContext($cc, 100, 2); $partResult = $eclient->uploadPart($partRequest); $part = new Oss\Models\UploadPart( $i, $partResult->etag, ); array_push($parts, $part); $i++; } fclose($file); } $this->assertTrue(false, "should not here"); } catch (\InvalidArgumentException $e) { $this->assertStringContainsString('request.encryptionMultiPart.partSize must be aligned to', $e->getMessage()); } } }