+12








fcd7c979df
Co-authored-by: Artur <145776561+arturict@users.noreply.github.com> Co-authored-by: arturict <arturict@users.noreply.github.com> Co-authored-by: Thomas <thomas@ajnart.fr> Co-authored-by: Afonso Jorge Ramos <afonsojorgeramos@gmail.com> Co-authored-by: Danura30082 <danura30082+github@gmail.com> Co-authored-by: Kushie <122986913+kushiemoon-dev@users.noreply.github.com> Co-authored-by: ajnart <thomas@ajnart.fr> Co-authored-by: ajnart <thomas@ajnart.dev> Co-authored-by: chenjun <chenjun@foxmail.com> Co-authored-by: Wikibear <wikibear@users.noreply.github.com> Co-authored-by: Bergasha <bergasha@gmail.com> Co-authored-by: leafyelin <43306196+leafyelin@users.noreply.github.com> Co-authored-by: Lucas Araujo <lucas.lra@gmail.com> Co-authored-by: GreenMonito <86085570+GreenMonito@users.noreply.github.com> Co-authored-by: Nerdy-Technician <roffo@nerdy-technician.social> Co-authored-by: Jun <34545896+jcstrong@users.noreply.github.com> Co-authored-by: Edmond Abraham <54119952+gitedmond@users.noreply.github.com> Co-authored-by: thrawnx <tight.bulb9384@fastmail.com> Co-authored-by: Chris <58918656+nordada@users.noreply.github.com> Co-authored-by: yi111 <153097222+Yi-111-a@users.noreply.github.com> Co-authored-by: Yanis <naamaneyanis@gmail.com> Co-authored-by: Wikibear <me@sej.de> Co-authored-by: alessiottavo <93441886+alessiottavo@users.noreply.github.com>
180 lines
4.8 KiB
TypeScript
180 lines
4.8 KiB
TypeScript
import type { DayOfWeek } from "@mantine/dates";
|
|
import { z } from "zod/v4";
|
|
|
|
import { colorSchemes } from "@homarr/definitions";
|
|
import type { TranslationObject } from "@homarr/translation";
|
|
|
|
import { zodEnumFromArray } from "./enums";
|
|
import { createCustomErrorParams } from "./form/i18n";
|
|
import { nullableEmailSchema, optionalEmailSchema } from "./email";
|
|
|
|
export {
|
|
createBoardHeaderItem,
|
|
createBuiltinHeaderItem,
|
|
defaultHeaderPreferences,
|
|
getDefaultHeaderZone,
|
|
getHeaderItemKey,
|
|
getHeaderItems,
|
|
getHeaderItemZone,
|
|
headerBuiltinItemIds,
|
|
headerItemIds,
|
|
headerItemSchema,
|
|
headerLogoDisplayValues,
|
|
headerPreferenceItemIds,
|
|
headerPreferencesMutationSchema,
|
|
headerPreferencesSchema,
|
|
headerPreferencesVersion,
|
|
headerSearchDisplayValues,
|
|
headerZoneIds,
|
|
isRequiredHeaderItem,
|
|
parseHeaderPreferences,
|
|
requiredHeaderBuiltinItemIds,
|
|
} from "./header-preferences";
|
|
export type {
|
|
HeaderBoardItem,
|
|
HeaderBuiltinItem,
|
|
HeaderBuiltinItemId,
|
|
HeaderItem,
|
|
HeaderItemId,
|
|
HeaderLogoDisplay,
|
|
HeaderPreferenceItemId,
|
|
HeaderPreferences,
|
|
HeaderSearchDisplay,
|
|
HeaderZoneId,
|
|
HeaderZones,
|
|
} from "./header-preferences";
|
|
|
|
// We always want the lowercase version of the username to compare it in a case-insensitive way
|
|
export const usernameSchema = z.string().trim().toLowerCase().min(3).max(255);
|
|
|
|
const regexCheck = (regex: RegExp) => (value: string) => regex.test(value);
|
|
export const passwordRequirements = [
|
|
{ check: (value) => value.length >= 8, value: "length" },
|
|
{ check: regexCheck(/[a-z]/), value: "lowercase" },
|
|
{ check: regexCheck(/[A-Z]/), value: "uppercase" },
|
|
{ check: regexCheck(/\d/), value: "number" },
|
|
{ check: regexCheck(/[$&+,:;=?@#|'<>.^*()%!\-~`"_/\\[\]{}]/), value: "special" },
|
|
] satisfies {
|
|
check: (value: string) => boolean;
|
|
value: keyof TranslationObject["user"]["field"]["password"]["suggestion"];
|
|
}[];
|
|
|
|
export const userPasswordSchema = z.string().min(8).max(255);
|
|
|
|
const addConfirmPasswordRefinement = <
|
|
TSchema extends z.ZodObject<{ password: z.core.$ZodString; confirmPassword: z.core.$ZodString }, z.core.$strip>,
|
|
>(
|
|
schema: TSchema,
|
|
) => {
|
|
return schema.refine((data) => data.password === data.confirmPassword, {
|
|
path: ["confirmPassword"],
|
|
params: createCustomErrorParams({
|
|
key: "passwordsDoNotMatch",
|
|
params: {},
|
|
}),
|
|
});
|
|
};
|
|
|
|
export const userBaseCreateSchema = z.object({
|
|
username: usernameSchema,
|
|
password: userPasswordSchema,
|
|
confirmPassword: z.string(),
|
|
email: optionalEmailSchema,
|
|
});
|
|
|
|
export const userCreateSchema = addConfirmPasswordRefinement(userBaseCreateSchema).and(
|
|
z.object({ groupIds: z.array(z.string()) }),
|
|
);
|
|
|
|
export const userInitSchema = addConfirmPasswordRefinement(userBaseCreateSchema);
|
|
|
|
export const userSignInSchema = z.object({
|
|
name: z.string().min(1),
|
|
password: z.string().min(1),
|
|
});
|
|
|
|
export const ldapSignInSchema = z.object({
|
|
name: z
|
|
.string()
|
|
.min(1)
|
|
// Prevent special characters that could lead to LDAP injection attacks
|
|
.regex(/^[^\\,+<>;"=)(*|!&]+$/, {
|
|
message: "Invalid characters in ldap username",
|
|
}),
|
|
password: z.string().min(1),
|
|
});
|
|
|
|
export const userRegistrationSchema = addConfirmPasswordRefinement(
|
|
z.object({
|
|
username: usernameSchema,
|
|
password: userPasswordSchema,
|
|
confirmPassword: z.string(),
|
|
}),
|
|
);
|
|
|
|
export const userRegistrationApiSchema = userRegistrationSchema.and(
|
|
z.object({
|
|
inviteId: z.string(),
|
|
token: z.string(),
|
|
}),
|
|
);
|
|
|
|
export const userEditProfileSchema = z.object({
|
|
id: z.string(),
|
|
name: usernameSchema,
|
|
email: nullableEmailSchema,
|
|
});
|
|
|
|
const baseChangePasswordSchema = z.object({
|
|
previousPassword: z.string().min(1),
|
|
password: userPasswordSchema,
|
|
confirmPassword: z.string(),
|
|
});
|
|
|
|
export const userChangePasswordSchema = addConfirmPasswordRefinement(baseChangePasswordSchema);
|
|
|
|
export const userChangePasswordApiSchema = addConfirmPasswordRefinement(baseChangePasswordSchema).and(
|
|
z.object({
|
|
userId: z.string(),
|
|
}),
|
|
);
|
|
|
|
export const userChangeHomeBoardsSchema = z.object({
|
|
homeBoardId: z.string().nullable(),
|
|
mobileHomeBoardId: z.string().nullable(),
|
|
});
|
|
|
|
export const userChangeSearchPreferencesSchema = z.object({
|
|
defaultSearchEngineId: z.string().min(1).nullable(),
|
|
openInNewTab: z.boolean(),
|
|
ddgBangsEnabled: z.boolean(),
|
|
});
|
|
|
|
export const userChangeColorSchemeSchema = z.object({
|
|
colorScheme: zodEnumFromArray(colorSchemes),
|
|
});
|
|
|
|
export const userByteUnitSystemSchema = z.object({
|
|
byteUnitSystem: z.enum(["binary", "decimal"]),
|
|
});
|
|
|
|
export const userFirstDayOfWeekSchema = z.object({
|
|
firstDayOfWeek: z
|
|
.number()
|
|
.min(0)
|
|
.max(6)
|
|
.transform((value) => value as DayOfWeek),
|
|
});
|
|
|
|
export const userPingIconsEnabledSchema = z.object({
|
|
pingIconsEnabled: z.boolean(),
|
|
});
|
|
|
|
export const userEnableRightClickOnWidgetsSchema = z.object({
|
|
enableRightClickOnWidgets: z.boolean(),
|
|
});
|
|
|
|
export const userDdgBangsSchema = z.object({
|
|
ddgBangs: z.boolean(),
|
|
});
|