validate invite token type on registration

This commit is contained in:
Jan Kahmen committed 2026-09-12 12:08:33 +00:00
1 parent c458d5fb65
commit 406518e0a5
3 files changed
+26 -1

No files matched your search

+2 -1
View File
@@ -5,6 +5,7 @@ import { requireTeamId, requireUserEmail, requireUserId, requireUserRoles } from
import {
registrationBodyValidation,
registerInviteTokenValidation,
loginValidation,
recoveryValidation,
recoveryTokenBodyValidation,
@@ -48,7 +49,7 @@ class AuthController implements IAuthController {
registerUser = catchAsync(async (req: Request, res: Response) => {
const newUser = req.body.user;
const newUserToken = req.body.token;
const newUserToken = registerInviteTokenValidation.parse(req.body.token);
if (newUser?.email) {
const newUserEmail = requireUserEmail(newUser.email);
newUser.email = newUserEmail.toLowerCase();
@@ -23,6 +23,8 @@ export const registrationBodyValidation = z.object({
inviteToken: z.string().optional().default(""),
});
export const registerInviteTokenValidation = z.string().optional().default("");
export const recoveryValidation = z.object({
email: z.email("Must be a valid email address"),
});
@@ -0,0 +1,22 @@
import { describe, expect, it } from "@jest/globals";
import { registerInviteTokenValidation } from "../../../src/api/validation/authValidation.ts";
describe("authValidation", () => {
describe("registerInviteTokenValidation", () => {
it("accepts a valid token string", () => {
expect(registerInviteTokenValidation.parse("a".repeat(64))).toBe("a".repeat(64));
});
it("defaults an absent token to an empty string", () => {
expect(registerInviteTokenValidation.parse(undefined)).toBe("");
});
it("rejects a NoSQL operator object in place of a token", () => {
expect(() => registerInviteTokenValidation.parse({ $ne: null })).toThrow();
});
it("rejects an array token", () => {
expect(() => registerInviteTokenValidation.parse(["a", "b"])).toThrow();
});
});
});