diff --git a/package.json b/package.json index 236736e..02dd16b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.6.11", + "version": "0.6.12", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/v2/src/config/index.js b/v2/src/config/index.js index a168d72..7211c83 100644 --- a/v2/src/config/index.js +++ b/v2/src/config/index.js @@ -9,7 +9,7 @@ // ═══════════════════════════════════════════════════════════════════════════════ module.exports = { - version: '0.6.11', + version: '0.6.12', // ── IAM ────────────────────────────────────────────────────────────────── iamUrl: process.env.V2_IAM_URL || 'https://auth-api.ngcloud.ru/api/v1/auth/user', diff --git a/v2/src/router/index.js b/v2/src/router/index.js index db3357e..a11a1a0 100644 --- a/v2/src/router/index.js +++ b/v2/src/router/index.js @@ -32,24 +32,36 @@ function resolveContext(req, res, next) { // Нет сессии — нет доступа if (!u) return res.redirect('/login'); - // Имперсонация: админ действует от имени компании - // u.originalUserEmail — реальный админ - // u.impersonatedCompanyId — W-номер компании - const ADMIN_EMAIL = process.env.ADMIN_EMAIL || ''; - const isImpersonated = !!(u.originalUserEmail && u.impersonatedCompanyId) || u.isImpersonated; + // ═══ САНИТАЙЗЕР IAM — всё что пришло может быть null/undefined/говном ═══ + const s = (v) => (v == null || v === 'null' || v === 'undefined') ? '' : String(v).trim(); + const arr = (v) => (Array.isArray(v) ? v : []); + + // Нормализуем ВСЕ поля из сессии + const email = s(u.email); + const clientId = s(u.clientId); + const activeClientId = s(u.activeClientId); + const originalUserEmail = s(u.originalUserEmail); + const impersonatedCompanyId = s(u.impersonatedCompanyId); + const companyName = s(u.companyName); + const allClientIds = arr(u.allClientIds).map(s).filter(Boolean); + const profiles = arr(u.profiles); + const isAdmin = !!u.isAdmin; + const adminMode = !!u.adminMode; + const isImpersonatedFlag = !!u.isImpersonated; + + const ADMIN_EMAIL = (process.env.ADMIN_EMAIL || '').trim(); + const isImpersonated = (!!originalUserEmail && !!impersonatedCompanyId) || isImpersonatedFlag; // req.email = ТЕКУЩИЙ юзер (имперсонированный или реальный) - // ВЕЗДЕ: created_by, экран, формы - req.email = u.email || ''; - req.clientId = isImpersonated ? u.impersonatedCompanyId : (u.activeClientId || u.clientId || ''); + req.email = email; + req.clientId = isImpersonated ? impersonatedCompanyId : (activeClientId || clientId); if (!req.clientId) return res.status(400).send('

Ошибка

Не удалось определить W-номер компании. Проверьте настройки IAM.

Выйти

'); - req.companyName = u.companyName || req.clientId; - req.isAdmin = !!(u.isAdmin && u.adminMode) || (ADMIN_EMAIL && u.email === ADMIN_EMAIL); + req.companyName = companyName || req.clientId; + req.isAdmin = (isAdmin && adminMode) || (!!ADMIN_EMAIL && email === ADMIN_EMAIL); req.isImpersonated = isImpersonated; - // req.impersonatedBy = РЕАЛЬНЫЙ юзер (только в колонке impersonated_by аудита) - req.impersonatedBy = isImpersonated ? (u.originalUserEmail || '') : null; - req.allClientIds = u.allClientIds || [req.clientId]; - req.profiles = u.profiles || []; + req.impersonatedBy = isImpersonated ? originalUserEmail : null; + req.allClientIds = allClientIds.length ? allClientIds : [req.clientId]; + req.profiles = profiles; next(); }