From b947f1d467cb77457b30b366bc0ec816df3b196d Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 8 Oct 2026 15:19:36 +0300 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=20?= =?UTF-8?q?=E2=80=94=20=D0=BF=D0=BE=D0=BB=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4-=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B0=20=D0=B8=20=D1=84=D0=B8=D0=BA=D1=81?= =?UTF-8?q?=D1=8B=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20(2026-10-08)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-10-07-session-log.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/HISTORY/2026-10-07-session-log.md b/HISTORY/2026-10-07-session-log.md index 1ad026b..48acc45 100644 --- a/HISTORY/2026-10-07-session-log.md +++ b/HISTORY/2026-10-07-session-log.md @@ -131,3 +131,21 @@ Redis-схема не меняется (сообщения и так лежат Осталось осознанно не тронуто: `DeleteMessageBatch` итерация с `RemoveIndex` внутри безопасна (tombstone не меняет длину) — покрыто тестами. + +## 8. Полный код-ревью сервиса (2026-10-08) — коммит `5b0e89a` + +Разобран весь сервис: auth (SigV4 + JWT), router, billing, tenant, admin/UI API, +создание очередей. Критичных проблем не найдено. Исправлено три замечания: + +1. **TOCTOU лимита тенантов** — `TenantStore.Create`: проверка `MaxTenantsGlobal` + была только под RLock, вставка — позже под Lock без повторной проверки. Добавлена + проверка под Lock (как уже было в `CreateFromJWT`). +2. **Потеря `NubesSub` при рестарте** — `CreateFromJWT`: обновлённый `NubesSub` + сохранялся в Redis только внутри ветки смены `MaxQueues`; теперь персист при + любом реальном изменении, запись только если что-то изменилось. +3. **`http.Client` на каждый вызов** — `auth.PingNubesAPI` переведён на общий + клиент (keep-alive). + +UI/безопасность проверены отдельно: `listTenants`/`getTenant`/IDOR для UI-тенанта — +видит только себя, чужие `{id}` отсекаются, удаление через UI запрещено, +`SecretKey` отдаётся только по явному `/ui/api/credentials`.