will-core
Version:
core module
192 lines (191 loc) • 8.97 kB
JavaScript
"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;