fix: Telegram footer shows SAC as sender when SAC delivers the message
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -95,7 +95,8 @@ def _line(emoji: str, label: str, value: str) -> str:
|
|||||||
return f"{emoji} {label}: {value}\n"
|
return f"{emoji} {label}: {value}\n"
|
||||||
|
|
||||||
|
|
||||||
def _event_generated_by(event: Event) -> str:
|
def _event_content_author(event: Event) -> str:
|
||||||
|
"""Кто сгенерировал содержимое события (ingest / отчёт)."""
|
||||||
details = _details_dict(event)
|
details = _details_dict(event)
|
||||||
gb = details.get("generated_by")
|
gb = details.get("generated_by")
|
||||||
if isinstance(gb, str) and gb.strip().lower() in ("agent", "sac"):
|
if isinstance(gb, str) and gb.strip().lower() in ("agent", "sac"):
|
||||||
@@ -108,6 +109,21 @@ def _event_generated_by(event: Event) -> str:
|
|||||||
return "agent"
|
return "agent"
|
||||||
|
|
||||||
|
|
||||||
|
def _notification_delivered_by(event: Event) -> str:
|
||||||
|
"""Кто доставил сообщение в Telegram (footer «📡 Оповещение»).
|
||||||
|
|
||||||
|
Шаблоны здесь используются только при отправке из SAC. Агент добавляет footer сам.
|
||||||
|
"""
|
||||||
|
details = _details_dict(event)
|
||||||
|
via = details.get("telegram_via")
|
||||||
|
if isinstance(via, str) and via.strip().lower() in ("agent", "sac"):
|
||||||
|
return via.strip().lower()
|
||||||
|
if _event_content_author(event) == "sac":
|
||||||
|
return "sac"
|
||||||
|
# ingest от агента, канал Telegram — SAC (exclusive / notify_lifecycle)
|
||||||
|
return "sac"
|
||||||
|
|
||||||
|
|
||||||
def _event_product_version(event: Event) -> tuple[str | None, str | None]:
|
def _event_product_version(event: Event) -> tuple[str | None, str | None]:
|
||||||
details = _details_dict(event)
|
details = _details_dict(event)
|
||||||
platform = None
|
platform = None
|
||||||
@@ -137,12 +153,13 @@ def _event_product_version(event: Event) -> tuple[str | None, str | None]:
|
|||||||
|
|
||||||
|
|
||||||
def _append_event_source(html_msg: str, event: Event) -> str:
|
def _append_event_source(html_msg: str, event: Event) -> str:
|
||||||
|
delivered = _notification_delivered_by(event)
|
||||||
product, version = _event_product_version(event)
|
product, version = _event_product_version(event)
|
||||||
return append_notification_source_html(
|
return append_notification_source_html(
|
||||||
html_msg,
|
html_msg,
|
||||||
generated_by=_event_generated_by(event),
|
generated_by=delivered,
|
||||||
product=product,
|
product=product if delivered == "agent" else None,
|
||||||
product_version=version,
|
product_version=version if delivered == "agent" else None,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ def test_daily_report_telegram_html_uses_report_html(db_session):
|
|||||||
payload={},
|
payload={},
|
||||||
)
|
)
|
||||||
assert format_event_telegram_html(event) == (
|
assert format_event_telegram_html(event) == (
|
||||||
"<b>📊 OK</b>\nline\n📡 Оповещение: агент (ssh-monitor)"
|
"<b>📊 OK</b>\nline\n📡 Оповещение: SAC (Security Alert Center)"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ def test_rdp_success_template():
|
|||||||
text = format_event_telegram_html(event)
|
text = format_event_telegram_html(event)
|
||||||
assert "УСПЕШНЫЙ" in text
|
assert "УСПЕШНЫЙ" in text
|
||||||
assert "Сеть/RDP" in text
|
assert "Сеть/RDP" in text
|
||||||
assert "📡 Оповещение: агент" in text
|
assert "📡 Оповещение: SAC (Security Alert Center)" in text
|
||||||
|
|
||||||
|
|
||||||
def test_event_telegram_includes_sac_source_for_sac_daily_report():
|
def test_event_telegram_includes_sac_source_for_sac_daily_report():
|
||||||
@@ -107,7 +107,26 @@ def test_lifecycle_started_template():
|
|||||||
assert "K6A-DC3" in text
|
assert "K6A-DC3" in text
|
||||||
assert "1.2.30-SAC" in text
|
assert "1.2.30-SAC" in text
|
||||||
assert "загрузка ОС" in text
|
assert "загрузка ОС" in text
|
||||||
assert "📡 Оповещение: агент" in text
|
assert "📡 Оповещение: SAC (Security Alert Center)" in text
|
||||||
|
|
||||||
|
|
||||||
|
def test_lifecycle_footer_uses_telegram_via_agent_when_present():
|
||||||
|
host = Host(hostname="WIN01", display_name="H1", os_family="windows")
|
||||||
|
event = Event(
|
||||||
|
event_id="00000000-0000-4000-8000-000000000506",
|
||||||
|
host_id=1,
|
||||||
|
host=host,
|
||||||
|
occurred_at=datetime(2026, 5, 29, 9, 0, tzinfo=timezone.utc),
|
||||||
|
category="agent",
|
||||||
|
type="agent.lifecycle",
|
||||||
|
severity="info",
|
||||||
|
title="started",
|
||||||
|
summary="x",
|
||||||
|
details={"lifecycle": "started", "telegram_via": "agent"},
|
||||||
|
payload={"source": {"product": "rdp-login-monitor", "product_version": "1.2.30-SAC"}},
|
||||||
|
)
|
||||||
|
text = format_event_telegram_html(event)
|
||||||
|
assert "📡 Оповещение: агент (rdp-login-monitor 1.2.30-SAC)" in text
|
||||||
|
|
||||||
|
|
||||||
def test_rdp_shadow_control_template():
|
def test_rdp_shadow_control_template():
|
||||||
|
|||||||
Reference in New Issue
Block a user