UNPKG

will-core

Version:
194 lines (193 loc) 9.25 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ForgotPasswordHandler = void 0; const will_sql_1 = require("will-sql"); const will_lib_1 = require("will-lib"); const will_api_1 = require("will-api"); const will_util_1 = require("will-util"); const VerifyError_1 = require("../models/VerifyError"); const NotifyConfig_1 = require("../utils/NotifyConfig"); const SchemeHandler_1 = require("./SchemeHandler"); class ForgotPasswordHandler extends SchemeHandler_1.SchemeHandler { constructor() { super(...arguments); this.model = { name: "tuser", alias: { privateAlias: this.section } }; //declared addon actions name this.handlers = [{ name: "password" }]; } async password(context) { return this.callFunctional(context, { operate: "password", raw: false }, this.doPassword); } async doPassword(context, model) { let pemail = context.params.email; let psecurecode = context.params.securecode; let pcapid = context.params.capid; if (!pemail || pemail.trim().length == 0) { return Promise.reject(new VerifyError_1.VerifyError("Email not defined", will_api_1.HTTP.NOT_ACCEPTABLE, -16050)); } if ((!pcapid || pcapid.trim().length == 0) || (!psecurecode || psecurecode.trim().length == 0)) { return Promise.reject(new VerifyError_1.VerifyError("Answer code not defined", will_api_1.HTTP.NOT_ACCEPTABLE, -16051)); } let db = this.getPrivateConnector(model); try { let caplib = new will_lib_1.CaptchaLibrary(); let valid = await caplib.verifyCaptcha(db, pcapid, psecurecode); if (!valid) { return Promise.reject(new VerifyError_1.VerifyError("Secure code is invalid", will_api_1.HTTP.NOT_ACCEPTABLE, -16052)); } let date = new Date(); let userinfo = await this.getUserInfoByEmail(db, pemail, context); if (userinfo.found) { let verify = await this.performForgotPassword(context, model, db, userinfo, date); if (!verify.result) { return Promise.reject(new VerifyError_1.VerifyError(verify.msg, will_api_1.HTTP.NOT_ALLOWED, verify.errno)); } return verify; } else { return Promise.reject(new VerifyError_1.VerifyError("User not found", will_api_1.HTTP.NOT_ACCEPTABLE, -16053)); } } catch (ex) { this.logger.error(this.constructor.name, ex); return Promise.reject(this.getDBError(ex)); } finally { if (db) db.close(); } } async getUserInfoByEmail(db, email, context) { let userinfo = { found: false, userid: "", email: email }; let sql = new will_sql_1.KnSQL("select tuser.site,tuser.userid,tuser.username,tuserinfo.email,"); sql.append("tuserinfo.userename,tuserinfo.useresurname,tuserinfo.usertname,tuserinfo.usertsurname "); sql.append("from tuser,tuserinfo "); sql.append("where tuser.userid = tuserinfo.userid "); sql.append("and tuserinfo.email = ?email "); sql.set("email", email); this.logger.info(this.constructor.name + ".getUserInfoByEmail", sql); let rs = await sql.executeQuery(db, context); this.logger.debug(this.constructor.name + ".getUserInfoByEmail", "effected " + rs.rows.length + " rows"); if (rs.rows && rs.rows.length > 0) { let row = rs.rows[0]; userinfo.found = true; userinfo.site = row.site; userinfo.userid = row.userid; userinfo.username = row.username; userinfo.email = row.email; userinfo.usernameen = (row.userename ? row.userename : "") + " " + (row.useresurname ? row.useresurname : ""); userinfo.usernameth = (row.usertname ? row.usertname : "") + " " + (row.usertsurname ? row.usertsurname : ""); } return userinfo; } async getUserInfoById(db, id, context) { let userinfo = { found: false, userid: id, email: "" }; let sql = new will_sql_1.KnSQL("select tuser.site,tuser.userid,tuser.username,tuserinfo.email,"); sql.append("tuserinfo.userename,tuserinfo.useresurname,tuserinfo.usertname,tuserinfo.usertsurname "); sql.append("from tuser,tuserinfo "); sql.append("where tuser.userid = tuserinfo.userid "); sql.append("and tuser.userid = ?userid "); sql.set("userid", id); this.logger.info(this.constructor.name + ".getUserInfoById", sql); let rs = await sql.executeQuery(db, context); this.logger.debug(this.constructor.name + ".getUserInfoById", "effected " + rs.rows.length + " rows"); if (rs.rows && rs.rows.length > 0) { let row = rs.rows[0]; userinfo.found = true; userinfo.site = row.site; userinfo.userid = row.userid; userinfo.username = row.username; userinfo.email = row.email; userinfo.usernameen = (row.userename ? row.userename : "") + " " + (row.useresurname ? row.useresurname : ""); userinfo.usernameth = (row.usertname ? row.usertname : "") + " " + (row.usertsurname ? row.usertsurname : ""); } return userinfo; } async composeMailMessage(db, record, eng = true, template = "USER_FORGOT", templatetype = "MAIL_NOTIFY") { let msg = undefined; let noti = new NotifyConfig_1.NotifyConfig(); let tmp = await noti.getConfigTemplate(db, template, templatetype); if (tmp) { msg = eng ? tmp.contents : tmp.contexts; } if (!msg || msg.trim().length == 0) { msg = "Dear, ${userfullname}.<br/>"; msg += "Confirm your password was changed.<br/><br/>"; msg += "user = ${username}<br/>"; msg += "password = ${userpassword}<br/><br/>"; msg += "yours sincerely,<br/>"; msg += "Administrator<br/>"; } return [will_util_1.Utilities.translateVariables(msg, record), tmp]; } async performForgotPassword(context, model, db, userinfo, date) { let verify = await this.forgotPassword(db, userinfo, date); this.logger.debug(this.constructor.name + ".performForgotPassword: verify", verify); if (!verify.result) { return Promise.reject(new VerifyError_1.VerifyError(verify.msg, will_api_1.HTTP.NOT_ACCEPTABLE, verify.errno)); } else { this.logger.debug(this.constructor.name + ".performForgotPassword: send mail", userinfo.username + " : " + userinfo.usernameen); let record = { userfullname: userinfo.usernameen, username: userinfo.username, userpassword: verify.args }; let [msg, tmp] = await this.composeMailMessage(db, record, userinfo.info?.eng); this.doSendMail(context, model, { email: userinfo.email, subject: tmp ? tmp.subjecttitle : "Confirm Password Changed", message: msg }); } return Promise.resolve(verify); } async doSendMail(context, model, info) { let db = this.getPrivateConnector(model); try { await will_lib_1.MailLibrary.sendMail(info, db); } catch (ex) { this.logger.error(this.constructor.name, this.constructor.name, ex); } finally { if (db) db.close(); } } async forgotPassword(db, info, date) { let result = { result: false, msg: null, errno: 0, args: null }; try { await db.beginWork(); try { let pwd = will_lib_1.PasswordLibrary.createNewPassword(); let plib = new will_lib_1.PasswordLibrary(); await plib.updateTemporaryPassword(db, info.userid, pwd, info.site, date); await db.commitWork(); result.result = true; result.args = pwd; } catch (err) { this.logger.error(this.constructor.name, err); result.result = false; result.errno = -5000; 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 = -5100; if (ex.errno) result.errno = ex.errno; if (typeof ex === "string") { result.msg = ex; } else { result.msg = ex.message; } } return Promise.resolve(result); } } exports.ForgotPasswordHandler = ForgotPasswordHandler;