From a0c471a28eb9d26f651f148c7140d1354e885955 Mon Sep 17 00:00:00 2001 From: Miodec Date: Wed, 12 Feb 2025 12:12:37 +0100 Subject: [PATCH] chore: add captcha to the forgot password modal --- .../__tests__/api/controllers/user.spec.ts | 12 ++- backend/src/api/controllers/user.ts | 3 +- frontend/src/html/popups.html | 9 ++ frontend/src/styles/popups.scss | 6 ++ frontend/src/ts/event-handlers/login.ts | 7 ++ frontend/src/ts/index.ts | 1 + frontend/src/ts/modals/forgot-password.ts | 91 +++++++++++++++++++ frontend/src/ts/modals/simple-modals.ts | 46 ---------- packages/contracts/src/users.ts | 1 + 9 files changed, 126 insertions(+), 50 deletions(-) create mode 100644 frontend/src/ts/event-handlers/login.ts create mode 100644 frontend/src/ts/modals/forgot-password.ts diff --git a/backend/__tests__/api/controllers/user.spec.ts b/backend/__tests__/api/controllers/user.spec.ts index 7b7a38dd5..b034fd8c7 100644 --- a/backend/__tests__/api/controllers/user.spec.ts +++ b/backend/__tests__/api/controllers/user.spec.ts @@ -426,8 +426,11 @@ describe("user controller test", () => { AuthUtils, "sendForgotPasswordEmail" ); + const verifyCaptchaMock = vi.spyOn(Captcha, "verify"); + beforeEach(() => { sendForgotPasswordEmailMock.mockReset().mockResolvedValue(); + verifyCaptchaMock.mockReset().mockResolvedValue(true); }); it("should send forgot password email without authentication", async () => { @@ -436,7 +439,7 @@ describe("user controller test", () => { //WHEN const { body } = await mockApp .post("/users/forgotPasswordEmail") - .send({ email: "bob@example.com" }); + .send({ email: "bob@example.com", captcha: "" }); //THEN expect(body).toEqual({ @@ -458,7 +461,7 @@ describe("user controller test", () => { //THEN expect(body).toEqual({ message: "Invalid request data schema", - validationErrors: ['"email" Required'], + validationErrors: ['"captcha" Required', '"email" Required'], }); }); it("should fail without unknown properties", async () => { @@ -471,7 +474,10 @@ describe("user controller test", () => { //THEN expect(body).toEqual({ message: "Invalid request data schema", - validationErrors: ["Unrecognized key(s) in object: 'extra'"], + validationErrors: [ + '"captcha" Required', + "Unrecognized key(s) in object: 'extra'", + ], }); }); }); diff --git a/backend/src/api/controllers/user.ts b/backend/src/api/controllers/user.ts index eda361e0d..45800c80a 100644 --- a/backend/src/api/controllers/user.ts +++ b/backend/src/api/controllers/user.ts @@ -238,7 +238,8 @@ export async function sendVerificationEmail( export async function sendForgotPasswordEmail( req: MonkeyRequest ): Promise { - const { email } = req.body; + const { email, captcha } = req.body; + await verifyCaptcha(captcha); await authSendForgotPasswordEmail(email); return new MonkeyResponse( "Password reset request received. If the email is valid, you will receive an email shortly.", diff --git a/frontend/src/html/popups.html b/frontend/src/html/popups.html index e0f51474e..16e5f1533 100644 --- a/frontend/src/html/popups.html +++ b/frontend/src/html/popups.html @@ -4,6 +4,15 @@ + +