Просмотр исходного кода

Add ensureUserCanSendComment authorization middleware (#22959)

* Add ensureUserCanSendComment authorization middleware

* added tests

GitOrigin-RevId: d1f58bd6bc63275456e5280ccb8c99aaa02c4e5f
Domagoj Kriskovic 1 год назад
Родитель
Сommit
741b65d0eb

+ 15 - 0
services/web/app/src/Features/Authorization/AuthorizationManager.js

@@ -280,11 +280,25 @@ async function canUserResolveThread(userId, projectId, docId, threadId, token) {
   return comment.metadata.user_id === userId
   return comment.metadata.user_id === userId
 }
 }
 
 
+async function canUserSendComment(userId, projectId, token) {
+  const privilegeLevel = await getPrivilegeLevelForProject(
+    userId,
+    projectId,
+    token
+  )
+  return (
+    privilegeLevel === PrivilegeLevels.OWNER ||
+    privilegeLevel === PrivilegeLevels.READ_AND_WRITE ||
+    privilegeLevel === PrivilegeLevels.REVIEW
+  )
+}
+
 module.exports = {
 module.exports = {
   canUserReadProject: callbackify(canUserReadProject),
   canUserReadProject: callbackify(canUserReadProject),
   canUserWriteProjectContent: callbackify(canUserWriteProjectContent),
   canUserWriteProjectContent: callbackify(canUserWriteProjectContent),
   canUserReviewProjectContent: callbackify(canUserReviewProjectContent),
   canUserReviewProjectContent: callbackify(canUserReviewProjectContent),
   canUserResolveThread: callbackify(canUserResolveThread),
   canUserResolveThread: callbackify(canUserResolveThread),
+  canUserSendComment: callbackify(canUserSendComment),
   canUserWriteProjectSettings: callbackify(canUserWriteProjectSettings),
   canUserWriteProjectSettings: callbackify(canUserWriteProjectSettings),
   canUserRenameProject: callbackify(canUserRenameProject),
   canUserRenameProject: callbackify(canUserRenameProject),
   canUserAdminProject: callbackify(canUserAdminProject),
   canUserAdminProject: callbackify(canUserAdminProject),
@@ -297,6 +311,7 @@ module.exports = {
     canUserWriteProjectContent,
     canUserWriteProjectContent,
     canUserReviewProjectContent,
     canUserReviewProjectContent,
     canUserResolveThread,
     canUserResolveThread,
+    canUserSendComment,
     canUserWriteProjectSettings,
     canUserWriteProjectSettings,
     canUserRenameProject,
     canUserRenameProject,
     canUserAdminProject,
     canUserAdminProject,

+ 20 - 0
services/web/app/src/Features/Authorization/AuthorizationMiddleware.js

@@ -129,6 +129,25 @@ async function ensureUserCanResolveThread(req, res, next) {
   return HttpErrorHandler.forbidden(req, res)
   return HttpErrorHandler.forbidden(req, res)
 }
 }
 
 
+async function ensureUserCanSendComment(req, res, next) {
+  const projectId = _getProjectId(req)
+  const userId = _getUserId(req)
+  const token = TokenAccessHandler.getRequestToken(req, projectId)
+
+  const canSendComment = await AuthorizationManager.promises.canUserSendComment(
+    userId,
+    projectId,
+    token
+  )
+  if (canSendComment) {
+    logger.debug({ userId, projectId }, 'allowing user to send a comment')
+    return next()
+  }
+
+  logger.debug({ userId, projectId }, 'denying user to send a comment')
+  return HttpErrorHandler.forbidden(req, res)
+}
+
 async function ensureUserCanWriteProjectContent(req, res, next) {
 async function ensureUserCanWriteProjectContent(req, res, next) {
   const projectId = _getProjectId(req)
   const projectId = _getProjectId(req)
   const userId = _getUserId(req)
   const userId = _getUserId(req)
@@ -249,6 +268,7 @@ module.exports = {
     ensureUserCanWriteProjectSettings
     ensureUserCanWriteProjectSettings
   ),
   ),
   ensureUserCanResolveThread: expressify(ensureUserCanResolveThread),
   ensureUserCanResolveThread: expressify(ensureUserCanResolveThread),
+  ensureUserCanSendComment: expressify(ensureUserCanSendComment),
   ensureUserCanWriteProjectContent: expressify(
   ensureUserCanWriteProjectContent: expressify(
     ensureUserCanWriteProjectContent
     ensureUserCanWriteProjectContent
   ),
   ),

+ 9 - 0
services/web/test/unit/src/Authorization/AuthorizationManagerTests.js

@@ -462,6 +462,15 @@ describe('AuthorizationManager', function () {
     tokenReadAndWrite: true,
     tokenReadAndWrite: true,
   })
   })
 
 
+  testPermission('canUserSendComment', {
+    siteAdmin: true,
+    owner: true,
+    readAndWrite: true,
+    review: true,
+    publicReadAndWrite: true,
+    tokenReadAndWrite: true,
+  })
+
   testPermission('canUserWriteProjectContent', {
   testPermission('canUserWriteProjectContent', {
     siteAdmin: true,
     siteAdmin: true,
     owner: true,
     owner: true,

+ 5 - 0
services/web/test/unit/src/Authorization/AuthorizationMiddlewareTests.js

@@ -26,6 +26,7 @@ describe('AuthorizationMiddleware', function () {
         canUserWriteProjectSettings: sinon.stub(),
         canUserWriteProjectSettings: sinon.stub(),
         canUserWriteProjectContent: sinon.stub(),
         canUserWriteProjectContent: sinon.stub(),
         canUserResolveThread: sinon.stub(),
         canUserResolveThread: sinon.stub(),
+        canUserSendComment: sinon.stub(),
         canUserAdminProject: sinon.stub(),
         canUserAdminProject: sinon.stub(),
         canUserRenameProject: sinon.stub(),
         canUserRenameProject: sinon.stub(),
         canUserReviewProjectContent: sinon.stub(),
         canUserReviewProjectContent: sinon.stub(),
@@ -86,6 +87,10 @@ describe('AuthorizationMiddleware', function () {
     )
     )
   })
   })
 
 
+  describe('ensureUserCanSendComment', function () {
+    testMiddleware('ensureUserCanSendComment', 'canUserSendComment')
+  })
+
   describe('ensureUserCanResolveThread', function () {
   describe('ensureUserCanResolveThread', function () {
     beforeEach(function () {
     beforeEach(function () {
       this.req.params.doc_id = this.doc_id
       this.req.params.doc_id = this.doc_id