TokenAccessHandler.coffee 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. Project = require('../../models/Project').Project
  2. CollaboratorsHandler = require('../Collaborators/CollaboratorsHandler')
  3. PublicAccessLevels = require '../Authorization/PublicAccessLevels'
  4. PrivilegeLevels = require '../Authorization/PrivilegeLevels'
  5. ObjectId = require("mongojs").ObjectId
  6. Settings = require('settings-sharelatex')
  7. module.exports = TokenAccessHandler =
  8. ANONYMOUS_READ_AND_WRITE_ENABLED:
  9. Settings.allowAnonymousReadAndWriteSharing == true
  10. findProjectWithReadOnlyToken: (token, callback=(err, project)->) ->
  11. Project.findOne {
  12. 'tokens.readOnly': token,
  13. 'publicAccesLevel': PublicAccessLevels.TOKEN_BASED
  14. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, callback
  15. findProjectWithReadAndWriteToken: (token, callback=(err, project)->) ->
  16. Project.findOne {
  17. 'tokens.readAndWrite': token,
  18. 'publicAccesLevel': PublicAccessLevels.TOKEN_BASED
  19. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, callback
  20. findProjectWithHigherAccess: (token, userId, callback=(err, project, projectExists)->) ->
  21. Project.findOne {
  22. $or: [
  23. {'tokens.readAndWrite': token},
  24. {'tokens.readOnly': token}
  25. ]
  26. }, {_id: 1}, (err, project) ->
  27. if err?
  28. return callback(err)
  29. if !project?
  30. return callback(null, null, false) # Project doesn't exist, so we handle differently
  31. projectId = project._id
  32. CollaboratorsHandler.isUserInvitedMemberOfProject userId, projectId, (err, isMember) ->
  33. if err?
  34. return callback(err)
  35. callback(
  36. null,
  37. if isMember == true then project else null,
  38. true # Project does exist, but user doesn't have access
  39. )
  40. addReadOnlyUserToProject: (userId, projectId, callback=(err)->) ->
  41. userId = ObjectId(userId.toString())
  42. projectId = ObjectId(projectId.toString())
  43. Project.update {
  44. _id: projectId
  45. }, {
  46. $addToSet: {tokenAccessReadOnly_refs: userId}
  47. }, callback
  48. addReadAndWriteUserToProject: (userId, projectId, callback=(err)->) ->
  49. userId = ObjectId(userId.toString())
  50. projectId = ObjectId(projectId.toString())
  51. Project.update {
  52. _id: projectId
  53. }, {
  54. $addToSet: {tokenAccessReadAndWrite_refs: userId}
  55. }, callback
  56. grantSessionTokenAccess: (req, projectId, token) ->
  57. if req.session?
  58. if !req.session.anonTokenAccess?
  59. req.session.anonTokenAccess = {}
  60. req.session.anonTokenAccess[projectId.toString()] = token.toString()
  61. getRequestToken: (req, projectId) ->
  62. token = (
  63. req?.session?.anonTokenAccess?[projectId.toString()] or
  64. req?.headers['x-sl-anonymous-access-token']
  65. )
  66. return token
  67. isValidToken: (projectId, token, callback=(err, isValidReadAndWrite, isValidReadOnly)->) ->
  68. if !token
  69. return callback null, false, false
  70. _validate = (project) ->
  71. project? and
  72. project.publicAccesLevel == PublicAccessLevels.TOKEN_BASED and
  73. project._id.toString() == projectId.toString()
  74. TokenAccessHandler.findProjectWithReadAndWriteToken token, (err, readAndWriteProject) ->
  75. return callback(err) if err?
  76. isValidReadAndWrite = _validate(readAndWriteProject)
  77. TokenAccessHandler.findProjectWithReadOnlyToken token, (err, readOnlyProject) ->
  78. return callback(err) if err?
  79. isValidReadOnly = _validate(readOnlyProject)
  80. callback null, isValidReadAndWrite, isValidReadOnly
  81. protectTokens: (project, privilegeLevel) ->
  82. if project? && project.tokens?
  83. if privilegeLevel == PrivilegeLevels.OWNER
  84. return
  85. if privilegeLevel != PrivilegeLevels.READ_AND_WRITE
  86. project.tokens.readAndWrite = ''
  87. if privilegeLevel != PrivilegeLevels.READ_ONLY
  88. project.tokens.readOnly = ''