UNPKG

will-core

Version:
192 lines (191 loc) 8.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.LoginHandler = void 0; const will_sql_1 = require("will-sql"); const will_lib_1 = require("will-lib"); const will_api_1 = require("will-api"); const uuid_1 = require("uuid"); const VerifyError_1 = require("../models/VerifyError"); const SchemeHandler_1 = require("./SchemeHandler"); const SigninHandler_1 = require("./SigninHandler"); class LoginHandler extends SchemeHandler_1.SchemeHandler { constructor() { super(...arguments); this.model = { name: "tusertoken", alias: { privateAlias: this.section } }; //declared addon actions name this.handlers = [{ name: "logincallback" }, { name: "logoutcallback" }, { name: "anonymouslogin" }]; } async logincallback(context) { return this.callFunctional(context, { operate: "logincallback", raw: false }, this.doLoginCallback); } async logoutcallback(context) { return this.callFunctional(context, { operate: "logoutcallback", raw: false }, this.doLogoutCallback); } async anonymouslogin(context) { return this.callFunctional(context, { operate: "anonymouslogin", raw: false }, this.doAnonymousLogin); } async doLoginCallback(context, model) { let pcode = context.params.code; let pnonce = context.params.nonce; let ptoken = context.params.token; let pplayUri = context.params.playUri; this.logger.debug(this.constructor.name + ".doLoginCallback : uri=" + pplayUri + ", token=" + ptoken); if (ptoken != undefined) { const atoken = will_lib_1.AuthenToken.verifyAuthenToken(ptoken, false); if (atoken.identifier == undefined) { return Promise.reject(new VerifyError_1.VerifyError("Token undefined", will_api_1.HTTP.UNAUTHORIZED, -16071)); } let db = this.getPrivateConnector(model); try { return await this.processLogin(context, db, atoken.identifier, ptoken); } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } else { if (pnonce == undefined) { return Promise.reject(new VerifyError_1.VerifyError("Bad request", will_api_1.HTTP.BAD_REQUEST, -16072)); } let db = this.getPrivateConnector(model); try { return await this.processLoginByNonce(context, db, "" + pnonce, "" + pcode); } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } } async processLogin(context, db, useruuid, token) { this.logger.debug(this.constructor.name + ".processLogin: uuid=" + useruuid); let sql = new will_sql_1.KnSQL("select tusertoken.*,tuserinfo.userename,tuserinfo.useresurname,tuserinfo.email,tuserinfo.displayname,tuserinfo.usercontents "); sql.append("from tusertoken,tuserinfo "); sql.append("where tusertoken.useruuid = ?useruuid "); sql.append("and tusertoken.userid = tuserinfo.userid "); sql.set("useruuid", useruuid); this.logger.info(this.constructor.name + ".processLogin", sql); let rs = await sql.executeQuery(db, context); this.logger.debug(this.constructor.name + ".processLogin", "effected " + rs.rows.length + " rows."); if (rs.rows && rs.rows.length > 0) { return Promise.resolve(this.composeResponseInfo(rs.rows[0])); } else { return Promise.reject(new VerifyError_1.VerifyError("Not found", will_api_1.HTTP.UNAUTHORIZED, -16073)); } } composeResponseInfo(row) { let userinfo = {}; if (row.usercontents && row.usercontents.trim().length > 0) { userinfo = JSON.parse(row.usercontents); } this.logger.debug(this.constructor.name + ".composeResponseInfo: userinfo", userinfo); let accessinfo = {}; if (row.accesscontents && row.accesscontents.trim().length > 0) { accessinfo = JSON.parse(row.accesscontents); } this.logger.debug(this.constructor.name + ".composeResponseInfo: accessinfo", accessinfo); let response = { authToken: row.authtoken, userUuid: row.useruuid, textures: [], email: row.email, displayName: row.displayname, userPrincipalName: row.userename + " " + row.useresurname, userContents: userinfo, accessContents: accessinfo, info: { prime: row.prime, generator: row.generator, publickey: row.publickey, } }; return response; } async processLoginByNonce(context, db, nonce, code) { this.logger.debug(this.constructor.name + ".processLoginByNonce: nonce=" + nonce + ", code=" + code); let sql = new will_sql_1.KnSQL("select tusertoken.*,tuserinfo.userename,tuserinfo.useresurname,tuserinfo.email,tuserinfo.displayname,tuserinfo.usercontents "); sql.append("from tusertoken,tuserinfo "); sql.append("where tusertoken.nonce = ?nonce "); sql.append("and tusertoken.outdate is null and tusertoken.outtime is null "); sql.append("and tusertoken.userid = tuserinfo.userid "); sql.set("nonce", nonce); this.logger.info(this.constructor.name + ".processLoginByNonce", sql); let rs = await sql.executeQuery(db, context); this.logger.debug(this.constructor.name + ".processLoginByNonce", "effected " + rs.rows.length + " rows."); if (rs.rows && rs.rows.length > 0) { return Promise.resolve(this.composeResponseInfo(rs.rows[0])); } else { return Promise.reject(new VerifyError_1.VerifyError("Not found", will_api_1.HTTP.UNAUTHORIZED, -16074)); } } async doLogoutCallback(context, model) { let ptoken = context.params.token; this.logger.debug(this.constructor.name + ".doLogoutCallback : token=" + ptoken); let response = { authToken: ptoken ? ptoken : "" }; this.logger.debug(this.constructor.name + ".doLogoutCallback", response); if (ptoken != undefined) { let db = this.getPrivateConnector(model); try { await this.processLogout(db, "" + ptoken, context); } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } return Promise.resolve(response); } async processLogout(db, token, context) { let now = new Date(); let sql = new will_sql_1.KnSQL("update tusertoken set outdate = ?outdate, outtime = ?outtime "); sql.append("where authtoken = ?authtoken "); sql.set("outdate", now, "DATE"); sql.set("outtime", now, "TIME"); sql.set("authtoken", token); this.logger.info(this.constructor.name + ".processLogout", sql); let rs = await sql.executeQuery(db, context); this.logger.debug(this.constructor.name + ".processLogout", "affected " + rs.rows.affectedRows + " rows."); return Promise.resolve(rs); } doAnonymousLogin(context, model) { let identifier = (0, uuid_1.v4)(); let site = context.params.site; let accessor = context.params.accessor; let authdata = { identifier, site, accessor }; let authtoken = will_lib_1.AuthenToken.createAuthenToken(authdata); let response = { userUuid: identifier, authToken: authtoken }; this.saveAnonymousToken(context, model, authdata, authtoken); return Promise.resolve(response); } async saveAnonymousToken(context, model, authdata, authtoken) { let db = this.getPrivateConnector(model); try { let handler = new SigninHandler_1.SigninHandler(); return await handler.createUserToken(db, { userid: authdata.accessor, site: authdata.site }, authdata.identifier, authtoken, "A"); } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } } exports.LoginHandler = LoginHandler;