feat(auth): make password length configurable via env (min 5–30, max 30–128)

Add PASSWORD_MIN_LENGTH / PASSWORD_MAX_LENGTH (validated in src/env.ts) and a
shared passwordPolicy helper. The policy drives the zod schemas in register,
password reset and the admin create-user dialog, plus the live requirement
checks and strength meter in the register form.

Locale messages now interpolate the configured minimum via {min} instead of
hard-coding 12.
This commit is contained in:
openhands
2026-10-18 19:20:38 +02:00
parent aef0939ee9
commit 9cf1eb615c
36 changed files with 227 additions and 143 deletions
+5 -5
View File
@@ -6132,7 +6132,7 @@
"confirmPassword": "パスワードの確認",
"usernamePlaceholder": "ユーザー名",
"emailPlaceholder": "メールアドレス",
"passwordPlaceholder": "パスワード(12文字以上)",
"passwordPlaceholder": "パスワード({min}文字以上)",
"confirmPasswordPlaceholder": "パスワードの確認",
"selectOutfit": "アバターを選んでスタイルを設定",
"termsAccept": "18歳以上であり、{hotel} の規約に同意します。",
@@ -6153,7 +6153,7 @@
"termsError": "登録するには規約に同意する必要があります。",
"usernameError": "ユーザー名は必須です。",
"emailError": "有効なメールアドレスが必要です。",
"passwordError": "パスワードは12文字以上にしてください",
"passwordError": "パスワードは{min}文字以上にしてください",
"confirmPasswordError": "パスワードが一致しません。",
"termsRequired": "規約に同意する必要があります。",
"usernameRequired": "ユーザー名は必須です。",
@@ -6167,7 +6167,7 @@
"strengthFair": "普通",
"strengthGood": "良",
"strengthStrong": "強",
"passwordMinLength": "パスワードは12文字以上にしてください",
"passwordMinLength": "パスワードは{min}文字以上にしてください",
"passwordUpper": "パスワードには大文字を1文字以上含めてください",
"passwordLower": "パスワードには小文字を1文字以上含めてください",
"passwordDigit": "パスワードには数字を1文字以上含めてください",
@@ -6202,10 +6202,10 @@
"reset": {
"title": "Set a new password",
"subtitle": "Choose a strong password you don't use elsewhere.",
"passwordPlaceholder": "New password (min 12 chars)",
"passwordPlaceholder": "New password (min {min} chars)",
"resetPassword": "Reset password",
"backToLogin": "Back to login",
"passwordMinLength": "パスワードは12文字以上にしてください",
"passwordMinLength": "パスワードは{min}文字以上にしてください",
"tooManyAttempts": "試行回数が多すぎます — 後で再度お試しください",
"invalidLink": "このリセットリンクは無効か期限切れです。新しいリンクをリクエストしてください。",
"failed": "パスワードをリセットできませんでした。もう一度お試しください。"