diff --git a/v2/src/impersonation/index.js b/v2/src/impersonation/index.js index 73d7aa8..9e1b73d 100644 --- a/v2/src/impersonation/index.js +++ b/v2/src/impersonation/index.js @@ -1,40 +1,77 @@ // ═══════════════════════════════════════════════════════════════════════════════ -// V2 — Расширение имперсонации (отдельный модуль) +// V2 — Имперсонация (IAM + тестовый режим через ENV) // -// ЭТО: middleware — добавляет дополнительные компании админу. +// ЭТО: middleware — имитирует IAM-имперсонацию для тестов. // НЕ: жёсткая логика в resolveContext или user/index.js. // +// ТЕСТОВЫЙ РЕЖИМ (если задан IMPERSONATION_TARGET): +// При входе IMPERSONATION_ORIGINAL все данные сессии заменяются на TARGET. +// Полная имитация IAM-имперсонации: email, profiles, clientId — всё от таргета. +// // ENV: -// IMPERSONATION_ORIGINAL — email админа, который имперсонирует -// IMPERSONATION_COMPANY — W-номер компании имперсонируемого +// IMPERSONATION_ORIGINAL — email админа (кто имперсонирует) +// IMPERSONATION_TARGET — email юзера (кого имперсонируют) ← тест +// IMPERSONATION_COMPANY — W-номер основной компании таргета // IMPERSONATION_EXTRA_COMPANIES — доп. W-номера через запятую // ═══════════════════════════════════════════════════════════════════════════════ const ORIGINAL_EMAIL = process.env.IMPERSONATION_ORIGINAL || ''; -const EXTRA_COMPANIES = [ - process.env.IMPERSONATION_COMPANY || '', - ...(process.env.IMPERSONATION_EXTRA_COMPANIES || '').split(',').map(s => s.trim()) -].filter(Boolean); +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))]; function enhanceImpersonation(req, res, next) { - if (!ORIGINAL_EMAIL) return next(); const u = req.session && req.session.user; if (!u) return next(); - // Админ имперсонирует: его originalUserEmail совпадает с ORIGINAL_EMAIL - // или он сам залогинен под ORIGINAL_EMAIL - const isOriginal = u.email === ORIGINAL_EMAIL || u.originalUserEmail === ORIGINAL_EMAIL; - if (!isOriginal) return next(); - - const current = u.allClientIds || [u.clientId || '']; - u.allClientIds = [...new Set([...current, ...EXTRA_COMPANIES])].filter(Boolean); - - if (!u.profiles) u.profiles = []; - 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 }); + // ── IAM-имперсонация (уже есть в сессии) — просто добавляем компании ── + if (u.isImpersonated && u.originalUserEmail === ORIGINAL_EMAIL) { + addExtraCompanies(u); + return next(); } + + // ── Тестовый режим: полная подмена данных ─────────────────────────── + if (TARGET_EMAIL && u.email === ORIGINAL_EMAIL) { + // Сохраняем isAdmin от оригинала + const wasAdmin = u.isAdmin || (u.allClientIds || []).includes('WZ01112') || u.clientId === 'WZ01112'; + + // Подменяем ВСЕ данные на таргета (как делает 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) { + if (!u.profiles.find(p => p.client_id === cid)) + u.profiles.push({ client_id: cid, company_name: cid, is_active_profile: false }); + } +} + module.exports = { enhanceImpersonation };