fix(ui): reject unsafe rate limit integers

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
mrinal 2026-10-02 01:08:18 +00:00
parent 96138d89a0
commit 7b238d79c3
4 changed files with 12 additions and 8 deletions

View file

@ -37,11 +37,15 @@ describe("isValidRateLimitInput", () => {
["number zero", 0],
["integer string", "12"],
["integer", 12],
["maximum safe integer", String(Number.MAX_SAFE_INTEGER)],
])("accepts %s", (_label, value) => {
expect(isValidRateLimitInput(value)).toBe(true);
});
it.each(["1.5", "-1", "abc", "1e400"])("rejects %s", (value) => {
expect(isValidRateLimitInput(value)).toBe(false);
});
it.each(["1.5", "-1", "abc", "1e400", "9007199254740992", "9007199254740993", "1e30", "9999999999999999999"])(
"rejects %s",
(value) => {
expect(isValidRateLimitInput(value)).toBe(false);
},
);
});

View file

@ -13,5 +13,5 @@ export const isValidRateLimitInput = (value: string | number | null | undefined)
return true;
}
const number = Number(value);
return Number.isFinite(number) && Number.isInteger(number) && number >= 0;
return Number.isSafeInteger(number) && number >= 0;
};

View file

@ -520,7 +520,7 @@ describe("UserEditView", () => {
expect(typeof onSubmit.mock.calls[0][0].rpm_limit).toBe("number");
});
it.each(["-1", "1.5"])("rejects an invalid TPM limit of %s", async (value) => {
it.each(["-1", "1.5", "1e30", "9007199254740992"])("rejects an invalid TPM limit of %s", async (value) => {
const onSubmit = vi.fn();
renderWithProviders(<UserEditView {...defaultProps} userData={userDataWithRateLimits()} onSubmit={onSubmit} />);
@ -535,7 +535,7 @@ describe("UserEditView", () => {
fireEvent.submit(form);
expect(
await screen.findByText("Enter a non-negative whole number, or leave empty for unlimited"),
await screen.findByText("Enter a whole number from 0 to 9007199254740991, or leave empty for unlimited"),
).toBeInTheDocument();
expect(onSubmit).not.toHaveBeenCalled();
});

View file

@ -71,11 +71,11 @@ const budgetSchema = (unlimitedBudget: boolean) =>
tpm_limit: z
.union([z.string(), z.number()])
.nullish()
.refine(isValidRateLimitInput, "Enter a non-negative whole number, or leave empty for unlimited"),
.refine(isValidRateLimitInput, "Enter a whole number from 0 to 9007199254740991, or leave empty for unlimited"),
rpm_limit: z
.union([z.string(), z.number()])
.nullish()
.refine(isValidRateLimitInput, "Enter a non-negative whole number, or leave empty for unlimited"),
.refine(isValidRateLimitInput, "Enter a whole number from 0 to 9007199254740991, or leave empty for unlimited"),
});
type UserEditFormValues = z.infer<ReturnType<typeof budgetSchema>>;