diff --git a/package.json b/package.json index 45aeac5..db1ef0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.1.11", + "version": "0.1.12", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/v2/server.js b/v2/server.js index fe476df..d024119 100644 --- a/v2/server.js +++ b/v2/server.js @@ -26,7 +26,6 @@ const express = require('express'); const config = require('./src/config'); const auth = require('./src/auth'); const { resolveContext } = require('./src/router'); -const { enhanceImpersonation } = require('./src/impersonation'); const { createUserRouter } = require('./src/user'); const { createAdminRouter } = require('./src/admin'); const { pool } = require('./src/db'); @@ -103,10 +102,10 @@ function createV2Router({ generateCsrfToken, doubleCsrfProtection } = {}) { }); // ── /v2/app — пользовательский CRUD (только с сессией) ────────────── - router.use('/app', mutationLimiter, enhanceImpersonation, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createUserRouter({ generateCsrfToken })); + router.use('/app', mutationLimiter, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createUserRouter({ generateCsrfToken })); // ── /v2/admin — админка: лимиты + аудит ────────────────────────── - router.use('/admin', mutationLimiter, enhanceImpersonation, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createAdminRouter({ generateCsrfToken })); + router.use('/admin', mutationLimiter, resolveContext, doubleCsrfProtection || ((req,res,next)=>next()), createAdminRouter({ generateCsrfToken })); // ── GET /v2/ — редирект на /v2/app ────────────────────────────────── router.get('/', (req, res) => res.redirect('/v2/app')); diff --git a/v2/src/impersonation/index.js b/v2/src/impersonation/index.js deleted file mode 100644 index 37b3b6d..0000000 --- a/v2/src/impersonation/index.js +++ /dev/null @@ -1,60 +0,0 @@ -// ═══════════════════════════════════════════════════════════════════════════════ -// V2 — Имперсонация (IAM + URL-режим) -// -// ЭТО: middleware — подмена сессии при имперсонации. -// НЕ: жёсткая логика в resolveContext или user/index.js. -// -// IAM-имперсонация: если сессия уже содержит isImpersonated=true → не трогаем. -// -// URL-имперсонация: для разрешённых пользователей (IMPERSONATION_ALLOWED_USERS). -// /v2/app?impersonate=email&company=W*** -// Полная подмена сессии: email, clientId, profiles — всё от таргета. -// -// ENV: -// IMP_ALLOWED — emails через запятую (кому можно) -// ═══════════════════════════════════════════════════════════════════════════════ - -const ALLOWED_USERS = new Set( - (process.env.IMP_ALLOWED || '') - .split(/[\s,/]+/).map(s => s.trim()).filter(Boolean) -); - -function enhanceImpersonation(req, res, next) { - const u = req.session && req.session.user; - if (!u) return next(); - - // ── IAM-имперсонация — уже в сессии, не трогаем ──────────────────── - if (u.isImpersonated) return next(); - - // ── URL-имперсонация ─────────────────────────────────────────────── - const targetEmail = req.query.impersonate; - const targetCompany = req.query.company; - - if (targetEmail && targetCompany && ALLOWED_USERS.has(u.email)) { - // Сохраняем оригинал - const origEmail = u.email; - const origFio = u.fio; - - // Подменяем ВСЕ данные на таргета (как делает IAM) - u.email = targetEmail; - u.clientId = targetCompany; - u.activeClientId = targetCompany; - u.allClientIds = [targetCompany]; - u.companyName = targetCompany; - u.isImpersonated = true; - u.originalUserEmail = origEmail; - u.originalUserFullName = origFio ? (origFio.fullName || '') : ''; - u.impersonatedCompanyId = targetCompany; - u.fio = null; - - u.profiles = [{ - client_id: targetCompany, - company_name: targetCompany, - is_active_profile: true, - }]; - } - - next(); -} - -module.exports = { enhanceImpersonation };