TokenAccessHandler.coffee 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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, projectExists)->) ->
  11. Project.findOne {
  12. 'tokens.readOnly': token
  13. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, (err, project) ->
  14. if err?
  15. return callback(err)
  16. if !project?
  17. return callback(null, null, false) # Project doesn't exist, so we handle differently
  18. if project.publicAccesLevel != PublicAccessLevels.TOKEN_BASED
  19. return callback(null, null, true) # Project does exist, but it isn't token based
  20. return callback(null, project, true)
  21. findProjectWithReadAndWriteToken: (token, callback=(err, project, projectExists)->) ->
  22. Project.findOne {
  23. 'tokens.readAndWrite': token
  24. }, {_id: 1, publicAccesLevel: 1, owner_ref: 1}, (err, project) ->
  25. if err?
  26. return callback(err)
  27. if !project?
  28. return callback(null, null, false) # Project doesn't exist, so we handle differently
  29. if project.publicAccesLevel != PublicAccessLevels.TOKEN_BASED
  30. return callback(null, null, true) # Project does exist, but it isn't token based
  31. return callback(null, project, true)
  32. findProjectWithHigherAccess: (token, userId, callback=(err, project)->) ->
  33. Project.findOne {
  34. $or: [
  35. {'tokens.readAndWrite': token},
  36. {'tokens.readOnly': token}
  37. ]
  38. }, {_id: 1}, (err, project) ->
  39. if err?
  40. return callback(err)
  41. if !project?
  42. return callback(null, null)
  43. projectId = project._id
  44. CollaboratorsHandler.isUserInvitedMemberOfProject userId, projectId, (err, isMember) ->
  45. if err?
  46. return callback(err)
  47. callback(
  48. null,
  49. if isMember == true then project else null
  50. )
  51. addReadOnlyUserToProject: (userId, projectId, callback=(err)->) ->
  52. userId = ObjectId(userId.toString())
  53. projectId = ObjectId(projectId.toString())
  54. Project.update {
  55. _id: projectId
  56. }, {
  57. $addToSet: {tokenAccessReadOnly_refs: userId}
  58. }, callback
  59. addReadAndWriteUserToProject: (userId, projectId, callback=(err)->) ->
  60. userId = ObjectId(userId.toString())
  61. projectId = ObjectId(projectId.toString())
  62. Project.update {
  63. _id: projectId
  64. }, {
  65. $addToSet: {tokenAccessReadAndWrite_refs: userId}
  66. }, callback
  67. grantSessionTokenAccess: (req, projectId, token) ->
  68. if req.session?
  69. if !req.session.anonTokenAccess?
  70. req.session.anonTokenAccess = {}
  71. req.session.anonTokenAccess[projectId.toString()] = token.toString()
  72. getRequestToken: (req, projectId) ->
  73. token = (
  74. req?.session?.anonTokenAccess?[projectId.toString()] or
  75. req?.headers['x-sl-anonymous-access-token']
  76. )
  77. return token
  78. isValidToken: (projectId, token, callback=(err, isValidReadAndWrite, isValidReadOnly)->) ->
  79. if !token
  80. return callback null, false, false
  81. _validate = (project) ->
  82. project? and
  83. project.publicAccesLevel == PublicAccessLevels.TOKEN_BASED and
  84. project._id.toString() == projectId.toString()
  85. TokenAccessHandler.findProjectWithReadAndWriteToken token, (err, readAndWriteProject) ->
  86. return callback(err) if err?
  87. isValidReadAndWrite = _validate(readAndWriteProject)
  88. TokenAccessHandler.findProjectWithReadOnlyToken token, (err, readOnlyProject) ->
  89. return callback(err) if err?
  90. isValidReadOnly = _validate(readOnlyProject)
  91. callback null, isValidReadAndWrite, isValidReadOnly
  92. protectTokens: (project, privilegeLevel) ->
  93. if project? && project.tokens?
  94. if privilegeLevel == PrivilegeLevels.OWNER
  95. return
  96. if privilegeLevel != PrivilegeLevels.READ_AND_WRITE
  97. project.tokens.readAndWrite = ''
  98. if privilegeLevel != PrivilegeLevels.READ_ONLY
  99. project.tokens.readOnly = ''