naeel
f5ee0a36de
v0.5.112: стиль админки как на основной, убран Выйти, ⚙️ →Лимиты и Аудит
2026-06-15 14:36:11 +04:00
naeel
8fe89f3a0a
v0.5.111: админка — лимиты и аудит (/v2/admin), кнопка ⚙️
2026-06-15 14:24:20 +04:00
naeel
6bff095a67
v0.5.110: inline-редактирование через простые формы, без JS innerHTML
2026-06-15 14:17:40 +04:00
naeel
9ca0d087de
v0.5.109: синхронизация версий v2/config + package.json
2026-06-15 14:13:26 +04:00
naeel
11c3817376
v0.5.108: фикс inline-редактирования — innerHTML вместо show/hide
2026-06-15 14:04:11 +04:00
naeel
ebcdb1ccb1
v0.5.107: inline-редактирование в таблице, редирект / → /v2/app
2026-06-15 13:57:48 +04:00
naeel
eb3c17cd68
v0.5.106: фикс — админ всегда видит все компании, убран дубль (админ)
2026-06-15 13:51:37 +04:00
naeel
eb7788235f
v2: ARCHITECTURE.md — документ архитектуры
2026-06-15 13:47:09 +04:00
naeel
8ab0bb10ac
v0.5.105: убран переключатель Администратор, adminMode всегда on
2026-06-15 13:45:33 +04:00
naeel
2545bc97f1
v0.5.104: админ видит (личное) у своих компаний в dropdown
2026-06-15 13:41:01 +04:00
naeel
f00b7f3e87
v0.5.103: WZ01112 админ по умолчанию, adminMode auto-on
2026-06-15 13:39:04 +04:00
naeel
a31b3e61f2
v0.5.102: единый интерфейс /v2/app для юзеров и админов
2026-06-15 13:30:12 +04:00
naeel
2f151f4cdf
toggle-admin: redirect to /v2/admin on enable, session.save, v0.5.101
2026-06-15 12:44:14 +04:00
naeel
2e89a71afa
oidc: force redirect to /v2/app after login, v0.5.100
2026-06-15 12:28:33 +04:00
naeel
9eba8859cf
oidc: default returnTo /v2/app, v0.5.99
2026-06-15 12:22:18 +04:00
naeel
7fa6b43562
v2: WZ01112 admin toggle
2026-06-15 12:05:09 +04:00
naeel
3e418f9f4a
v2: документирование интеграции 0.5.98 — таблицы + impersonation
2026-06-15 09:17:34 +04:00
naeel
814d066b10
v2: таблицы v2_→оригинальные + impersonation модуль (IMPERSONATION_TARGET + EXTRA_COMPANIES)
2026-06-15 09:16:10 +04:00
naeel
cfaf8f34c3
v2: EJS-шаблоны — user, admin, admin-audit, admin-entries
2026-06-13 08:46:09 +04:00
naeel
30aaf8a7e4
v2: export слой — GET /v2/export, агрегация CIDR
2026-06-13 08:34:09 +04:00
naeel
e5815279a1
v2: +admin мок-юзер (3 компании, без имперсонации) для полного тестирования
2026-06-13 07:52:01 +04:00
naeel
616b4ead09
v2: подробные комментарии во всех модулях — что, зачем, контракты
2026-06-13 07:37:07 +04:00
naeel
1af304b2a8
v2: admin — дашборд компаний, аудит, лимиты, просмотр записей
2026-06-13 07:31:01 +04:00
naeel
9454e9853f
v2: userFlow action + ENABLE_TEST_API флаг — отключение без удаления кода
2026-06-13 07:25:36 +04:00
naeel
fe5a7d0d37
v2: выделение валидации — validate() в crud, db/queries получает готовый cidr
2026-06-13 07:11:53 +04:00
naeel
3c061b6c4b
v2: разделение слоёв — crud/index.js API-слой, user/ и test/ через crud
2026-06-13 06:55:18 +04:00
naeel
4b5ccc6a4c
v2: fix chaos test — CIDR от 11 (10.x заблокирован), по 10 на компанию, проверка всех компаний
2026-06-12 23:04:40 +04:00
naeel
5bc1b5773a
v2: fix test router mount /test/api → /test, /chaos теперь доступен без авторизации
2026-06-12 23:01:28 +04:00
naeel
0925ae4fd8
v2: /v2/test/chaos — параллельный хаос-тест внутри приложения (Promise.all)
2026-06-12 22:56:57 +04:00
naeel
2f59c033ac
v2: убран хаос — curl через сеть слишком медленный
2026-06-12 22:55:23 +04:00
naeel
81921c4e38
v2: упрощённый хаос — 30 последовательных запросов с задержками
2026-06-12 22:49:13 +04:00
naeel
23c59c1aae
v2: fix switch case in test API (был сломан sed-ом)
2026-06-12 22:29:24 +04:00
naeel
e7f0611947
v2: switch + chaos тесты (50/54 pass, switch ждёт redeploy)
2026-06-12 22:23:09 +04:00
naeel
1772ade84b
v2: test API — action=switch для переключения компаний
2026-06-12 22:02:12 +04:00
naeel
3f50a6fecf
v2: 47 CRUD-тестов — все ТЗ, нагрузка, БД, имперсонация — ALL PASS
2026-06-12 22:01:13 +04:00
naeel
2a1f4add2b
v2: фикс тестов — URL-encoding кириллицы
2026-06-12 21:56:36 +04:00
naeel
545d1c8aac
v2: /v2/test/api — CRUD эндпоинт + внешние тесты curl
2026-06-12 21:43:28 +04:00
naeel
7f7124e44e
v2: встроенные CRUD-тесты — /v2/test/crud (production-база)
2026-06-12 21:40:22 +04:00
naeel
8522988151
v2: /v2/login → returnTo=/v2/app
2026-06-12 21:21:16 +04:00
naeel
cd49398660
v2: убран v2_ префикс из req.* — роутер и модули согласованы
2026-06-12 21:19:43 +04:00
naeel
53dec84045
v2: документирован чеклист переименования при интеграции
2026-06-12 21:14:15 +04:00
naeel
d3b753e6bd
v2: убраны v2_ префиксы сессии — user/adminMode/token как в основном коде
2026-06-12 21:13:15 +04:00
naeel
287d196eaf
v2: resolveContext — копирует session.user → v2_user если нет своей
2026-06-12 21:10:36 +04:00
naeel
a835cf0f16
v2: user CRUD + schema автозапуск + router тесты — модуль пользователя готов
2026-06-12 21:09:30 +04:00
naeel
df72fa2fe1
v2: роутер по роли + пустышки user/admin — resolveContext middleware
2026-06-12 21:03:41 +04:00
naeel
15da5cd441
v2: fio — строка (fullName), не объект
2026-06-12 20:54:48 +04:00
naeel
b18429049e
v2: минимум — /v2/login→основной, /v2/iam→IAM-данные из сессии
2026-06-12 20:42:14 +04:00
naeel
eacf90e433
v2: откат auth/config/server к 5c09844 — чистый модуль аутентификации
2026-06-12 20:15:02 +04:00
naeel
33b879c098
v2: ⚠️ КОСТЫЛЬ /v2/test — вход с TEST_TOKEN (WZ01112) в обход Keycloak
2026-06-12 17:37:32 +04:00
naeel
0dc9820a31
v2: версия 0.5.70 — отображается в /v2 и /v2/app
2026-06-12 17:08:46 +04:00
naeel
1a2dd87705
v2: schema создаётся внутри v2, основной server.js не трогаем
2026-06-12 17:05:48 +04:00
naeel
522d2adfda
v2: отдельный модуль schema.js — автосоздание таблиц при старте
2026-06-12 17:04:25 +04:00
naeel
e91f1b0ff3
v2: CRUD-модуль — /v2/app с выбором компании, добавление/изменение/удаление записей
2026-06-12 16:53:33 +04:00
naeel
03d480de12
v2: документирован конфиг — тестовый KC vs production, инструкция перехода
2026-06-12 16:43:20 +04:00
naeel
53f2b49049
v2: убран JWT fallback — IAM обязателен, нет IAM = ошибка
2026-06-12 16:41:39 +04:00
naeel
21a2c65296
v2: IAM fallback — JWT claims если IAM недоступен
2026-06-12 16:31:18 +04:00
naeel
8f8093fa29
v2: детальное логирование postForm + exchangeCode
2026-06-12 16:26:17 +04:00
naeel
3e4c5cb1af
v2: отладка exchangeCode — логируем ответ Keycloak
2026-06-12 16:08:10 +04:00
naeel
5aee05e8dc
v2: конфиг — process.env с умолчаниями, без dotenv и .env
2026-06-12 16:00:34 +04:00
naeel
0733f4eaa1
v2: хардкод конфиг — без env, без V2_*, без .env
2026-06-12 15:59:25 +04:00
naeel
ac13330fdb
v2: изоляция — свои V2_* env, v2/.env, не трогает основные переменные
2026-06-12 15:58:17 +04:00
naeel
5c09844002
v2: модуль аутентификации Keycloak + IAM, роутер /v2
...
- v2/src/auth/index.js — login(), fetchIamUser(), exchangeCode(), buildAuthUrl()
- v2/src/config/index.js — приоритет V2_* → KC_* → умолчания
- v2/server.js — createV2Router(), монтируется в server.js как /v2
- server.js — app.use('/v2', createV2Router()) перед UI-роутером
- bump 0.5.57 → 0.5.58
2026-06-12 15:47:32 +04:00
naeel
b2f1cae37d
docs: session history 2026-06-11 with remaining tasks
2026-06-12 13:43:25 +04:00
naeel
2993f95b8d
tz
2026-06-11 21:38:19 +04:00
naeel
199585be67
docs: add actual TOR (ТЗ-факт) based on implemented features
2026-06-11 21:36:40 +04:00
naeel
f818f454a3
fix: deleted entries shown with strikethrough + opacity, edit/delete hidden
2026-06-11 21:26:05 +04:00
naeel
bc209aeab8
release: bump 0.5.57
2026-06-11 21:15:45 +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
ffdc12bdf8
fix: syntax error in /debug-session — missing closing brace
2026-06-11 20:39:30 +04:00
naeel
001db2a556
debug: /debug-session shows last audit log entries (impersonated_by)
2026-06-11 20:32:23 +04:00
naeel
447acba762
fix: impersonation banner shows activeClientId instead of raw JWT clientId
2026-06-11 20:27:08 +04:00
naeel
8f9e0a96ad
fix: reject client_id when allowedIds list is empty (no IAM, no JWT claims)
2026-06-11 20:18:55 +04:00
naeel
68ea44a81d
fix: X-Imp-* headers bridge UI→API impersonation + timezone GMT+4
2026-06-11 20:17:07 +04:00
naeel
d0a0fdc264
chore: exclude sonnet analysis files from git
2026-06-11 20:03:08 +04:00
naeel
1350f0dbba
security: fix OIDC state check bypass + open redirect in login-token
...
- oidc.js: remove || true — state check now works in all environments
- auth.js: wrap returnTo in safeReturn (was unprotected on line 166)
2026-06-11 20:02:49 +04:00
naeel
351cb6afe6
feat: test impersonation via IMPERSONATION_ORIGINAL/TARGET/COMPANY env vars
...
- ui/index.js: resolveUser checks env vars, only for matching email
- Закомментировать блок 'TEST IMPERSONATION' для прода
2026-06-11 19:25:11 +04:00
naeel
e0cbf4bf35
fix: /export defaults to JSON, ?format=txt for plain text
2026-06-11 16:32:19 +04:00
naeel
e3c4c738aa
feat: /export?format=json — JSON export for admin
2026-06-11 16:29:24 +04:00
naeel
3bc285dc93
fix: /export only for adminMode users, not public
2026-06-11 16:28:15 +04:00
naeel
6025d84959
fix: add ALTER TABLE migration for impersonated_by column
2026-06-11 16:20:52 +04:00
naeel
7758d70dcf
feat: double audit — impersonated_by in audit_log
...
- db.js: add impersonated_by column to audit_log
- queries.js: logAudit accepts impersonatedBy, all CRUD pass it
- api/routes/entries.js: pass req.user.originalUserEmail as impersonatedBy
- При имперсонации: created_by=импактируемый, impersonated_by=админ
2026-06-11 16:10:41 +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
ce6b67e72a
fix: email from session.user first, not JWT payload
...
- req.session.user.email приоритетнее payload.email
- Исправляет отображение чужого email в header
2026-06-11 15:08:07 +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
f739754c3b
fix: pass canAdminMode to render + bump 0.5.47
2026-06-11 14:34:42 +04:00
naeel
cad6ebb4d6
release: bump 0.5.46
2026-06-11 14:24:46 +04:00
naeel
8b891a4bed
fix: remove duplicate catch block causing startup crash
2026-06-11 14:19:01 +04:00
naeel
08248229b9
fix: если email мой — isAdmin = true, canAdminMode = true
...
- isAdmin = iamAdmin || (payload.email/login === ntazetdinov@nubes.ru )
2026-06-11 14:10:52 +04:00
naeel
2fbdc3259b
hardcode: canAdminMode для ntazetdinov@nubes.ru без зависимостей
...
- Просто хардкод email = 'ntazetdinov@nubes.ru '
- Убран лишний фетч email из сессии/payload/logging
2026-06-11 14:10:00 +04:00
naeel
d54a72ca2c
debug: add resolveUser logging for canAdminMode diagnosis
2026-06-11 14:04:36 +04:00
naeel
4af34616f9
fix: canAdminMode по email ntazetdinov@nubes.ru вместо isAdmin
...
- ui/index.js: email берётся из сессии (IAM/Keycloak)
- canAdminMode: (isAdmin AND WZ01112) OR (ntazetdinov@nubes.ru AND WZ01112)
- Временно для тестов, убрать после настройки IAM isAdmin
2026-06-11 13:41:35 +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
1794610f77
fix: ownCo not found → getOrCreateCompany instead of companies[0]
...
- Убрал fallback на companies[0] — небезопасно
- Если компания админа не найдена — создаём через getOrCreateCompany
2026-06-11 11:18:59 +04:00
naeel
2acad33fd4
fix: admin without ?company= loads own company (no redirect)
...
- Убрал редирект на ?company=<id> — админ видит свою компанию по умолчанию
- ownCo ищется по clientId из сессии, если не найдена — первая из списка
- Больше не пишет ?company= в URL при первом входе
2026-06-11 11:16: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