OneTimeTokenHandler.coffee 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. getValueFromTokenAndExpire: (use, token, callback = (error, data) ->)->
  28. logger.log token_start: token.slice(0,8), "getting data from #{use} token"
  29. now = new Date()
  30. db.tokens.findAndModify {
  31. query: {
  32. use: use,
  33. token: token,
  34. expiresAt: { $gt: now },
  35. usedAt: { $exists: false }
  36. },
  37. update: {
  38. $set: {
  39. usedAt: now
  40. }
  41. }
  42. }, (error, token) ->
  43. return callback(error) if error?
  44. if !token?
  45. return callback(new Errors.NotFoundError('no token found'))
  46. return callback null, token.data