fix db query
All checks were successful
Build and Deploy MITM Webserver / traffic_target (push) Successful in 1s
Build and Deploy MITM Webserver / build (push) Successful in 10s

This commit is contained in:
2026-03-30 21:46:13 +02:00
parent 95c0302b6b
commit d9cb501879

View File

@@ -28,6 +28,25 @@ def _db_text(value: Any) -> Any:
return str(value) return str(value)
def _analysis_protocol_name(app_protocol: Any, ip_proto_raw: Any, eth_type_raw: Any) -> str:
if app_protocol not in (None, ""):
return str(app_protocol)
if ip_proto_raw is not None:
try:
return str(protocol_from_number(int(ip_proto_raw)))
except Exception:
return f"IP_PROTO_{ip_proto_raw}"
if eth_type_raw is not None:
try:
return str(ethertype_from_int(int(eth_type_raw)))
except Exception:
return f"ETH_TYPE_{eth_type_raw}"
return "UNKNOWN"
def _serialize_row_for_broadcast(row: Dict[str, Any]) -> Dict[str, Any]: def _serialize_row_for_broadcast(row: Dict[str, Any]) -> Dict[str, Any]:
serialized = dict(row) serialized = dict(row)
_normalize_json_fields(serialized) _normalize_json_fields(serialized)
@@ -757,7 +776,9 @@ class DatabasePool:
ingress_if AS iface, ingress_if AS iface,
src_ip::text AS ip_address, src_ip::text AS ip_address,
src_mac::text AS mac_address, src_mac::text AS mac_address,
COALESCE(NULLIF(app_protocol::text, ''), NULLIF(ip_proto::text, ''), NULLIF(eth_type::text, ''), 'UNKNOWN') AS protocol_name, NULLIF(app_protocol::text, '') AS app_protocol_name,
ip_proto_raw,
eth_type_raw,
COALESCE(NULLIF(verdict::text, ''), 'unknown') AS verdict_name, COALESCE(NULLIF(verdict::text, ''), 'unknown') AS verdict_name,
timestamp, timestamp,
'source_on_ingress' AS evidence 'source_on_ingress' AS evidence
@@ -772,7 +793,9 @@ class DatabasePool:
egress_if AS iface, egress_if AS iface,
dst_ip::text AS ip_address, dst_ip::text AS ip_address,
dst_mac::text AS mac_address, dst_mac::text AS mac_address,
COALESCE(NULLIF(app_protocol::text, ''), NULLIF(ip_proto::text, ''), NULLIF(eth_type::text, ''), 'UNKNOWN') AS protocol_name, NULLIF(app_protocol::text, '') AS app_protocol_name,
ip_proto_raw,
eth_type_raw,
COALESCE(NULLIF(verdict::text, ''), 'unknown') AS verdict_name, COALESCE(NULLIF(verdict::text, ''), 'unknown') AS verdict_name,
timestamp, timestamp,
'destination_on_egress' AS evidence 'destination_on_egress' AS evidence
@@ -821,7 +844,9 @@ class DatabasePool:
filtered.iface, filtered.iface,
filtered.ip_address, filtered.ip_address,
filtered.mac_address, filtered.mac_address,
filtered.protocol_name, filtered.app_protocol_name,
filtered.ip_proto_raw,
filtered.eth_type_raw,
COUNT(*) AS packet_count, COUNT(*) AS packet_count,
MAX(filtered.timestamp) AS last_seen, MAX(filtered.timestamp) AS last_seen,
SUM(CASE WHEN filtered.verdict_name = 'accept' THEN 1 ELSE 0 END) AS accept_count, SUM(CASE WHEN filtered.verdict_name = 'accept' THEN 1 ELSE 0 END) AS accept_count,
@@ -833,7 +858,13 @@ class DatabasePool:
ON selected_hosts.iface = filtered.iface ON selected_hosts.iface = filtered.iface
AND selected_hosts.ip_address IS NOT DISTINCT FROM filtered.ip_address AND selected_hosts.ip_address IS NOT DISTINCT FROM filtered.ip_address
AND selected_hosts.mac_address IS NOT DISTINCT FROM filtered.mac_address AND selected_hosts.mac_address IS NOT DISTINCT FROM filtered.mac_address
GROUP BY filtered.iface, filtered.ip_address, filtered.mac_address, filtered.protocol_name GROUP BY
filtered.iface,
filtered.ip_address,
filtered.mac_address,
filtered.app_protocol_name,
filtered.ip_proto_raw,
filtered.eth_type_raw
), ),
ranked_protocols AS ( ranked_protocols AS (
SELECT * SELECT *
@@ -842,7 +873,12 @@ class DatabasePool:
*, *,
ROW_NUMBER() OVER ( ROW_NUMBER() OVER (
PARTITION BY iface, ip_address, mac_address PARTITION BY iface, ip_address, mac_address
ORDER BY packet_count DESC, last_seen DESC, protocol_name ORDER BY
packet_count DESC,
last_seen DESC,
app_protocol_name NULLS LAST,
ip_proto_raw NULLS LAST,
eth_type_raw NULLS LAST
) AS row_num ) AS row_num
FROM protocol_aggregated FROM protocol_aggregated
) ranked ) ranked
@@ -856,7 +892,9 @@ class DatabasePool:
selected_hosts.last_seen AS host_last_seen, selected_hosts.last_seen AS host_last_seen,
selected_hosts.source_on_ingress_count, selected_hosts.source_on_ingress_count,
selected_hosts.destination_on_egress_count, selected_hosts.destination_on_egress_count,
ranked_protocols.protocol_name, ranked_protocols.app_protocol_name,
ranked_protocols.ip_proto_raw,
ranked_protocols.eth_type_raw,
ranked_protocols.packet_count AS protocol_packet_count, ranked_protocols.packet_count AS protocol_packet_count,
ranked_protocols.last_seen AS protocol_last_seen, ranked_protocols.last_seen AS protocol_last_seen,
ranked_protocols.accept_count, ranked_protocols.accept_count,
@@ -876,7 +914,9 @@ class DatabasePool:
selected_hosts.mac_address, selected_hosts.mac_address,
ranked_protocols.packet_count DESC NULLS LAST, ranked_protocols.packet_count DESC NULLS LAST,
ranked_protocols.last_seen DESC NULLS LAST, ranked_protocols.last_seen DESC NULLS LAST,
ranked_protocols.protocol_name ranked_protocols.app_protocol_name NULLS LAST,
ranked_protocols.ip_proto_raw NULLS LAST,
ranked_protocols.eth_type_raw NULLS LAST
""", """,
since, since,
limit_per_interface, limit_per_interface,
@@ -906,7 +946,11 @@ class DatabasePool:
} }
iface_hosts[host_key] = host_record iface_hosts[host_key] = host_record
protocol_name = record.get("protocol_name") protocol_name = _analysis_protocol_name(
record.get("app_protocol_name"),
record.get("ip_proto_raw"),
record.get("eth_type_raw"),
)
if protocol_name not in (None, ""): if protocol_name not in (None, ""):
host_record["protocols"].append( host_record["protocols"].append(
{ {