diff --git a/decnet_web/src/components/AttackerDetail.tsx b/decnet_web/src/components/AttackerDetail.tsx index 221eb052..34554b1c 100644 --- a/decnet_web/src/components/AttackerDetail.tsx +++ b/decnet_web/src/components/AttackerDetail.tsx @@ -59,6 +59,8 @@ interface AttackerData { credential_count: number; fingerprints: any[]; commands: { service: string; decky: string; command: string; timestamp: string }[]; + country_code: string | null; + country_source: string | null; updated_at: string; behavior: AttackerBehavior | null; } @@ -903,6 +905,16 @@ const AttackerDetail: React.FC = () => {

{attacker.ip}

+ {attacker.country_code && ( + + + {attacker.country_code} + + + )} {attacker.is_traversal && ( TRAVERSAL )} @@ -934,7 +946,7 @@ const AttackerDetail: React.FC = () => { {/* Timestamps */}
toggle('timeline')}> -
+
FIRST SEEN: {new Date(attacker.first_seen).toLocaleString()} @@ -947,6 +959,21 @@ const AttackerDetail: React.FC = () => { UPDATED: {new Date(attacker.updated_at).toLocaleString()}
+
+ ORIGIN: + {attacker.country_code ? ( + + {attacker.country_code} + {attacker.country_source && ( + + ({attacker.country_source}) + + )} + + ) : ( + unknown + )} +
diff --git a/decnet_web/src/components/Attackers.css b/decnet_web/src/components/Attackers.css index dc8bbc1e..1de6638c 100644 --- a/decnet_web/src/components/Attackers.css +++ b/decnet_web/src/components/Attackers.css @@ -72,6 +72,18 @@ color: var(--matrix); font-variant-numeric: tabular-nums; letter-spacing: 1px; + display: inline-flex; + align-items: baseline; + gap: 8px; +} +.attackers-root .ak-card .ak-cc { + font-size: 0.62rem; + letter-spacing: 2px; + padding: 1px 6px; + border: 1px solid var(--border); + color: var(--matrix); + opacity: 0.75; + font-weight: 600; } .attackers-root .ak-meta { diff --git a/decnet_web/src/components/Attackers.tsx b/decnet_web/src/components/Attackers.tsx index 9e54eaed..3f9afc70 100644 --- a/decnet_web/src/components/Attackers.tsx +++ b/decnet_web/src/components/Attackers.tsx @@ -23,6 +23,8 @@ interface AttackerEntry { credential_count: number; fingerprints: any[]; commands: any[]; + country_code: string | null; + country_source: string | null; updated_at: string; } @@ -187,7 +189,17 @@ const Attackers: React.FC = () => { onClick={() => navigate(`/attackers/${a.uuid}`)} >
- {a.ip} + + {a.ip} + {a.country_code && ( + + {a.country_code} + + )} + {activity.toUpperCase()}