AuthorizationManager.coffee 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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: (req, user_id, project_id,
  25. callback = (error, privilegeLevel, becausePublic) ->) ->
  26. if !user_id?
  27. # User is Anonymous, Try Token-based access
  28. AuthorizationManager.getPublicAccessLevel project_id, (err, publicAccessLevel) ->
  29. return callback(err) if err?
  30. if publicAccessLevel == PublicAccessLevels.TOKEN_BASED
  31. TokenAccessHandler.requestHasReadOnlyTokenAccess req, project_id, (err, allowed) ->
  32. return callback(err) if err?
  33. if allowed
  34. callback null, PrivilegeLevels.READ_ONLY, false
  35. else
  36. callback null, PrivilegeLevels.NONE, false
  37. else if publicAccessLevel == PublicAccessLevels.READ_ONLY
  38. callback null, PrivilegeLevels.READ_ONLY, true
  39. else if publicAccessLevel == PublicAccessLevels.READ_AND_WRITE
  40. callback null, PrivilegeLevels.READ_AND_WRITE, true
  41. else
  42. callback null, PrivilegeLevels.NONE, false
  43. else
  44. # User is present, get their privilege level from database
  45. CollaboratorsHandler.getMemberIdPrivilegeLevel user_id, project_id, (error, privilegeLevel) ->
  46. return callback(error) if error?
  47. if privilegeLevel? and privilegeLevel != PrivilegeLevels.NONE
  48. # The user has direct access
  49. callback null, privilegeLevel, false
  50. else
  51. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  52. return callback(error) if error?
  53. if isAdmin
  54. callback null, PrivilegeLevels.OWNER, false
  55. else
  56. # Legacy public-access system
  57. # User is present (not anonymous), but does not have direct access
  58. AuthorizationManager.getPublicAccessLevel project_id, (err, publicAccessLevel) ->
  59. return callback(err) if err?
  60. if publicAccessLevel == PublicAccessLevels.READ_ONLY
  61. callback null, PrivilegeLevels.READ_ONLY, true
  62. else if publicAccessLevel == PublicAccessLevels.READ_AND_WRITE
  63. callback null, PrivilegeLevels.READ_AND_WRITE, true
  64. else
  65. callback null, PrivilegeLevels.NONE, false
  66. canUserReadProject: (req, user_id, project_id, callback = (error, canRead) ->) ->
  67. AuthorizationManager.getPrivilegeLevelForProject req, user_id, project_id, (error, privilegeLevel) ->
  68. return callback(error) if error?
  69. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE, PrivilegeLevels.READ_ONLY])
  70. canUserWriteProjectContent: (req, user_id, project_id, callback = (error, canWriteContent) ->) ->
  71. AuthorizationManager.getPrivilegeLevelForProject req, user_id, project_id, (error, privilegeLevel) ->
  72. return callback(error) if error?
  73. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE])
  74. canUserWriteProjectSettings: (req, user_id, project_id, callback = (error, canWriteSettings) ->) ->
  75. AuthorizationManager.getPrivilegeLevelForProject req, user_id, project_id, (error, privilegeLevel, becausePublic) ->
  76. return callback(error) if error?
  77. if privilegeLevel == PrivilegeLevels.OWNER
  78. return callback null, true
  79. else if privilegeLevel == PrivilegeLevels.READ_AND_WRITE and !becausePublic
  80. return callback null, true
  81. else
  82. return callback null, false
  83. canUserAdminProject: (req, user_id, project_id, callback = (error, canAdmin) ->) ->
  84. AuthorizationManager.getPrivilegeLevelForProject req, user_id, project_id, (error, privilegeLevel) ->
  85. return callback(error) if error?
  86. return callback null, (privilegeLevel == PrivilegeLevels.OWNER)
  87. isUserSiteAdmin: (user_id, callback = (error, isAdmin) ->) ->
  88. if !user_id?
  89. return callback null, false
  90. User.findOne { _id: user_id }, { isAdmin: 1 }, (error, user) ->
  91. return callback(error) if error?
  92. return callback null, (user?.isAdmin == true)