UNPKG

will-core

Version:
189 lines (188 loc) 8.38 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChangePasswordHandler = void 0; const will_sql_1 = require("will-sql"); const will_lib_1 = require("will-lib"); const will_api_1 = require("will-api"); const VerifyError_1 = require("../models/VerifyError"); const SchemeHandler_1 = require("./SchemeHandler"); const bcrypt = require('bcrypt'); class ChangePasswordHandler extends SchemeHandler_1.SchemeHandler { constructor() { super(...arguments); this.model = { name: "tuser", alias: { privateAlias: this.section } }; //declared addon actions name this.handlers = [{ name: "change" }, { name: "policy" }, { name: "policies" }]; } async change(context) { return this.callFunctional(context, { operate: "change", raw: false }, this.doChange); } async policy(context) { return this.callFunctional(context, { operate: "policy", raw: false }, this.doPolicy); } async policies(context) { return this.callFunctional(context, { operate: "policies", raw: false }, this.doPolicies); } async doChange(context, model) { let vi = this.validateParameters(context.params, "userid", "oldpassword", "userpassword", "confirmpassword"); if (!vi.valid) { return Promise.reject(new VerifyError_1.VerifyError("Parameter not found (" + vi.info + ")", will_api_1.HTTP.NOT_ACCEPTABLE, -16061)); } let puserid = context.params.userid; let poldpass = context.params.oldpassword; let puserpass = context.params.userpassword; let pcnfpass = context.params.confirmpassword; const atoken = await this.getAuthenToken(context, true, true); if (atoken == undefined) { return Promise.reject(new VerifyError_1.VerifyError("Token is invalid", will_api_1.HTTP.UNAUTHORIZED, -16031)); } let db = this.getPrivateConnector(model); try { let plib = new will_lib_1.PasswordLibrary(); let ut = await plib.getUserTokenInfo(db, atoken.identifier); if (!ut.userid) { return Promise.reject(new VerifyError_1.VerifyError("Token not found", will_api_1.HTTP.UNAUTHORIZED, -16003)); } puserid = ut.userid; let error = this.checkChangePassword(puserid, puserpass, pcnfpass); if (error) { return Promise.reject(error); } return await this.processChangePassword(db, puserid, puserpass, poldpass); } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } checkChangePassword(puserid, puserpass, pcnfpass) { if (puserid == null || puserid == "") { return new VerifyError_1.VerifyError("Invalid user or password", will_api_1.HTTP.NOT_ACCEPTABLE, -16033); } if (puserpass != pcnfpass) { return new VerifyError_1.VerifyError("Confirm Password Mismatch", will_api_1.HTTP.NOT_ACCEPTABLE, -16034); } if (puserpass == puserid) { return new VerifyError_1.VerifyError("Not allow password as same as user", will_api_1.HTTP.NOT_ACCEPTABLE, -16035); } if (puserpass.length < 3) { return new VerifyError_1.VerifyError("Password must be equal to or greater than 3 characters", will_api_1.HTTP.NOT_ACCEPTABLE, -16036); } return null; } async processChangePassword(db, puserid, puserpass, poldpass) { let sql = new will_sql_1.KnSQL("select tuser.site,tuser.username,tuser.userpassword,tuserinfo.activeflag "); sql.append("from tuser left join tuserinfo on tuserinfo.userid = tuser.userid "); sql.append("where tuser.userid = ?userid "); sql.set("userid", puserid); this.logger.info(this.constructor.name + ".processChangePassword", sql); let rs = await sql.executeQuery(db); this.logger.debug(this.constructor.name + ".processChangePassword: rs", rs.rows.length); if (rs.rows && rs.rows.length > 0) { let row = rs.rows[0]; if (puserpass == row.username) { return Promise.reject(new VerifyError_1.VerifyError("Not allow password as same as user", will_api_1.HTTP.NOT_ACCEPTABLE, -16035)); } if ("1" == row.activeflag) { return Promise.reject(new VerifyError_1.VerifyError("Not allow active directory user change password", will_api_1.HTTP.NOT_ACCEPTABLE, -16037)); } let usrpass = row.userpassword; let validpass = bcrypt.compareSync(poldpass, usrpass); if (!validpass) { return Promise.reject(new VerifyError_1.VerifyError("Invalid user or password", will_api_1.HTTP.NOT_ACCEPTABLE, -16033)); } else { let site = row.site; let verify = await this.changeUserPassword(db, puserid, poldpass, puserpass, site, new Date()); this.logger.debug(this.constructor.name + ".processChangePassword: verify", verify); if (verify && !verify.result) { return Promise.reject(new VerifyError_1.VerifyError(verify.msg, will_api_1.HTTP.NOT_ACCEPTABLE, verify.errno)); } } } else { return Promise.reject(new VerifyError_1.VerifyError("Invalid user or password", will_api_1.HTTP.NOT_ACCEPTABLE, -16033)); } return this.createRecordSet(); } async changeUserPassword(db, userid, pwd, newpwd, site, date) { let result = { result: false, msg: null, errno: 0, args: null }; try { await db.beginWork(); try { let plib = new will_lib_1.PasswordLibrary(); result = await plib.changePassword(db, site, userid, pwd, newpwd, date, '0'); this.logger.debug(this.constructor.name + ".changeUserPassword", result); await db.commitWork(); } catch (err) { this.logger.error(this.constructor.name, err); result.result = false; result.errno = -4000; if (err.errno) result.errno = err.errno; if (typeof err === "string") { result.msg = err; } else { result.msg = err.message; } await db.rollbackWork(); } } catch (ex) { this.logger.error(this.constructor.name, ex); result.result = false; result.errno = -4100; if (ex.errno) result.errno = ex.errno; if (typeof ex === "string") { result.msg = ex; } else { result.msg = ex.message; } } return Promise.resolve(result); } async doPolicy(context, model) { let db = this.getPrivateConnector(model); try { let plib = new will_lib_1.PasswordLibrary(); let policy = await plib.getPasswordPolicy(db); let policies = []; for (let p of policy) { policies.push(p.text); } return { policy: policies }; } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } async doPolicies(context, model) { let db = this.getPrivateConnector(model); try { let plib = new will_lib_1.PasswordLibrary(); return await plib.getPasswordPolicy(db); } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } } exports.ChangePasswordHandler = ChangePasswordHandler;