CocoaShare/Classes/Dropbox/DropboxSDK/MPOAuth/MPOAuthCredentialConcreteStore.m

296 lines
8.5 KiB
Objective-C

//
// MPOAuthCredentialConcreteStore.m
// MPOAuthConnection
//
// Created by Karl Adam on 08.12.11.
// Copyright 2008 matrixPointer. All rights reserved.
//
#import "MPOAuthCredentialConcreteStore.h"
#import "MPURLRequestParameter.h"
#import "MPOAuthCredentialConcreteStore+KeychainAdditions.h"
#import "NSString+URLEscapingAdditions.h"
extern NSString * const MPOAuthCredentialRequestTokenKey;
extern NSString * const MPOAuthCredentialRequestTokenSecretKey;
extern NSString * const MPOAuthCredentialAccessTokenKey;
extern NSString * const MPOAuthCredentialAccessTokenSecretKey;
extern NSString * const MPOAuthCredentialSessionHandleKey;
@implementation MPOAuthCredentialConcreteStore
- (id)initWithCredentials:(NSDictionary *)inCredentials {
return [self initWithCredentials:inCredentials forBaseURL:nil];
}
- (id)initWithCredentials:(NSDictionary *)inCredentials forBaseURL:(NSURL *)inBaseURL {
return [self initWithCredentials:inCredentials forBaseURL:inBaseURL withAuthenticationURL:inBaseURL];
}
- (id)initWithCredentials:(NSDictionary *)inCredentials forBaseURL:(NSURL *)inBaseURL withAuthenticationURL:(NSURL *)inAuthenticationURL {
if ((self = [super init])) {
store = [[NSMutableDictionary alloc] initWithDictionary:inCredentials];
[self setBaseURL:inBaseURL];
[self setAuthenticationURL:inAuthenticationURL];
}
return self;
}
- (oneway void)dealloc {
[store release];
[baseURL release];
[authenticationURL release];
[super dealloc];
}
- (void)setStore:(NSMutableDictionary *)theStore {
[store release];
store = [theStore retain];
}
- (NSMutableDictionary *)store {
return store;
}
- (void)setBaseURL:(NSURL *)theURL {
[baseURL release];
baseURL = [theURL retain];
}
- (NSURL *)baseURL {
return baseURL;
}
- (void)setAuthenticationURL:(NSURL *)theURL {
[authenticationURL release];
authenticationURL = [theURL retain];
}
- (NSURL *)authenticationURL {
return authenticationURL;
}
#pragma mark -
- (NSString *)consumerKey {
return [store objectForKey:kMPOAuthCredentialConsumerKey];
}
- (NSString *)consumerSecret {
return [store objectForKey:kMPOAuthCredentialConsumerSecret];
}
- (NSString *)username {
return [store objectForKey:kMPOAuthCredentialUsername];
}
- (NSString *)password {
return [store objectForKey:kMPOAuthCredentialPassword];
}
- (NSString *)requestToken {
return [store objectForKey:kMPOAuthCredentialRequestToken];
}
- (void)setRequestToken:(NSString *)inToken {
if (inToken) {
[store setObject:inToken forKey:kMPOAuthCredentialRequestToken];
} else {
[store removeObjectForKey:kMPOAuthCredentialRequestToken];
[self removeValueFromKeychainUsingName:kMPOAuthCredentialRequestToken];
}
}
- (NSString *)requestTokenSecret {
return [store objectForKey:kMPOAuthCredentialRequestTokenSecret];
}
- (void)setRequestTokenSecret:(NSString *)inTokenSecret {
if (inTokenSecret) {
[store setObject:inTokenSecret forKey:kMPOAuthCredentialRequestTokenSecret];
} else {
[store removeObjectForKey:kMPOAuthCredentialRequestTokenSecret];
[self removeValueFromKeychainUsingName:kMPOAuthCredentialRequestTokenSecret];
}
}
- (NSString *)accessToken {
return [store objectForKey:kMPOAuthCredentialAccessToken];
}
- (void)setAccessToken:(NSString *)inToken {
if (inToken) {
[store setObject:inToken forKey:kMPOAuthCredentialAccessToken];
} else {
[store removeObjectForKey:kMPOAuthCredentialAccessToken];
[self removeValueFromKeychainUsingName:kMPOAuthCredentialAccessToken];
}
}
- (NSString *)accessTokenSecret {
return [store objectForKey:kMPOAuthCredentialAccessTokenSecret];
}
- (void)setAccessTokenSecret:(NSString *)inTokenSecret {
if (inTokenSecret) {
[store setObject:inTokenSecret forKey:kMPOAuthCredentialAccessTokenSecret];
} else {
[store removeObjectForKey:kMPOAuthCredentialAccessTokenSecret];
[self removeValueFromKeychainUsingName:kMPOAuthCredentialAccessTokenSecret];
}
}
- (NSString *)sessionHandle {
return [store objectForKey:kMPOAuthCredentialSessionHandle];
}
- (void)setSessionHandle:(NSString *)inSessionHandle {
if (inSessionHandle) {
[store setObject:inSessionHandle forKey:kMPOAuthCredentialSessionHandle];
} else {
[store removeObjectForKey:kMPOAuthCredentialSessionHandle];
[self removeValueFromKeychainUsingName:kMPOAuthCredentialSessionHandle];
}
}
#pragma mark -
- (NSString *)credentialNamed:(NSString *)inCredentialName {
return [store objectForKey:inCredentialName];
}
- (void)setCredential:(id)inCredential withName:(NSString *)inName {
[store setObject:inCredential forKey:inName];
[self addToKeychainUsingName:inName andValue:inCredential];
}
- (void)removeCredentialNamed:(NSString *)inName {
[store removeObjectForKey:inName];
[self removeValueFromKeychainUsingName:inName];
}
- (void)discardOAuthCredentials {
[self setRequestToken:nil];
[self setRequestTokenSecret:nil];
[self setAccessToken:nil];
[self setAccessTokenSecret:nil];
[self setSessionHandle:nil];
}
#pragma mark -
- (NSString *)tokenSecret {
NSString *tokenSecret = @"";
if ([self accessToken]) {
tokenSecret = [self accessTokenSecret];
} else if ([self requestToken]) {
tokenSecret = [self requestTokenSecret];
}
return tokenSecret;
}
- (NSString *)signingKey {
NSString *consumerSecret = [[self consumerSecret] stringByAddingURIPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *tokenSecret = [[self tokenSecret] stringByAddingURIPercentEscapesUsingEncoding:NSUTF8StringEncoding];
return [NSString stringWithFormat:@"%@%&%@", consumerSecret, tokenSecret];
}
#pragma mark -
- (NSString *)timestamp {
return [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];
}
- (NSString *)signatureMethod {
return [store objectForKey:kMPOAuthSignatureMethod];
}
- (NSArray *)oauthParameters {
NSMutableArray *oauthParameters = [[NSMutableArray alloc] initWithCapacity:5];
MPURLRequestParameter *tokenParameter = [self oauthTokenParameter];
[oauthParameters addObject:[self oauthConsumerKeyParameter]];
if (tokenParameter) [oauthParameters addObject:tokenParameter];
[oauthParameters addObject:[self oauthSignatureMethodParameter]];
[oauthParameters addObject:[self oauthTimestampParameter]];
[oauthParameters addObject:[self oauthNonceParameter]];
[oauthParameters addObject:[self oauthVersionParameter]];
return [oauthParameters autorelease];
}
- (void)setSignatureMethod:(NSString *)inSignatureMethod {
[store setObject:inSignatureMethod forKey:kMPOAuthSignatureMethod];
}
- (MPURLRequestParameter *)oauthConsumerKeyParameter {
MPURLRequestParameter *aRequestParameter = [[MPURLRequestParameter alloc] init];
aRequestParameter.name = @"oauth_consumer_key";
aRequestParameter.value = [self consumerKey];
return [aRequestParameter autorelease];
}
- (MPURLRequestParameter *)oauthTokenParameter {
MPURLRequestParameter *aRequestParameter = nil;
if ([self accessToken] || [self requestToken]) {
aRequestParameter = [[MPURLRequestParameter alloc] init];
aRequestParameter.name = @"oauth_token";
if ([self accessToken]) {
aRequestParameter.value = [self accessToken];
} else if ([self requestToken]) {
aRequestParameter.value = [self requestToken];
}
}
return [aRequestParameter autorelease];
}
- (MPURLRequestParameter *)oauthSignatureMethodParameter {
MPURLRequestParameter *aRequestParameter = [[MPURLRequestParameter alloc] init];
aRequestParameter.name = @"oauth_signature_method";
aRequestParameter.value = [self signatureMethod];
return [aRequestParameter autorelease];
}
- (MPURLRequestParameter *)oauthTimestampParameter {
MPURLRequestParameter *aRequestParameter = [[MPURLRequestParameter alloc] init];
aRequestParameter.name = @"oauth_timestamp";
aRequestParameter.value = [self timestamp];
return [aRequestParameter autorelease];
}
- (MPURLRequestParameter *)oauthNonceParameter {
MPURLRequestParameter *aRequestParameter = [[MPURLRequestParameter alloc] init];
aRequestParameter.name = @"oauth_nonce";
NSString *generatedNonce = nil;
CFUUIDRef generatedUUID = CFUUIDCreate(kCFAllocatorDefault);
generatedNonce = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, generatedUUID);
CFRelease(generatedUUID);
aRequestParameter.value = generatedNonce;
[generatedNonce release];
return [aRequestParameter autorelease];
}
- (MPURLRequestParameter *)oauthVersionParameter {
MPURLRequestParameter *versionParameter = [store objectForKey:@"versionParameter"];
if (!versionParameter) {
versionParameter = [[MPURLRequestParameter alloc] init];
versionParameter.name = @"oauth_version";
versionParameter.value = @"1.0";
[versionParameter autorelease];
}
return versionParameter;
}
@end