TokenAccessHandler.coffee 4.3 KB

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