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

141 lines
4.4 KiB
Mathematica
Raw Normal View History

2011-02-01 09:51:02 -06:00
//
// MPOAuthAuthenticationMethod.m
// MPOAuthConnection
//
// Created by Karl Adam on 09.12.19.
// Copyright 2009 matrixPointer. All rights reserved.
//
#import "MPOAuthAuthenticationMethod.h"
#import "MPOAuthAuthenticationMethodOAuth.h"
#import "MPOAuthCredentialConcreteStore.h"
#import "MPURLRequestParameter.h"
#import "NSURL+MPURLParameterAdditions.h"
NSString * const MPOAuthAccessTokenURLKey = @"MPOAuthAccessTokenURL";
@interface MPOAuthAuthenticationMethod ()
+ (Class)_authorizationMethodClassForURL:(NSURL *)inBaseURL withConfiguration:(NSDictionary **)outConfig;
- (id)initWithAPI:(MPOAuthAPI *)inAPI forURL:(NSURL *)inURL withConfiguration:(NSDictionary *)inConfig;
- (void)_automaticallyRefreshAccessToken:(NSTimer *)inTimer;
@end
@implementation MPOAuthAuthenticationMethod
- (id)initWithAPI:(MPOAuthAPI *)inAPI forURL:(NSURL *)inURL {
return [self initWithAPI:inAPI forURL:inURL withConfiguration:nil];
}
- (id)initWithAPI:(MPOAuthAPI *)inAPI forURL:(NSURL *)inURL withConfiguration:(NSDictionary *)inConfig {
if ([[self class] isEqual:[MPOAuthAuthenticationMethod class]]) {
NSDictionary *configuration = nil;
Class methodClass = [[self class] _authorizationMethodClassForURL:inURL withConfiguration:&configuration];
[self release];
self = [[methodClass alloc] initWithAPI:inAPI forURL:inURL withConfiguration:configuration];
} else if (self = [super init]) {
oauthAPI = inAPI;
}
return self;
}
- (oneway void)dealloc {
[oauthGetAccessTokenURL release];
[refreshTimer invalidate];
[refreshTimer release];
refreshTimer = nil;
[super dealloc];
}
- (void)setOauthAPI:(MPOAuthAPI *)theAPI {
oauthAPI = theAPI;
}
- (MPOAuthAPI *)oauthAPI {
return oauthAPI;
}
- (void)setOauthGetAccessTokenURL:(NSURL *)theURL {
[oauthGetAccessTokenURL release];
oauthGetAccessTokenURL = [theURL retain];
}
- (NSURL *)oauthGetAccessTokenURL {
return oauthGetAccessTokenURL;
}
#pragma mark -
+ (Class)_authorizationMethodClassForURL:(NSURL *)inBaseURL withConfiguration:(NSDictionary **)outConfig {
Class methodClass = [MPOAuthAuthenticationMethodOAuth class];
NSString *oauthConfigPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"oauthAutoConfig" ofType:@"plist"];
NSDictionary *oauthConfigDictionary = [NSDictionary dictionaryWithContentsOfFile:oauthConfigPath];
NSEnumerator *enumerator = [oauthConfigDictionary keyEnumerator];
NSString *domainString = nil;
while (domainString = [enumerator nextObject]) {
if ([inBaseURL domainMatches:domainString]) {
NSDictionary *oauthConfig = [oauthConfigDictionary objectForKey:domainString];
NSArray *requestedMethods = [oauthConfig objectForKey:@"MPOAuthAuthenticationPreferredMethods"];
NSString *requestedMethod = nil;
for (int i=0; i<[requestedMethods count]; i++) {
requestedMethod = [requestedMethods objectAtIndex:i];
Class requestedMethodClass = NSClassFromString(requestedMethod);
if (requestedMethodClass) {
methodClass = requestedMethodClass;
}
break;
}
if (requestedMethod) {
*outConfig = [oauthConfig objectForKey:requestedMethod];
} else {
*outConfig = oauthConfig;
}
break;
}
}
return methodClass;
}
#pragma mark -
- (void)authenticate {
[NSException raise:@"Not Implemented" format:@"All subclasses of MPOAuthAuthenticationMethod are required to implement -authenticate"];
}
- (void)setTokenRefreshInterval:(NSTimeInterval)inTimeInterval {
if (refreshTimer==nil && inTimeInterval > 0.0) {
refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:inTimeInterval target:self selector:@selector(_automaticallyRefreshAccessToken:) userInfo:nil repeats:YES] retain];
}
}
- (void)refreshAccessToken {
MPURLRequestParameter *sessionHandleParameter = nil;
MPOAuthCredentialConcreteStore *credentials = (MPOAuthCredentialConcreteStore *)[oauthAPI credentials];
if (credentials.sessionHandle) {
sessionHandleParameter = [[MPURLRequestParameter alloc] init];
sessionHandleParameter.name = @"oauth_session_handle";
sessionHandleParameter.value = credentials.sessionHandle;
}
[oauthAPI performMethod:nil
atURL:oauthGetAccessTokenURL
withParameters:sessionHandleParameter ? [NSArray arrayWithObject:sessionHandleParameter] : nil
withTarget:nil
andAction:nil];
[sessionHandleParameter release];
}
#pragma mark -
- (void)_automaticallyRefreshAccessToken:(NSTimer *)inTimer {
[self refreshAccessToken];
}
@end