acorn-api
Version:
University of Toronto Acorn API
107 lines • 4.37 kB
JavaScript
;
/**
* This Class provides basic acorn actions
*
* Created by Charlie on 2017-09-22.
*/
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const rp = require("request-promise");
const libxmljs = require("libxmljs");
const AcornError_1 = require("./AcornError");
const AcornAPI_1 = require("./AcornAPI");
const ACORN_HOST = "https://acorn.utoronto.ca";
const urlTable = {
"authURL1": ACORN_HOST + "/sws",
"authURL2": "https://weblogin.utoronto.ca/",
"authURL3": "https://idp.utorauth.utoronto.ca/PubCookie.reply",
"acornURL": ACORN_HOST + "/spACS"
};
const formHeader = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36',
'content-type': 'application/x-www-form-urlencoded',
'Accept': 'text/html'
};
class BasicAcornAPI extends AcornAPI_1.BaseAcornAPI {
/**
* Login to Acorn
* @throws AcornError throw AcornError if login failed
* @returns Boolean will be true if all processes goes properly
*/
login(user, pass) {
return __awaiter(this, void 0, void 0, function* () {
let body = yield rp.get({
uri: urlTable.authURL1,
jar: this.state.cookieJar
});
body = yield rp.post({
uri: urlTable.authURL2,
jar: this.state.cookieJar,
headers: formHeader,
form: BasicAcornAPI.extractFormData(body),
});
let loginInfo = BasicAcornAPI.extractFormData(body);
loginInfo['user'] = user;
loginInfo['pass'] = pass;
body = yield rp.post({
uri: urlTable.authURL2,
jar: this.state.cookieJar,
headers: formHeader,
form: loginInfo,
});
if (body.search('Authentication failed') > -1)
throw new AcornError_1.AcornError('Invalid Identity');
body = yield rp.post({
uri: urlTable.authURL3,
jar: this.state.cookieJar,
headers: formHeader,
form: BasicAcornAPI.extractFormData(body),
followAllRedirects: true
});
if (body.search('<h1>A problem has occurred</H1>') > -1)
throw new AcornError_1.AcornError('A problem has occurred');
body = yield rp.post({
uri: urlTable.acornURL,
jar: this.state.cookieJar,
headers: formHeader,
form: BasicAcornAPI.extractFormData(body),
followAllRedirects: true
});
if (!(body.search('<title>ACORN</title>') > -1))
throw new AcornError_1.AcornError('Acorn Unavailable Now');
// TODO check cookie to verify whether logged in
this.state.isLoggedIn = true;
return true;
});
}
/**
* Extract data from fields of all existing forms from HTML string or dom
* Helper method to facilitate auth process
* @param doc HTML Document or HTML string
* @return LooseObj loose javascript object
*/
static extractFormData(doc) {
let sanctifiedDoc;
if (typeof doc === 'string') {
sanctifiedDoc = libxmljs.parseHtml(doc);
}
else {
sanctifiedDoc = doc;
}
const inputs = sanctifiedDoc.find('//form//input[@type="hidden"]');
let result = {};
for (let input of inputs) {
result[input.attr('name').value()] = input.attr('value') ? input.attr('value').value() : "";
}
return result;
}
}
exports.BasicAcornAPI = BasicAcornAPI;
//# sourceMappingURL=BasicAcornAPI.js.map