diff --git a/aw-server/aw-ru-patch.js b/aw-server/aw-ru-patch.js index bc21566..e0a690d 100755 --- a/aw-server/aw-ru-patch.js +++ b/aw-server/aw-ru-patch.js @@ -365,6 +365,10 @@ return /^#\/buckets\/aw-dlp-endpoint-signals_/i.test(window.location.hash || ""); } + function isAlertsRoute() { + return /^#\/alerts(?:[/?#]|$)/i.test(window.location.hash || ""); + } + function getDlpBucketIdFromHash() { const hash = window.location.hash || ""; const match = hash.match(/^#\/buckets\/([^/?#]+)/i); @@ -681,6 +685,37 @@ } } }, 1); + if (verdict === "incident") { + await saveDlpIncident(host, event, { + verdict: verdict, + category: category, + comment: comment + }); + } + } + + async function saveDlpIncident(host, event, review) { + const bucketId = "aw-dlp-incidents_" + host; + await ensureAwBucket(bucketId, "aw-dlp-incidents", "aw.dlp.incident", host); + await saveAwHeartbeat(bucketId, { + timestamp: new Date().toISOString(), + duration: 0, + data: { + host: host, + sourceBucket: getDlpBucketIdFromHash(), + sourceEvent: { + timestamp: event.timestamp, + data: event.data || {} + }, + incident: { + incidentId: generateDlpId("incident"), + verdict: review && review.verdict || "incident", + category: review && review.category || "", + comment: review && review.comment || "", + status: "open" + } + } + }, 1); } async function saveDlpRule(host, event, row) { @@ -970,6 +1005,74 @@ } } + async function refreshDlpAlertsCenter(center, host) { + center.querySelector("[data-aw-ru-dlp-alerts-message]").textContent = "Загрузка DLP-инцидентов..."; + try { + const events = (await loadBucketEvents("aw-dlp-incidents_" + host, 100)) + .sort(function (a, b) { return String(b.timestamp).localeCompare(String(a.timestamp)); }); + const rows = events.map(function (event) { + const data = event.data || {}; + const incident = data.incident || {}; + const sourceData = data.sourceEvent && data.sourceEvent.data ? data.sourceEvent.data : {}; + return '' + + '' + escapeHtml(new Date(event.timestamp).toLocaleString()) + '' + + '' + escapeHtml(incident.status || "open") + '' + + '' + escapeHtml(incident.category || "") + '' + + '' + escapeHtml(incident.comment || "") + '' + + '' + escapeHtml(sourceData.username || sourceData.owner || "") + '' + + '' + escapeHtml(sourceData.signalType || "") + '' + + '' + escapeHtml(sourceData.documentName || sourceData.printerName || "") + '' + + ''; + }); + center.querySelector("[data-aw-ru-dlp-alerts-events]").innerHTML = rows.length + ? rows.join("") + : 'Операторских DLP-инцидентов пока нет.'; + center.querySelector("[data-aw-ru-dlp-alerts-status]").textContent = "Инцидентов: " + events.length; + center.querySelector("[data-aw-ru-dlp-alerts-message]").textContent = "Список DLP-инцидентов обновлен."; + } catch (error) { + center.querySelector("[data-aw-ru-dlp-alerts-events]").innerHTML = 'Не удалось загрузить DLP-инциденты.'; + center.querySelector("[data-aw-ru-dlp-alerts-message]").textContent = "Ошибка загрузки DLP-инцидентов: " + error.message; + } + } + + function injectDlpAlertsCenter(root) { + if (!isAlertsRoute()) return; + const host = window.__awRuPatchSettingsHost || getCurrentHostFromHash(); + if (!host) return; + + const heading = root.querySelector("h3"); + if (!heading) return; + + let center = root.querySelector("[data-aw-ru-dlp-alerts='1']"); + if (!center) { + center = document.createElement("section"); + center.className = "aw-ru-dlp-center"; + center.setAttribute("data-aw-ru-dlp-alerts", "1"); + center.innerHTML = + '

DLP-инциденты оператора

' + + '
' + + 'bucket: ' + escapeHtml("aw-dlp-incidents_" + host) + '' + + '' + + '
Инцидентов: 0
' + + '
' + + '

Здесь выводятся DLP-события, которые оператор вручную признал инцидентами через review-центр.

' + + '' + + '' + + '' + + '
ВремяСтатусКатегорияКомментарийПользовательТипДокумент/канал
Загрузка...
' + + '
'; + heading.parentElement.insertBefore(center, heading.nextSibling); + center.querySelector("[data-aw-ru-refresh-dlp-alerts]").addEventListener("click", function () { + refreshDlpAlertsCenter(center, host); + }); + } + + if (center.getAttribute("data-aw-ru-loaded") !== "1") { + center.setAttribute("data-aw-ru-loaded", "1"); + refreshDlpAlertsCenter(center, host); + } + } + let trendsRedirectInFlight = false; let settingsHostFetchInFlight = false; @@ -1040,6 +1143,7 @@ hideNoiseNavigation(document.body); injectDlpNavigation(document.body); injectDlpReviewCenter(document.body); + injectDlpAlertsCenter(document.body); redirectBareTrendsRoute(); }