feat(web/attackers): surface ASN + AS name on cards and detail
Attacker list cards gain an AS<number> chip with the AS description on hover. Attacker detail page adds an AS row beside ORIGIN — same shape as the existing country/source pair so operators can read "this attacker is in DE on AS24940 Hetzner" at a glance instead of having to grep the IP into a separate tool. Both fields collapse to "unknown" when the IP isn't BGP-announced (CGNAT, dark space, RFC1918), matching the existing pattern for country resolution.
This commit is contained in:
@@ -25,6 +25,9 @@ interface AttackerEntry {
|
||||
commands: any[];
|
||||
country_code: string | null;
|
||||
country_source: string | null;
|
||||
asn: number | null;
|
||||
as_name: string | null;
|
||||
asn_source: string | null;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
@@ -209,6 +212,14 @@ const Attackers: React.FC = () => {
|
||||
<div className="ak-meta">
|
||||
<span>First: {new Date(a.first_seen).toLocaleDateString()}</span>
|
||||
<span>Last: {timeAgo(a.last_seen)}</span>
|
||||
{a.asn != null && (
|
||||
<span
|
||||
className="ak-asn"
|
||||
title={a.as_name ? `${a.as_name}${a.asn_source ? ` (${a.asn_source})` : ''}` : undefined}
|
||||
>
|
||||
AS{a.asn}
|
||||
</span>
|
||||
)}
|
||||
{a.is_traversal && <span className="chip violet" style={{ fontSize: '0.6rem' }}>TRAVERSAL</span>}
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user