AliyunOSSSDK/Signer/OSSSignerBase.m (98 lines of code) (raw):
//
// OSSSignerBase.m
// AliyunOSSSDK iOS
//
// Created by ws on 2023/12/26.
// Copyright © 2023 aliyun. All rights reserved.
//
#import "OSSSignerBase.h"
#import "NSDate+OSS.h"
#import "OSSDefine.h"
#import "OSSV1Signer.h"
#import "OSSV4Signer.h"
#import "OSSLog.h"
#import "OSSAllRequestNeededMessage.h"
#import "OSSSignerParams.h"
#import "OSSConstants.h"
#import "NSMutableDictionary+OSS.h"
@interface OSSSignerBase()
@end
@implementation OSSSignerBase
- (instancetype)initWithSignerParams:(OSSSignerParams *)signerParams {
self = [super init];
if (self) {
self.signerParams = signerParams;
}
return self;
}
- (void)addDateHeaderIfNeeded:(OSSAllRequestNeededMessage *)request {
NSDate *date = [NSDate oss_clockSkewFixedDate];
request.date = [date oss_asStringValue];
request.headerParams[OSSHttpHeaderDate] = [date oss_asStringValue];
}
- (void)addSecurityTokenHeaderIfNeeded:(OSSAllRequestNeededMessage *)request
federationToken:(OSSFederationToken *)federationToken {
if ([federationToken useSecurityToken] && !request.isUseUrlSignature) {
request.headerParams[OSSHttpHeaderSecurityToken] = federationToken.tToken;
}
}
- (void)addAuthorizationHeader:(OSSAllRequestNeededMessage *)request
federationToken:(OSSFederationToken *)federationToken {
}
- (NSString *)buildStringToSign:(OSSAllRequestNeededMessage *)request {
return nil;
}
- (OSSTask *)sign:(OSSAllRequestNeededMessage *)requestMessage {
id<OSSCredentialProvider> credentialProvider = self.signerParams.credentialProvider;
OSSFederationToken *federationToken;
NSError *error;
if ([credentialProvider isKindOfClass:[OSSFederationCredentialProvider class]]) {
federationToken = [(OSSFederationCredentialProvider *)credentialProvider getToken:&error];
} else if ([credentialProvider isKindOfClass:[OSSStsTokenCredentialProvider class]]) {
federationToken = [((OSSStsTokenCredentialProvider *)credentialProvider) getToken];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
} else if ([credentialProvider isKindOfClass:[OSSPlainTextAKSKPairCredentialProvider class]]) {
federationToken = [[OSSFederationToken alloc] init];
federationToken.tAccessKey = ((OSSPlainTextAKSKPairCredentialProvider *)credentialProvider).accessKey;
federationToken.tSecretKey = ((OSSPlainTextAKSKPairCredentialProvider *)credentialProvider).secretKey;
}
#pragma clang diagnostic pop
if (error) {
[OSSTask taskWithError:error];
}
[self addDateHeaderIfNeeded:requestMessage];
if ([credentialProvider isKindOfClass:[OSSCustomSignerCredentialProvider class]]) {
OSSCustomSignerCredentialProvider *customSignerCredentialProvider = (OSSCustomSignerCredentialProvider *)credentialProvider;
NSString *stringToSign = [self buildStringToSign:requestMessage];
NSString *authorization = [customSignerCredentialProvider sign:stringToSign
error:&error];
[requestMessage.headerParams oss_setObject:authorization forKey:OSSHttpHeaderAuthorization];
} else {
if (federationToken == nil) {
OSSLogError(@"Can't get a federation token");
[OSSTask taskWithResult:[NSError errorWithDomain:OSSClientErrorDomain
code:OSSClientErrorCodeSignFailed
userInfo:@{OSSErrorMessageTOKEN: @"Can't get a federation token"}]];
}
[self addSecurityTokenHeaderIfNeeded:requestMessage federationToken:federationToken];
[self addAuthorizationHeader:requestMessage federationToken:federationToken];
}
if (error) {
[OSSTask taskWithError:error];
}
return [OSSTask taskWithResult:nil];
}
- (OSSTask *)presign:(OSSAllRequestNeededMessage *)requestMessage {
return [OSSTask taskWithResult:nil];
}
+ (id<OSSRequestSigner>)createRequestSignerWithSignerVersion:(OSSSignVersion)signerVersion
signerParams:(OSSSignerParams *)signerParams {
if (signerVersion == OSSSignVersionV4) {
return [[OSSV4Signer alloc] initWithSignerParams:signerParams];
} else {
return [[OSSV1Signer alloc] initWithSignerParams:signerParams];
}
}
+ (id<OSSRequestPresigner>)createRequestPresignerWithSignerVersion:(OSSSignVersion)signerVersion
signerParams:(OSSSignerParams *)signerParams {
if (signerVersion == OSSSignVersionV4) {
return [[OSSV4Signer alloc] initWithSignerParams:signerParams];
} else {
return [[OSSV1Signer alloc] initWithSignerParams:signerParams];
}
}
@end