2011-02-01 09:51:02 -06:00
|
|
|
//
|
|
|
|
// 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 {
|
2011-02-12 09:17:28 -06:00
|
|
|
if ((self = [super init])) {
|
2011-02-01 09:51:02 -06:00
|
|
|
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
|