security.js 3.0 KB

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