const CONFIG = require('./config.js'); const SESSION_TIME = 2 * 1 * 60 * 60 * 1000; // 2h const SESSION_COOKIE = "_sessionId"; const crypto = require('crypto'); const ldapjs = require('ldapjs'); const ldap = ldapjs.createClient({ url: [ CONFIG.ldapUrl, CONFIG.ldapUrl ], reconnect: true }); const MD5 = require('./md5sum.js').string; let loggedCache = {}; let ldapReady = new Promise((ok, ko) => { ldap.on("error", (err) => { console.error("LDAP Error: " +err) }); ldap.bind(CONFIG.ldapBindDN, CONFIG.ldapBindPwd, (err) => { if (err) { console.error(err); ko(err); throw err; } console.log("LDAP is ready"); ok(); }); }); function getSessionId(cookieObject) { return cookieObject?.[SESSION_COOKIE]; } function getSessionObj(cookieObject) { let cookie = getSessionId(cookieObject); if (!cookie) return null; let sessionEntry = loggedCache[cookie]; const now = (new Date()).getTime(); if (!sessionEntry || sessionEntry.expire < now) return null; sessionEntry.expire = now + SESSION_TIME; return sessionEntry; } function getAccessList(cookieObject) { let session = getSessionObj(cookieObject); if (!session) return null; return session.accessList; } function getRequestIp(req) { return req.headers['x-forwarded-for'] || req.socket.remoteAddress; } function sign(msg) { return crypto.sign('sha256', Buffer.from(msg), decodeKey(CONFIG.privKey)).toString('base64'); } function Access() { } Access.prototype.id = function() { return ""; } function LinkAccess(linkId) { Access.call(this); this.linkId = linkId; } LinkAccess.prototype = Object.create(Access.prototype); LinkAccess.prototype.id = function() { return "LINK_"+this.linkId; } module.exports = { getAccessList: getAccessList, getRequestIp: getRequestIp, createSession: req => { const now = Date.now(); let sessionInfos = { loginDateTime: now, expire: now + SESSION_TIME, accessList: {}, random: Math.random(), userAgent: req.headers['user-agent'], ipAddress: getRequestIp(req) }; let sessionKey = MD5(JSON.stringify(sessionInfos)); sessionInfos.sessionId = sessionKey; loggedCache[sessionKey] = sessionInfos; req.cookies[SESSION_COOKIE] = sessionKey; return { key: sessionKey, accessList: sessionInfos.accessList }; }, addLinkToSession: (req, linkId) => { let session = getSessionObj(req.cookies); if (!session) return; let accessList = new LinkAccess(linkId); session.accessList[accessList.id()] = accessList; return session.accessList; }, removeFromSession: (req, accessId) => { let session = getSessionObj(req.cookies); if (!session) return; delete session.accessList[accessId]; return session.accessList; }, SESSION_COOKIE: SESSION_COOKIE };