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
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
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
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
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
51a003e078
v0.5.10: /export — attachment default, ?view=1 inline, ?filename=custom
2026-06-02 14:49:50 +03:00
naeel
66a52d9363
v0.5.9: fix tests IDs, revert dotenv abs paths, deploy-vm doc
2026-06-02 14:20:16 +03:00
naeel
b91b78ab04
v0.5.8: distinct MOCK_USERS (WZ88888=АЛЬФА, WZ77777=БЕТА)
2026-06-02 11:36:53 +03:00
naeel
f1416e6566
v0.5.7: unique company names in MOCK_USERS
2026-06-02 11:32:41 +03:00
naeel
8ea10f1e37
v0.5.4: fix multi-company API — client_id validation, export isolation, 121 tests PASS
2026-06-02 11:20:51 +03:00
naeel
59ad0fa67e
v0.5.5: fix export client_id + multi-company tests (section O)
2026-06-02 11:17:23 +03:00
naeel
1b1b3b6bd7
v0.5.3: fix multi-company API isolation (client_id param)
2026-06-02 10:57:52 +03:00
naeel
a083f65323
v0.5.2: multi-company, isAdmin fix, appVersion, docs
2026-06-02 10:52:12 +03:00
naeel
0413b44051
fix: P0/P1 fixes (auth+limit+schema) + project audit docs
2026-05-31 09:42:46 +03:00
naeel
b0a5875f4e
refactor: /exp в отдельный модуль src/routes/exp.js
2026-05-31 09:05:48 +03:00
naeel
ed5b3c8367
feat: comprehensive API tests (104 pass) + fix: validation errors → 400, comment length limit
2026-05-30 19:44:37 +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
87216389e3
feat: REST API v1 (Bearer JWT, CRUD entries + admin companies)
2026-05-30 18:04:27 +03:00
naeel
093b96b9ae
fix: CSRF 403 — читать токен из body (_csrf), cookieName без __Host- (v0.4.0)
2026-05-30 16:49:35 +03:00
naeel
97c3f66b3c
fix: saveUninitialized true — CSRF токен валиден между GET и POST /login
2026-05-30 16:29:05 +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
bcd8c5631a
feat: authLimiter on POST /login, GET /callback, POST /dev-login (10 req / 5 min)
2026-05-30 15:38:38 +03:00
naeel
b6e8f31cc6
refactor: csp.js exports CSP_DIRECTIVES, helmet applies them in one call
2026-05-30 15:37:32 +03:00
naeel
695264e7b4
feat: CSP enabled via src/middleware/csp.js (unsafe-inline, blocks external/frame/object)
2026-05-30 15:36:22 +03:00
naeel
f4c9983612
feat: PG session store via connect-pg-simple (src/middleware/session.js)
2026-05-30 15:34:50 +03:00
naeel
289e7cd751
fix: overlaps() canonical formula (a.start<=b.end && b.start<=a.end)
2026-05-30 15:31:37 +03:00
naeel
a5170a062c
security: fix 7 vulnerabilities from Opus code review
...
- [A01] /export: mount after auth.middleware, filter by company for non-admin
- [A02] OIDC: verify issuer, audience, select key by kid; preload JWKS at startup
- [A07] session fixation: session.regenerate() in POST /login, GET /callback, POST /dev-login
- [A10] open redirect: safeReturn() helper validates returnTo (blocks //evil.com, https:// etc)
- [A05] CSRF: getSessionIdentifier uses req.sessionID instead of dead req.cookies.jwt
- [A05] fail-fast: reject default SESSION_SECRET / CSRF_SECRET in NODE_ENV=production
- [A05] DEV_MODE=true blocked in production
Tests: 68 PASS, 0 FAIL (was 50, added 18 new security-focused tests)
2026-05-30 15:25:57 +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
3f18e05d2d
refactor: шаг 7 — /audit /admin /admin/limit вынесены в src/routes/admin.js
2026-05-30 13:42:06 +03:00
naeel
87a841fa56
refactor: шаг 6 — GET / и POST /add /edit /delete вынесены в src/routes/entries.js
2026-05-30 13:40:50 +03:00
naeel
55d26c1ece
refactor: шаг 5 — /login /logout вынесены в src/routes/auth.js
2026-05-30 13:39:04 +03:00
naeel
f91a882379
refactor: шаг 4 — GET /export вынесен в src/routes/export.js
2026-05-30 13:38:03 +03:00
naeel
b25f346d97
refactor: шаг 3 — CSRF-инициализация вынесена в src/middleware/csrf.js
2026-05-30 13:37:08 +03:00
naeel
35210291d0
refactor: шаг 2 — лимитеры вынесены в src/middleware/rateLimit.js
2026-05-30 13:36:10 +03:00
naeel
631641bbf0
refactor: шаг 1 — MOCK_USERS и backUrl вынесены в src/config.js
2026-05-30 13:35:16 +03:00
naeel
c6c9d01cd7
feat: admin-роль (isAdmin, requireAdmin), getCompanyById, getAllCompanies, setLimit, getAudit с JOIN
2026-05-30 09:09:24 +03:00
naeel
cda0b085e6
feat: CIDR агрегация (aggregateCIDRs) для /export по ТЗ
2026-05-30 09:07:30 +03:00
naeel
2fb4548bf6
fix: auth.js на jsonwebtoken (CJS) вместо jose (ESM)
2026-05-30 08:45:21 +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
d4a70bb947
feat: валидатор IPv4, CRUD-запросы, схема БД
2026-05-29 23:29:11 +03:00
naeel
814625ef57
feat: каркас Express + pg, health check
2026-05-29 21:56:20 +03:00