[CL-1153] SEC-Q2: убрать non-atomic webhook dedup путь — только атомарный fail-closed #1157
No reviewers
Labels
No labels
ci-failing
duplicate
needs-rebase
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
europa-tech-srl/europatech!1157
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/claude-sec-q2-1153-dedup-nonatomic"
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?
Что сделано
api/src/controllers/webhook/dedup.ts: удалены legacy non-atomic парыisEventProcessed/markEventProcessed+ NP/OB варианты и write-only in-memory fallback Map (fallbackProcessedIds,evictOldestEntries, cleanup-interval). Общая логика сведена вmarkKeyProcessedIfNew(Redis SET NX, fail closed). Остались толькоmark*EventProcessedIfNew+release*EventProcessed.dedup.test.tsпереведены на атомарный контракт (SET NX claim/duplicate/fail-closed/release+re-claim).premium.routes.tsобновлены (isEventProcessed->markEventProcessedIfNew).docs/vault/modules/api-payments.md+1 строка (Rule G).Refs #1153
Зачем
Non-atomic путь допускал TOCTOU-гонку двойного финансового исполнения между check и mark, а in-memory fallback тихо деградировал multi-instance dedup при падении Redis (PM2 cluster). После ухода всех хэндлеров на атомарный путь legacy-код остался мёртвым грузом с опасным контрактом: fallback Map стал write-only (никто не читал), т.е. защиты не давал вообще. GitNexus impact: LOW, 0 прод-callsites.
План тестирования
pnpm exec tsc --noEmit— clean (послеprisma generate).pnpm exec eslint src --max-warnings 0— clean.pnpm exec vitest runв api: 867 files / 10940 tests passed, 0 failed.Где могу ошибаться
MEDIUM из ревью: консолидация сменила текст Sentry/log-сообщений для NP/OB — text-matching alert-правила могли молча отвалиться. Возвращены дословные pre-1153 строки через DedupProvider {tag, short, long}; теги не менялись. LOW: добавлены тесты already-claimed для NP/OB и ветка 'Redis client not configured' (vi.resetModules + fresh import, assert captureMessage x3). Refs #1153Merge evidence (Rule 103.1 + Rule C):
dee5960e(дословные pre-1153 тексты через DedupProvider, +3 теста).dee5960e(API, App, Contracts, Python SDK, Secrets Scan, Telegram Mini App, Prisma Migrate Gate, React Doctor).