Files
IPWhiteList/docs/plan-actual.md
T

132 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План разработки 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 достаточно для ТЗ