adds password max chars hint

This commit is contained in:
Christian Beutel
2025-02-16 20:46:31 +01:00
parent 95f78cb89a
commit 307736dfc2
17 changed files with 120 additions and 54 deletions

View File

@@ -34,23 +34,47 @@
extend: validator({ extend: validator({
schema: z schema: z
.object({ .object({
oldPassword: z.string().min( oldPassword: z
.string()
.min(
8, 8,
$_("must-be-at-least-n-characters-long", { $_("must-be-at-least-n-characters-long", {
values: { n: 8 }, values: { n: 8 },
}), }),
)
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
), ),
password: z.string().min( password: z
.string()
.min(
8, 8,
$_("must-be-at-least-n-characters-long", { $_("must-be-at-least-n-characters-long", {
values: { n: 8 }, values: { n: 8 },
}), }),
)
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
), ),
passwordConfirm: z.string().min( passwordConfirm: z
.string()
.min(
8, 8,
$_("must-be-at-least-n-characters-long", { $_("must-be-at-least-n-characters-long", {
values: { n: 8 }, values: { n: 8 },
}), }),
)
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
), ),
}) })
.refine((d) => d.password === d.passwordConfirm, { .refine((d) => d.password === d.passwordConfirm, {

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Fehler beim Lesen der Datei", "error-reading-file": "Fehler beim Lesen der Datei",
"error-saving-list": "Fehler beim Speichern der Liste", "error-saving-list": "Fehler beim Speichern der Liste",
"error-saving-trail": "Fehler beim Speichern der Route", "error-saving-trail": "Fehler beim Speichern der Route",
"error-setting-up-strava-integration": "Fehler beim Einrichten der Strava-Integration", "error-setting-up-integration": "Fehler beim Einrichten der Strava-Integration",
"error-updating-password": "Fehler beim Aktualisieren des Passworts", "error-updating-password": "Fehler beim Aktualisieren des Passworts",
"error-updating-strava-integration": "Fehler Aktualisierung der Komoot-Integration", "error-updating-strava-integration": "Fehler Aktualisierung der Komoot-Integration",
"est-duration": "Gesch. Dauer", "est-duration": "Gesch. Dauer",
@@ -177,6 +177,7 @@
"metric": "Metrisch", "metric": "Metrisch",
"moderate": "Mittel", "moderate": "Mittel",
"must-be-at-least-n-characters-long": "Muss mindestens {n} Zeichen lang sein", "must-be-at-least-n-characters-long": "Muss mindestens {n} Zeichen lang sein",
"must-be-at-most-n-characters-long": "",
"my-account": "Mein Konto", "my-account": "Mein Konto",
"n-days-ago": "vor {n} Tagen", "n-days-ago": "vor {n} Tagen",
"n-hours-ago": "vor {n} Stunden", "n-hours-ago": "vor {n} Stunden",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Error reading file", "error-reading-file": "Error reading file",
"error-saving-list": "Error saving list", "error-saving-list": "Error saving list",
"error-saving-trail": "Error saving trail", "error-saving-trail": "Error saving trail",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up {provider} integration",
"error-updating-password": "Error updating password", "error-updating-password": "Error updating password",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Est. duration", "est-duration": "Est. duration",
@@ -177,6 +177,7 @@
"metric": "Metric", "metric": "Metric",
"moderate": "Moderate", "moderate": "Moderate",
"must-be-at-least-n-characters-long": "Must be at least {n} characters long", "must-be-at-least-n-characters-long": "Must be at least {n} characters long",
"must-be-at-most-n-characters-long": "Must be at most {n} characters long",
"my-account": "My Account", "my-account": "My Account",
"n-days-ago": "{n} days ago", "n-days-ago": "{n} days ago",
"n-hours-ago": "{n} hours ago", "n-hours-ago": "{n} hours ago",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Error leyendo el archivo", "error-reading-file": "Error leyendo el archivo",
"error-saving-list": "Error guardando la lista", "error-saving-list": "Error guardando la lista",
"error-saving-trail": "Error guardando la ruta", "error-saving-trail": "Error guardando la ruta",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Error actualizando la contraseña", "error-updating-password": "Error actualizando la contraseña",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Duración estimada", "est-duration": "Duración estimada",
@@ -177,6 +177,7 @@
"metric": "Métrica", "metric": "Métrica",
"moderate": "Medio", "moderate": "Medio",
"must-be-at-least-n-characters-long": "Tiene que tener por lo menos {n} caracteres", "must-be-at-least-n-characters-long": "Tiene que tener por lo menos {n} caracteres",
"must-be-at-most-n-characters-long": "",
"my-account": "Mi cuenta", "my-account": "Mi cuenta",
"n-days-ago": "hace {n} días", "n-days-ago": "hace {n} días",
"n-hours-ago": "hace {n} horas", "n-hours-ago": "hace {n} horas",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Erreur de lecture du fichier", "error-reading-file": "Erreur de lecture du fichier",
"error-saving-list": "Erreur lors de l'enregistrement de la liste", "error-saving-list": "Erreur lors de l'enregistrement de la liste",
"error-saving-trail": "Erreur lors de l'enregistrement de l'itinéraire", "error-saving-trail": "Erreur lors de l'enregistrement de l'itinéraire",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Erreur lors de la mise à jour du mot de passe", "error-updating-password": "Erreur lors de la mise à jour du mot de passe",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Temps estimé", "est-duration": "Temps estimé",
@@ -177,6 +177,7 @@
"metric": "Métrique", "metric": "Métrique",
"moderate": "Moyenne", "moderate": "Moyenne",
"must-be-at-least-n-characters-long": "Doit être composé d'au moins {n} caractères", "must-be-at-least-n-characters-long": "Doit être composé d'au moins {n} caractères",
"must-be-at-most-n-characters-long": "",
"my-account": "Mon profil", "my-account": "Mon profil",
"n-days-ago": "il y a {n} jours", "n-days-ago": "il y a {n} jours",
"n-hours-ago": "il y a {n} heures", "n-hours-ago": "il y a {n} heures",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Hiba a fájl olvasása közben", "error-reading-file": "Hiba a fájl olvasása közben",
"error-saving-list": "Error saving list", "error-saving-list": "Error saving list",
"error-saving-trail": "Error saving trail", "error-saving-trail": "Error saving trail",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Error updating password", "error-updating-password": "Error updating password",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Becsült időtartam", "est-duration": "Becsült időtartam",
@@ -177,6 +177,7 @@
"metric": "Metrikus", "metric": "Metrikus",
"moderate": "Mérsékelt", "moderate": "Mérsékelt",
"must-be-at-least-n-characters-long": "Legalább {n} karakter hosszúnak kell lennie", "must-be-at-least-n-characters-long": "Legalább {n} karakter hosszúnak kell lennie",
"must-be-at-most-n-characters-long": "",
"my-account": "My Account", "my-account": "My Account",
"n-days-ago": "{n} days ago", "n-days-ago": "{n} days ago",
"n-hours-ago": "{n} hours ago", "n-hours-ago": "{n} hours ago",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Errore durante la lettura del file", "error-reading-file": "Errore durante la lettura del file",
"error-saving-list": "Errore salvando la lista", "error-saving-list": "Errore salvando la lista",
"error-saving-trail": "Errore nel salvataggio del percorso", "error-saving-trail": "Errore nel salvataggio del percorso",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Errore nell'aggiornamento della password", "error-updating-password": "Errore nell'aggiornamento della password",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Durata stimata", "est-duration": "Durata stimata",
@@ -177,6 +177,7 @@
"metric": "Metrico", "metric": "Metrico",
"moderate": "Moderato", "moderate": "Moderato",
"must-be-at-least-n-characters-long": "Deve essere lungo almeno {n} caratteri", "must-be-at-least-n-characters-long": "Deve essere lungo almeno {n} caratteri",
"must-be-at-most-n-characters-long": "",
"my-account": "Il mio account", "my-account": "Il mio account",
"n-days-ago": "{n} giorni fa", "n-days-ago": "{n} giorni fa",
"n-hours-ago": "{n} ore fa", "n-hours-ago": "{n} ore fa",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Het bestand kan niet worden ingelezen", "error-reading-file": "Het bestand kan niet worden ingelezen",
"error-saving-list": "Error saving list", "error-saving-list": "Error saving list",
"error-saving-trail": "Error saving trail", "error-saving-trail": "Error saving trail",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Error updating password", "error-updating-password": "Error updating password",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Geschatte duur", "est-duration": "Geschatte duur",
@@ -177,6 +177,7 @@
"metric": "Metrisch", "metric": "Metrisch",
"moderate": "Gemiddeld", "moderate": "Gemiddeld",
"must-be-at-least-n-characters-long": "Minimaal {n} tekens", "must-be-at-least-n-characters-long": "Minimaal {n} tekens",
"must-be-at-most-n-characters-long": "",
"my-account": "My Account", "my-account": "My Account",
"n-days-ago": "{n} dagen geleden", "n-days-ago": "{n} dagen geleden",
"n-hours-ago": "{n} uuren geleden", "n-hours-ago": "{n} uuren geleden",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Błąd wczytywania pliku", "error-reading-file": "Błąd wczytywania pliku",
"error-saving-list": "Błąd przy zapisywaniu listy", "error-saving-list": "Błąd przy zapisywaniu listy",
"error-saving-trail": "Błąd podczas zapisywania szlaku", "error-saving-trail": "Błąd podczas zapisywania szlaku",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Błąd podczas aktualizacji hasła", "error-updating-password": "Błąd podczas aktualizacji hasła",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Szacowany czas", "est-duration": "Szacowany czas",
@@ -177,6 +177,7 @@
"metric": "Metryczne", "metric": "Metryczne",
"moderate": "Średni", "moderate": "Średni",
"must-be-at-least-n-characters-long": "Długość musi wynosić przynajmniej {n} znaków", "must-be-at-least-n-characters-long": "Długość musi wynosić przynajmniej {n} znaków",
"must-be-at-most-n-characters-long": "",
"my-account": "Moje konto", "my-account": "Moje konto",
"n-days-ago": "{n} dni temu", "n-days-ago": "{n} dni temu",
"n-hours-ago": "{n} godzin temu", "n-hours-ago": "{n} godzin temu",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "Erro ao ler o arquivo", "error-reading-file": "Erro ao ler o arquivo",
"error-saving-list": "Erro ao gravar lista", "error-saving-list": "Erro ao gravar lista",
"error-saving-trail": "Erro ao gravar percurso", "error-saving-trail": "Erro ao gravar percurso",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "Erro ao atualizar password", "error-updating-password": "Erro ao atualizar password",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "Duração prevista", "est-duration": "Duração prevista",
@@ -177,6 +177,7 @@
"metric": "Métrica", "metric": "Métrica",
"moderate": "Moderado", "moderate": "Moderado",
"must-be-at-least-n-characters-long": "Deve ter pelo menos {n} caracteres", "must-be-at-least-n-characters-long": "Deve ter pelo menos {n} caracteres",
"must-be-at-most-n-characters-long": "",
"my-account": "A minha conta", "my-account": "A minha conta",
"n-days-ago": "{n} dias atrás", "n-days-ago": "{n} dias atrás",
"n-hours-ago": "{n} horas atrás", "n-hours-ago": "{n} horas atrás",

View File

@@ -107,7 +107,7 @@
"error-reading-file": "读取文件错误", "error-reading-file": "读取文件错误",
"error-saving-list": "保存列表失败", "error-saving-list": "保存列表失败",
"error-saving-trail": "保存路线失败", "error-saving-trail": "保存路线失败",
"error-setting-up-strava-integration": "Error setting up strava integration", "error-setting-up-integration": "Error setting up strava integration",
"error-updating-password": "更新密码失败", "error-updating-password": "更新密码失败",
"error-updating-strava-integration": "Error updating komoot integration", "error-updating-strava-integration": "Error updating komoot integration",
"est-duration": "预计时长", "est-duration": "预计时长",
@@ -177,6 +177,7 @@
"metric": "公制", "metric": "公制",
"moderate": "中等", "moderate": "中等",
"must-be-at-least-n-characters-long": "长度至少 {n} 字符", "must-be-at-least-n-characters-long": "长度至少 {n} 字符",
"must-be-at-most-n-characters-long": "",
"my-account": "我的账户", "my-account": "我的账户",
"n-days-ago": "{n} 天前", "n-days-ago": "{n} 天前",
"n-hours-ago": "{n} 小时前", "n-hours-ago": "{n} 小时前",

View File

@@ -4,7 +4,7 @@ import type { User } from "../user";
const UserCreateSchema = (z.object({ const UserCreateSchema = (z.object({
username: z.string({ message: "required" }).min(3, "must-be-at-least-n-characters-long").regex(/^[\w][\w\.]*$/, "invalid-username"), username: z.string({ message: "required" }).min(3, "must-be-at-least-n-characters-long").regex(/^[\w][\w\.]*$/, "invalid-username"),
email: z.string({ message: "required" }).email("not-a-valid-email-address"), email: z.string({ message: "required" }).email("not-a-valid-email-address"),
password: z.string().min(8, "must-be-at-least-n-characters-long"), password: z.string().min(8, "must-be-at-least-n-characters-long").max(72),
passwordConfirm: z.string().optional() passwordConfirm: z.string().optional()
}) satisfies ZodType<Partial<User>>).refine((data) => data.password === data.passwordConfirm, { }) satisfies ZodType<Partial<User>>).refine((data) => data.password === data.passwordConfirm, {
@@ -15,9 +15,9 @@ const UserCreateSchema = (z.object({
const UserUpdateSchema = (z.object({ const UserUpdateSchema = (z.object({
username: z.string({ message: "required" }).min(3, "must-be-at-least-n-characters-long").regex(/^[\w][\w\.]*$/, "invalid-username").optional(), username: z.string({ message: "required" }).min(3, "must-be-at-least-n-characters-long").regex(/^[\w][\w\.]*$/, "invalid-username").optional(),
email: z.string({ message: "required" }).email("not-a-valid-email-address").optional(), email: z.string({ message: "required" }).email("not-a-valid-email-address").optional(),
password: z.string().min(8, "must-be-at-least-n-characters-long").optional(), password: z.string().min(8, "must-be-at-least-n-characters-long").max(72).optional(),
oldPassword: z.string().min(8, "must-be-at-least-n-characters-long").optional(), oldPassword: z.string().min(8, "must-be-at-least-n-characters-long").max(72).optional(),
passwordConfirm: z.string().min(8, "must-be-at-least-n-characters-long").optional(), passwordConfirm: z.string().min(8, "must-be-at-least-n-characters-long").max(72).optional(),
}) satisfies ZodType<Partial<User>>).refine((data) => data.password === data.passwordConfirm, { }) satisfies ZodType<Partial<User>>).refine((data) => data.password === data.passwordConfirm, {
message: "passwords-must-match", message: "passwords-must-match",
path: ["passwordConfirm"], path: ["passwordConfirm"],

View File

@@ -8,8 +8,8 @@ export async function POST(event: RequestEvent) {
const data = await event.request.json() const data = await event.request.json()
const safeData = z.object({ const safeData = z.object({
token: z.string(), token: z.string(),
password: z.string(), password: z.string().min(8).max(72),
passwordConfirm: z.string() passwordConfirm: z.string().min(8).max(72)
}).refine(d => d.password === d.passwordConfirm).parse(data) }).refine(d => d.password === d.passwordConfirm).parse(data)
const r = await pb.collection('users').confirmPasswordReset(safeData.token, safeData.password, safeData.passwordConfirm); const r = await pb.collection('users').confirmPasswordReset(safeData.token, safeData.password, safeData.passwordConfirm);
return json(r); return json(r);

View File

@@ -9,7 +9,7 @@ export async function POST(event: RequestEvent) {
const safeData = z.object({ const safeData = z.object({
email: z.string().email().optional(), email: z.string().email().optional(),
username: z.string().optional(), username: z.string().optional(),
password: z.string() password: z.string().min(8).max(72)
}).refine(d => d.email !== undefined || d.username !== undefined).parse(data); }).refine(d => d.email !== undefined || d.username !== undefined).parse(data);

View File

@@ -23,17 +23,33 @@
extend: validator({ extend: validator({
schema: z schema: z
.object({ .object({
password: z.string().min( password: z
.string()
.min(
8, 8,
$_("must-be-at-least-n-characters-long", { $_("must-be-at-least-n-characters-long", {
values: { n: 8 }, values: { n: 8 },
}), }),
)
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
), ),
passwordConfirm: z.string().min( passwordConfirm: z
.string()
.min(
8, 8,
$_("must-be-at-least-n-characters-long", { $_("must-be-at-least-n-characters-long", {
values: { n: 8 }, values: { n: 8 },
}), }),
)
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
), ),
}) })
.refine((d) => d.password === d.passwordConfirm, { .refine((d) => d.password === d.passwordConfirm, {

View File

@@ -41,7 +41,15 @@
extend: validator({ extend: validator({
schema: z.object({ schema: z.object({
username: z.string().min(1, "required"), username: z.string().min(1, "required"),
password: z.string().min(1, "required"), password: z
.string()
.min(1, "required")
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
),
}), }),
}), }),
onSubmit: async (newUser) => { onSubmit: async (newUser) => {

View File

@@ -39,11 +39,19 @@
.string() .string()
.min(1, "required") .min(1, "required")
.email("not-a-valid-email-address"), .email("not-a-valid-email-address"),
password: z.string().min( password: z
.string()
.min(
8, 8,
$_("must-be-at-least-n-characters-long", { $_("must-be-at-least-n-characters-long", {
values: { n: 8 }, values: { n: 8 },
}), }),
)
.max(
72,
$_("must-be-at-most-n-characters-long", {
values: { n: 72 },
}),
), ),
}), }),
}), }),