Ohm-Management - Projektarbeit B-ME
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

authorization.js 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Original file created by Prof.Dr. Matthias Hopf
  2. /*
  3. * Authorization
  4. */
  5. var common, Users;
  6. const ldap = require ('./ldap_ohm'),
  7. crypto = require ('./crypto'),
  8. dbs = require ('./dbs');
  9. // deactivated is not used yet
  10. const serverVisibleSession = { user: true, name: true, type: true, mail: true, roles: true, gender: true, deactivated: true, host: true };
  11. const clientVisibleSession = { user: true, name: true, type: true, mail: true, roles: true, gender: true };
  12. // Fill in session object
  13. function fillSession (req, user, roles, cb) {
  14. if (req.session === undefined)
  15. next (common.genError (500, "Error"));
  16. // regenerate a new session-id with clean instance
  17. req.session.regenerate (function (err) {
  18. if (user !== undefined && ! err) {
  19. common.shallowCopy (user, serverVisibleSession, {roles: true}, req.session);
  20. console.info(req.session);
  21. if (user._id) {
  22. req.session.user = user._id;
  23. }
  24. req.session.roles = roles;
  25. } else if (user === undefined && roles === undefined) {
  26. // User logged out
  27. req.session.destroy(function(err) {
  28. if (err) {
  29. console.error(err);
  30. }
  31. });
  32. }
  33. return cb (err);
  34. });
  35. }
  36. // Save found user into DB, if not already exists
  37. function saveFoundToDB(found) {
  38. console.info(found);
  39. Users.findById(found.user)
  40. .exec(function(err, result){
  41. if (err) {
  42. console.error("Error: Users collection.");
  43. console.error(err);
  44. }
  45. // User doesn't exist
  46. if (found !== undefined && !result) {
  47. Users.create({
  48. _id: found.user,
  49. name: found.name,
  50. mail: found.mail,
  51. type: found.type,
  52. abos: '',
  53. bookmarks: '',
  54. roles: '',
  55. }, function(err, done) {
  56. if (err) {
  57. console.error("User creation: Failed");
  58. console.error(err);
  59. } else {
  60. console.info("New User created!");
  61. }
  62. if (done == null) {
  63. console.error("Can not create user.");
  64. }
  65. });
  66. }
  67. });
  68. }
  69. const authorization = {
  70. // Generate Error object suitible for throwing or next()ing
  71. genCheckAuthorized: function (group) {
  72. return function (req, res, next) {
  73. if (req.session === undefined || req.session.user === undefined ||
  74. req.session.roles === undefined)
  75. return next (common.genError (403, "Unauthorized"));
  76. if (req.session.roles[group] === undefined)
  77. return next (common.genError (403, "Unauthorized"));
  78. next ();
  79. }
  80. },
  81. // Login route: requires .user and .pwd params
  82. login: function (req, res, next) {
  83. var user = req.body.user || '';
  84. var pwd = req.body.pwd || '';
  85. // Helper: Return valid session Object
  86. function returnSession () {
  87. // Only export client visible parts of session object
  88. var copy = common.shallowCopy (req.session, clientVisibleSession);
  89. return res.json (copy);
  90. }
  91. // Helper: Return error
  92. function returnError () {
  93. fillSession (req, undefined, undefined, function (err) {
  94. next (common.genError (401, "Unauthorized"));
  95. });
  96. }
  97. // Check whether to just validate current session ID
  98. if (user === '' && pwd === '') {
  99. console.log ("auth revalidate: " + req.session._id);
  100. if (req.session.user === undefined)
  101. return returnError();
  102. return returnSession ();
  103. }
  104. // check local database, then ldap
  105. Users.findById (req.body.user) .exec (function (err, entry) {
  106. // If there is a local user AND it has a password associated, test against this, and only this
  107. // if (entry != null && entry.pwd) {
  108. // if (crypto.checkLocalAuth (entry, req.body.pwd)) {
  109. // return fillSession (req, entry, common.arrayToHash(entry.roles), returnSession);
  110. // }
  111. // return returnError ();
  112. // }
  113. // check ldap
  114. ldap.authorize (user.toLowerCase(), pwd, function (found) {
  115. //console.log ("ldap authorize " + user + " returns " + JSON.stringify (found));
  116. // No ldap entry either -> unauthorized
  117. if (found == null) {
  118. return returnError ();
  119. }
  120. // If there is an entry w/o password, use it for roles etc.
  121. if (entry) {
  122. if (! entry.name || entry.name === "")
  123. entry.name = found.name;
  124. if (! entry.mail || entry.mail === "")
  125. entry.mail = found.mail;
  126. if (! entry.type || entry.type === "")
  127. entry.type = found.type;
  128. if (! entry.orclgender || entry.orclgender === "")
  129. entry.orclgender = found.orclgender;
  130. return fillSession (req, entry, entry.roles.length > 0 ? common.arrayToHash(entry.roles) : {user:true}, returnSession);
  131. }
  132. // Otherwise create standard user entry
  133. saveFoundToDB(found);
  134. return fillSession (req, found, {user:true}, returnSession);
  135. });
  136. });
  137. },
  138. logout: function (req, res, next) {
  139. fillSession (req, undefined, undefined, function (err) {
  140. return res.json ({});
  141. });
  142. },
  143. init: function (_common) {
  144. common = _common;
  145. ldap.init (_common);
  146. Users = dbs.models.Users;
  147. },
  148. };
  149. module.exports = authorization;