Skip to content

Instantly share code, notes, and snippets.

Created August 31, 2014 22:12
Show Gist options
  • Save anonymous/c40cdd99a826c06073aa to your computer and use it in GitHub Desktop.
Save anonymous/c40cdd99a826c06073aa to your computer and use it in GitHub Desktop.
Objective-C Powerschool login
#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:&regexError];
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