UNPKG

@scefira/dfw-nodejs

Version:
174 lines (141 loc) 5.68 kB
import uuidv4 from "uuid/v4"; import dfw_user from "../../model/dfw_user.model"; import dfw_session from "../../model/dfw_session.model"; import DFWUtils from "../DFWUtils"; import dfw_credential from "../../model/dfw_credential.model"; import { DFWScheme } from "../.."; import DFWModule from "./DFWModule"; import { Op } from "sequelize"; import moment from "moment"; export default class SessionManager extends DFWModule{ public constructor(dfw){ super(dfw); setInterval(()=>{ // Clear expired files each 6 hours this.sweepSessionsAsync(); },1000*60*60*6); } /** * * @param dfw */ public async touchAsync(dfw:DFWScheme){ dfw.session = { isLogged:false, model:{} as any, loginAsync: async (options:DFWLoginParams) => { return await this.loginAsync(dfw,options) }, logoutAsync: async ()=>{ return await this.logoutAsync(dfw); } } if(dfw.request.cookies === undefined || dfw.request.cookies === null || dfw.request.cookies.sid === undefined || dfw.request.cookies.stk === undefined){ dfw.session.model = await this.regenerateSessionAsync(dfw); }else{ dfw.session.sid = dfw.request.cookies.sid; dfw.session.stk = dfw.request.cookies.stk; let cSession:dfw_session|null = await dfw.db.retriveModel(dfw_session).findOne({ where : { id: dfw.session.sid as number }, include : [ { model: dfw.db.retriveModel(dfw_user) , include : [ dfw.db.retriveModel(dfw_credential) ]} ] }) // Current session if(cSession == null || cSession == undefined || cSession.token !== dfw.request.cookies.stk){ dfw.session.model = await this.regenerateSessionAsync(dfw); }else{ dfw.session.model = cSession; } } /// new session data dfw.session.model.expire = moment().add(3,"days").toDate(); // Caducidad dfw.session.model.agent = dfw.request.headers['user-agent']?dfw.request.headers['user-agent']:""; dfw.session.model.ip = dfw.request.ip; dfw.session.model.site = dfw.request.originalUrl; dfw.session.model.expire = moment().add(3,"days").toDate(); dfw.session.model.save(); await this.setCurrentSessionData(dfw); } /** * * @param dfw */ private async setCurrentSessionData(dfw:DFWScheme){ dfw.session.sid = dfw.session.model.id; dfw.session.stk = dfw.session.model.token; dfw.session.isLogged = dfw.session.model.idUser !== 0 && dfw.session.model.idUser !== null && dfw.session.model.idUser !== undefined; if(dfw.session.isLogged === false && dfw.session.model !== undefined){ dfw.session.model.idUser = null; dfw.session.model.user = null; } } /** * * @param dfw */ public async sweepSessionsAsync(){ this.DFWInstance.getDatabase().retriveModel(dfw_session).destroy({ where:{ expire: { [Op.lt] : moment().toDate() }, } }) } /** * * @param dfw */ private async regenerateSessionAsync(dfw:DFWScheme):Promise<dfw_session>{ var stk = uuidv4(); var session:dfw_session = await dfw.db.retriveModel(dfw_session).create({ token: stk, }) dfw.response.cookie("sid",session.id); dfw.response.cookie("stk",stk); dfw.session = { sid : session.id , stk , isLogged: false , model : session } as any return session; } /** * * @param dfw * @param options */ public async loginAsync(dfw:DFWScheme,options:DFWLoginParams):Promise<boolean>{ if(options.user === null || options.user === undefined || options.password === undefined || options.password === null){ // Seguridad, validación de campos de identificador vacio return false; } // Retrive user with credentials var user = await dfw.db.entityHandler.dfw_user.findAsync(options.user, [ dfw.db.retriveModel(dfw_credential) ]); if(user !== null){ if(user.checkPassword(options.password) === true){ dfw.session.model.user = user; dfw.session.model.idUser = user.id; dfw.session.model = await dfw.session.model.save(); await this.setCurrentSessionData(dfw); return true; } } await DFWUtils.sleepAsync(2500); return false; } public async logoutAsync(dfw:DFWScheme):Promise<boolean>{ if( dfw.session.model !== undefined ){ dfw.session.model.idUser = null; dfw.session.model.user = null; await dfw.session.model.save(); await this.setCurrentSessionData(dfw); return true; } await this.setCurrentSessionData(dfw); return false; } } export interface DFWSessionSchema{ sid?:number; stk?:string; isLogged:boolean; model:dfw_session; // Modelo de la sessión loginAsync:(params:DFWLoginParams)=>Promise<boolean> logoutAsync:()=>Promise<boolean> } export interface DFWLoginParams{ user:string|number; password:string; remember?:boolean; }