TokenAccessHandler.coffee 2.6 KB

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