| Белые списки IP v<%= appVersion %> <% if (typeof canAdminMode !== 'undefined' && canAdminMode) { %>
<% } %> <% if (typeof adminMode !== 'undefined' && adminMode) { %> Аудит Лимиты <% } %> Выйти (<%= user.email %>)
<% if (success) { %>
<%= success %>
<% } %> <% if (error) { %>
<%= error %>
<% } %> <% if (typeof isImpersonated !== 'undefined' && isImpersonated) { %>
⚠️ Режим имперсонации — данные сохраняются от имени <%= user.clientId %> <% if (typeof originalUserEmail !== 'undefined' && originalUserEmail) { %> (вы: <%= originalUserEmail %>) <% } %>
<% } %> <% // Для admin: selectedCompany — выбранная компания (объект из getAllCompanies). // Для обычного пользователя: selectedCompany — их компания (из getOrCreateCompany). // company_id — числовой PK для передачи в скрытые поля форм. const companyPk = selectedCompany ? selectedCompany.id : null; %> <% if (adminMode && companies) { %>
Компания: → Аудит этой компании → Лимиты Режим: Администратор
<% } %> <% if (!isAdmin && allClientIds && allClientIds.length > 1) { %>
Компания: Компаний: <%= allClientIds.length %>
<% } %>
<%= used %> / <%= limit %>
записей
<%= selectedCompany ? selectedCompany.client_id : user.clientId %>
компания
<%= user.email %>
пользователь
Добавить адрес
<% // Передаём числовой PK компании в скрытом поле. // Для admin: server.js возьмёт его из req.body.company_id. // Для обычного пользователя: server.js игнорирует это поле // и использует clientId из токена — защита от подмены. %> <%# CSRF-токен: защита от межсайтовой подделки запроса (double-submit cookie) %>
= limit ? 'disabled' : '' %>>
Доверенные адреса
<% if (entries.length === 0) { %>
Нет добавленных адресов
<% } else { %>
<% entries.forEach(e => { %> <% }) %>
Адрес / Подсеть Комментарий Добавил Добавлена Изменена Действия
<%= e.value_cidr %> <%= e.comment || '—' %> <%= e.created_by %> <%= new Date(e.created_at).toLocaleDateString('ru', {day:'numeric',month:'short',year:'numeric',hour:'2-digit',minute:'2-digit',timeZone:'Europe/Moscow'}) %> <%= e.updated_at ? new Date(e.updated_at).toLocaleDateString('ru', {day:'numeric',month:'short',hour:'2-digit',minute:'2-digit',timeZone:'Europe/Moscow'}) : '—' %> <% // data-* атрибуты для JS-заполнения modal без inline-onclick с параметрами. // Так как комментарий может содержать кавычки — EJS экранирует их в HTML. // Но в data-атрибуте JSON::stringify безопаснее. %>
<%# CSRF-токен: одно значение на всю страницу, сгенерировано сервером %>
<% } %>