Commit Graph
100 Commits
Author SHA1 Message Date
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
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 f40bcb84fd feat: ensureSchema — приложение само создаёт таблицы при старте
- db.js: ensureSchema() = CREATE TABLE IF NOT EXISTS для всех таблиц
- server.js: вызов ensureSchema() после коннекта к БД
- Больше не нужен ручной psql -f sql/schema.sql
2026-06-09 19:55:07 +04:00
naeel b0e43f981b Revert "feat: auto-migration on startup (ensureSchema)"
This reverts commit dce2368712.
2026-06-09 19:48:43 +04:00
naeel dce2368712 feat: auto-migration on startup (ensureSchema)
- db.js: ensureSchema() creates tables if not exist
- server.js: calls ensureSchema() after DB connection
- No manual SQL needed for deployment
2026-06-09 19:46:19 +04:00
naeel 9fd808bc1f chore: DB defaults for managed platform, reduce required env vars
- db.js: DB_HOST default postgresqlk8s-master, DB_NAME default ipwhitelist, DB_USER default super
- server.js: fail-fast for DB_PASS in production (instead of IAM_API_URL)
- After this change: only DB_PASS is required for mock mode
2026-06-09 19:20:29 +04:00
naeel 393595301b fix: IAM_API_URL default to dev, document env selection
- .env.example: показаны три URL стендов (dev/test/prod), dev по умолчанию
- src/config.js: дефолт IAM_API_URL сменён с prod на dev (безопаснее)
- docs/devops-deploy.md: добавлена строка IAM_API_URL в таблицу настройки .env
2026-06-06 12:00:27 +04:00
naeel ae6f3c4f8d fix: devops-deploy.md — multi-company через IAM 2026-06-04 16:52:07 +03:00
naeel 1f1d70e577 fix: AGENT-GUIDE comma-separated → IAM profiles 2026-06-04 16:50:47 +03:00
naeel e7aeceb3b6 fix: README multi-company — IAM вместо comma-separated 2026-06-04 16:49:50 +03:00
naeel 4f8695aeda docs: AGENT-GUIDE 0.5.23 + changelog 2026-06-04 16:39:44 +03:00
naeel 28954515e3 cleanup: убраны устаревшие comma-separated clientId 2026-06-04 16:38:33 +03:00
naeel a0b66bb602 docs: wowater.md + README 0.5.23 2026-06-04 16:36:45 +03:00
naeel e9bd94cea3 fix: 0.0.0.0/8 → blocked ranges + bump 0.5.23 2026-06-04 16:13:04 +03:00
naeel 05c6920987 cleanup: PRODUCTION-READY-ANALYSIS.md → audits/ 2026-06-04 16:02:20 +03:00
naeel 3ef5478130 cleanup: PROJECT-AUDIT.md → audits/, ++gitignore 2026-06-04 15:59:59 +03:00
naeel a3cf9812df cleanup: аудиты → audits/, версии актуальны, gitignore
- audits/: все аудиты + ревью вынесены из docs/
- .gitignore: audits/, удалены старые паттерны
- README.md: v0.5.22
- .github/AGENT-GUIDE.md: v0.5.22
- Удалены из трекинга: TZ-COMPLIANCE, аудиты
2026-06-04 15:56:38 +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
naeel 99796202cb fix: IAM warning, nginx doc, fail-fast IAM_API_URL + bump 0.5.20
- src/routes/oidc.js: console.error при IAM fallback вместо warn
- server.js: проверка IAM_API_URL в production mode
- docs/devops-deploy.md: X-Forwarded-Proto в nginx config
2026-06-04 15:33:32 +03:00
naeel 7b66b94774 bump: 0.5.19 (redirect security fixes) 2026-06-04 15:27:17 +03:00
naeel 8cbbe52316 fix: safeReturn для всех редиректов (security)
- ui/routes/auth.js: safeReturn() для returnTo в POST /login и /login-token
- src/routes/oidc.js: safeLocal() для oidcReturnTo в /callback
2026-06-04 15:26:26 +03:00
naeel 6edef60ed8 bump: 0.5.18 (IAM integration) 2026-06-04 15:11:53 +03:00
naeel bbcda90378 fix: IAM баги после ревью
- ui/routes/auth.js: POST /login-token сделан async (был await без async)
- ui/routes/auth.js: IAM enrichment только при auth.isOidc (не в mock-режиме)
- src/auth.js: fetchIamUser, switchProfile возвращаются из initAuth()
- src/routes/oidc.js: auth.fetchIamUser вместо require('../auth') (устранение циклической зависимости)
- ui/routes/auth.js: auth.fetchIamUser вместо require
- tests/api-crud.sh: удалён хардкоженный prod-токен, токен только через аргумент
2026-06-04 15:08:40 +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 0b3f1ab445 gitignore: добавить docs/agent-opinions.md 2026-06-03 13:41:00 +03:00
naeel c10b70f97a cleanup: заменить тестовый email на example.com в keycloak-auth-reference 2026-06-03 13:40:41 +03:00
naeel b7fe03f02d cleanup финал: AGENT-GUIDE SSH-команда, deploy-keycloak URL, keycloak-auth ФИО/namespaces 2026-06-03 13:19:46 +03:00
naeel f5dd0eaf15 cleanup: ТЗ-плюс — убрать реальные URL, email, deck-test client_id 2026-06-03 13:18:00 +03:00
naeel 8577ffa05c fix README: devops-deploy не английский 2026-06-03 13:13:42 +03:00
naeel 2194c1650f cleanup: убрать IP, реальные URL, креды из публичных файлов
- AGENT-GUIDE.md: убран IP ВМ, HTTP→HTTPS
- copilot-instructions.md: Files/token.txt→.env.example
- keycloak-auth-reference.md: убраны реальные client_id, URL gateway, email
- deploy-keycloak.md: реальные параметры заменены на шаблоны
- .env.example: русские значения→шаблоны
- README.md: порт 3000, multi-company пример под mock
2026-06-03 13:10:48 +03:00
naeel 43fa0faf7a docs: fix нумерация шагов, client scope, README обрезанная фраза + версия 2026-06-03 13:05:40 +03:00
naeel 2a77b163db fix docs/devops-deploy — чёткий порядок, без дыр
- порядок шагов исправлен (сначала код, потом таблицы)
- sudo согласован
- PostgreSQL: установка → код → таблицы
- все <домен> заменены на white.nubes.ru как пример
- таблица .env с колонкой 'Что писать'
2026-06-03 13:02:42 +03:00
naeel 006741a5fa fix gitignore — вернуть docs паттерны, убрать kubeconfig из трека 2026-06-03 12:44:51 +03:00
naeel 8e72fc4559 bump v0.5.13 → v0.5.14 2026-06-03 12:37:21 +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 22beaa86a3 v0.5.13: AGENT-GUIDE.md — полный гайд для AI-агентов (англ.) 2026-06-03 06:22:35 +03:00
naeel 2841e3ac27 v0.5.13: gitignore разработческих файлов (DevOps-чистота) 2026-06-03 06:19:55 +03:00
naeel 8feabc339d v0.5.13: DevOps-деплой гайд + .env.example 2026-06-03 06:17:49 +03:00
naeel ba0779db51 v0.5.13: подготовка OIDC (Keycloak) — роуты готовы, ждут DevOps
- src/routes/oidc.js: /login, /callback, /logout
  Активны ТОЛЬКО при KC_CLIENT_ID+KC_CLIENT_SECRET
  Сейчас (mock) — пустой router, запросы уходят в UI
- server.js: подключены OIDC-роуты
- docs/deploy-keycloak.md: что нужно от DevOps для включения
2026-06-03 06:12:22 +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 ac0f151bcb v0.5.13 2026-06-03 05:54:46 +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 599808b838 fix: переключение компаний не работало — req.user.activeClientId не синхронизировался
Баг: resolveUser запускается ДО обработчика. После смены
session.user.activeClientId рендер и companyQuery продолжали
использовать старое значение req.user.activeClientId.

Фикс: req.user.activeClientId = switchTo после обновления сессии.
2026-06-03 05:34:06 +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 805b440e5d v0.5.11: ТЗ-полный compliance тест — 111 тестов, 20 компаний × 100 CIDR
Покрытие:
- §4.1 Просмотр списка (19 тестов)
- §4.2 Создание записи (10 тестов)
- §4.3 Редактирование (4 теста)
- §4.4 Soft delete (5 тестов)
- §4.5 Лимиты (8 тестов)
- §4.6 Аудит (7 тестов)
- §4.7 Export (13 тестов)
- §5 Валидация — все 14 запрещённых + маски + XSS/SQLi (21 тест)
- §3 Роли и права (9 тестов)
- §3.1 Мульти-компания (7 тестов)
- ТЗ-плюс уточнения (2 теста)

Результат: 111 PASS, 0 FAIL — лог в test-results/
2026-06-02 18:38:08 +03:00
naeel b10b3e8b09 правило №6: перед изменением кода — описать и получить согласие 2026-06-02 18:13:17 +03:00
naeel 6bbd0fe1e2 v0.5.11: /export публичный (временно, с заделом на Keycloak SSO)
Изменения:
- server.js: публичный GET /export до всей авторизации
  🔮 Для Keycloak SSO: раскомментировать auth.bearerMiddleware
- Удалён ошибочно созданный src/routes/exp.js
- Обновлены тесты: /export доступен без авторизации
2026-06-02 18:12:35 +03:00