Skip to content

Commit

Permalink
modify logic of signv4
Browse files Browse the repository at this point in the history
  • Loading branch information
wlll129 authored and huiguangjun committed Jan 10, 2025
1 parent 63668fd commit 8d1ceba
Show file tree
Hide file tree
Showing 6 changed files with 294 additions and 41 deletions.
1 change: 1 addition & 0 deletions AliyunOSSSDK/OSSDefine.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@
#define OSSHttpHeaderCopySource @"x-oss-copy-source"
#define OSSHttpHeaderSymlinkTarget @"x-oss-symlink-target"
#define OSSHttpHeaderDate @"Date"
#define OSSHttpHeaderDateEx @"x-oss-date"
#define OSSHttpHeaderSecurityToken @"x-oss-security-token"
#define OSSHttpHeaderAuthorization @"Authorization"
#define OSSHttpHeaderHost @"Host"
Expand Down
2 changes: 2 additions & 0 deletions AliyunOSSSDK/OSSUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
+ (NSString *)calBase64Sha1WithData:(NSString *)data withSecret:(NSString *)key;
+ (NSString *)calBase64WithData:(uint8_t *)data;
+ (NSString *)encodeURL:(NSString *)url;
+ (NSString *)encodeResourcePath:(NSString *)resourcePath;
+ (NSString *)encodeQuery:(NSString *)query;
+ (NSData *)constructHttpBodyFromPartInfos:(NSArray *)partInfos;
+ (NSData *)constructHttpBodyForDeleteMultipleObjects:(NSArray<NSString *> *)keys quiet:(BOOL)quiet;
+ (NSData *)constructHttpBodyForCreateBucketWithLocation:(NSString *)location __attribute__((deprecated("deprecated!")));
Expand Down
53 changes: 53 additions & 0 deletions AliyunOSSSDK/OSSUtil.m
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,59 @@ + (NSString *)encodeURL:(NSString *)url {

}

+ (NSString *)encodeResourcePath:(NSString *)resourcePath {
//保持和android处理方式一致,添加+ -> %20,* -> %2A,%7E -> ~, "%2F" -> /
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[resourcePath UTF8String];
NSUInteger sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = source[i];
if (thisChar == ' ') {
[output appendString:@"%20"];
} else if (thisChar == '*') {
[output appendString:@"%2A"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || thisChar == '/' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
NSString *encodeUrl = [output stringByReplacingOccurrencesOfString:@"%2F" withString:@"/"];
encodeUrl = [encodeUrl stringByReplacingOccurrencesOfString:@"%7E" withString:@"~"];
return encodeUrl;


// 不要用系统urlencode 的方式,很多特殊字符都没有转化;
// 详见:https://stackoverflow.com/questions/8088473/how-do-i-url-encode-a-string

}

+ (NSString *)encodeQuery:(NSString *)query {
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[query UTF8String];
NSUInteger sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = source[i];
if (thisChar == ' ') {
[output appendString:@"%20"];
} else if (thisChar == '*') {
[output appendString:@"%2A"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
NSString *encodeUrl = [output stringByReplacingOccurrencesOfString:@"%7E" withString:@"~"];
return encodeUrl;
}

+ (NSData *)constructHttpBodyFromPartInfos:(NSArray *)partInfos {
NSMutableString * body = [NSMutableString stringWithString:@"<CompleteMultipartUpload>\n"];
[partInfos enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
Expand Down
30 changes: 20 additions & 10 deletions AliyunOSSSDK/Signer/OSSV4Signer.m
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ - (BOOL)hasSignedHeaders:(NSString *)header {
if ([self hasDefaultSignedHeaders:header]) {
return YES;
}
return [self.additionalSignedHeaders containsObject:header];
return [self.additionalSignedHeaders containsObject:header.lowercaseString];
}

- (BOOL)hasAdditionalSignedHeaders {
Expand Down Expand Up @@ -95,6 +95,7 @@ - (void)addDateHeaderIfNeeded:(OSSAllRequestNeededMessage *)request {
[self initRequestDateTime];
NSString *date = [self getDateTime];
request.date = date;
[request.headerParams oss_setObject:date forKey:OSSHttpHeaderDateEx];
[request.headerParams oss_setObject:date forKey:OSSHttpHeaderDate];
}

Expand All @@ -113,20 +114,25 @@ - (NSString *)buildCanonicalRequest:(OSSAllRequestNeededMessage *)request {
[canonicalString appendString:NewLine];

//Canonical URI + "\n"
NSMutableCharacterSet *characterSet = NSCharacterSet.newlineCharacterSet.mutableCopy;
[characterSet addCharactersInString:@"!*\"'();:@&=+$,?#[]|%"];
[canonicalString appendString:[resourcePath stringByAddingPercentEncodingWithAllowedCharacters:[characterSet invertedSet]]];
[canonicalString appendString:[OSSUtil encodeResourcePath:resourcePath]];
[canonicalString appendString:NewLine];

//Canonical Query String + "\n" +
NSMutableArray * params = [NSMutableArray new];
NSArray *allParamsKey = [request.params.allKeys sortedArrayUsingSelector:@selector(compare:)];

NSMutableDictionary *encodedParams = @{}.mutableCopy;
for (NSString *key in request.params.allKeys) {
NSString *encodedValue = [OSSUtil encodeQuery:[request.params[key] oss_trim]];
NSString *encodedKey = [OSSUtil encodeQuery:key];
[encodedParams oss_setObject:encodedValue forKey:encodedKey];
}
NSArray *allParamsKey = [encodedParams.allKeys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in allParamsKey) {
NSString *value = [[request.params[key] oss_trim] oss_urlEncodedString];
NSString *value = encodedParams[key];
if ([value oss_isNotEmpty]) {
[params addObject:[NSString stringWithFormat:@"%@=%@", [key oss_urlEncodedString], value]];
[params addObject:[NSString stringWithFormat:@"%@=%@", key, value]];
} else {
[params addObject:[NSString stringWithFormat:@"%@", [key oss_urlEncodedString]]];
[params addObject:[NSString stringWithFormat:@"%@", key]];
}
}
[canonicalString appendString:[params componentsJoinedByString:@"&"]];
Expand All @@ -141,10 +147,14 @@ - (NSString *)buildCanonicalRequest:(OSSAllRequestNeededMessage *)request {
if (request.contentMd5) {
headerParams[OSSHttpHeaderContentMD5.lowercaseString] = request.contentMd5;
}
NSArray *allHeaderKey = [headerParams.allKeys sortedArrayUsingSelector:@selector(compare:)];
NSMutableDictionary *lowercaseHeaders = @{}.mutableCopy;
for (NSString *key in headerParams.allKeys) {
[lowercaseHeaders oss_setObject:headerParams[key] forKey:key.lowercaseString];
}
NSArray *allHeaderKey = [lowercaseHeaders.allKeys sortedArrayUsingSelector:@selector(compare:)];
for (NSString *key in allHeaderKey) {
NSString *keyStr = [key oss_trim];
NSString *valueStr = [headerParams[key] oss_trim];
NSString *valueStr = [lowercaseHeaders[key] oss_trim];
if ([self hasSignedHeaders:keyStr] && [valueStr oss_isNotEmpty]) {
[headers addObject:[NSString stringWithFormat:@"%@:%@%@", keyStr, valueStr, NewLine]];
}
Expand Down
2 changes: 1 addition & 1 deletion AliyunOSSiOSTests/OSSConfigurationTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ - (void)testAPI_signerV1 {

- (void)testAPI_signerV4 {
NSString *bucketName = [@"test-signerv4-" stringByAppendingFormat:@"%@", @((NSInteger)[NSDate new].timeIntervalSince1970)];
NSString *objectKey = @"signerV4";
NSString *objectKey = @"signerV4/!@#$%^&*()_=\\|';:><[.-+]{}?\"~`";
NSURL * fileURL = [[NSBundle mainBundle] URLForResource:@"hasky" withExtension:@"jpeg"];
NSString *endpoint = OSS_ENDPOINT;

Expand Down
Loading

0 comments on commit 8d1ceba

Please sign in to comment.