-
-
Save anonymous/c40cdd99a826c06073aa to your computer and use it in GitHub Desktop.
Objective-C Powerschool login
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <Foundation/Foundation.h> | |
#import <CommonCrypto/CommonCrypto.h> | |
#import "NSString+MyAdditions.h" | |
#define POWERSCHOOL_TOKEN_DATA 0 | |
#define POWERSCHOOL_CONTEXT_DATA 1 | |
NSArray* getAuthData() | |
{ | |
NSMutableArray *authData = [NSMutableArray array]; | |
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://psgk.schoolname.org:8081/guardian/home.html"]]; | |
[request setHTTPShouldHandleCookies:YES]; | |
[request setHTTPMethod:@"GET"]; | |
NSURLResponse *response; | |
NSError *connectionError; | |
NSString *dataString = nil; | |
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&connectionError]; | |
if (!connectionError) | |
{ | |
NSArray *findHiddenValuesWithIds = @[@"pstoken", @"contextData"]; | |
dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; | |
for (NSString *hiddenValueId in findHiddenValuesWithIds) | |
{ | |
NSString *pattern = [NSString stringWithFormat:@"<input type=\"hidden\" name=\"%@\" value=\"(.*?)\" \\/>", hiddenValueId]; | |
NSError *regexError; | |
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:®exError]; | |
if (!regexError) | |
{ | |
NSArray *matches = [regex matchesInString:dataString options:0 range:NSMakeRange(0, [dataString length])]; | |
for (NSTextCheckingResult *match in matches) | |
{ | |
NSRange matchRange = [match rangeAtIndex:1]; | |
NSString *matchString = [dataString substringWithRange:matchRange]; | |
[authData addObject:matchString]; | |
} | |
} | |
} | |
} | |
return authData; | |
} | |
void doPCASLogin(NSString *username, NSString* password) | |
{ | |
password = [password lowercaseString]; | |
NSArray *authData = getAuthData(); | |
NSMutableString *hmacPassword = [NSMutableString stringWithString:[password hmacMD5WithData:[authData objectAtIndex:POWERSCHOOL_CONTEXT_DATA]]]; | |
[hmacPassword replaceOccurrencesOfString:@"=" withString:@"" options:0 range:NSMakeRange(0, [hmacPassword length])]; | |
NSMutableDictionary *fields = [NSMutableDictionary dictionary]; | |
[fields setValue:[authData objectAtIndex:POWERSCHOOL_TOKEN_DATA] forKey:@"pstoken"]; | |
[fields setValue:[authData objectAtIndex:POWERSCHOOL_CONTEXT_DATA] forKey:@"contextData"]; | |
[fields setValue:@"guardian/home.html" forKey:@"returnUrl"]; | |
[fields setValue:@"PS Parent Portal" forKey:@"serviceName"]; | |
[fields setValue:@"" forKey:@"serviceTicket"]; | |
[fields setValue:@"/" forKey:@"pcasServerUrl"]; | |
[fields setValue:@"User Id and Password Credential" forKey:@"credentialType"]; | |
[fields setValue:username forKey:@"account"]; | |
[fields setValue:hmacPassword forKey:@"pw"]; | |
NSArray *postStringOrder = @[@"pstoken", @"contextData", @"returnUrl", @"serviceName", @"serviceTicket", @"pcasServerUrl", @"credentialType", @"account", @"pw"]; | |
NSMutableString *postString = [NSMutableString string]; | |
for (NSString *fieldName in postStringOrder) | |
{ | |
[postString appendFormat:@"%@=%@&", fieldName, [fields objectForKey:fieldName]]; | |
} | |
postString = [NSMutableString stringWithString:[postString substringToIndex:[postString length] - 1]]; | |
NSURL *loginUrl = [NSURL URLWithString:@"http://psgk.schoolname.org:8081/guardian/home.html"]; | |
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:loginUrl]; | |
request.timeoutInterval = 10; | |
request.HTTPShouldHandleCookies = YES; | |
request.HTTPMethod = @"POST"; | |
request.HTTPBody = [postString dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO]; | |
NSURLResponse *response; | |
NSError *responseError; | |
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&responseError]; | |
if (responseData != nil) | |
{ | |
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; | |
NSLog(@"%@", responseString); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment