will-core
Version:
core module
189 lines (188 loc) • 8.38 kB
JavaScript
"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;