OneTimeTokenHandler.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /* eslint-disable
  2. handle-callback-err,
  3. max-len,
  4. no-unused-vars,
  5. */
  6. // TODO: This file was created by bulk-decaffeinate.
  7. // Fix any style issues and re-enable lint.
  8. /*
  9. * decaffeinate suggestions:
  10. * DS102: Remove unnecessary code created because of implicit returns
  11. * DS207: Consider shorter variations of null checks
  12. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  13. */
  14. const Settings = require('settings-sharelatex')
  15. const crypto = require('crypto')
  16. const logger = require('logger-sharelatex')
  17. const { db } = require('../../infrastructure/mongodb')
  18. const Errors = require('../Errors/Errors')
  19. const ONE_HOUR_IN_S = 60 * 60
  20. module.exports = {
  21. getNewToken(use, data, options, callback) {
  22. // options is optional
  23. if (options == null) {
  24. options = {}
  25. }
  26. if (callback == null) {
  27. callback = function(error, data) {}
  28. }
  29. if (typeof options === 'function') {
  30. callback = options
  31. options = {}
  32. }
  33. const expiresIn = options.expiresIn || ONE_HOUR_IN_S
  34. const createdAt = new Date()
  35. const expiresAt = new Date(createdAt.getTime() + expiresIn * 1000)
  36. const token = crypto.randomBytes(32).toString('hex')
  37. return db.tokens.insertOne(
  38. {
  39. use,
  40. token,
  41. data,
  42. createdAt,
  43. expiresAt
  44. },
  45. function(error) {
  46. if (error != null) {
  47. return callback(error)
  48. }
  49. return callback(null, token)
  50. }
  51. )
  52. },
  53. getValueFromTokenAndExpire(use, token, callback) {
  54. if (callback == null) {
  55. callback = function(error, data) {}
  56. }
  57. const now = new Date()
  58. return db.tokens.findOneAndUpdate(
  59. {
  60. use,
  61. token,
  62. expiresAt: { $gt: now },
  63. usedAt: { $exists: false }
  64. },
  65. {
  66. $set: {
  67. usedAt: now
  68. }
  69. },
  70. function(error, result) {
  71. if (error != null) {
  72. return callback(error)
  73. }
  74. const token = result.value
  75. if (token == null) {
  76. return callback(new Errors.NotFoundError('no token found'))
  77. }
  78. return callback(null, token.data)
  79. }
  80. )
  81. }
  82. }