Skip to content

Commit b4f7914

Browse files
authored
fix(vapt): prevent users from requesting themselves to be reviewers (#1467)
* fix(review): prevent users from specifying themselves as reivewers * test(review): add test toe ensure users cannot specify themselves for review request * chore: remove extra `.list.mock` call
1 parent f27be77 commit b4f7914

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/routes/v2/authenticated/__tests__/review.spec.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { mockUserId } from "@fixtures/identity"
1313
import { MOCK_USER_EMAIL_ONE, MOCK_USER_EMAIL_TWO } from "@fixtures/users"
1414
import { CollaboratorRoles, ReviewRequestStatus } from "@root/constants"
1515
import MissingSiteError from "@root/errors/MissingSiteError"
16+
import { MOCK_USER_SESSION_DATA_ONE } from "@root/fixtures/sessionData"
1617
import GitHubService from "@root/services/db/GitHubService"
1718
import CollaboratorsService from "@services/identity/CollaboratorsService"
1819
import NotificationsService from "@services/identity/NotificationsService"
@@ -335,6 +336,34 @@ describe("Review Requests Router", () => {
335336
).not.toHaveBeenCalled()
336337
expect(mockNotificationsService.create).not.toHaveBeenCalled()
337338
})
339+
340+
it("should return 400 if the user requests themselves to review", async () => {
341+
// Arrange
342+
mockCollaboratorsService.getRole.mockResolvedValueOnce("role")
343+
mockIdentityUsersService.findByEmail.mockResolvedValueOnce("user")
344+
345+
// Act
346+
const response = await request(app)
347+
.post("/mockSite/review/request")
348+
.send({
349+
// NOTE: this is injected via `generateRouterForDefaultUserWithSite`
350+
// and from there, `attachDefaultUserSessionDataWithSite`
351+
reviewers: [MOCK_USER_SESSION_DATA_ONE.email],
352+
title: "mockTitle",
353+
description: "mockDescription",
354+
})
355+
356+
// Assert
357+
expect(response.status).toEqual(400)
358+
expect(mockSitesService.getBySiteName).toHaveBeenCalledTimes(1)
359+
expect(mockCollaboratorsService.getRole).toHaveBeenCalledTimes(1)
360+
expect(mockIdentityUsersService.findByEmail).toHaveBeenCalledTimes(1)
361+
expect(mockCollaboratorsService.list).not.toHaveBeenCalled()
362+
expect(
363+
mockReviewRequestService.createReviewRequest
364+
).not.toHaveBeenCalled()
365+
expect(mockNotificationsService.create).not.toHaveBeenCalled()
366+
})
338367
})
339368

340369
describe("listReviews", () => {

src/routes/v2/authenticated/review.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,26 @@ export class ReviewsRouter {
210210
)
211211
const { reviewers, title, description } = req.body
212212

213+
// NOTE: reject requests that asks for the user to be the reviewer
214+
// rather than accept and filter later.
215+
// We should be stricter because this is prohibited on frontend
216+
// so this means that the user is trying to do something they know is forbidden
217+
if (reviewers.includes(userWithSiteSessionData.email)) {
218+
logger.error({
219+
message: `User ${userWithSiteSessionData.email} attempted to request a review from themselves for site ${siteName}`,
220+
method: "createReviewRequest",
221+
meta: {
222+
userId: userWithSiteSessionData.isomerUserId,
223+
email: userWithSiteSessionData.email,
224+
siteName,
225+
},
226+
})
227+
return res.status(400).send({
228+
message:
229+
"Please ensure that you are not requesting a review from yourself!",
230+
})
231+
}
232+
213233
// Step 3: Check if reviewers are admins of repo
214234
// Check if number of requested reviewers > 0
215235
if (reviewers.length === 0) {

0 commit comments

Comments
 (0)