00001
00002
00003
00004
00005
00006
00007
00008
00009 #import "MoodleAuthenticator.h"
00010 #import "WIRemoting.h"
00011
00012 @implementation MoodleAuthenticator
00013
00014 - (id)initWithUsername:(NSString*)aUsername
00015 password:(NSString *)aPassword
00016 {
00017 self = [super init];
00018
00019 if (nil != self) {
00020 wrapper = [[RMResultDelegateWrapper alloc]
00021 initWithObject:self
00022 finished:@selector(getAuthenticationToken:)
00023 failed:@selector(failed:error:)];
00024
00025 username = [aUsername copy];
00026 password = [aPassword copy];
00027 sessionKey = nil;
00028 client = -1;
00029 }
00030
00031 return self;
00032 }
00033
00034 - (void) clear
00035 {
00036 client = -1;
00037 [sessionKey release];
00038 sessionKey = nil;
00039 }
00040
00041 - (void) dealloc
00042 {
00043 [wrapper release];
00044 [super dealloc];
00045 }
00046
00047 - (void) authenticateWithCall:(RMCall *)call
00048 {
00049 @synchronized(call.semaphore) {
00050 [call addDelegate:wrapper];
00051 if ([call call:@"login"
00052 arguments:[NSDictionary
00053 dictionaryWithObjectsAndKeys:
00054 username, @"username",
00055 password, @"password",
00056 nil]]) {
00057
00058 }
00059 [call removeDelegate:wrapper];
00060 }
00061 }
00062
00063 - (id<RMCallProtocol>) callProtocol
00064 {
00065 return self;
00066 }
00067
00068 - (BOOL) authenticateResponseString:(NSString *)responseString
00069 {
00070
00071 id r = [responseString JSONValue];
00072
00073 if ([r isKindOfClass:[NSDictionary class]]) {
00074 NSNumber *n = [r valueForKey:@"error"];
00075 NSDictionary *message = [r valueForKey:@"message"];
00076
00077 if (nil != n &&
00078 [n boolValue] &&
00079 nil != message &&
00080 [message isKindOfClass:[NSDictionary class]] &&
00081 [[message valueForKey:@"code"] isEqual:@"SOAP"] &&
00082 [[message valueForKey:@"string"] isEqual:@"Invalid username and / or password."]) {
00083 return NO;
00084 }
00085 else {
00086 return YES;
00087 }
00088 }
00089
00090 return NO;
00091 }
00092
00093 - (void) adjustRequest:(ASIFormDataRequest *)request
00094 method:(NSString *)method
00095 arguments:(NSDictionary *)arguments
00096 {
00097
00098 if (client != -1 && nil != sessionKey) {
00099 [request setPostValue:[NSNumber numberWithInt:client] forKey:@"client"];
00100 [request setPostValue:sessionKey forKey:@"sessionkey"];
00101 }
00102 }
00103
00104 #pragma mark authentication token
00105
00106 - (void) getAuthenticationToken: (RMResponse*) response
00107 {
00108 if (nil != sessionKey) {
00109 [sessionKey release];
00110 sessionKey = nil;
00111 client = -1;
00112 }
00113
00114 id r = [[response responseString] JSONValue];
00115 if (nil != r && [r isKindOfClass:[NSDictionary class]]) {
00116 NSNumber *n = (NSNumber*) [r valueForKey:@"client"];
00117 sessionKey = [[r valueForKey:@"sessionkey"] copy];;
00118 if (nil != n && nil != sessionKey) {
00119 client = [n intValue];
00120 }
00121 }
00122
00123 }
00124
00125 - (void) failed:(RMResponse*) response error:(NSError*) error
00126 {
00127 [sessionKey release];
00128 sessionKey = nil;
00129 client = -1;
00130 }
00131
00132 @end