will-core
Version:
core module
194 lines (193 loc) • 9.25 kB
JavaScript
"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;