386 Commits
Author SHA1 Message Date
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 ed6e9c4464 промпт для код ревью от Опус 4.8 2026-05-30 15:07:30 +03:00
naeel e9bfe6dae6 код ревью от Опус 4.8 2026-05-30 15:06: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 876e03b78b research: payg-report полная копия репы (все файлы, без .git) 2026-05-30 14:23:10 +03:00
naeel 032b41b3f5 research: auth-flow.md — полная документация SSO, KK endpoints, JWT claims, открытые вопросы 2026-05-30 14:21:42 +03:00
naeel 374a1a87b6 research: SSO-пример из payg-report (Application.cfc, oauth2.cfc, jwt.cfc) 2026-05-30 14:19:51 +03:00
naeel 6de5631451 test: добавлен tests/run-tests.js (45 тестов без БД) 2026-05-30 13:59:21 +03:00
naeel ef564ee4e5 refactor: шаг 8 — server.js упрощён до 131 строки (только init + роутеры) 2026-05-30 13:42:43 +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 695ed231e6 feat: CSRF защита (double-submit cookie) — все мутирующие POST-роуты, login-форма 2026-05-30 13:28:01 +03:00
naeel 2332827326 feat: helmet (security headers) + rate-limit (30/min mutations, 20/min export) 2026-05-30 13:22:54 +03:00
naeel c319e76c74 feat: UI — edit modal, admin-панель выбора компании, кнопки Аудит/Лимиты; views/audit.ejs, views/admin.ejs 2026-05-30 09:16:08 +03:00
naeel 8c1bafeb97 feat: роуты /edit, /audit, /admin, /admin/limit — admin-ветки, публичный /export с агрегацией 2026-05-30 09:11:41 +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 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 d4a70bb947 feat: валидатор IPv4, CRUD-запросы, схема БД 2026-05-29 23:29:11 +03:00
naeel 61685b687b fix: healthz всегда 200, страница показывает реальный статус БД 2026-05-29 22:33:40 +03:00
naeel f9c1d5ac4c fix: не падать без БД, добавить .gitignore 2026-05-29 22:19:04 +03:00
naeel 814625ef57 feat: каркас Express + pg, health check 2026-05-29 21:56:20 +03:00