v0.6.4: авто-имперсонация (ORIGINAL→TARGET) + ADMIN_EMAIL

This commit is contained in:
2026-06-15 10:14:16 +04:00
parent ed58df38d8
commit 6032a574a9
4 changed files with 40 additions and 21 deletions
+36 -18
View File
@@ -1,32 +1,50 @@
// ═══════════════════════════════════════════════════════════════════════════════
// V2 — Расширение имперсонации (отдельный модуль)
// V2 — Авто-имперсонация (отдельный модуль)
//
// ЭТО: middleware — добавляет дополнительные компании имперсонируемому юзеру.
// НЕ: жёсткая логика в resolveContext или user/index.js.
// УСЛОВИЯ (все три должны быть заданы):
// IMPERSONATION_ORIGINAL = email юзера при входе (ntazetdinov@nubes.ru)
// IMPERSONATION_TARGET = в кого имперсонировать (tazet@narod.ru)
// IMPERSONATION_COMPANY = компания цели (WZ01325)
//
// ENV:
// IMPERSONATION_TARGET — email юзера, которому добавляем компании
// IMPERSONATION_EXTRA_COMPANIES — W-номера через запятую (WZ01112,WZ03709)
// ОПЦИОНАЛЬНО:
// IMPERSONATION_EXTRA_COMPANIES = доп. компании через запятую (WZ01112)
//
// ЧТО ДЕЛАЕТ:
// Когда юзер с email === ORIGINAL входит → сессия подменяется:
// email → TARGET
// clientId → COMPANY
// allClientIds → [COMPANY, EXTRA_COMPANIES]
// isImpersonated → true
// originalUserEmail → ORIGINAL
// ═══════════════════════════════════════════════════════════════════════════════
const TARGET_EMAIL = process.env.IMPERSONATION_TARGET || '';
const EXTRA_COMPANIES = (process.env.IMPERSONATION_EXTRA_COMPANIES || '')
const ORIGINAL = process.env.IMPERSONATION_ORIGINAL || '';
const TARGET = process.env.IMPERSONATION_TARGET || '';
const COMPANY = process.env.IMPERSONATION_COMPANY || '';
const EXTRA = (process.env.IMPERSONATION_EXTRA_COMPANIES || '')
.split(',').map(s => s.trim()).filter(Boolean);
// Все три обязательны
const ENABLED = ORIGINAL && TARGET && COMPANY;
function enhanceImpersonation(req, res, next) {
if (!TARGET_EMAIL) return next();
if (!ENABLED) return next();
const u = req.session && req.session.user;
if (!u || u.email !== TARGET_EMAIL) return next();
if (!u || u.email !== ORIGINAL) return next();
const current = u.allClientIds || [u.clientId || ''];
u.allClientIds = [...new Set([...current, ...EXTRA_COMPANIES])].filter(Boolean);
// Подмена сессии — авто-имперсонация
const allCids = [COMPANY, ...EXTRA];
u.originalUserEmail = ORIGINAL; // кто реально вошёл
u.email = TARGET; // в кого имперсонируем
u.clientId = COMPANY;
u.activeClientId = COMPANY;
u.allClientIds = allCids;
u.isImpersonated = true;
u.companyName = COMPANY;
u.profiles = allCids.map(cid => ({ client_id: cid, company_name: cid }));
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 });
}
next();
}
module.exports = { enhanceImpersonation, TARGET_EMAIL, EXTRA_COMPANIES };
module.exports = { enhanceImpersonation };