AuthorizationManager.coffee 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. module.exports = AuthorizationManager =
  8. # Get the privilege level that the user has for the project
  9. # Returns:
  10. # * privilegeLevel: "owner", "readAndWrite", of "readOnly" if the user has
  11. # access. false if the user does not have access
  12. # * becausePublic: true if the access level is only because the project is public.
  13. getPrivilegeLevelForProject: (user_id, project_id, callback = (error, privilegeLevel, becausePublic) ->) ->
  14. getPublicAccessLevel = () ->
  15. Project.findOne { _id: project_id }, { publicAccesLevel: 1 }, (error, project) ->
  16. return callback(error) if error?
  17. if !project?
  18. return callback new Errors.NotFoundError("no project found with id #{project_id}")
  19. if project.publicAccesLevel == PublicAccessLevels.READ_ONLY
  20. return callback null, PrivilegeLevels.READ_ONLY, true
  21. else if project.publicAccesLevel == PublicAccessLevels.READ_AND_WRITE
  22. return callback null, PrivilegeLevels.READ_AND_WRITE, true
  23. else
  24. return callback null, PrivilegeLevels.NONE, false
  25. if !user_id?
  26. getPublicAccessLevel()
  27. else
  28. CollaboratorsHandler.getMemberIdPrivilegeLevel user_id, project_id, (error, privilegeLevel) ->
  29. return callback(error) if error?
  30. if privilegeLevel? and privilegeLevel != PrivilegeLevels.NONE
  31. # The user has direct access
  32. callback null, privilegeLevel, false
  33. else
  34. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  35. return callback(error) if error?
  36. if isAdmin
  37. callback null, PrivilegeLevels.OWNER, false
  38. else
  39. getPublicAccessLevel()
  40. canUserReadProject: (user_id, project_id, callback = (error, canRead) ->) ->
  41. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) ->
  42. return callback(error) if error?
  43. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE, PrivilegeLevels.READ_ONLY])
  44. canUserWriteProjectContent: (user_id, project_id, callback = (error, canWriteContent) ->) ->
  45. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) ->
  46. return callback(error) if error?
  47. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE])
  48. canUserWriteProjectSettings: (user_id, project_id, callback = (error, canWriteSettings) ->) ->
  49. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel, becausePublic) ->
  50. return callback(error) if error?
  51. if privilegeLevel == PrivilegeLevels.OWNER
  52. return callback null, true
  53. else if privilegeLevel == PrivilegeLevels.READ_AND_WRITE and !becausePublic
  54. return callback null, true
  55. else
  56. return callback null, false
  57. canUserAdminProject: (user_id, project_id, callback = (error, canAdmin) ->) ->
  58. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) ->
  59. return callback(error) if error?
  60. return callback null, (privilegeLevel == PrivilegeLevels.OWNER)
  61. isUserSiteAdmin: (user_id, callback = (error, isAdmin) ->) ->
  62. if !user_id?
  63. return callback null, false
  64. User.findOne { _id: user_id }, { isAdmin: 1 }, (error, user) ->
  65. return callback(error) if error?
  66. return callback null, (user?.isAdmin == true)