AuthorizationManager.coffee 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler")
  2. Project = require("../../models/Project").Project
  3. User = require("../../models/User").User
  4. PrivilegeLevels = require("./PrivilegeLevels")
  5. PublicAccessLevels = require("./PublicAccessLevels")
  6. Errors = require("../Errors/Errors")
  7. ObjectId = require("mongojs").ObjectId
  8. TokenAccessHandler = require('../TokenAccess/TokenAccessHandler')
  9. module.exports = AuthorizationManager =
  10. getPublicAccessLevel: (project_id, callback=(err, level)->) ->
  11. if !ObjectId.isValid(project_id)
  12. return callback(new Error("invalid project id"))
  13. # Note, the Project property in the DB is `publicAccesLevel`, without the second `s`
  14. Project.findOne { _id: project_id }, { publicAccesLevel: 1 }, (error, project) ->
  15. return callback(error) if error?
  16. if !project?
  17. return callback new Errors.NotFoundError("no project found with id #{project_id}")
  18. callback null, project.publicAccesLevel
  19. # Get the privilege level that the user has for the project
  20. # Returns:
  21. # * privilegeLevel: "owner", "readAndWrite", of "readOnly" if the user has
  22. # access. false if the user does not have access
  23. # * becausePublic: true if the access level is only because the project is public.
  24. getPrivilegeLevelForProject: (
  25. user_id, project_id, token,
  26. callback = (error, privilegeLevel, becausePublic) ->
  27. ) ->
  28. if !user_id?
  29. # User is Anonymous, Try Token-based access
  30. AuthorizationManager.getPublicAccessLevel project_id, (err, publicAccessLevel) ->
  31. return callback(err) if err?
  32. if publicAccessLevel == PublicAccessLevels.TOKEN_BASED
  33. # Anonymous users can have read-only access to token-based projects,
  34. # while read-write access must be logged in,
  35. # unless the `enableAnonymousReadAndWriteSharing` setting is enabled
  36. TokenAccessHandler.isValidToken project_id, token,
  37. (err, isValidReadAndWrite, isValidReadOnly) ->
  38. return callback(err) if err?
  39. if isValidReadOnly
  40. # Grant anonymous user read-only access
  41. callback null, PrivilegeLevels.READ_ONLY, false
  42. else if (
  43. isValidReadAndWrite and
  44. TokenAccessHandler.ANONYMOUS_READ_AND_WRITE_ENABLED
  45. )
  46. # Grant anonymous user read-and-write access
  47. callback null, PrivilegeLevels.READ_AND_WRITE, false
  48. else
  49. # Deny anonymous access
  50. callback null, PrivilegeLevels.NONE, false
  51. else if publicAccessLevel == PublicAccessLevels.READ_ONLY
  52. # Legacy public read-only access for anonymous user
  53. callback null, PrivilegeLevels.READ_ONLY, true
  54. else if publicAccessLevel == PublicAccessLevels.READ_AND_WRITE
  55. # Legacy public read-write access for anonymous user
  56. callback null, PrivilegeLevels.READ_AND_WRITE, true
  57. else
  58. # Deny anonymous user access
  59. callback null, PrivilegeLevels.NONE, false
  60. else
  61. # User is present, get their privilege level from database
  62. CollaboratorsHandler.getMemberIdPrivilegeLevel user_id, project_id, (error, privilegeLevel) ->
  63. return callback(error) if error?
  64. if privilegeLevel? and privilegeLevel != PrivilegeLevels.NONE
  65. # The user has direct access
  66. callback null, privilegeLevel, false
  67. else
  68. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  69. return callback(error) if error?
  70. if isAdmin
  71. callback null, PrivilegeLevels.OWNER, false
  72. else
  73. # Legacy public-access system
  74. # User is present (not anonymous), but does not have direct access
  75. AuthorizationManager.getPublicAccessLevel project_id, (err, publicAccessLevel) ->
  76. return callback(err) if err?
  77. if publicAccessLevel == PublicAccessLevels.READ_ONLY
  78. callback null, PrivilegeLevels.READ_ONLY, true
  79. else if publicAccessLevel == PublicAccessLevels.READ_AND_WRITE
  80. callback null, PrivilegeLevels.READ_AND_WRITE, true
  81. else
  82. callback null, PrivilegeLevels.NONE, false
  83. canUserReadProject: (user_id, project_id, token, callback = (error, canRead) ->) ->
  84. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel) ->
  85. return callback(error) if error?
  86. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE, PrivilegeLevels.READ_ONLY])
  87. canUserWriteProjectContent: (user_id, project_id, token, callback = (error, canWriteContent) ->) ->
  88. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel) ->
  89. return callback(error) if error?
  90. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE])
  91. canUserWriteProjectSettings: (user_id, project_id, token, callback = (error, canWriteSettings) ->) ->
  92. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel, becausePublic) ->
  93. return callback(error) if error?
  94. if privilegeLevel == PrivilegeLevels.OWNER
  95. return callback null, true
  96. else if privilegeLevel == PrivilegeLevels.READ_AND_WRITE and !becausePublic
  97. return callback null, true
  98. else
  99. return callback null, false
  100. canUserAdminProject: (user_id, project_id, token, callback = (error, canAdmin) ->) ->
  101. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel) ->
  102. return callback(error) if error?
  103. return callback null, (privilegeLevel == PrivilegeLevels.OWNER)
  104. isUserSiteAdmin: (user_id, callback = (error, isAdmin) ->) ->
  105. if !user_id?
  106. return callback null, false
  107. User.findOne { _id: user_id }, { isAdmin: 1 }, (error, user) ->
  108. return callback(error) if error?
  109. return callback null, (user?.isAdmin == true)