From 2ee923f64ee73b10118bb83559f0d1353549f238 Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sun, 13 Apr 2025 14:05:10 +0300 Subject: [PATCH 1/6] feat: error code support for haveibeenpwned --- .../src/plugins/haveibeenpwned/haveibeenpwned.test.ts | 5 ++--- packages/better-auth/src/plugins/haveibeenpwned/index.ts | 8 +++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts index 6e85a288c4..046fd02b42 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from "vitest"; import { getTestInstance } from "../../test-utils/test-instance"; import { haveIBeenPwned } from "./index"; - describe("have-i-been-pwned", async () => { const { client } = await getTestInstance( { @@ -23,6 +22,7 @@ describe("have-i-been-pwned", async () => { }); expect(result.error).not.toBeNull(); expect(result.error?.status).toBe(400); + expect(result.error?.code).toBe("THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD"); }); it("should allow account creation with strong, uncompromised password", async () => { @@ -46,7 +46,6 @@ describe("have-i-been-pwned", async () => { password: initialPassword, name: "Test User", }); - console.log(res); const result = await client.changePassword( { currentPassword: initialPassword, @@ -58,8 +57,8 @@ describe("have-i-been-pwned", async () => { }, }, ); - console.log({ result }); expect(result.error).toBeDefined(); expect(result.error?.status).toBe(400); }); }); + diff --git a/packages/better-auth/src/plugins/haveibeenpwned/index.ts b/packages/better-auth/src/plugins/haveibeenpwned/index.ts index aeab5a2159..b3fd219659 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/index.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/index.ts @@ -3,6 +3,10 @@ import { createHash } from "@better-auth/utils/hash"; import { betterFetch } from "@better-fetch/fetch"; import type { BetterAuthPlugin } from "../../types"; +const ERROR_CODES = { + PASSWORD_COMPROMISED: "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", +} as const; + async function checkPasswordCompromise( password: string, customMessage?: string, @@ -30,7 +34,6 @@ async function checkPasswordCompromise( message: `Failed to check password. Status: ${error.status}`, }); } - const lines = data.split("\n"); const found = lines.some( (line) => line.split(":")[0].toUpperCase() === suffix.toUpperCase(), @@ -41,6 +44,7 @@ async function checkPasswordCompromise( message: customMessage || "The password you entered has been compromised. Please choose a different password.", + code: ERROR_CODES.PASSWORD_COMPROMISED, }); } } catch (error) { @@ -70,8 +74,10 @@ export const haveIBeenPwned = (options?: HaveIBeenPwnedOptions) => ); return ctx.password.hash(password); }, + }, }, }; }, + $ERROR_CODES: ERROR_CODES, }) satisfies BetterAuthPlugin; From c8b52765e27fd57a065d8333c84e7af44943d298 Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sun, 13 Apr 2025 14:05:39 +0300 Subject: [PATCH 2/6] lint --- docs/components/landing/hero.tsx | 2 +- .../src/plugins/haveibeenpwned/haveibeenpwned.test.ts | 5 +++-- packages/better-auth/src/plugins/haveibeenpwned/index.ts | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/components/landing/hero.tsx b/docs/components/landing/hero.tsx index 4d660e39d0..1455b49390 100644 --- a/docs/components/landing/hero.tsx +++ b/docs/components/landing/hero.tsx @@ -5,7 +5,7 @@ import useMeasure from "react-use-measure"; import Link from "next/link"; import clsx from "clsx"; import { Button } from "@/components/ui/button"; -import { Check, Copy, CornerRightUp } from "lucide-react"; +import { Check, Copy } from "lucide-react"; import { useTheme } from "next-themes"; import { Highlight, themes } from "prism-react-renderer"; import { AnimatePresence, motion, MotionConfig } from "framer-motion"; diff --git a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts index 046fd02b42..754d32ce06 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts @@ -22,7 +22,9 @@ describe("have-i-been-pwned", async () => { }); expect(result.error).not.toBeNull(); expect(result.error?.status).toBe(400); - expect(result.error?.code).toBe("THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD"); + expect(result.error?.code).toBe( + "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", + ); }); it("should allow account creation with strong, uncompromised password", async () => { @@ -61,4 +63,3 @@ describe("have-i-been-pwned", async () => { expect(result.error?.status).toBe(400); }); }); - diff --git a/packages/better-auth/src/plugins/haveibeenpwned/index.ts b/packages/better-auth/src/plugins/haveibeenpwned/index.ts index b3fd219659..570ba47666 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/index.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/index.ts @@ -4,7 +4,8 @@ import { betterFetch } from "@better-fetch/fetch"; import type { BetterAuthPlugin } from "../../types"; const ERROR_CODES = { - PASSWORD_COMPROMISED: "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", + PASSWORD_COMPROMISED: + "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", } as const; async function checkPasswordCompromise( @@ -74,7 +75,6 @@ export const haveIBeenPwned = (options?: HaveIBeenPwnedOptions) => ); return ctx.password.hash(password); }, - }, }, }; From 12958447f8890617f053db773dca268d41f798d7 Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sun, 13 Apr 2025 14:11:19 +0300 Subject: [PATCH 3/6] export error code --- .../src/plugins/haveibeenpwned/haveibeenpwned.test.ts | 4 ++-- packages/better-auth/src/plugins/haveibeenpwned/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts index 754d32ce06..928f7423d6 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { getTestInstance } from "../../test-utils/test-instance"; -import { haveIBeenPwned } from "./index"; +import { haveIBeenPwned , ERROR_CODES } from "./index"; describe("have-i-been-pwned", async () => { const { client } = await getTestInstance( { @@ -23,7 +23,7 @@ describe("have-i-been-pwned", async () => { expect(result.error).not.toBeNull(); expect(result.error?.status).toBe(400); expect(result.error?.code).toBe( - "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", + ERROR_CODES.PASSWORD_COMPROMISED, ); }); diff --git a/packages/better-auth/src/plugins/haveibeenpwned/index.ts b/packages/better-auth/src/plugins/haveibeenpwned/index.ts index 570ba47666..7c10c8e10d 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/index.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/index.ts @@ -3,7 +3,7 @@ import { createHash } from "@better-auth/utils/hash"; import { betterFetch } from "@better-fetch/fetch"; import type { BetterAuthPlugin } from "../../types"; -const ERROR_CODES = { +export const ERROR_CODES = { PASSWORD_COMPROMISED: "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", } as const; From c0aca984627f8253f80e6028d5fa695c5821c932 Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sun, 13 Apr 2025 14:11:50 +0300 Subject: [PATCH 4/6] lint --- .../src/plugins/haveibeenpwned/haveibeenpwned.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts index 928f7423d6..781a4c2ee7 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { getTestInstance } from "../../test-utils/test-instance"; -import { haveIBeenPwned , ERROR_CODES } from "./index"; +import { haveIBeenPwned, ERROR_CODES } from "./index"; describe("have-i-been-pwned", async () => { const { client } = await getTestInstance( { @@ -22,9 +22,7 @@ describe("have-i-been-pwned", async () => { }); expect(result.error).not.toBeNull(); expect(result.error?.status).toBe(400); - expect(result.error?.code).toBe( - ERROR_CODES.PASSWORD_COMPROMISED, - ); + expect(result.error?.code).toBe(ERROR_CODES.PASSWORD_COMPROMISED); }); it("should allow account creation with strong, uncompromised password", async () => { From 8836938b7b1aed14305e9fe0430d94d6b7970fc3 Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sun, 13 Apr 2025 14:18:27 +0300 Subject: [PATCH 5/6] reexporting on build --- .../src/plugins/haveibeenpwned/haveibeenpwned.test.ts | 5 +++-- packages/better-auth/src/plugins/haveibeenpwned/index.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts index 781a4c2ee7..046fd02b42 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { getTestInstance } from "../../test-utils/test-instance"; -import { haveIBeenPwned, ERROR_CODES } from "./index"; +import { haveIBeenPwned } from "./index"; describe("have-i-been-pwned", async () => { const { client } = await getTestInstance( { @@ -22,7 +22,7 @@ describe("have-i-been-pwned", async () => { }); expect(result.error).not.toBeNull(); expect(result.error?.status).toBe(400); - expect(result.error?.code).toBe(ERROR_CODES.PASSWORD_COMPROMISED); + expect(result.error?.code).toBe("THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD"); }); it("should allow account creation with strong, uncompromised password", async () => { @@ -61,3 +61,4 @@ describe("have-i-been-pwned", async () => { expect(result.error?.status).toBe(400); }); }); + diff --git a/packages/better-auth/src/plugins/haveibeenpwned/index.ts b/packages/better-auth/src/plugins/haveibeenpwned/index.ts index 7c10c8e10d..570ba47666 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/index.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/index.ts @@ -3,7 +3,7 @@ import { createHash } from "@better-auth/utils/hash"; import { betterFetch } from "@better-fetch/fetch"; import type { BetterAuthPlugin } from "../../types"; -export const ERROR_CODES = { +const ERROR_CODES = { PASSWORD_COMPROMISED: "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", } as const; From feebaa81625b19bdb4e1088ed7634e3293fa5f7d Mon Sep 17 00:00:00 2001 From: Kinfe123 Date: Sun, 13 Apr 2025 14:18:48 +0300 Subject: [PATCH 6/6] lint --- .../src/plugins/haveibeenpwned/haveibeenpwned.test.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts index 046fd02b42..754d32ce06 100644 --- a/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts +++ b/packages/better-auth/src/plugins/haveibeenpwned/haveibeenpwned.test.ts @@ -22,7 +22,9 @@ describe("have-i-been-pwned", async () => { }); expect(result.error).not.toBeNull(); expect(result.error?.status).toBe(400); - expect(result.error?.code).toBe("THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD"); + expect(result.error?.code).toBe( + "THE_PASSWORD_YOU_ENTERED_HAS_BEEN_COMPROMISED_PLEASE_CHOOSE_A_DIFFERENT_PASSWORD", + ); }); it("should allow account creation with strong, uncompromised password", async () => { @@ -61,4 +63,3 @@ describe("have-i-been-pwned", async () => { expect(result.error?.status).toBe(400); }); }); -