AuthorizationManager.coffee 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. CollaboratorsHandler = require("../Collaborators/CollaboratorsHandler")
  2. ProjectGetter = require('../Project/ProjectGetter')
  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. ProjectGetter.getProject 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, (err, isValidReadAndWrite, isValidReadOnly) ->
  37. return callback(err) if err?
  38. if isValidReadOnly
  39. # Grant anonymous user read-only access
  40. callback null, PrivilegeLevels.READ_ONLY, false
  41. else if (
  42. isValidReadAndWrite and
  43. TokenAccessHandler.ANONYMOUS_READ_AND_WRITE_ENABLED
  44. )
  45. # Grant anonymous user read-and-write access
  46. callback null, PrivilegeLevels.READ_AND_WRITE, false
  47. else
  48. # Deny anonymous access
  49. callback null, PrivilegeLevels.NONE, false
  50. else if publicAccessLevel == PublicAccessLevels.READ_ONLY
  51. # Legacy public read-only access for anonymous user
  52. callback null, PrivilegeLevels.READ_ONLY, true
  53. else if publicAccessLevel == PublicAccessLevels.READ_AND_WRITE
  54. # Legacy public read-write access for anonymous user
  55. callback null, PrivilegeLevels.READ_AND_WRITE, true
  56. else
  57. # Deny anonymous user access
  58. callback null, PrivilegeLevels.NONE, false
  59. else
  60. # User is present, get their privilege level from database
  61. CollaboratorsHandler.getMemberIdPrivilegeLevel user_id, project_id, (error, privilegeLevel) ->
  62. return callback(error) if error?
  63. if privilegeLevel? and privilegeLevel != PrivilegeLevels.NONE
  64. # The user has direct access
  65. callback null, privilegeLevel, false
  66. else
  67. AuthorizationManager.isUserSiteAdmin user_id, (error, isAdmin) ->
  68. return callback(error) if error?
  69. if isAdmin
  70. callback null, PrivilegeLevels.OWNER, false
  71. else
  72. # Legacy public-access system
  73. # User is present (not anonymous), but does not have direct access
  74. AuthorizationManager.getPublicAccessLevel project_id, (err, publicAccessLevel) ->
  75. return callback(err) if err?
  76. if publicAccessLevel == PublicAccessLevels.READ_ONLY
  77. callback null, PrivilegeLevels.READ_ONLY, true
  78. else if publicAccessLevel == PublicAccessLevels.READ_AND_WRITE
  79. callback null, PrivilegeLevels.READ_AND_WRITE, true
  80. else
  81. callback null, PrivilegeLevels.NONE, false
  82. canUserReadProject: (user_id, project_id, token, callback = (error, canRead) ->) ->
  83. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel) ->
  84. return callback(error) if error?
  85. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE, PrivilegeLevels.READ_ONLY])
  86. canUserWriteProjectContent: (user_id, project_id, token, callback = (error, canWriteContent) ->) ->
  87. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel) ->
  88. return callback(error) if error?
  89. return callback null, (privilegeLevel in [PrivilegeLevels.OWNER, PrivilegeLevels.READ_AND_WRITE])
  90. canUserWriteProjectSettings: (user_id, project_id, token, callback = (error, canWriteSettings) ->) ->
  91. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel, becausePublic) ->
  92. return callback(error) if error?
  93. if privilegeLevel == PrivilegeLevels.OWNER
  94. return callback null, true
  95. else if privilegeLevel == PrivilegeLevels.READ_AND_WRITE and !becausePublic
  96. return callback null, true
  97. else
  98. return callback null, false
  99. canUserAdminProject: (user_id, project_id, token, callback = (error, canAdmin) ->) ->
  100. AuthorizationManager.getPrivilegeLevelForProject user_id, project_id, token, (error, privilegeLevel) ->
  101. return callback(error) if error?
  102. return callback null, (privilegeLevel == PrivilegeLevels.OWNER)
  103. isUserSiteAdmin: (user_id, callback = (error, isAdmin) ->) ->
  104. if !user_id?
  105. return callback null, false
  106. User.findOne { _id: user_id }, { isAdmin: 1 }, (error, user) ->
  107. return callback(error) if error?
  108. return callback null, (user?.isAdmin == true)