From 3d20c2a31d65a2769c3f3860999262421ff7d662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 22 Jun 2026 17:46:52 +0400 Subject: [PATCH] =?UTF-8?q?v0.5.166:=20/export=E2=86=92/v2/export=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82,=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D1=80=D1=82=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D0=BE=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- server.js | 21 ++++---------------- tests/run-tests.js | 8 -------- {src => v1_legacy/src}/api/index.js | 0 {src => v1_legacy/src}/api/routes/admin.js | 0 {src => v1_legacy/src}/api/routes/entries.js | 0 {tests => v1_legacy/tests}/api.js | 0 {tests => v1_legacy/tests}/integration.js | 0 {tests => v1_legacy/tests}/ui-sso.py | 0 {ui => v1_legacy/ui}/api-client.js | 0 {ui => v1_legacy/ui}/index.js | 0 {ui => v1_legacy/ui}/routes/admin.js | 0 {ui => v1_legacy/ui}/routes/auth.js | 0 {ui => v1_legacy/ui}/routes/entries.js | 0 {ui => v1_legacy/ui}/routes/export.js | 0 {views => v1_legacy/views}/admin.ejs | 0 {views => v1_legacy/views}/index.ejs | 0 v2/server.js | 7 +++++-- v2/src/config/index.js | 2 +- 19 files changed, 11 insertions(+), 29 deletions(-) rename {src => v1_legacy/src}/api/index.js (100%) rename {src => v1_legacy/src}/api/routes/admin.js (100%) rename {src => v1_legacy/src}/api/routes/entries.js (100%) rename {tests => v1_legacy/tests}/api.js (100%) rename {tests => v1_legacy/tests}/integration.js (100%) rename {tests => v1_legacy/tests}/ui-sso.py (100%) rename {ui => v1_legacy/ui}/api-client.js (100%) rename {ui => v1_legacy/ui}/index.js (100%) rename {ui => v1_legacy/ui}/routes/admin.js (100%) rename {ui => v1_legacy/ui}/routes/auth.js (100%) rename {ui => v1_legacy/ui}/routes/entries.js (100%) rename {ui => v1_legacy/ui}/routes/export.js (100%) rename {views => v1_legacy/views}/admin.ejs (100%) rename {views => v1_legacy/views}/index.ejs (100%) diff --git a/package.json b/package.json index f4261b9..44ea5ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.5.164", + "version": "0.5.166", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/server.js b/server.js index 6145dea..3f1ce59 100644 --- a/server.js +++ b/server.js @@ -31,7 +31,6 @@ const { authLimiter } = require('./src/middleware/rateLimit'); const { createSessionMiddleware } = require('./src/middleware/session'); const { aggregateCIDRs } = require('./src/validators'); const { CSP_DIRECTIVES } = require('./src/middleware/csp'); -// const { createUiRouter } = require('./ui/index'); // ⛔ устарело, всё в v2 const app = express(); const PORT = process.env.PORT || 3000; @@ -102,28 +101,16 @@ async function start() { // JWKS endpoint для валидации токенов внешними сервисами (только в mock-режиме) if (auth.jwksHandler) app.get('/.well-known/jwks.json', auth.jwksHandler); - // ⛔ Старый /export — удалён, всё в /v2/export - // app.get('/export', async (req, res) => { ... }); - - // ── OIDC-роуты (Keycloak) — активны ТОЛЬКО когда KC_CLIENT_ID задан ───── - // В mock-режиме (сейчас): заглушки, работает ui/routes/auth.js - // 🔮 В проде: задать KC_CLIENT_ID + KC_CLIENT_SECRET в .env + // ── OIDC-роуты (Keycloak) ─────────────────────────────────────────────── const { createRouter: createOidcRouter } = require('./src/routes/oidc'); app.use('/', createOidcRouter({ auth })); - // ⛔ Старый API v1 — удалён, всё в v2 - // const { createApiRouter } = require('./src/api/index'); - // app.use('/api/v1', createApiRouter({ auth, q })); - - // ── UI-слой: SSR через EJS, данные из /api/v1/* ─────────────────────────── - // Монтируется ПОСЛЕ /api/v1/ — не перехватывает API-запросы. - // ── V2 — тестовый роутер (Keycloak → IAM → вывод) ───────────────── - // Редирект корня на V2 + // ── V2 — основной код ───────────────────────────────────────────────── app.get('/', (req, res) => res.redirect('/v2/app')); + // Редирект /export → /v2/export (для обратной совместимости) + app.get('/export', (req, res) => res.redirect('/v2/export' + (req.originalUrl.includes('?') ? req.originalUrl.substring(req.originalUrl.indexOf('?')) : ''))); const { createV2Router } = require('./v2/server'); app.use('/v2', createV2Router()); - // ⛔ Старый UI-слой — удалён, всё в v2 - // app.use('/', createUiRouter({ auth, MOCK_USERS, authLimiter })); // ── Общий обработчик ошибок ─────────────────────────────────────────────── // eslint-disable-next-line no-unused-vars diff --git a/tests/run-tests.js b/tests/run-tests.js index dc702f0..dd19003 100644 --- a/tests/run-tests.js +++ b/tests/run-tests.js @@ -45,14 +45,6 @@ const modules = [ 'src/validators.js', 'src/middleware/rateLimit.js', 'src/middleware/csrf.js', - 'src/api/index.js', - 'src/api/routes/entries.js', - 'src/api/routes/admin.js', - 'ui/index.js', - 'ui/routes/auth.js', - 'ui/routes/entries.js', - 'ui/routes/admin.js', - 'ui/routes/export.js', 'server.js', ]; diff --git a/src/api/index.js b/v1_legacy/src/api/index.js similarity index 100% rename from src/api/index.js rename to v1_legacy/src/api/index.js diff --git a/src/api/routes/admin.js b/v1_legacy/src/api/routes/admin.js similarity index 100% rename from src/api/routes/admin.js rename to v1_legacy/src/api/routes/admin.js diff --git a/src/api/routes/entries.js b/v1_legacy/src/api/routes/entries.js similarity index 100% rename from src/api/routes/entries.js rename to v1_legacy/src/api/routes/entries.js diff --git a/tests/api.js b/v1_legacy/tests/api.js similarity index 100% rename from tests/api.js rename to v1_legacy/tests/api.js diff --git a/tests/integration.js b/v1_legacy/tests/integration.js similarity index 100% rename from tests/integration.js rename to v1_legacy/tests/integration.js diff --git a/tests/ui-sso.py b/v1_legacy/tests/ui-sso.py similarity index 100% rename from tests/ui-sso.py rename to v1_legacy/tests/ui-sso.py diff --git a/ui/api-client.js b/v1_legacy/ui/api-client.js similarity index 100% rename from ui/api-client.js rename to v1_legacy/ui/api-client.js diff --git a/ui/index.js b/v1_legacy/ui/index.js similarity index 100% rename from ui/index.js rename to v1_legacy/ui/index.js diff --git a/ui/routes/admin.js b/v1_legacy/ui/routes/admin.js similarity index 100% rename from ui/routes/admin.js rename to v1_legacy/ui/routes/admin.js diff --git a/ui/routes/auth.js b/v1_legacy/ui/routes/auth.js similarity index 100% rename from ui/routes/auth.js rename to v1_legacy/ui/routes/auth.js diff --git a/ui/routes/entries.js b/v1_legacy/ui/routes/entries.js similarity index 100% rename from ui/routes/entries.js rename to v1_legacy/ui/routes/entries.js diff --git a/ui/routes/export.js b/v1_legacy/ui/routes/export.js similarity index 100% rename from ui/routes/export.js rename to v1_legacy/ui/routes/export.js diff --git a/views/admin.ejs b/v1_legacy/views/admin.ejs similarity index 100% rename from views/admin.ejs rename to v1_legacy/views/admin.ejs diff --git a/views/index.ejs b/v1_legacy/views/index.ejs similarity index 100% rename from views/index.ejs rename to v1_legacy/views/index.ejs diff --git a/v2/server.js b/v2/server.js index 3ff792f..aeb56de 100644 --- a/v2/server.js +++ b/v2/server.js @@ -141,9 +141,12 @@ function createV2Router() { router.use('/test', createTestRouter()); } - // ── /v2/export — выгрузка CIDR (публичный, без авторизации) ────── + // ── /v2/export — выгрузка CIDR (только для админов) ───────────── const { createExportRouter } = require('./src/export'); - router.use('/export', createExportRouter()); + router.use('/export', resolveContext, (req, res, next) => { + if (!req.canAdmin) return res.status(403).send('Доступ запрещён — только для администраторов'); + next(); + }, createExportRouter()); // ── GET /v2/logout — выход только из whitelist (без KC SSO) ───────── router.get('/logout', (req, res) => { diff --git a/v2/src/config/index.js b/v2/src/config/index.js index 69dcbeb..591af30 100644 --- a/v2/src/config/index.js +++ b/v2/src/config/index.js @@ -8,7 +8,7 @@ // ═══════════════════════════════════════════════════════════════════════════════ module.exports = { - version: '0.5.164', + version: '0.5.166', // ── IAM ────────────────────────────────────────────────────────────────── iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user',