diff --git a/decnet_web/src/components/AttackerDetail.tsx b/decnet_web/src/components/AttackerDetail.tsx index 45949e3..4a1d058 100644 --- a/decnet_web/src/components/AttackerDetail.tsx +++ b/decnet_web/src/components/AttackerDetail.tsx @@ -361,12 +361,24 @@ const OS_LABELS: Record = { unknown: 'UNKNOWN', }; +const BEHAVIOR_LABELS: Record = { + beaconing: 'BEACONING', + interactive: 'INTERACTIVE', + scanning: 'SCANNING', + brute_force: 'BRUTE FORCE', + slow_scan: 'SLOW SCAN', + mixed: 'MIXED', + unknown: 'UNKNOWN', +}; + const BEHAVIOR_COLORS: Record = { - beaconing: '#ff6b6b', + beaconing: '#ff6b6b', interactive: 'var(--accent-color)', - scanning: '#e5c07b', - mixed: 'var(--text-color)', - unknown: 'var(--text-color)', + scanning: '#e5c07b', + brute_force: '#ff9f43', + slow_scan: '#c8a96e', + mixed: 'var(--text-color)', + unknown: 'var(--text-color)', }; const TOOL_LABELS: Record = { @@ -423,14 +435,35 @@ const KeyValueRow: React.FC<{ label: string; value: React.ReactNode }> = ({ labe ); +const ToolBadges: React.FC<{ tools: string[] }> = ({ tools }) => ( +
+ {tools.map(t => ( + + {TOOL_LABELS[t] || t.toUpperCase()} + + ))} +
+); + const BehaviorHeadline: React.FC<{ b: AttackerBehavior }> = ({ b }) => { const osLabel = b.os_guess ? (OS_LABELS[b.os_guess] || b.os_guess.toUpperCase()) : '—'; - const behaviorLabel = b.behavior_class ? b.behavior_class.toUpperCase() : 'UNKNOWN'; + const behaviorLabel = b.behavior_class + ? (BEHAVIOR_LABELS[b.behavior_class] || b.behavior_class.toUpperCase()) + : 'UNKNOWN'; const behaviorColor = b.behavior_class ? BEHAVIOR_COLORS[b.behavior_class] : undefined; const tools = b.tool_guesses && b.tool_guesses.length > 0 ? b.tool_guesses : null; - const toolLabel = tools - ? tools.map(t => TOOL_LABELS[t] || t.toUpperCase()).join(', ') - : '—'; return (
@@ -438,7 +471,7 @@ const BehaviorHeadline: React.FC<{ b: AttackerBehavior }> = ({ b }) => { : '—'} color={tools ? '#ff6b6b' : undefined} />