docs: актуальный план на основе ТЗ и реального кода
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
# План разработки IP WhiteList — актуальный (30.05.2026)
|
||||
|
||||
> Основан на ТЗ (`WhiteIPlist.txt`) и реальном состоянии кода.
|
||||
> Все предыдущие планы (plan.md, plan-v2.md, plan-working.md, plan-gemini.md, plan-gpt54.md) устарели.
|
||||
|
||||
---
|
||||
|
||||
## Что уже работает (не трогать)
|
||||
|
||||
| Компонент | Файл | Состояние |
|
||||
|---|---|---|
|
||||
| Валидатор IPv4/CIDR | `src/validators.js` | ✅ Полный — все 14 диапазонов Приложения А |
|
||||
| CRUD функции | `src/queries.js` | ✅ `createEntry`, `updateEntry`, `deleteEntry`, `listEntries`, `getExportCIDRs`, `getAudit` |
|
||||
| Soft delete | `src/queries.js` + `sql/schema.sql` | ✅ `deleted_at`, `deleted_by` |
|
||||
| Схема БД | `sql/schema.sql` | ✅ Все таблицы и индексы |
|
||||
| Аудит-лог запись | `src/queries.js` | ✅ Пишется при CREATE/UPDATE/DELETE |
|
||||
| UI главная страница | `views/index.ejs` | ✅ Стиль Nubes |
|
||||
| Экспорт txt | `server.js GET /export` | ✅ Работает (без суммаризации) |
|
||||
| Лимит + custom_limit | `src/queries.js` | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## Что есть в queries.js, но не подключено к роутам
|
||||
|
||||
- `updateEntry` — написана, роута `POST /update/:id` нет, UI-кнопки нет
|
||||
- `getAudit` — написана, роута и страницы нет
|
||||
- `listEntries(companyId, includeDeleted=true)` — параметр есть, но нигде не вызывается с `true`
|
||||
|
||||
---
|
||||
|
||||
## Что отсутствует полностью
|
||||
|
||||
### A. Роуты (server.js)
|
||||
- `POST /update/:id` — редактирование записи
|
||||
- `GET /admin` — страница администратора
|
||||
- `POST /admin/limit/:companyId` — изменение лимита компании
|
||||
- `GET /admin/audit` — журнал аудита (только для admin)
|
||||
|
||||
### B. UI (views/)
|
||||
- Кнопка и inline-форма редактирования в таблице
|
||||
- Страница admin (`views/admin.ejs`):
|
||||
- Список всех компаний
|
||||
- Записи с фильтром по компании
|
||||
- Переключатель "показать удалённые"
|
||||
- Журнал аудита
|
||||
- Изменение лимита компании
|
||||
|
||||
### C. Авторизация
|
||||
- Текущий код: наивный base64 decode JWT — не проверяет подпись, не Keycloak
|
||||
- Нужно: `openid-client` (OIDC), интеграция с Keycloak, проверка `clientID` и `email` из claims
|
||||
- Admin-роль: `clientId === 'WZ01112'` — определяется из claim
|
||||
|
||||
### D. Суммаризация CIDR в экспорте
|
||||
- ТЗ требует агрегацию в минимальный набор CIDR
|
||||
- Нужна библиотека: `npm install cidr-tools` или `ip-range-check`
|
||||
- Или самописный merge (sorted ranges → contiguous merge)
|
||||
|
||||
### E. Клиентская валидация
|
||||
- ТЗ: валидация на клиенте обязательна, серверная — авторитетная
|
||||
- Сейчас: только серверная
|
||||
- Нужно: JS в index.ejs — проверить формат CIDR, маску /22–/32, не RFC1918
|
||||
|
||||
### F. Переключатель компаний
|
||||
- ТЗ: пользователь может быть в нескольких компаниях (несколько `clientId` в токене)
|
||||
- Нужно: UI-dropdown, переключение активного `clientId`, хранение выбора в сессии
|
||||
|
||||
---
|
||||
|
||||
## Обнаруженные баги
|
||||
|
||||
### overlaps() в validators.js — логическая ошибка
|
||||
|
||||
```js
|
||||
// Текущий код (неверно):
|
||||
return a.start <= b.end && b.start <= a.start ||
|
||||
b.start <= a.end && a.start <= b.start;
|
||||
|
||||
// Правильно:
|
||||
return a.start <= b.end && b.start <= a.end;
|
||||
```
|
||||
|
||||
Стандартное условие пересечения отрезков. Текущий код даёт false positive для некоторых смежных диапазонов.
|
||||
**Приоритет: высокий** — влияет на корректность проверки пересечений.
|
||||
|
||||
---
|
||||
|
||||
## Порядок реализации
|
||||
|
||||
### Этап 1 — Критические фиксы (не ломают работу)
|
||||
1. Исправить `overlaps()` в `validators.js`
|
||||
2. Добавить `POST /update/:id` в `server.js`
|
||||
3. Добавить кнопку редактирования + inline-форму в `views/index.ejs`
|
||||
|
||||
### Этап 2 — Полнота ТЗ
|
||||
4. Клиентская валидация (JS в index.ejs)
|
||||
5. Суммаризация CIDR в `GET /export` (cidr-tools или ручной merge)
|
||||
6. Определение admin-роли (`clientId === 'WZ01112'`)
|
||||
7. Страница `/admin` + роут `GET /admin`
|
||||
8. Роут `POST /admin/limit/:companyId`
|
||||
9. Журнал аудита для admin (`GET /admin/audit`)
|
||||
|
||||
### Этап 3 — Авторизация (блокирующая для продакшена)
|
||||
10. `npm install openid-client` — OIDC Keycloak
|
||||
11. Заменить auth middleware на реальную проверку токена
|
||||
12. Убрать `DEV_MODE` (или оставить только для локальной разработки)
|
||||
|
||||
### Этап 4 — Опционально
|
||||
13. Переключатель компаний (multi-company claim)
|
||||
14. Автотесты: `npm install --save-dev jest supertest`
|
||||
15. Пагинация (только если лимит вырастет > 50)
|
||||
16. Audit UI для клиента (не только admin)
|
||||
|
||||
---
|
||||
|
||||
## Зависимости
|
||||
|
||||
```
|
||||
openid-client — OIDC / Keycloak
|
||||
cidr-tools — суммаризация CIDR в экспорте
|
||||
```
|
||||
|
||||
Всё остальное — в рамках существующего стека (Express, EJS, pg).
|
||||
|
||||
---
|
||||
|
||||
## Что НЕ нужно делать
|
||||
|
||||
- Переписывать validators.js (только исправить overlaps)
|
||||
- Переписывать queries.js — всё уже написано
|
||||
- Менять схему БД — она полная
|
||||
- Пересобирать стек — Express + EJS достаточно для ТЗ
|
||||
Reference in New Issue
Block a user