diff --git a/package.json b/package.json index ae78856..377987c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.5.171", + "version": "0.5.172", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/server.js b/server.js index 3f1ce59..7db97a8 100644 --- a/server.js +++ b/server.js @@ -78,26 +78,6 @@ async function start() { // k8s liveness probe — простая проверка что сервер жив app.get('/healthz', (req, res) => res.send('OK')); - // 🔧 DEBUG: показать IAM-данные из сессии (убрать после теста!) - app.get('/debug-session', async (req, res) => { - if (!req.session || !req.session.user) return res.json({ error: 'no session' }); - const { token, idToken, ...safe } = req.session; - // Последняя запись аудита для проверки impersonated_by - let lastAudit = null; - try { - const { getAudit } = require('./src/queries'); - const audit = await getAudit(null); - lastAudit = audit.slice(0, 3); - } catch(e) { lastAudit = 'error: ' + e.message; } - res.json({ - user: req.session.user, - hasToken: !!token, - tokenPreview: token ? token.slice(0, 50) + '...' : null, - tokenPayload: token ? (() => { try { const p = JSON.parse(Buffer.from(token.split('.')[1], 'base64url').toString()); return { iss: p.iss, sub: p.sub, email: p.email, ClientID: p.ClientID, iat: p.iat }; } catch(e) { return 'decode error'; } })() : null, - lastAudit, - }); - }); - // JWKS endpoint для валидации токенов внешними сервисами (только в mock-режиме) if (auth.jwksHandler) app.get('/.well-known/jwks.json', auth.jwksHandler); diff --git a/v2/server.js b/v2/server.js index 94ebc33..6d26288 100644 --- a/v2/server.js +++ b/v2/server.js @@ -65,34 +65,6 @@ function createV2Router() { } }); - // ── GET /v2/iam_response_test — IAM test стенд (только админ) ───── - router.get('/iam_response_test', resolveContext, async (req, res) => { - if (!req.canAdmin) return res.status(403).send('Доступ запрещён'); - const token = req.session && req.session.token; - if (!token) return res.redirect('/v2/login'); - try { - const raw = await iamFetch(token, config.iamApiBase + '/auth/user'); - res.set('Content-Type', 'text/html; charset=utf-8'); - res.send(rawPage('IAM TEST', raw)); - } catch (e) { - res.send('
' + e.message + ''); - } - }); - - // ── GET /v2/iam_response_dev — IAM dev стенд (только админ) ─────── - router.get('/iam_response_dev', resolveContext, async (req, res) => { - if (!req.canAdmin) return res.status(403).send('Доступ запрещён'); - const token = req.session && req.session.token; - if (!token) return res.redirect('/v2/login'); - try { - const raw = await iamFetch(token, config.iamApiBase + '/auth/user'); - res.set('Content-Type', 'text/html; charset=utf-8'); - res.send(rawPage('IAM DEV', raw)); - } catch (e) { - res.send('
' + e.message + ''); - } - }); - // ── GET /v2/iam-gateway-test — сравнение API (только админ) ──────── router.get('/iam-gateway-test', resolveContext, async (req, res) => { if (!req.canAdmin) return res.status(403).send('Доступ запрещён'); @@ -279,8 +251,6 @@ function iamComparePage(results) { html += 'CRUD'; html += 'Админка'; html += 'IAM PROD'; - html += 'IAM TEST'; - html += 'IAM DEV'; html += ''; for (const [name, r] of Object.entries(results)) { diff --git a/v2/src/config/index.js b/v2/src/config/index.js index 208a302..2c17134 100644 --- a/v2/src/config/index.js +++ b/v2/src/config/index.js @@ -8,7 +8,7 @@ // ═══════════════════════════════════════════════════════════════════════════════ module.exports = { - version: '0.5.171', + version: '0.5.172', // ── IAM ────────────────────────────────────────────────────────────────── iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user', diff --git a/v2/src/db/schema.js b/v2/src/db/schema.js index a04d1af..0520111 100644 --- a/v2/src/db/schema.js +++ b/v2/src/db/schema.js @@ -41,6 +41,11 @@ async function ensureSchema(pool) { deleted_at TIMESTAMPTZ ); + -- Защита от дублей: уникальный CIDR в компании среди активных записей + CREATE UNIQUE INDEX IF NOT EXISTS idx_whitelist_entries_active_cidr + ON whitelist_entries(company_id, value_cidr) + WHERE deleted_at IS NULL; + -- Аудит: каждое действие с возможностью отследить имперсонацию CREATE TABLE IF NOT EXISTS audit_log ( id SERIAL PRIMARY KEY,