AliyunOSSiOSTests/OSSSingerTest.m (678 lines of code) (raw):
//
// SingerTest.m
// AliyunOSSiOSTests
//
// Created by ws on 2024/1/2.
// Copyright © 2024 aliyun. All rights reserved.
//
#import <XCTest/XCTest.h>
#import <AliyunOSSiOS/AliyunOSSiOS.h>
#import <AliyunOSSiOS/OSSSignerParams.h>
#import <AliyunOSSiOS/OSSSignerBase.h>
#import <AliyunOSSiOS/OSSV4Signer.h>
#import <AliyunOSSiOS/NSData+OSS.h>
#import <AliyunOSSiOS/OSSServiceSignature.h>
#import "OSSTestMacros.h"
@interface OSSSingerTest : XCTestCase
@end
@implementation OSSSingerTest
- (void)setUp {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
[NSDate oss_setClockSkew:0];
}
- (void)test_singerWithSignerV4 {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:@"ak" secretKey:@"sk"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702743657.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
id<OSSRequestSigner> signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSString *authPat = @"OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,Signature=e21d18daa82167720f9b1047ae7e7f1ce7cb77a31e8203a7d5f4624fa0284afe";
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
}
- (void)test_singerWithSignerV4Token {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"ak" secretKeyId:@"sk" securityToken:@"token"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702784856.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
id<OSSRequestSigner> signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSString *authPat = @"OSS4-HMAC-SHA256 Credential=ak/20231217/cn-hangzhou/oss/aliyun_v4_request,Signature=b94a3f999cf85bcdc00d332fbd3734ba03e48382c36fa4d5af5df817395bd9ea";
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
}
- (void)test_singerWithFederationCredentialProvider {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{
OSSFederationToken *federationToken = [OSSFederationToken new];
federationToken.tAccessKey = @"ak";
federationToken.tSecretKey = @"sk";
federationToken.tToken = @"token";
return federationToken;
}];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702784856.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
id<OSSRequestSigner> signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSString *authPat = @"OSS4-HMAC-SHA256 Credential=ak/20231217/cn-hangzhou/oss/aliyun_v4_request,Signature=b94a3f999cf85bcdc00d332fbd3734ba03e48382c36fa4d5af5df817395bd9ea";
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{
return nil;
}];
signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
OSSTask *task = [signer sign:requestMessage];
XCTAssertNotNil(task.error);
XCTAssertEqual(task.error.code, OSSClientErrorCodeSignFailed);
}
- (void)test_singerWithOSSCustomSignerCredentialProvider {
OSSSignVersion version = OSSSignVersionV4;
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702743657.018L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
id<OSSCredentialProvider> credentialProvider = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^NSString * _Nullable(NSString * _Nonnull contentToSign, NSError *__autoreleasing _Nullable * _Nullable error) {
return @"OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,Signature=0436fec1623c737d5827c11d200afd3df51d067b80196080438f57c94d99b9b0";
}];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
id<OSSRequestSigner> signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
OSSTask *task = [signer sign:requestMessage];
XCTAssertNotNil(task.error);
XCTAssertEqual(task.error.code, OSSClientErrorCodeSignFailed);
}
- (void)test_signerV4WithAdditionalHeaders {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:@"ak" secretKey:@"sk"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702747512.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
NSMutableSet<NSString *> *signHeaders = [NSMutableSet new];
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
id<OSSRequestSigner> signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSString *authPat = @"OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=abc;zabc,Signature=4a4183c187c07c8947db7620deb0a6b38d9fbdd34187b6dbaccb316fa251212f";
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
// 2
signHeaders = [NSMutableSet new];
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
[signHeaders addObject:@"x-oss-head1"];
[signHeaders addObject:@"x-oss-no-exist"];
requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSLog(@"%@", requestMessage.headerParams);
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
}
- (void)test_signerV4WithAdditionalHeadersByToken {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"ak" secretKeyId:@"sk" securityToken:@"token"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702747512.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
NSMutableSet<NSString *> *signHeaders = [NSMutableSet new];
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
id<OSSRequestSigner> signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSString *authPat = @"OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=abc;zabc,Signature=203120400fdac93fd2f87640e5071f19de7c4561090e8a5fcffbe7d1ef89e073";
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
// 2
signHeaders = [NSMutableSet new];
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
[signHeaders addObject:@"x-oss-head1"];
[signHeaders addObject:@"x-oss-no-exist"];
requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signer = [OSSSignerBase createRequestSignerWithSignerVersion:version
signerParams:signerParam];
[signer sign:requestMessage];
NSLog(@"%@", requestMessage.headerParams);
XCTAssertTrue([authPat isEqualToString:requestMessage.headerParams[OSSHttpHeaderAuthorization]]);
}
- (void)test_singerWithSignerV4Presign {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:@"ak" secretKey:@"sk"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702781677.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"application/octet-stream";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.isUseUrlSignature = YES;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
id<OSSRequestPresigner> signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
[signer presign:requestMessage];
XCTAssertTrue([@"OSS4-HMAC-SHA256" isEqualToString:requestMessage.params[@"x-oss-signature-version"]]);
XCTAssertTrue([@"20231217T025437Z" isEqualToString:requestMessage.params[@"x-oss-date"]]);
XCTAssertTrue([@"599" isEqualToString:requestMessage.params[@"x-oss-expires"]]);
XCTAssertTrue([@"ak/20231217/cn-hangzhou/oss/aliyun_v4_request" isEqualToString:requestMessage.params[@"x-oss-credential"]]);
XCTAssertTrue([@"a39966c61718be0d5b14e668088b3fa07601033f6518ac7b523100014269c0fe" isEqualToString:requestMessage.params[@"x-oss-signature"]]);
XCTAssertNil(requestMessage.params[@"x-oss-additional-headers"]);
}
- (void)test_V4PresignWithOSSFederationCredentialProvider {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSFederationCredentialProvider alloc] initWithFederationTokenGetter:^OSSFederationToken * _Nullable{
OSSFederationToken *federationToken = [OSSFederationToken new];
federationToken.tAccessKey = @"ak";
federationToken.tSecretKey = @"sk";
federationToken.tToken = @"token";
return federationToken;
}];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702785388.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"application/octet-stream";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.isUseUrlSignature = YES;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
id<OSSRequestPresigner> signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
[signer presign:requestMessage];
XCTAssertTrue([@"OSS4-HMAC-SHA256" isEqualToString:requestMessage.params[@"x-oss-signature-version"]]);
XCTAssertTrue([@"20231217T035628Z" isEqualToString:requestMessage.params[@"x-oss-date"]]);
XCTAssertTrue([@"599" isEqualToString:requestMessage.params[@"x-oss-expires"]]);
XCTAssertTrue([@"ak/20231217/cn-hangzhou/oss/aliyun_v4_request" isEqualToString:requestMessage.params[@"x-oss-credential"]]);
XCTAssertTrue([@"3817ac9d206cd6dfc90f1c09c00be45005602e55898f26f5ddb06d7892e1f8b5" isEqualToString:requestMessage.params[@"x-oss-signature"]]);
XCTAssertNil(requestMessage.params[@"x-oss-additional-headers"]);
}
- (void)test_V4PresignWithOSSCustomSignerCredentialProvider {
OSSSignVersion version = OSSSignVersionV4;
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702743657.018L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
id<OSSCredentialProvider> credentialProvider = [[OSSCustomSignerCredentialProvider alloc] initWithImplementedSigner:^NSString * _Nullable(NSString * _Nonnull contentToSign, NSError *__autoreleasing _Nullable * _Nullable error) {
return @"OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,Signature=0436fec1623c737d5827c11d200afd3df51d067b80196080438f57c94d99b9b0";
}];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"text/plain";
headers[@"x-oss-content-sha256"] = @"UNSIGNED-PAYLOAD";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.isUseUrlSignature = YES;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
id<OSSRequestPresigner> signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
OSSTask *task = [signer presign:requestMessage];
XCTAssertNotNil(task.error);
XCTAssertEqual(task.error.code, OSSClientErrorCodeSignFailed);
}
- (void)test_presignWithAdditionalHeaders {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSPlainTextAKSKPairCredentialProvider alloc] initWithPlainTextAccessKey:@"ak" secretKey:@"sk"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702783809.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
NSMutableSet<NSString *> *signHeaders = [NSMutableSet new];
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"application/octet-stream";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
requestMessage.isUseUrlSignature = YES;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
signerParam.additionalHeaderNames = signHeaders;
id<OSSRequestPresigner> signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
[signer presign:requestMessage];
XCTAssertTrue([@"OSS4-HMAC-SHA256" isEqualToString:requestMessage.params[@"x-oss-signature-version"]]);
XCTAssertTrue([@"20231217T033009Z" isEqualToString:requestMessage.params[@"x-oss-date"]]);
XCTAssertTrue([@"599" isEqualToString:requestMessage.params[@"x-oss-expires"]]);
XCTAssertTrue([@"ak/20231217/cn-hangzhou/oss/aliyun_v4_request" isEqualToString:requestMessage.params[@"x-oss-credential"]]);
XCTAssertTrue([@"6bd984bfe531afb6db1f7550983a741b103a8c58e5e14f83ea474c2322dfa2b7" isEqualToString:requestMessage.params[@"x-oss-signature"]]);
XCTAssertTrue([requestMessage.params[@"x-oss-additional-headers"] isEqualToString:@"abc;zabc"]);
// 2
signHeaders = [NSMutableSet new];
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
[signHeaders addObject:@"x-oss-head1"];
[signHeaders addObject:@"x-oss-no-exist"];
requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
signerParam.additionalHeaderNames = signHeaders;
signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
[signer presign:requestMessage];
XCTAssertTrue([@"OSS4-HMAC-SHA256" isEqualToString:requestMessage.params[@"x-oss-signature-version"]]);
XCTAssertTrue([@"20231217T033009Z" isEqualToString:requestMessage.params[@"x-oss-date"]]);
XCTAssertTrue([@"599" isEqualToString:requestMessage.params[@"x-oss-expires"]]);
XCTAssertTrue([@"ak/20231217/cn-hangzhou/oss/aliyun_v4_request" isEqualToString:requestMessage.params[@"x-oss-credential"]]);
XCTAssertTrue([@"6bd984bfe531afb6db1f7550983a741b103a8c58e5e14f83ea474c2322dfa2b7" isEqualToString:requestMessage.params[@"x-oss-signature"]]);
XCTAssertTrue([requestMessage.params[@"x-oss-additional-headers"] isEqualToString:@"abc;zabc"]);
}
- (void)test_presignWithAdditionalHeadersByToken {
OSSSignVersion version = OSSSignVersionV4;
id<OSSCredentialProvider> credentialProvider = [[OSSStsTokenCredentialProvider alloc] initWithAccessKeyId:@"ak" secretKeyId:@"sk" securityToken:@"token"];
NSString *bucket = @"bucket";
NSString *key = @"1234+-/123/1.txt";
NSString *region = @"cn-hangzhou";
NSString *product = @"oss";
NSTimeInterval t = 1702783809.0L;
[NSDate oss_setClockSkew:[NSDate new].timeIntervalSince1970 - t];
NSMutableDictionary *headers = @{}.mutableCopy;
NSMutableDictionary *parameters = @{}.mutableCopy;
NSMutableSet<NSString *> *signHeaders = [NSMutableSet new];
headers[@"x-oss-head1"] = @"value";
headers[@"abc"] = @"value";
headers[@"ZAbc"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"XYZ"] = @"value";
headers[@"content-type"] = @"application/octet-stream";
parameters[@"param1"] = @"value1";
parameters[@"|param1"] = @"value2";
parameters[@"+param1"] = @"value3";
parameters[@"|param1"] = @"value4";
parameters[@"+param2"] = @"";
parameters[@"|param2"] = @"";
parameters[@"param2"] = @"";
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
OSSAllRequestNeededMessage *requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
requestMessage.isUseUrlSignature = YES;
NSString *resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
OSSSignerParams *signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
signerParam.additionalHeaderNames = signHeaders;
id<OSSRequestPresigner> signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
[signer presign:requestMessage];
XCTAssertTrue([@"OSS4-HMAC-SHA256" isEqualToString:requestMessage.params[@"x-oss-signature-version"]]);
XCTAssertTrue([@"20231217T033009Z" isEqualToString:requestMessage.params[@"x-oss-date"]]);
XCTAssertTrue([@"599" isEqualToString:requestMessage.params[@"x-oss-expires"]]);
XCTAssertTrue([@"ak/20231217/cn-hangzhou/oss/aliyun_v4_request" isEqualToString:requestMessage.params[@"x-oss-credential"]]);
XCTAssertTrue([@"2143a96a0e0e02889309ac8f8db57e79ffc275a0c9ebe3af676c8a1ce5635eca" isEqualToString:requestMessage.params[@"x-oss-signature"]]);
XCTAssertTrue([requestMessage.params[@"x-oss-additional-headers"] isEqualToString:@"abc;zabc"]);
// 2
signHeaders = [NSMutableSet new];
[signHeaders addObject:@"abc"];
[signHeaders addObject:@"ZAbc"];
[signHeaders addObject:@"x-oss-head1"];
[signHeaders addObject:@"x-oss-no-exist"];
requestMessage = [OSSAllRequestNeededMessage new];
requestMessage.httpMethod = @"PUT";
requestMessage.bucketName = bucket;
requestMessage.objectKey = key;
requestMessage.headerParams = headers;
requestMessage.params = parameters;
requestMessage.additionalHeaderNames = signHeaders;
resource = [@"/" stringByAppendingString:((bucket != nil) ? [bucket stringByAppendingString:@"/"] : @"")];
resource = [resource stringByAppendingString:(key != nil ? key : @"")];
signerParam = [OSSSignerParams new];
signerParam.credentialProvider = credentialProvider;
signerParam.resourcePath = resource;
signerParam.product = product;
signerParam.region = region;
signerParam.expiration = 599;
signerParam.additionalHeaderNames = signHeaders;
signer = [OSSSignerBase createRequestPresignerWithSignerVersion:version
signerParams:signerParam];
[signer presign:requestMessage];
XCTAssertTrue([@"OSS4-HMAC-SHA256" isEqualToString:requestMessage.params[@"x-oss-signature-version"]]);
XCTAssertTrue([@"20231217T033009Z" isEqualToString:requestMessage.params[@"x-oss-date"]]);
XCTAssertTrue([@"599" isEqualToString:requestMessage.params[@"x-oss-expires"]]);
XCTAssertTrue([@"ak/20231217/cn-hangzhou/oss/aliyun_v4_request" isEqualToString:requestMessage.params[@"x-oss-credential"]]);
XCTAssertTrue([@"2143a96a0e0e02889309ac8f8db57e79ffc275a0c9ebe3af676c8a1ce5635eca" isEqualToString:requestMessage.params[@"x-oss-signature"]]);
XCTAssertTrue([requestMessage.params[@"x-oss-additional-headers"] isEqualToString:@"abc;zabc"]);
}
@end