naeel
cfaf8f34c3
v2: EJS-шаблоны — user, admin, admin-audit, admin-entries
2026-06-13 08:46:09 +04:00
naeel
f818f454a3
fix: deleted entries shown with strikethrough + opacity, edit/delete hidden
2026-06-11 21:26:05 +04:00
naeel
a601570a4a
fix: return includeDeleted checkbox + submit button for admin filter (no JS)
2026-06-11 21:07:59 +04:00
naeel
5781b37882
fix: audit table has impersonated_by column + filter uses button submit (no JS)
2026-06-11 20:47:03 +04:00
naeel
447acba762
fix: impersonation banner shows activeClientId instead of raw JWT clientId
2026-06-11 20:27:08 +04:00
naeel
68ea44a81d
fix: X-Imp-* headers bridge UI→API impersonation + timezone GMT+4
2026-06-11 20:17:07 +04:00
naeel
9c51e449ab
fix: remove canWrite from IAM — it is IAM RBAC, not our app logic
...
- IAM permissions.can_write defaults to false for all users
- Our app controls writes via adminMode + company membership
2026-06-11 16:01:55 +04:00
naeel
9a331eec82
feat: full IAM impersonation support — read-only + original user + canWrite
...
- src/auth.js: all impersonation fields + permissions.can_write
- src/routes/oidc.js: save all fields to session
- ui/index.js: canWrite, originalUserEmail in req.user
- ui/routes/entries.js: read-only guard on POST/PATCH/DELETE
- docs/PLAN-impersonation.md: updated with implemented items
2026-06-11 15:54:56 +04:00
naeel
a2cfd2c10f
feat: IAM impersonation support — isImpersonated flag + banner
...
- src/auth.js: fetchIamUser extract isImpersonated from response
- src/routes/oidc.js: save isImpersonated to session
- ui/index.js: isImpersonated in req.user
- ui/routes/entries.js: pass isImpersonated to render
- views/index.ejs: banner 'Режим имперсонации'
- docs/PLAN-impersonation.md: план дальнейших шагов (двойной аудит)
2026-06-11 15:34:19 +04:00
naeel
7b3dd8b4b3
fix: всегда показывать email залогиненного, не owner_email компании
...
- Убрано selectedCompany.owner_email из отображения «пользователь»
- Админ видит свой email, а не создателя компании
2026-06-11 15:16:59 +04:00
naeel
9cb53df8b1
fix: toggle as pure HTML form — no JS, no fetch, just POST+redirect
...
- views/index.ejs: onclick+fetch → form method=POST с button
- ui/routes/auth.js: JSON → res.redirect(Referer)
- Текст меняется: «Администратор» ↔ «Выйти из админки»
2026-06-11 14:59:59 +04:00
naeel
fa4d5646fa
fix: toggle now works — JSON response + immediate CSS flip
...
- /toggle-admin returns JSON {ok, adminMode} instead of redirect
- onclick: toggle CSS instantly, then fetch, then reload on ok
2026-06-11 14:42:31 +04:00
naeel
13466ebd37
simplify: toggle adminMode, canAdminMode flag, remove getOrCreateCompany fallback
...
- ui/index.js: canAdminMode = isAdmin AND WZ01112 (временно || WZ01112)
- views/index.ejs: checkbox → toggle с JS fetch, условие canAdminMode
- ui/routes/entries.js: убран getOrCreateCompany-фоллбек для админа
- Админ без ?company= видит список компаний, без автозагрузки
- isAdmin теперь чисто из IAM (без || WZ01112)
2026-06-11 13:15:37 +04:00
naeel
4f1f64dd6c
feat: adminMode — чек-бокс переключения админского интерфейса
...
Шаг 1: /toggle-admin роут в ui/routes/auth.js
- переключает req.session.adminMode
- canAdmin = isAdmin || clientId === WZ01112 (временно)
Шаг 2: resolveUser в ui/index.js
- req.user.adminMode из req.session.adminMode
- isAdmin = IAM.isAdmin || clientId === WZ01112 (временно)
Шаг 3: adminMode вместо isAdmin в интерфейсе
- ui/routes/entries.js: adminMode решает админский view
- ui/routes/admin.js: requireAdmin проверяет adminMode
Шаг 4: views/index.ejs
- чек-бокс «Администратор» (виден только если isAdmin)
- ссылки Аудит/Лимиты видны только при adminMode
- селектор компаний — при adminMode
2026-06-11 11:08:03 +04:00
naeel
28954515e3
cleanup: убраны устаревшие comma-separated clientId
2026-06-04 16:38:33 +03:00
naeel
a8a07fe019
feat: IAM API интеграция + обновление ТЗ + тесты
...
- src/auth.js: fetchIamUser(), switchProfile(), userFromPayload(iamData)
- src/config.js: IAM_API_URL из env
- src/routes/oidc.js: обогащение сессии через IAM (с fallback на JWT)
- ui/routes/auth.js: обогащение при токен-логине
- ui/routes/entries.js: switchTo через POST /switch-profile
- src/api/routes/entries.js: resolveCompany через profiles[]
- views/index.ejs: переключатель компаний с названиями из profiles
- .env.example: IAM_API_URL
- docs: обновлены ТЗ-реализация.md, ТЗ-плюс.md, добавлен iam-integration.md
- tests: api-crud.sh (14 тестов CRUD + валидации)
- .gitignore: исключены .env.test, DEPLOY-TESTING.md
2026-06-04 13:53:44 +03:00
naeel
878e46287b
v0.5.17: owner_email в companies + универсальный парсер токенов + jwt.decode fallback
2026-06-03 15:17:56 +03:00
naeel
38c7adf25d
v0.5.14 — вход по токену, JWKS в mock-режиме, production deploy docs
...
- POST /login-token: принимает реальный JWT (не только clientId)
- auth.js: verifyAnyToken — mock + JWKS (Keycloak Nubes) одновременно
- auth.js: JWKS предзагружается всегда, даже в mock-режиме
- devops-deploy.md: полная production-инструкция для DevOps
- .env.example: production-ready шаблон
- README.md: актуальный (v0.5.13, архитектура, тесты, ссылки)
- .gitignore: очищен от дубликатов
2026-06-03 12:37:10 +03:00
naeel
9344eb57fb
v0.5.13: убраны футеры с версией (версия в шапке и title)
2026-06-03 06:06:53 +03:00
naeel
3dc5dc4ecc
v0.5.13: зачистка UI — мёртвый login.ejs, /exp→/export, комментарии
2026-06-03 06:06:40 +03:00
naeel
d7afff4bcd
v0.5.12: версия в title и заголовке страниц
...
- <title> → IP WhiteList v<%= appVersion %> — ...
- <h1> на login → IP WhiteList v<%= appVersion %>
- Header → «Белые списки IP v...»
- Футер с версией уже был
2026-06-03 05:42:23 +03:00
naeel
0fd5b43a94
v0.5.12: доделки перед сдачей заказчику
...
§4.7: агрегация CIDR в публичном /export (aggregateCIDRs)
§5: клиентская JS-валидация (запрещённые диапазоны + нормализация)
§4.1: фильтр «показать удалённые» для admin (API + UI)
§5: уведомление о нормализации (уже работало, проверено)
Файлы:
- server.js: +aggregateCIDRs в /export
- views/index.ejs: JS-валидация + чек-бокс удалённых
- src/api/routes/entries.js: ?includeDeleted=true (admin only)
- ui/routes/entries.js: проброс includeDeleted
- docs/PLAN-predsdachey.md: план доделок
2026-06-02 19:04:24 +03:00
naeel
15b458eb35
v0.5.11: зачистка мёртвого кода + новые интеграционные тесты
...
Удалено:
- src/routes/*.js (5 файлов) — старая монолитная архитектура
- views/dev-login.ejs — старый dev-логин
- tests/debug-session.js — тесты старой архитектуры
Добавлено:
- safeReturn в src/auth.js
- Новые интеграционные тесты tests/integration.js (67 тестов, UI+API)
Обновлено:
- tests/run-tests.js — убраны старые require, добавлены новые модули
- tests/tz-compliance.js — /exp → /api/v1/entries/export
- server.js — убран require('./src/routes/exp')
2026-06-02 18:04:33 +03:00
naeel
453e25e40f
ui: убрать вход по Bearer токену, добавить ручной ввод clientId (отладка)
2026-06-02 17:31:21 +03:00
naeel
23d55a1005
v0.5.4: auto-switch on select change, remove buttons
2026-06-02 11:30:03 +03:00
naeel
a083f65323
v0.5.2: multi-company, isAdmin fix, appVersion, docs
2026-06-02 10:52:12 +03:00
naeel
63d3a67eea
fix: убрать кнопку Применить из аудита — onchange достаточно
2026-05-31 13:01:32 +03:00
naeel
0abaa65bf8
fix: preserve form values on error + rename Дата→Добавлена, Изменён→Изменена + bump 0.5.1
2026-05-31 12:48:08 +03:00
naeel
02d842fd73
fix: display dates in Europe/Moscow timezone + bump 0.4.8
2026-05-31 08:13:36 +03:00
naeel
a355b34e4a
fix: remove duplicate own company option in dropdown + bump 0.4.6
2026-05-31 07:23:25 +03:00
naeel
fa67872f30
feat: admin own company option in dropdown + fix company=own routing + bump 0.4.5
2026-05-31 06:57:34 +03:00
naeel
c19480336d
fix: remove inline JS handlers (onclick/onchange/onsubmit) -> event delegation + bump 0.4.4
2026-05-31 06:26:47 +03:00
naeel
8531a0b545
fix: audit filter onchange restore + bump 0.4.2
2026-05-31 06:04:19 +03:00
naeel
86b782bc33
fix: audit filter — add submit button, fix type comparison
2026-05-31 05:49:37 +03:00
naeel
aef7da5740
fix: ReferenceError message/wasNormalized → success в шаблонах (500 на всех страницах)
2026-05-30 19:19:15 +03:00
naeel
c85a438ba2
feat: UI-слой через /api/v1/* (ui/, views/ui-login.ejs, views/error.ejs)
...
- ui/api-client.js: HTTP-клиент к /api/v1/* (token из session.token)
- ui/routes/auth.js: /login (mock-пресеты), /login-token (Bearer paste), /logout
- ui/routes/entries.js: /, /add, /edit/:id, /delete/:id через API
- ui/routes/admin.js: /admin, /admin/limit/:id, /audit через API
- ui/routes/export.js: /export → проксирует /api/v1/entries/export
- ui/index.js: createUiRouter() — requireToken + resolveUser middleware
- views/ui-login.ejs: страница входа (mock + token)
- views/error.ejs: шаблон для 403/404/500
API расширения:
- GET /api/v1/entries теперь возвращает limit и used
- GET /api/v1/entries?company=<id> (admin): записи другой компании
- POST/PATCH/DELETE /api/v1/entries?company=<id> (admin): мутации для другой компании
- GET /api/v1/entries/export: агрегированный CIDR (перенесён из монолита)
- GET /api/v1/audit?company=<id>: журнал (перенесён из монолита)
server.js: заменены src/routes/* на ui/createUiRouter(), убран CSRF
2026-05-30 19:02:51 +03:00
naeel
d96919e68c
fix: logo SVG viewBox (0 0 311 69), version in UI footer (v0.2.0)
2026-05-30 15:58:51 +03:00
naeel
86ca944c52
feat: Authorization Code Flow (KK) + session middleware + dev-login
...
- src/auth.js: OIDC mode (KC_CLIENT_ID/KC_CLIENT_SECRET), session-based
middleware, legacy jwt-cookie migration, httpGet/httpPost без внешних зав.
- src/routes/auth.js: GET /callback (OIDC), GET+POST /dev-login (backdoor),
session-based login/logout для обоих режимов
- server.js: express-session (8h, httpOnly, sameSite lax), trust proxy в prod
- views/dev-login.ejs: форма с пресетами MOCK_USERS + произвольные поля
- views/login.ejs: ссылка на /dev-login если devLoginEnabled
- tests: +5 тестов (session middleware), 50 PASS / 0 FAIL
Env-переменные:
KC_CLIENT_ID, KC_CLIENT_SECRET, KC_BASE_URL, APP_URL — OIDC режим
SESSION_SECRET — секрет сессии
DEV_MODE=true — /dev-login без пароля
DEV_SECRET=xyz — /dev-login с ?key=xyz
2026-05-30 14:37:29 +03:00
naeel
695ed231e6
feat: CSRF защита (double-submit cookie) — все мутирующие POST-роуты, login-форма
2026-05-30 13:28:01 +03:00
naeel
c319e76c74
feat: UI — edit modal, admin-панель выбора компании, кнопки Аудит/Лимиты; views/audit.ejs, views/admin.ejs
2026-05-30 09:16:08 +03:00
naeel
28b8e7bd27
feat: мок JWT-аутентификация (RS256, JWKS, cookie)
...
- src/auth.js: генерация ключей RS256, JWKS endpoint, verify/issue/middleware
- views/login.ejs: мок-страница входа с выбором пользователя
- server.js: cookie-parser, /login, /logout, auth.middleware
- При переключении на прод: JWKS_URL в env → всё остальное без изменений
2026-05-30 08:42:09 +03:00
naeel
51f2f4ddaf
fix: гонки (транзакции), валидатор (суперсеть, parseInt, слэши), auth (401, DEV_MODE, export), схема (UNIQUE, CHECK, FK), client-валидация
2026-05-30 08:28:21 +03:00
naeel
60972169c5
feat: логотип Nubes в header'е
2026-05-29 23:58:07 +03:00
naeel
0270432bfc
style: UI в стиле платформы — карточки с header'ом, таблица с разделителями
2026-05-29 23:46:55 +03:00
naeel
4702f14dc9
feat: favicon Nubes
2026-05-29 23:40:46 +03:00
naeel
39feac109b
style: UI в стиле Nubes — тёмный header, карточки, индикаторы
2026-05-29 23:38:29 +03:00
naeel
a0a52e99fb
feat: роуты и UI — список, добавление, удаление, экспорт
2026-05-29 23:30:43 +03:00
naeel
61685b687b
fix: healthz всегда 200, страница показывает реальный статус БД
2026-05-29 22:33:40 +03:00
naeel
814625ef57
feat: каркас Express + pg, health check
2026-05-29 21:56:20 +03:00