security.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. const CONFIG = require('./config.js');
  2. const SESSION_TIME = 2 * 1 * 60 * 60 * 1000; // 2h
  3. const SESSION_COOKIE = "_sessionId";
  4. const crypto = require('crypto');
  5. const ldapjs = require('ldapjs');
  6. const ldap = ldapjs.createClient({
  7. url: [ CONFIG.ldapUrl, CONFIG.ldapUrl ],
  8. reconnect: true
  9. });
  10. const MD5 = require('./md5sum.js').string;
  11. const SessionModel = require('../model/session.js').SessionModel;
  12. let loggedCache = {};
  13. let ldapReady = new Promise((ok, ko) => {
  14. ldap.on("error", (err) => { console.error("LDAP Error: " +err) });
  15. ldap.bind(CONFIG.ldapBindDN, CONFIG.ldapBindPwd, (err) => {
  16. if (err) {
  17. console.error(err);
  18. ko(err);
  19. throw err;
  20. }
  21. console.log("LDAP is ready");
  22. ok();
  23. });
  24. });
  25. function getSessionId(cookieObject) {
  26. return cookieObject?.[SESSION_COOKIE];
  27. }
  28. function getSessionObj(cookieObject) {
  29. let cookie = getSessionId(cookieObject);
  30. if (!cookie)
  31. return null;
  32. let sessionEntry = loggedCache[cookie];
  33. const now = (new Date()).getTime();
  34. if (!sessionEntry || sessionEntry.expire < now)
  35. return null;
  36. sessionEntry.expire = now + SESSION_TIME;
  37. return sessionEntry;
  38. }
  39. function getAccessList(cookieObject) {
  40. let session = getSessionObj(cookieObject);
  41. if (!session)
  42. return null;
  43. return session.accessList;
  44. }
  45. function getRequestIp(req) {
  46. return req.headers['x-forwarded-for'] || req.socket.remoteAddress;
  47. }
  48. function sign(msg) {
  49. return crypto.sign('sha256', Buffer.from(msg), decodeKey(CONFIG.privKey)).toString('base64');
  50. }
  51. function Access() {
  52. }
  53. Access.prototype.id = function() { return ""; }
  54. function LinkAccess(linkId) {
  55. Access.call(this);
  56. this.linkId = linkId;
  57. }
  58. LinkAccess.prototype = Object.create(Access.prototype);
  59. LinkAccess.prototype.id = function() { return "LINK_"+this.linkId; }
  60. module.exports = {
  61. getAccessList: getAccessList,
  62. getRequestIp: getRequestIp,
  63. createSession: req => {
  64. const now = Date.now();
  65. let sessionInfos = {
  66. loginDateTime: now,
  67. expire: now + SESSION_TIME,
  68. accessList: {},
  69. random: Math.random(),
  70. userAgent: req.headers['user-agent'],
  71. ipAddress: getRequestIp(req)
  72. };
  73. let sessionKey = MD5(JSON.stringify(sessionInfos));
  74. sessionInfos.sessionId = sessionKey;
  75. loggedCache[sessionKey] = sessionInfos;
  76. req.cookies[SESSION_COOKIE] = sessionKey;
  77. return { key: sessionKey, accessList: sessionInfos.accessList };
  78. },
  79. addLinkToSession: (req, linkId) => {
  80. let session = getSessionObj(req.cookies);
  81. if (!session)
  82. return;
  83. let accessList = new LinkAccess(linkId);
  84. session.accessList[accessList.id()] = accessList;
  85. return session.accessList;
  86. },
  87. removeFromSession: (req, accessId) => {
  88. let session = getSessionObj(req.cookies);
  89. if (!session)
  90. return;
  91. delete session.accessList[accessId];
  92. return session.accessList;
  93. },
  94. SESSION_COOKIE: SESSION_COOKIE
  95. };