test(tradein/auth): правило про синхронную сверку — сторожем, а не комментарием (#2715) #2735
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2735
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "test/2715-verify-password-call-site-guard"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Пункт 3 хвоста #2715. Только тест, кода приложения не трогает — поэтому отдельно от #2734 (пункты 1-2), файлы не пересекаются, порядок мержа любой.
Правило «из
async defзови ТОЛЬКОverify_password_bounded» жило в docstringapp/core/password.py, а синхроннаяverify_passwordоставалась публичной и импортируемой. Одной строчкиasyncio.to_thread(verify_password, …)в будущем коде хватит, чтобы получить вынос в поток вообще без учёта слотов: внешне быстро, а потолок перебора (#2665) и доля на ключ (#2714) тихо исчезают.AST, а не grep.
verify_passwordпоминается в комментариях и docstring'ах (auth.py,config.py) — текстовый поиск краснел бы на них, и сторож пришлось бы ослаблять исключениями. А форму без скобок (to_thread(verify_password, …)) — ровно ту, ради которой сторож и пишется —grep 'verify_password('не поймал бы вовсе.Детектор проверен на себе (
test_detector_actually_detects): пустой детектор (return False) прошёл бы все файлыapp/и выглядел бы работающим сторожем до первого настоящего нарушения. Тест фиксирует и то, что он ловит, и то, на что не имеет права краснеть.hash_passwordсторож НЕ трогает: вteam.py:444/568он синхронный сознательно (ручки аутентифицированные и редкие, анонимно не вызываются), это оговорено в docstringpassword.py.Прецедент такого сторожа в репозитории:
backend/tests/sql/test_auth_sql_migrations.py.Test plan
pytest tests/test_password_call_sites.py— 2 passed на текущемmain(нарушений вapp/сейчас нет)from app.core.password import verify_passwordвapp/api/v1/team.py→AssertionError: ['app/api/v1/team.py']Refs #2715