AuthorizationManager.coffee 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 if project.publicAccesLevel == PublicAccessLevels.TOKEN_BASED
  27. return callback null, PrivilegeLevels.READ_ONLY, false
  28. else
  29. return callback null, PrivilegeLevels.NONE, false
  30. if !user_id?
  31. getPublicAccessLevel()
  32. else
  33. CollaboratorsHandler.getMemberIdPrivilegeLevel user_id, project_id, (error, privilegeLevel) ->
  34. return callback(error) if error?
  35. if privilegeLevel? and privilegeLevel != PrivilegeLevels.NONE
  36. # The user has direct access
  37. callback null, privilegeLevel, false
  38. else
  39. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  40. return callback(error) if error?
  41. if isAdmin
  42. callback null, PrivilegeLevels.OWNER, false
  43. else
  44. getPublicAccessLevel()
  45. canUserReadProject: (user_id, project_id, callback = (error, canRead) ->) ->
  46. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) ->
  47. return callback(error) if error?
  48. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE, PrivilegeLevels.READ_ONLY])
  49. canUserWriteProjectContent: (user_id, project_id, callback = (error, canWriteContent) ->) ->
  50. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) ->
  51. return callback(error) if error?
  52. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE])
  53. canUserWriteProjectSettings: (user_id, project_id, callback = (error, canWriteSettings) ->) ->
  54. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel, becausePublic) ->
  55. return callback(error) if error?
  56. if privilegeLevel == PrivilegeLevels.OWNER
  57. return callback null, true
  58. else if privilegeLevel == PrivilegeLevels.READ_AND_WRITE and !becausePublic
  59. return callback null, true
  60. else
  61. return callback null, false
  62. canUserAdminProject: (user_id, project_id, callback = (error, canAdmin) ->) ->
  63. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, (error, privilegeLevel) ->
  64. return callback(error) if error?
  65. return callback null, (privilegeLevel == PrivilegeLevels.OWNER)
  66. isUserSiteAdmin: (user_id, callback = (error, isAdmin) ->) ->
  67. if !user_id?
  68. return callback null, false
  69. User.findOne { _id: user_id }, { isAdmin: 1 }, (error, user) ->
  70. return callback(error) if error?
  71. return callback null, (user?.isAdmin == true)