[Bug] Согласовать password policy (ASCII, 8–72) в backend, OpenAPI и frontend #60

Closed
opened 2026-10-11 21:43:36 +03:00 by codex-bot · 1 comment
Owner

Problem

FE/spec и backend расходятся: FE проверяет 12–72 UTF-8 bytes, backend MinLength(12) считает characters и проверяет bytes только в максимуме. Шесть кириллических букв проходят UI и отвергаются API. Existing ASCII DTO test не отличает эти policy. OpenAPI обещает minLength: 12/maxLength: 72 в characters.

Решение owner (2026-10-16): новая password policy

Заменяет byte-policy из исходной формулировки.

  • Допустимы только печатные ASCII-символы U+0020–U+007E: латинские буквы, цифры, спецсимволы и пробел. Пробел разрешён, потому что existing tests и пользователи используют passphrase вида a secure password.
  • Не допускаются: emoji, кириллица и любые не-ASCII символы, управляющие символы (в т.ч. tab, перевод строки, DEL).
  • Длина: минимум 8, максимум 72 символа. Для ASCII символы = bytes, поэтому 72-byte ceiling bcrypt сохраняется без pre-hash и без изменения stored hashes.
  • Пароль не trim-ится и не нормализуется. Политику сложности (обязательные классы символов) не добавляем.
  • Политика применяется на register. Подтвердить: login проверяет только тип и максимум 72 bytes, без charset и минимума, чтобы не заблокировать существующих пользователей, чей пароль был принят прежней policy (кириллица, 12+ символов). Если нужна единая строгая проверка на login, это отдельное решение с планом миграции пользователей.

Expected Behavior

Register принимает и отвергает одни и те же raw passwords в FE schema и backend DTO по политике выше. Published OpenAPI описывает политику корректно (pattern, minLength: 8, maxLength: 72 корректны для ASCII).

Evidence

Audit date 2026-10-11; 03, 08. IDs DRY-001, RISK-007, TQ-007 (password arm), TA-F12. Backend revision 0ad84ff4f0b4712abc7e69dc299856f14af6eadd; frontend c8821200ce699dab1ce65360d1968d5877a2e78b; Confidence High; Verification status static.
Affected: auth.dto.ts:43–74; frontend auth.schema.ts:36–43; snapshot:5246–5250; backend common/dto-validation.spec.ts:13–30.

Scope

In scope

Password validation в backend DTO (register и login), Swagger metadata, explicit consumer artifact delivery, frontend schema/AuthForm, meaningful boundary table.

Out of scope

Требования сложности (классы символов), normalization/trim, stored hash rewrite, shared cross-repo validator package, миграция существующих пользователей с не-ASCII паролями.

Proposed Approach

Register DTO: ASCII-pattern + длина 8–72. Login DTO: строка не длиннее 72 bytes. Swagger: pattern/minLength/maxLength для register. Frontend: схема register по той же policy, login без charset/минимума.

Acceptance Criteria

  • Register: ASCII (буквы, цифры, спецсимволы, пробел) на 7/8/72/73 символах принимается/отвергается одинаково в FE schema и configured backend DTO; кириллица, emoji, tab/перевод строки/DEL отвергаются.
  • Raw whitespace password не изменён; 72-byte bcrypt ceiling и server validation сохранены.
  • Register/login success и 400/VALIDATION_ERROR/pointers подтверждены; login существующего пользователя с прежним не-ASCII паролем работает.
  • Fresh OpenAPI metadata корректно описывает policy и передана frontend; generated TS не правится вручную.

Verification

Existing DTO/auth HTTP и frontend schema/AuthForm cases; runtime OpenAPI parity и consumer openapi:check при delivery. Relevant final gates.

Dependencies

Нет. Token-role/cookie regression T09 независима от DTO fix.

Traceability

Campaign WealthLedger/main#23 . Findings DRY-001, RISK-007, TQ-007, TA-F12. Repository WealthLedger/backend; T08.

<!-- wealthledger-audit:2026-10-11:password-byte-policy --> ## Problem FE/spec и backend расходятся: FE проверяет 12–72 UTF-8 bytes, backend `MinLength(12)` считает characters и проверяет bytes только в максимуме. Шесть кириллических букв проходят UI и отвергаются API. Existing ASCII DTO test не отличает эти policy. OpenAPI обещает `minLength: 12`/`maxLength: 72` в characters. ## Решение owner (2026-10-16): новая password policy Заменяет byte-policy из исходной формулировки. - Допустимы только печатные ASCII-символы U+0020–U+007E: латинские буквы, цифры, спецсимволы и пробел. Пробел разрешён, потому что existing tests и пользователи используют passphrase вида `a secure password`. - Не допускаются: emoji, кириллица и любые не-ASCII символы, управляющие символы (в т.ч. tab, перевод строки, DEL). - Длина: минимум 8, максимум 72 символа. Для ASCII символы = bytes, поэтому 72-byte ceiling bcrypt сохраняется без pre-hash и без изменения stored hashes. - Пароль не trim-ится и не нормализуется. Политику сложности (обязательные классы символов) не добавляем. - Политика применяется на register. **Подтвердить:** login проверяет только тип и максимум 72 bytes, без charset и минимума, чтобы не заблокировать существующих пользователей, чей пароль был принят прежней policy (кириллица, 12+ символов). Если нужна единая строгая проверка на login, это отдельное решение с планом миграции пользователей. ## Expected Behavior Register принимает и отвергает одни и те же raw passwords в FE schema и backend DTO по политике выше. Published OpenAPI описывает политику корректно (`pattern`, `minLength: 8`, `maxLength: 72` корректны для ASCII). ## Evidence Audit date `2026-10-11`; [03](https://git.personal.ksv741.ru/WealthLedger/main/src/commit/d07fbfabb1295780952a554185989d2d5b5c8349/audits/2026-10-11/reports/03-duplication-and-reusability-report.md), [08](https://git.personal.ksv741.ru/WealthLedger/main/src/commit/d07fbfabb1295780952a554185989d2d5b5c8349/audits/2026-10-11/reports/08-test-quality-and-effectiveness-report.md). IDs DRY-001, RISK-007, TQ-007 (password arm), TA-F12. Backend revision `0ad84ff4f0b4712abc7e69dc299856f14af6eadd`; frontend `c8821200ce699dab1ce65360d1968d5877a2e78b`; Confidence High; Verification status static. Affected: [auth.dto.ts:43–74](https://git.personal.ksv741.ru/WealthLedger/backend/src/commit/0ad84ff4f0b4712abc7e69dc299856f14af6eadd/src/modules/auth/presentation/auth.dto.ts#L43-L74); frontend auth.schema.ts:36–43; snapshot:5246–5250; backend common/dto-validation.spec.ts:13–30. ## Scope ### In scope Password validation в backend DTO (register и login), Swagger metadata, explicit consumer artifact delivery, frontend schema/AuthForm, meaningful boundary table. ### Out of scope Требования сложности (классы символов), normalization/trim, stored hash rewrite, shared cross-repo validator package, миграция существующих пользователей с не-ASCII паролями. ## Proposed Approach Register DTO: ASCII-pattern + длина 8–72. Login DTO: строка не длиннее 72 bytes. Swagger: `pattern`/`minLength`/`maxLength` для register. Frontend: схема register по той же policy, login без charset/минимума. ## Acceptance Criteria - [ ] Register: ASCII (буквы, цифры, спецсимволы, пробел) на 7/8/72/73 символах принимается/отвергается одинаково в FE schema и configured backend DTO; кириллица, emoji, tab/перевод строки/DEL отвергаются. - [ ] Raw whitespace password не изменён; 72-byte bcrypt ceiling и server validation сохранены. - [ ] Register/login success и 400/VALIDATION_ERROR/pointers подтверждены; login существующего пользователя с прежним не-ASCII паролем работает. - [ ] Fresh OpenAPI metadata корректно описывает policy и передана frontend; generated TS не правится вручную. ## Verification Existing DTO/auth HTTP и frontend schema/AuthForm cases; runtime OpenAPI parity и consumer openapi:check при delivery. Relevant final gates. ## Dependencies Нет. Token-role/cookie regression T09 независима от DTO fix. ## Traceability Campaign https://git.personal.ksv741.ru/WealthLedger/main/issues/23 . Findings DRY-001, RISK-007, TQ-007, TA-F12. Repository WealthLedger/backend; T08.
codex-bot added this to the Technical Audit Remediation — 2026-10-11 milestone 2026-10-11 21:43:36 +03:00
codex-bot added the Kind/Bug
Priority
Medium
3
audit/2026-10-11
labels 2026-10-11 21:43:36 +03:00
codex-bot was assigned by hermes-agent 2026-10-12 00:04:24 +03:00
hermes-agent added this to the WealthLedger — Delivery Board project 2026-10-12 00:04:24 +03:00
codex-bot changed title from [Bug] Согласовать password validation в UTF-8 bytes и HTTP metadata to [Bug] Согласовать password policy (ASCII, 8–72) в backend, OpenAPI и frontend 2026-10-16 08:40:31 +03:00
Author
Owner

Решено. Влиты в develop: backend#109, frontend#89, specs#47, docs#47. AC подтверждены тестами (границы 7/8/72/73, кириллица, emoji, tab/LF/DEL, raw whitespace, login со старым паролем, 400/VALIDATION_ERROR с pointer #/password) и OpenAPI parity; npm run verify в backend и frontend прошёл.

Принятые допущения: пробел разрешён; login проверяет только непустой пароль до 72 байт.

Решено. Влиты в `develop`: backend#109, frontend#89, specs#47, docs#47. AC подтверждены тестами (границы 7/8/72/73, кириллица, emoji, tab/LF/DEL, raw whitespace, login со старым паролем, 400/VALIDATION_ERROR с pointer `#/password`) и OpenAPI parity; `npm run verify` в backend и frontend прошёл. Принятые допущения: пробел разрешён; login проверяет только непустой пароль до 72 байт.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WealthLedger/backend#60