fix(tradein): убрать require_admin полностью — Caddy basic_auth достаточен #474
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#474
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-remove-require-admin"
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
Доделка PR #437 (refactor: убрать X-Admin-Token UI / middleware).
require_adminDepends остался вadmin.py— блокировал/admin/scrape/*возвратом 401 для всех запросов безX-Admin-Token. Frontend/trade-in/scrapers/avito(PR #472) не шлёт header (полагается на Caddy basic_auth gate), → "Invalid or missing X-Admin-Token" во всех 4 секциях.LOC: +11 / -50 (4 files).
Changes
admin.pyrequire_admin; removedependencies=[Depends(require_admin)]из 7 endpoints (/scrape,/geocode-missing,/scrape/cian/upload-cookies,/scrape/cian/test-auth,/scrape/avito-house,/scrape/avito-detail,/scrape/avito-imv)config.pyadmin_token: str | None = None+ commentdeploy/cron-scrape.shADMIN_HDRvar +-H "$ADMIN_HDR"из всех curlscripts/upload-cian-cookies.shTRADEIN_ADMIN_TOKENloading +-H X-Admin-TokenAuth contract (после fix)
/trade-in/api/v1/admin/*(черезhandle_pathconfig)DependsremovedADMIN_TOKENenv переменная больше не используется backend'ом, но можно держать в.env.runtimeкак dead referenceVerify
test_api_avito_stage4a.py5/5 PASSED — тестыrequire_adminне мокалиadmin.py:44-47(ScrapeRequest) — НЕ тронуты (out of scope)Test plan
/trade-in/api/v1/admin/scrapeчерез Caddy basic_auth → expect 200 (no 401)/trade-in/scrapers/avito→ submit any form → verify работает без token inputRefs
X-Admin-TokenMerged via deep-code-reviewer — verdict APPROVE (squash →
dbad7a6).Security verification (CRITICAL focus area):
Caddyfile:53-96wraps everything inroute { }block;import caddy/users.caddy.snippet(basic_auth) loaded BEFOREhandle /trade-in/api/*(line 72). Только/health+/preview/*короткозамкнуты выше auth./trade-in/api/v1/admin/*под basic_auth.:80блок (line 150-170) тоже импортирует ту же snippet, нельзя обойти через прямой IP/SSH tunnel.docker-compose.prod.ymlдляtradein-backendНЕ имеетports:mapping, только internal networks (tradein-net+gendesign_shared). Не reachable извне.extra="ignore"вconfig.py:7— staleADMIN_TOKENenv в.env.runtimeне сломает Settings() load.test_api_avito_stage4a.pyне мокалrequire_adminи не assert'ил 401 → 5/5 PASS после removal.cron-scrape.shиспользуетdocker exec ... curl http://localhost:8000/...(inside container loopback, минует Caddy) — auth removal acceptable.Minor (non-blocking):
scripts/upload-cian-cookies.shтеперь hitshttps://gendsgn.ru/trade-in/...без credentials → получит 401 от Caddy. User должен либо вызывать сcurl --user kopylov:..., либо обновить script добавив--userflag. Docs gap, отдельным PR.docker-compose.prod.yml:45всё ещё передаётADMIN_TOKEN: "${ADMIN_TOKEN:-}"в backend — dead reference, но не вредно (per PR description acceptable).Manual verify steps для user (post-deploy):