diff --git a/frontend/src/pages/api/auth/sign-up.ts b/frontend/src/pages/api/auth/sign-up.ts index 988df60..737a991 100644 --- a/frontend/src/pages/api/auth/sign-up.ts +++ b/frontend/src/pages/api/auth/sign-up.ts @@ -2,6 +2,23 @@ import type { APIRoute } from 'astro'; import { pb } from '../../../lib/pb'; import { sendEmail, generateVerifyEmailHtml, getSiteUrl } from '../../../lib/email'; +const PASSWORD_MIN_LENGTH = 8; +const PASSWORD_MAX_LENGTH = 12; +const PASSWORD_REGEX = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d_!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]+$/; + +function validatePassword(password: string): { valid: boolean; error?: string } { + if (!password || password.length < PASSWORD_MIN_LENGTH) { + return { valid: false, error: 'Пароль должен быть не менее 8 символов' }; + } + if (password.length > PASSWORD_MAX_LENGTH) { + return { valid: false, error: 'Пароль не должен превышать 12 символов' }; + } + if (!PASSWORD_REGEX.test(password)) { + return { valid: false, error: 'Пароль должен содержать хотя бы одну букву и одну цифру' }; + } + return { valid: true }; +} + export const POST: APIRoute = async ({ request, redirect }) => { try { const data = await request.json(); @@ -17,6 +34,14 @@ export const POST: APIRoute = async ({ request, redirect }) => { }), { status: 400 }); } + const passwordValidation = validatePassword(password); + if (!passwordValidation.valid) { + return new Response(JSON.stringify({ + success: false, + error: passwordValidation.error + }), { status: 400 }); + } + // Создаём пользователя const record = await pb.collection('users').create({ firstName,