TokenAccessHandler.coffee 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. Project = require('../../models/Project').Project
  2. PublicAccessLevels = require '../Authorization/PublicAccessLevels'
  3. ObjectId = require("mongojs").ObjectId
  4. module.exports = TokenAccessHandler =
  5. findProjectWithReadOnlyToken: (token, callback=(err, project)->) ->
  6. Project.findOne {
  7. 'tokens.readOnly': token,
  8. 'publicAccesLevel': PublicAccessLevels.TOKEN_BASED
  9. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, callback
  10. findProjectWithReadAndWriteToken: (token, callback=(err, project)->) ->
  11. Project.findOne {
  12. 'tokens.readAndWrite': token,
  13. 'publicAccesLevel': PublicAccessLevels.TOKEN_BASED
  14. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, callback
  15. findPrivateOverleafProjectWithReadAndWriteToken: (token, callback=(err, project)->) ->
  16. Project.findOne {
  17. 'tokens.readAndWrite': token,
  18. 'publicAccesLevel': PublicAccessLevels.PRIVATE,
  19. 'overleaf.id': {'$exists': true}
  20. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, callback
  21. addReadOnlyUserToProject: (userId, projectId, callback=(err)->) ->
  22. userId = ObjectId(userId.toString())
  23. projectId = ObjectId(projectId.toString())
  24. Project.update {
  25. _id: projectId
  26. }, {
  27. $addToSet: {tokenAccessReadOnly_refs: userId}
  28. }, callback
  29. addReadAndWriteUserToProject: (userId, projectId, callback=(err)->) ->
  30. userId = ObjectId(userId.toString())
  31. projectId = ObjectId(projectId.toString())
  32. Project.update {
  33. _id: projectId
  34. }, {
  35. $addToSet: {tokenAccessReadAndWrite_refs: userId}
  36. }, callback
  37. grantSessionReadOnlyTokenAccess: (req, projectId, token) ->
  38. if req.session?
  39. if !req.session.anonReadOnlyTokenAccess?
  40. req.session.anonReadOnlyTokenAccess = {}
  41. req.session.anonReadOnlyTokenAccess[projectId.toString()] = token.toString()
  42. getRequestToken: (req, projectId) ->
  43. token = (
  44. req?.session?.anonReadOnlyTokenAccess?[projectId.toString()] or
  45. req?.headers['x-sl-anon-token']
  46. )
  47. return token
  48. isValidReadOnlyToken: (projectId, token, callback=(err, allowed)->) ->
  49. if !token
  50. return callback null, false
  51. TokenAccessHandler.findProjectWithReadOnlyToken token, (err, project) ->
  52. return callback(err) if err?
  53. isAllowed = (
  54. project? and
  55. project.publicAccesLevel == PublicAccessLevels.TOKEN_BASED and
  56. project._id.toString() == projectId.toString()
  57. )
  58. callback null, isAllowed