AuthorizationManager.coffee 3.6 KB

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