TokenAccessHandler.coffee 3.0 KB

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