From b640e9e8e771334043f27aacdd9cc449cec85140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 15 Jun 2026 14:53:21 +0400 Subject: [PATCH] =?UTF-8?q?revert:=20=D0=BE=D1=82=D0=BA=D0=B0=D1=82=20?= =?UTF-8?q?=D0=B8=D0=BC=D0=BF=D0=B5=D1=80=D1=81=D0=BE=D0=BD=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=BA=20v0.5.115=20=D0=B4=D0=BE=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=81=D1=83=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2/src/impersonation/index.js | 71 +++++++++-------------------------- 1 file changed, 17 insertions(+), 54 deletions(-) diff --git a/v2/src/impersonation/index.js b/v2/src/impersonation/index.js index 9e1b73d..73d7aa8 100644 --- a/v2/src/impersonation/index.js +++ b/v2/src/impersonation/index.js @@ -1,77 +1,40 @@ // ═══════════════════════════════════════════════════════════════════════════════ -// V2 — Имперсонация (IAM + тестовый режим через ENV) +// V2 — Расширение имперсонации (отдельный модуль) // -// ЭТО: middleware — имитирует IAM-имперсонацию для тестов. +// ЭТО: middleware — добавляет дополнительные компании админу. // НЕ: жёсткая логика в resolveContext или user/index.js. // -// ТЕСТОВЫЙ РЕЖИМ (если задан IMPERSONATION_TARGET): -// При входе IMPERSONATION_ORIGINAL все данные сессии заменяются на TARGET. -// Полная имитация IAM-имперсонации: email, profiles, clientId — всё от таргета. -// // ENV: -// IMPERSONATION_ORIGINAL — email админа (кто имперсонирует) -// IMPERSONATION_TARGET — email юзера (кого имперсонируют) ← тест -// IMPERSONATION_COMPANY — W-номер основной компании таргета +// IMPERSONATION_ORIGINAL — email админа, который имперсонирует +// IMPERSONATION_COMPANY — W-номер компании имперсонируемого // IMPERSONATION_EXTRA_COMPANIES — доп. W-номера через запятую // ═══════════════════════════════════════════════════════════════════════════════ const ORIGINAL_EMAIL = process.env.IMPERSONATION_ORIGINAL || ''; -const TARGET_EMAIL = process.env.IMPERSONATION_TARGET || ''; -const MAIN_COMPANY = process.env.IMPERSONATION_COMPANY || ''; -const EXTRA_COMPANIES = (process.env.IMPERSONATION_EXTRA_COMPANIES || '') - .split(',').map(s => s.trim()).filter(Boolean); -const ALL_TARGET_CIDS = [...new Set([MAIN_COMPANY, ...EXTRA_COMPANIES].filter(Boolean))]; +const EXTRA_COMPANIES = [ + process.env.IMPERSONATION_COMPANY || '', + ...(process.env.IMPERSONATION_EXTRA_COMPANIES || '').split(',').map(s => s.trim()) +].filter(Boolean); function enhanceImpersonation(req, res, next) { + if (!ORIGINAL_EMAIL) return next(); const u = req.session && req.session.user; if (!u) return next(); - // ── IAM-имперсонация (уже есть в сессии) — просто добавляем компании ── - if (u.isImpersonated && u.originalUserEmail === ORIGINAL_EMAIL) { - addExtraCompanies(u); - return next(); - } + // Админ имперсонирует: его originalUserEmail совпадает с ORIGINAL_EMAIL + // или он сам залогинен под ORIGINAL_EMAIL + const isOriginal = u.email === ORIGINAL_EMAIL || u.originalUserEmail === ORIGINAL_EMAIL; + if (!isOriginal) return next(); - // ── Тестовый режим: полная подмена данных ─────────────────────────── - if (TARGET_EMAIL && u.email === ORIGINAL_EMAIL) { - // Сохраняем isAdmin от оригинала - const wasAdmin = u.isAdmin || (u.allClientIds || []).includes('WZ01112') || u.clientId === 'WZ01112'; + const current = u.allClientIds || [u.clientId || '']; + u.allClientIds = [...new Set([...current, ...EXTRA_COMPANIES])].filter(Boolean); - // Подменяем ВСЕ данные на таргета (как делает IAM) - u.email = TARGET_EMAIL; - u.clientId = MAIN_COMPANY || u.clientId; - u.activeClientId = MAIN_COMPANY || u.clientId; - u.allClientIds = ALL_TARGET_CIDS; - u.companyName = MAIN_COMPANY; - u.isAdmin = wasAdmin; // админство сохраняется - u.isImpersonated = true; - u.originalUserEmail = ORIGINAL_EMAIL; - u.originalUserFullName = u.fio ? (u.fio.fullName || '') : ''; - u.fio = null; // фио таргета неизвестно - - // Профили таргета (имитация) - u.profiles = ALL_TARGET_CIDS.map(cid => ({ - client_id: cid, - company_name: cid, - is_active_profile: cid === MAIN_COMPANY, - })); - - return next(); - } - - // ── Не имперсонация — ничего не делаем ────────────────────────────── - next(); -} - -function addExtraCompanies(u) { - if (!ALL_TARGET_CIDS.length) return; - const current = u.allClientIds || []; - u.allClientIds = [...new Set([...current, ...ALL_TARGET_CIDS])].filter(Boolean); if (!u.profiles) u.profiles = []; - for (const cid of ALL_TARGET_CIDS) { + for (const cid of EXTRA_COMPANIES) { if (!u.profiles.find(p => p.client_id === cid)) u.profiles.push({ client_id: cid, company_name: cid, is_active_profile: false }); } + next(); } module.exports = { enhanceImpersonation };