import { z } from "zod"; export const LoginSchema = z.object({ username: z.string().min(1, "Uživatelské jméno je povinné").max(255), password: z.string().min(1, "Heslo je povinné").max(200), remember_me: z.boolean().optional().default(false), }); export const TotpVerifySchema = z.object({ login_token: z.string().min(1, "Token je povinný"), totp_code: z .string() .length(6, "Kód musí mít 6 číslic") .regex(/^\d{6}$/, "Kód musí mít 6 číslic"), remember_me: z.boolean().optional().default(false), }); export const TotpBackupSchema = z.object({ login_token: z.string().min(1, "Token je povinný"), backup_code: z .string() .min(1, "Záložní kód je povinný") // Cap length so a request with bodyLimit=10KB can't trigger N×bcrypt on // a multi-KB string. Real backup codes are 8-16 chars; 64 is generous. .max(64, "Záložní kód je příliš dlouhý"), remember_me: z.boolean().optional().default(false), }); export const TotpEnableSchema = z.object({ secret: z.string().min(1).max(255), code: z.string().min(1).max(64), password: z.string().max(200).optional(), current_code: z.string().max(64).optional(), }); export const TotpDisableSchema = z.object({ code: z.string().min(1).max(64), password: z.string().max(200).optional(), }); export const TotpRequiredSchema = z.object({ required: z.boolean(), }); export type LoginInput = z.infer; export type TotpVerifyInput = z.infer; export type TotpBackupInput = z.infer;