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).
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.
<!-- 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
was assigned by hermes-agent2026-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 и frontend2026-10-16 08:40:31 +03:00
Решено. Влиты в 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 байт.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 из исходной формулировки.
a secure password.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 revision0ad84ff4f0b4712abc7e69dc299856f14af6eadd; frontendc8821200ce699dab1ce65360d1968d5877a2e78b; 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
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.
[Bug] Согласовать password validation в UTF-8 bytes и HTTP metadatato [Bug] Согласовать password policy (ASCII, 8–72) в backend, OpenAPI и frontendРешено. Влиты в
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 байт.