AuthenticationManager.coffee 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. Settings = require 'settings-sharelatex'
  2. User = require("../../models/User").User
  3. {db, ObjectId} = require("../../infrastructure/mongojs")
  4. crypto = require 'crypto'
  5. bcrypt = require 'bcrypt'
  6. module.exports = AuthenticationManager =
  7. authenticate: (query, password, callback = (error, user) ->) ->
  8. # Using Mongoose for legacy reasons here. The returned User instance
  9. # gets serialized into the session and there may be subtle differences
  10. # between the user returned by Mongoose vs mongojs (such as default values)
  11. User.findOne query, (error, user) =>
  12. return callback(error) if error?
  13. if user?
  14. if user.hashedPassword?
  15. bcrypt.compare password, user.hashedPassword, (error, match) ->
  16. return callback(error) if error?
  17. if match
  18. callback null, user
  19. else
  20. callback null, null
  21. else
  22. callback null, null
  23. else
  24. callback null, null
  25. setUserPassword: (user_id, password, callback = (error) ->) ->
  26. bcrypt.genSalt 7, (error, salt) ->
  27. return callback(error) if error?
  28. bcrypt.hash password, salt, (error, hash) ->
  29. return callback(error) if error?
  30. db.users.update({
  31. _id: ObjectId(user_id.toString())
  32. }, {
  33. $set: hashedPassword: hash
  34. $unset: password: true
  35. }, callback)
  36. getAuthToken: (user_id, callback = (error, auth_token) ->) ->
  37. db.users.findOne { _id: ObjectId(user_id.toString()) }, { auth_token : true }, (error, user) =>
  38. return callback(error) if error?
  39. return callback(new Error("user could not be found: #{user_id}")) if !user?
  40. if user.auth_token?
  41. callback null, user.auth_token
  42. else
  43. @_createSecureToken (error, auth_token) ->
  44. db.users.update { _id: ObjectId(user_id.toString()) }, { $set : auth_token: auth_token }, (error) ->
  45. return callback(error) if error?
  46. callback null, auth_token
  47. _createSecureToken: (callback = (error, token) ->) ->
  48. crypto.randomBytes 48, (error, buffer) ->
  49. return callback(error) if error?
  50. callback null, buffer.toString("hex")