Commit Graph
189 Commits
Author SHA1 Message Date
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 bc209aeab8 release: bump 0.5.57 2026-06-11 21:15:45 +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 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
naeel 8c1787df19 bump 0.5.37 — debug /debug-session endpoint 2026-06-11 10:49:54 +04:00
naeel 02859d6a7a fix: replace regex constraint with LIKE '%/%' for PG compat
- constraint CHECK (value_cidr LIKE '%/%') instead of regex
- regex broke on managed PG with standard_conforming_strings=off
- ALTER TABLE adds constraint on existing tables
2026-06-10 11:51:08 +04:00
naeel 32cb0f4ac6 fix: block clientId login in OIDC mode (crash fix)
- ui/routes/auth.js: auth.isOidc → redirect to /login with error instead of
  calling issueMockToken which throws 'Mock keypair not initialized'
- This was crashing the process via unhandled promise rejection
2026-06-10 11:42:50 +04:00
naeel e22b7ac408 bump 0.5.34 — save idToken for logout 2026-06-09 22:37:05 +04:00
naeel 54f950b7d1 bump 0.5.33 — revert idToken, logout via KC config 2026-06-09 22:29:15 +04:00
naeel 9fc3665292 bump 0.5.32 — remove audience check from JWT verify 2026-06-09 22:17:23 +04:00
naeel 4a45546b0d bump 0.5.31 — disable state check in production for SSO test 2026-06-09 22:01:26 +04:00
naeel 9b76333b22 bump 0.5.30 — restore state check, clean code 2026-06-09 21:59:26 +04:00
naeel a39f97f3b4 bump 0.5.29 — add KC_BASE_URL to exchange error 2026-06-09 21:56:45 +04:00
naeel 6c5215513c bump 0.5.28 — disable state check for SSO test 2026-06-09 21:53:07 +04:00
naeel 61361ec7e2 bump 0.5.27 — error handler: URL, user, clientId, stack 2026-06-09 21:01:33 +04:00
naeel d0bfdab085 bump 0.5.26 — fix server.js error handler to show message 2026-06-09 21:01:00 +04:00
naeel 9c74479121 bump 0.5.25 — error details on 500 page, ensureSchema catch
- ui/index.js: 500 page shows error.message
- server.js: ensureSchema error logged, doesn't crash startup
2026-06-09 20:56:58 +04:00
naeel 51b6fdf132 bump 0.5.24 2026-06-09 20:51:33 +04:00
naeel e3ebd8ba4e Revert "bump 0.5.24"
This reverts commit f5141f652f.
2026-06-09 20:49:59 +04:00
naeel f5141f652f bump 0.5.24 2026-06-09 20:49:35 +04:00
naeel e9bd94cea3 fix: 0.0.0.0/8 → blocked ranges + bump 0.5.23 2026-06-04 16:13:04 +03:00
naeel c1df27d29d fix: DeepSeek audit — header injection + IAM limit + bump 0.5.22
- src/api/routes/entries.js: санитизация filename в /api/v1/entries/export
- ui/routes/export.js: санитизация filename в UI /export
- src/auth.js: лимит 100KB для IAM-ответов
- src/api/routes/entries.js: fallback для пустого allowedIds
2026-06-04 15:48:16 +03:00
naeel 58e34042de fix: header injection, api timeout, nginx duplicate + bump 0.5.21
- server.js: санитизация filename в /export (header injection)
- ui/api-client.js: req.setTimeout(15000) + try/catch JSON.parse
- docs/devops-deploy.md: убран дубль X-Forwarded-Proto
2026-06-04 15:41:03 +03:00