OneTimeTokenHandler.coffee 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. Settings = require('settings-sharelatex')
  2. crypto = require("crypto")
  3. logger = require("logger-sharelatex")
  4. {db} = require "../../infrastructure/mongojs"
  5. Errors = require "../Errors/Errors"
  6. ONE_HOUR_IN_S = 60 * 60
  7. module.exports =
  8. getNewToken: (use, data, options = {}, callback = (error, data) ->)->
  9. # options is optional
  10. if typeof options == "function"
  11. callback = options
  12. options = {}
  13. expiresIn = options.expiresIn or ONE_HOUR_IN_S
  14. createdAt = new Date()
  15. expiresAt = new Date(createdAt.getTime() + expiresIn * 1000)
  16. token = crypto.randomBytes(32).toString("hex")
  17. logger.log {data, expiresIn, token_start: token.slice(0,8)}, "generating token for #{use}"
  18. db.tokens.insert {
  19. use: use
  20. token: token,
  21. data: data,
  22. createdAt: createdAt,
  23. expiresAt: expiresAt
  24. }, (error) ->
  25. return callback(error) if error?
  26. callback null, token
  27. findValidTokenFromData: (use, data, callback = (error, token) ->) ->
  28. db.tokens.findOne {
  29. use: use,
  30. data: data,
  31. expiresAt: { $gt: new Date() },
  32. usedAt: { $exists: false }
  33. }, (error, token) ->
  34. return callback(error) if error?
  35. return callback null, token?.token
  36. getValueFromTokenAndExpire: (use, token, callback = (error, data) ->)->
  37. logger.log token_start: token.slice(0,8), "getting data from #{use} token"
  38. now = new Date()
  39. db.tokens.findAndModify {
  40. query: {
  41. use: use,
  42. token: token,
  43. expiresAt: { $gt: now },
  44. usedAt: { $exists: false }
  45. },
  46. update: {
  47. $set: {
  48. usedAt: now
  49. }
  50. }
  51. }, (error, token) ->
  52. return callback(error) if error?
  53. if !token?
  54. return callback(new Errors.NotFoundError('no token found'))
  55. return callback null, token.data