UNPKG

acorn-api

Version:
107 lines 4.37 kB
"use strict"; /** * 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