CocoaShare/Classes/Dropbox/DropboxSDK/MPOAuth/MPOAuthAPI.m
2011-02-01 10:19:26 -06:00

254 lines
8.8 KiB
Objective-C

//
// MPOAuthAPI.m
// MPOAuthConnection
//
// Created by Karl Adam on 08.12.05.
// Copyright 2008 matrixPointer. All rights reserved.
//
#import "MPOAuthAPIRequestLoader.h"
#import "MPOAuthAPI.h"
#import "MPOAuthCredentialConcreteStore.h"
#import "MPOAuthURLRequest.h"
#import "MPOAuthURLResponse.h"
#import "MPURLRequestParameter.h"
#import "MPOAuthAuthenticationMethod.h"
#import "NSURL+MPURLParameterAdditions.h"
NSString *kMPOAuthCredentialConsumerKey = @"kMPOAuthCredentialConsumerKey";
NSString *kMPOAuthCredentialConsumerSecret = @"kMPOAuthCredentialConsumerSecret";
NSString *kMPOAuthCredentialUsername = @"kMPOAuthCredentialUsername";
NSString *kMPOAuthCredentialPassword = @"kMPOAuthCredentialPassword";
NSString *kMPOAuthCredentialRequestToken = @"kMPOAuthCredentialRequestToken";
NSString *kMPOAuthCredentialRequestTokenSecret = @"kMPOAuthCredentialRequestTokenSecret";
NSString *kMPOAuthCredentialAccessToken = @"kMPOAuthCredentialAccessToken";
NSString *kMPOAuthCredentialAccessTokenSecret = @"kMPOAuthCredentialAccessTokenSecret";
NSString *kMPOAuthCredentialSessionHandle = @"kMPOAuthCredentialSessionHandle";
NSString *kMPOAuthSignatureMethod = @"kMPOAuthSignatureMethod";
NSString * const MPOAuthTokenRefreshDateDefaultsKey = @"MPOAuthAutomaticTokenRefreshLastExpiryDate";
@interface MPOAuthAPI ()
- (void)performMethod:(NSString *)inMethod atURL:(NSURL *)inURL withParameters:(NSArray *)inParameters withTarget:(id)inTarget andAction:(SEL)inAction usingHTTPMethod:(NSString *)inHTTPMethod;
@end
@implementation MPOAuthAPI
- (id)initWithCredentials:(NSDictionary *)inCredentials andBaseURL:(NSURL *)inBaseURL {
return [self initWithCredentials:inCredentials authenticationURL:inBaseURL andBaseURL:inBaseURL];
}
- (id)initWithCredentials:(NSDictionary *)inCredentials authenticationURL:(NSURL *)inAuthURL andBaseURL:(NSURL *)inBaseURL {
return [self initWithCredentials:inCredentials authenticationURL:inBaseURL andBaseURL:inBaseURL autoStart:YES];
}
- (id)initWithCredentials:(NSDictionary *)inCredentials authenticationURL:(NSURL *)inAuthURL andBaseURL:(NSURL *)inBaseURL autoStart:(BOOL)aFlag {
if (self = [super init]) {
[self setAuthenticationURL:inAuthURL];
[self setBaseURL:inBaseURL];
[self setAuthenticationState:MPOAuthAuthenticationStateUnauthenticated];
credentials = [[MPOAuthCredentialConcreteStore alloc] initWithCredentials:inCredentials forBaseURL:inBaseURL withAuthenticationURL:inAuthURL];
[self setAuthenticationMethod:[[MPOAuthAuthenticationMethod alloc] initWithAPI:self forURL:inAuthURL]];
[self setSignatureScheme:MPOAuthSignatureSchemeHMACSHA1];
activeLoaders = [[NSMutableArray alloc] initWithCapacity:10];
if (aFlag) {
[self authenticate];
}
}
return self;
}
- (oneway void)dealloc {
[credentials release];
[baseURL release];
[authenticationURL release];
[authenticationMethod release];
[activeLoaders release];
[super dealloc];
}
- (void)setCredentials:(id)theCredentials {
credentials = theCredentials;
}
- (id<MPOAuthCredentialStore,MPOAuthParameterFactory>)credentials {
return credentials;
}
- (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;
}
- (void)setAuthenticationMethod:(MPOAuthAuthenticationMethod *)theMethod {
[authenticationMethod release];
authenticationMethod = [theMethod retain];
}
- (MPOAuthAuthenticationMethod *)authenticationMethod {
return authenticationMethod;
}
- (void)setSignatureScheme:(MPOAuthSignatureScheme)theScheme {
signatureScheme = theScheme;
NSString *methodString = @"HMAC-SHA1";
switch (signatureScheme) {
case MPOAuthSignatureSchemePlainText:
methodString = @"PLAINTEXT";
break;
case MPOAuthSignatureSchemeRSASHA1:
methodString = @"RSA-SHA1";
case MPOAuthSignatureSchemeHMACSHA1:
default:
// already initted to the default
break;
}
[(MPOAuthCredentialConcreteStore *)credentials setSignatureMethod:methodString];
}
- (MPOAuthSignatureScheme)signatureScheme {
return signatureScheme;
}
- (void)setAuthenticationState:(MPOAuthAuthenticationState)theState {
oauthAuthenticationState = theState;
}
- (MPOAuthAuthenticationState)authenticationState {
return oauthAuthenticationState;
}
- (void)setActiveLoaders:(NSMutableArray *)theLoaders {
[activeLoaders release];
activeLoaders = [theLoaders retain];
}
- (NSMutableArray *)activeLoaders {
return activeLoaders;
}
#pragma mark -
- (void)authenticate {
NSAssert([credentials consumerKey], @"A Consumer Key is required for use of OAuth.");
[authenticationMethod authenticate];
}
- (BOOL)isAuthenticated {
return ([self authenticationState] == MPOAuthAuthenticationStateAuthenticated);
}
#pragma mark -
- (void)performMethod:(NSString *)inMethod withTarget:(id)inTarget andAction:(SEL)inAction {
[self performMethod:inMethod atURL:baseURL withParameters:nil withTarget:inTarget andAction:inAction usingHTTPMethod:@"GET"];
}
- (void)performMethod:(NSString *)inMethod atURL:(NSURL *)inURL withParameters:(NSArray *)inParameters withTarget:(id)inTarget andAction:(SEL)inAction {
[self performMethod:inMethod atURL:inURL withParameters:inParameters withTarget:inTarget andAction:inAction usingHTTPMethod:@"GET"];
}
- (void)performPOSTMethod:(NSString *)inMethod atURL:(NSURL *)inURL withParameters:(NSArray *)inParameters withTarget:(id)inTarget andAction:(SEL)inAction {
[self performMethod:inMethod atURL:inURL withParameters:inParameters withTarget:inTarget andAction:inAction usingHTTPMethod:@"POST"];
}
- (void)performMethod:(NSString *)inMethod atURL:(NSURL *)inURL withParameters:(NSArray *)inParameters withTarget:(id)inTarget andAction:(SEL)inAction usingHTTPMethod:(NSString *)inHTTPMethod {
if (!inMethod && ![inURL path] && ![inURL query]) {
[NSException raise:@"MPOAuthNilMethodRequestException" format:@"Nil was passed as the method to be performed on %@", inURL];
}
NSURL *requestURL = inMethod ? [NSURL URLWithString:inMethod relativeToURL:inURL] : inURL;
MPOAuthURLRequest *aRequest = [[MPOAuthURLRequest alloc] initWithURL:requestURL andParameters:inParameters];
MPOAuthAPIRequestLoader *loader = [[MPOAuthAPIRequestLoader alloc] initWithRequest:aRequest];
aRequest.HTTPMethod = inHTTPMethod;
loader.credentials = credentials;
loader.target = inTarget;
loader.action = inAction ? inAction : @selector(_performedLoad:receivingData:);
[loader loadSynchronously:NO];
// [activeLoaders addObject:loader];
[loader release];
[aRequest release];
}
- (void)performURLRequest:(NSURLRequest *)inRequest withTarget:(id)inTarget andAction:(SEL)inAction {
if (!inRequest && ![[inRequest URL] path] && ![[inRequest URL] query]) {
[NSException raise:@"MPOAuthNilMethodRequestException" format:@"Nil was passed as the method to be performed on %@", inRequest];
}
MPOAuthURLRequest *aRequest = [[MPOAuthURLRequest alloc] initWithURLRequest:inRequest];
MPOAuthAPIRequestLoader *loader = [[MPOAuthAPIRequestLoader alloc] initWithRequest:aRequest];
loader.credentials = credentials;
loader.target = inTarget;
loader.action = inAction ? inAction : @selector(_performedLoad:receivingData:);
[loader loadSynchronously:NO];
// [activeLoaders addObject:loader];
[loader release];
[aRequest release];
}
- (NSData *)dataForMethod:(NSString *)inMethod {
return [self dataForURL:baseURL andMethod:inMethod withParameters:nil];
}
- (NSData *)dataForMethod:(NSString *)inMethod withParameters:(NSArray *)inParameters {
return [self dataForURL:baseURL andMethod:inMethod withParameters:inParameters];
}
- (NSData *)dataForURL:(NSURL *)inURL andMethod:(NSString *)inMethod withParameters:(NSArray *)inParameters {
NSURL *requestURL = [NSURL URLWithString:inMethod relativeToURL:inURL];
MPOAuthURLRequest *aRequest = [[MPOAuthURLRequest alloc] initWithURL:requestURL andParameters:inParameters];
MPOAuthAPIRequestLoader *loader = [[MPOAuthAPIRequestLoader alloc] initWithRequest:aRequest];
loader.credentials = credentials;
[loader loadSynchronously:YES];
[loader autorelease];
[aRequest release];
return loader.data;
}
#pragma mark -
- (id)credentialNamed:(NSString *)inCredentialName {
return [credentials credentialNamed:inCredentialName];
}
- (void)setCredential:(id)inCredential withName:(NSString *)inName {
[(MPOAuthCredentialConcreteStore *)credentials setCredential:inCredential withName:inName];
}
- (void)removeCredentialNamed:(NSString *)inName {
[(MPOAuthCredentialConcreteStore *)credentials removeCredentialNamed:inName];
}
- (void)discardCredentials {
[credentials discardOAuthCredentials];
[self setAuthenticationState:MPOAuthAuthenticationStateUnauthenticated];
}
#pragma mark -
#pragma mark - Private APIs -
- (void)_performedLoad:(MPOAuthAPIRequestLoader *)inLoader receivingData:(NSData *)inData {
// NSLog(@"loaded %@, and got %@", inLoader, inData);
}
@end