TokenAccessHandler.coffee 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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)->) ->
  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)
  31. projectId = project._id
  32. CollaboratorsHandler.isUserInvitedMemberOfProject userId, projectId, (err, isMember) ->
  33. if err?
  34. return callback(err)
  35. callback(null, if isMember == true then project else null)
  36. addReadOnlyUserToProject: (userId, projectId, callback=(err)->) ->
  37. userId = ObjectId(userId.toString())
  38. projectId = ObjectId(projectId.toString())
  39. Project.update {
  40. _id: projectId
  41. }, {
  42. $addToSet: {tokenAccessReadOnly_refs: userId}
  43. }, callback
  44. addReadAndWriteUserToProject: (userId, projectId, callback=(err)->) ->
  45. userId = ObjectId(userId.toString())
  46. projectId = ObjectId(projectId.toString())
  47. Project.update {
  48. _id: projectId
  49. }, {
  50. $addToSet: {tokenAccessReadAndWrite_refs: userId}
  51. }, callback
  52. grantSessionTokenAccess: (req, projectId, token) ->
  53. if req.session?
  54. if !req.session.anonTokenAccess?
  55. req.session.anonTokenAccess = {}
  56. req.session.anonTokenAccess[projectId.toString()] = token.toString()
  57. getRequestToken: (req, projectId) ->
  58. token = (
  59. req?.session?.anonTokenAccess?[projectId.toString()] or
  60. req?.headers['x-sl-anonymous-access-token']
  61. )
  62. return token
  63. isValidToken: (projectId, token, callback=(err, isValidReadAndWrite, isValidReadOnly)->) ->
  64. if !token
  65. return callback null, false, false
  66. _validate = (project) ->
  67. project? and
  68. project.publicAccesLevel == PublicAccessLevels.TOKEN_BASED and
  69. project._id.toString() == projectId.toString()
  70. TokenAccessHandler.findProjectWithReadAndWriteToken token, (err, readAndWriteProject) ->
  71. return callback(err) if err?
  72. isValidReadAndWrite = _validate(readAndWriteProject)
  73. TokenAccessHandler.findProjectWithReadOnlyToken token, (err, readOnlyProject) ->
  74. return callback(err) if err?
  75. isValidReadOnly = _validate(readOnlyProject)
  76. callback null, isValidReadAndWrite, isValidReadOnly
  77. protectTokens: (project, privilegeLevel) ->
  78. if project? && project.tokens?
  79. if privilegeLevel == PrivilegeLevels.OWNER
  80. return
  81. if privilegeLevel != PrivilegeLevels.READ_AND_WRITE
  82. project.tokens.readAndWrite = ''
  83. if privilegeLevel != PrivilegeLevels.READ_ONLY
  84. project.tokens.readOnly = ''