internal/dashboard/frontend/dist/assets/EntityDetailView-Ca19rlgy.js

import{d as Se,x as xe,w as W,k as m,y as j,i as l,h as c,z as Ue,o as a,L as Oe,j as d,f as o,A as x,n as K,p as r,B as Ge,r as Pe,C as We,D as Ke,E as Ye,G as ke,H as Je,e as i,g as y,I as oe,J as M,K as I,M as E,N as Qe,l as u,O as P,_ as Xe,t as h,P as B,Q as ie,R as ue,S as we,T as F,q as Ze,U as et,V as tt,W as at,X as lt,Y as re,Z as st,m as nt,$ as ot,a0 as it,a1 as U,a2 as $e,a3 as ut,a4 as rt,a5 as R}from"./index-BebFsTBB.js";import{u as ct,s as vt}from"./usePlotlyChart-zffLq8Zp.js";import{_ as dt}from"./PageHeader.vue_vue_type_script_setup_true_lang-BZ4Q4Q8A.js";import{u as pt}from"./useChartData-BzFV_X8y.js";import"./chart-BJS5fRTR.js";const mt=Se({__name:"DetailChart",props:Ue({chartData:{},localFilterActions:{},title:{},loading:{type:Boolean},isPort:{type:Boolean},isHoneypot:{type:Boolean},chartLink:{}},{selectedPoints:{default:0},selectedPointsModifiers:{},selectedIPs:{default:0},selectedIPsModifiers:{}}),emits:["update:selectedPoints","update:selectedIPs"],setup(D){const _=D,N=Ge("chartContainer"),t=xe(D,"selectedPoints"),p=xe(D,"selectedIPs"),$={};_.isPort&&($.yField="remote_addr",$.yTitle="Remote Address",$.categoricalY=!0);const{debouncedDrawPlot:z}=ct(N,()=>_.chartData,{...$,onRelayout(k){_.isPort||vt(k,_.localFilterActions)},onSelected(k){if(t.value=k?.points?.length??0,k?.points){const T=new Set(k.points.map(g=>_.chartData[g.pointIndex]?.remote_addr));p.value=T.size}else p.value=0}});return W(()=>_.chartData,()=>{z()},{deep:!0}),(k,T)=>{const g=Pe("router-link");return a(),m(j,{title:t.value>0?`${D.title} (${t.value} points, ${p.value} IPs selected)`:D.title,icon:l(r).chart,"body-class":"relative h-[calc(100%-3rem)] min-h-[300px]"},{"header-right":c(()=>[D.chartLink?(a(),m(g,{key:0,to:D.chartLink,class:"btn-secondary"},{default:c(()=>[T[0]||(T[0]=x(" Open in Chart View ",-1)),(a(),m(K(l(r).externalLink),{class:"text-[10px]"}))]),_:1},8,["to"])):d("",!0)]),default:c(()=>[D.loading?(a(),m(Oe,{key:0})):d("",!0),o("div",{ref_key:"chartContainer",ref:N,class:"h-full w-full"},null,512)]),_:1},8,["title","icon"])}}}),ft={class:"page-container"},yt={key:0,class:"flex flex-wrap items-center gap-8"},ht={class:"flex flex-col"},_t={key:0,class:"text-stone-400"},gt={key:1,class:"text-muted animate-pulse"},bt={key:2,class:""},xt=["title"],kt={key:1,class:"text-muted"},wt={key:2,class:"stat-label"},$t={key:0,class:"flex gap-2"},St={key:0,class:"stat-value"},Pt={key:1,class:"flex items-center gap-4"},Dt={class:"flex items-center gap-2 text-stone-300"},It={key:0,class:"text-stone-400"},Tt={class:"h-75 overflow-y-auto pr-2 text-xs"},At={key:0,class:"animate-pulse py-4 text-center"},Lt={key:1,class:"py-4 text-center text-stone-500"},Ct={class:"w-1/3 whitespace-nowrap"},Vt={class:"flex w-min flex-wrap justify-end gap-1"},Bt={class:"flex items-center gap-2"},Ft={class:"flex gap-1"},Nt=["value"],qt={class:"mb-2 flex"},Et={class:"flex rounded bg-stone-800 p-0.5"},Rt={class:"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4"},jt={class:"relative flex flex-col pt-2"},zt={class:"stat-value"},Mt={class:"text-muted font-normal"},Ht={class:"stat-value"},Ut={class:"text-muted font-normal"},Ot={key:0},Gt={class:"mt-4 grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-4"},Wt={class:"stat-label"},Zt=Se({__name:"EntityDetailView",props:{type:{},value:{}},setup(D){const _=nt(),N=ot(),t=u(()=>{const e=_.name;return e==="ip"?"ip":e==="subnet"?"subnet":e==="port"?"port":e==="honeypot"?"honeypot":["city","country","asn","domain","fqdn"].includes(e)?"geo":"unknown"}),p=u(()=>_.params.ip),$=u(()=>_.params.port),z=u(()=>_.params.mask?parseInt(_.params.mask):24),k=u(()=>_.params.honeypot),T=D,g=u(()=>{if(t.value!=="geo")return"";if(T.type)return T.type;if(_.params.type)return _.params.type;const e=_.name;return e==="domain"?"domain":e==="fqdn"?"fqdn":""}),S=u(()=>t.value!=="geo"?"":T.value?T.value:_.params.value?_.params.value:""),A=u(()=>{switch(t.value){case"ip":return p.value;case"subnet":return`${it(p.value,z.value)}/${z.value}`;case"port":return $.value;case"honeypot":return k.value;case"geo":return S.value;default:return""}}),Y=We(),De=Ke(),{getIPInfo:Ie,ipInfoIsLoading:Te,getDomainByIp:Ae}=De,C=u(()=>t.value==="ip"?Ae(p.value).value:null),f=u(()=>t.value==="ip"||t.value==="subnet"?Ie(p.value).value:null),J=u(()=>t.value==="ip"||t.value==="subnet"?Y.getTagsByIp(A.value):[]),Q=u(()=>{if(t.value==="ip"||t.value==="subnet"){const e=Y.getBlocklistEntryByIp(A.value);if(e)return e.expires;const s=Y.getBotnetEntryByIp(A.value);if(s)return s.expires}return null}),X=u(()=>{switch(t.value){case"ip":return{remote_addr:[p.value]};case"subnet":return{remote_addr:[A.value]};case"port":return{dst_port:[$.value]};case"honeypot":const e=U(k.value);return{type:e?[e.name]:[]};case"geo":return g.value&&["asn","city","country","domain","fqdn"].includes(g.value)?{[g.value]:[S.value]}:{};default:return{}}}),b=Ye(ke(X.value));W([t,A,g,S],()=>{if(b.state.remote_addr=[],b.state.dst_port=[],b.state.country=[],b.state.city=[],b.state.asn=[],b.state.domain=[],b.state.fqdn=[],b.state.type=[],t.value==="ip")b.state.remote_addr=[p.value];else if(t.value==="subnet")b.state.remote_addr=[A.value];else if(t.value==="port")b.state.dst_port=[$.value];else if(t.value==="honeypot"){const e=U(k.value);e&&(b.state.type=[e.name])}else t.value==="geo"&&g.value&&["asn","city","country","domain","fqdn"].includes(g.value)&&(b.state[g.value]=[S.value])},{deep:!0});const v=P(null),L=P(!1),H=P(24),ce=P([]),Z=P(!1),ve=P([]),ee=P(!1),O=P({});async function Le(){L.value=!0,v.value=null,O.value={};let e="";try{if(t.value==="ip"){if(!p.value)return;e=`${R()}/api/stats/ip?ip=${p.value}`}else if(t.value==="subnet"){if(!p.value)return;e=`${R()}/api/stats/ip?ip=${A.value}`}else if(t.value==="port"){if(!$.value)return;e=`${R()}/api/stats/port?port=${$.value}`}else if(t.value==="honeypot"){const s=U(k.value);if(!s)return;e=`${R()}/api/stats/honeypot?event_type=${s.name}`}else if(t.value==="geo"){if(!S.value)return;e=`${R()}/api/stats/geo?type=${g.value}&value=${S.value}`}if(e){const s=await fetch(e);if(s.ok){const w=await s.json();t.value==="honeypot"&&(O.value=w),v.value=w}}}catch(s){console.error("Failed to fetch stats",s)}finally{L.value=!1}}async function de(){if(!(t.value!=="ip"||!p.value)){Z.value=!0;try{const e=await fetch(`${R()}/api/stats/subnet?ip=${p.value}&mask=${H.value}`);e.ok&&(ce.value=await e.json())}catch(e){console.error("Failed to fetch subnet stats for IP view",e)}finally{Z.value=!1}}}async function Ce(){if(!(t.value!=="subnet"||!p.value)){ee.value=!0;try{const e=await fetch(`${R()}/api/stats/subnet?ip=${p.value}&mask=${z.value}`);e.ok&&(ve.value=await e.json())}catch(e){console.error("Failed to fetch subnet stats",e)}finally{ee.value=!1}}}W(()=>[_.path,t.value],()=>{if(t.value==="ip"&&!$e(p.value)){N.push("/");return}if(t.value==="port"&&!ut($.value)){N.push("/");return}if(t.value==="subnet"&&(!$e(p.value)||isNaN(z.value))){N.push("/");return}if(t.value==="honeypot"&&!k.value){N.push("/");return}Le(),t.value==="ip"&&de(),t.value==="subnet"&&Ce()},{immediate:!0}),W(H,()=>{t.value==="ip"&&de()});const Ve=u(()=>ke({...X.value,limit:1e4,columns:["time","event","dst_port","remote_addr","type"]})),{chartData:pe,loading:te}=pt({filters:()=>Ve.value}),{entries:Be,total:Fe,loading:Ne,connectionStatus:me,connect:qe,disconnect:Ee}=Je({filterState:b.state}),Re=u(()=>rt(pe.value)),G=P(0),ae=P(0);function je(){me.value==="open"?Ee():qe()}const le=u(()=>(v.value?.top_ports||[]).map(e=>({label:e.label,count:e.count,routerLink:`/port/${e.label}`}))),ze=u(()=>(v.value?.top_events||[]).map(e=>({id:e.label,label:t.value==="port"?U(e.label)?.label??e.label:e.label,count:e.count}))),fe=u(()=>(v.value?.top_addrs||[]).map(e=>({label:e.label,count:e.count,routerLink:`/ip/${e.label}`}))),Me=u(()=>(v.value?.top_subdomains||[]).map(e=>({label:e.label,count:e.count,routerLink:`/fqdn/${e.label}`}))),ye=u(()=>ce.value.map(e=>({label:e.label,count:e.count,routerLink:`/ip/${e.label}`}))),he=u(()=>ve.value.map(e=>({label:e.label,count:e.count,routerLink:`/ip/${e.label}`}))),_e=u(()=>{if(t.value!=="honeypot")return[];const e=["top_events","top_addrs","top_ports","total_events","first_seen","last_seen","title","metadata"];return Object.keys(O.value).filter(s=>!e.includes(s))}),q=P(!1),ge=u(()=>{if(t.value==="ip")return{title:`${p.value}`,icon:r.address};if(t.value==="subnet")return{title:`${A.value}`,icon:r.subnet};if(t.value==="port")return{title:`Port ${$.value}`,icon:r.port};if(t.value==="honeypot"){const e=U(k.value);return{title:e?`${e.label} Honeypot`:k.value,icon:r.honeypotType}}if(t.value==="geo"){if(L.value)return{title:"Loading...",icon:void 0};if(g.value==="country"){const e=v.value?.title||S.value;return{title:(B.get(e)?.[1]||e)+" "+(B.get(e)?.[0]||""),icon:r.country}}return g.value==="asn"?{title:v.value?.metadata?.asn_org||`ASN ${S.value}`,icon:r.asn}:g.value==="domain"||g.value==="fqdn"?{title:v.value?.title||S.value,icon:r.domain}:{title:v.value?.title||S.value,icon:r.city}}return{title:"Details",icon:r.activity}}),be=u(()=>{if(L.value||!v.value?.metadata)return null;const{country:e}=v.value.metadata;return g.value==="city"&&e?B.get(e)?.[0]+" "+B.get(e)?.[1]:g.value==="asn"?`ASN ${S.value}`:e&&g.value!=="country"?B.get(e)?.[1]:null}),He=u(()=>{if(t.value==="port")return;const e=X.value,s=Object.keys(e);if(s.length>0){const w=s[0];if(w){const n=e[w];if(Array.isArray(n)&&n.length>0)return`/charts?${w}=${n[0]}`}}return"/charts"}),se=u(()=>t.value==="ip"?["time","event","details"]:["time","event","remote_addr","details"]),{width:ne}=st();return(e,s)=>{const w=Pe("router-link");return a(),i("div",ft,[y(dt,{title:ge.value.title,icon:ge.value.icon,class:"min-h-12"},{left:c(()=>[t.value==="ip"||t.value==="subnet"?(a(),i("div",yt,[o("div",ht,[t.value==="ip"&&C.value&&C.value!==p.value?(a(),i("p",_t,[f.value?.domain&&f.value.domain!==C.value&&C.value.endsWith(f.value.domain)?(a(),i(I,{key:0},[y(w,{to:`/fqdn/${C.value}`,class:"peer hover:text-stone-50"},{default:c(()=>[x(h(C.value.slice(0,-f.value.domain.length)),1)]),_:1},8,["to"]),y(w,{to:`/domain/${f.value.domain}`,class:"peer-hover:text-stone-50 hover:text-stone-50"},{default:c(()=>[x(h(f.value.domain),1)]),_:1},8,["to"])],64)):(a(),m(w,{key:1,to:`/fqdn/${C.value}`,class:"hover:text-stone-50"},{default:c(()=>[x(h(C.value),1)]),_:1},8,["to"]))])):t.value==="ip"&&l(Te)(p.value)?(a(),i("p",gt," Looking up domain... ")):d("",!0),f.value?(a(),i("p",bt,[f.value?.country?.iso_code?(a(),i("span",{key:0,title:l(B).get(f.value.country.iso_code)?.[1],class:"stat-label"},[x(h(l(B).get(f.value.country.iso_code)?.[0])+" ",1),f.value?.city?.name?(a(),m(w,{key:0,to:`/city/${f.value.city.name}`,class:"hover:text-stone-200"},{default:c(()=>[x(h(f.value.city.name)+", ",1)]),_:1},8,["to"])):d("",!0),y(w,{to:`/country/${f.value.country.iso_code}`,class:"hover:text-stone-200"},{default:c(()=>[x(h(l(B).get(f.value.country.iso_code)?.[1]),1)]),_:1},8,["to"])],8,xt)):d("",!0),f.value?.asn&&f.value?.country?.iso_code?(a(),i("span",kt,", ")):d("",!0),f.value?.asn?.autonomous_system_organization?(a(),i("span",wt,[y(w,{to:`/asn/${f.value.asn.autonomous_system_number}`,class:"hover:text-stone-200"},{default:c(()=>[x(h(f.value?.asn?.autonomous_system_organization)+" (ASN"+h(f.value?.asn?.autonomous_system_number)+") ",1)]),_:1},8,["to"])])):d("",!0)])):d("",!0)]),J.value&&J.value.length>0?(a(),i("div",$t,[(a(!0),i(I,null,E(J.value,n=>(a(),m(we,{tag:n,key:n},null,8,["tag"]))),128)),Q.value?(a(),i("span",St," Unblocked "+h(Q.value?l(ie)(Q.value):"N/A"),1)):d("",!0)])):d("",!0)])):t.value==="geo"&&v.value?.metadata?(a(),i("div",Pt,[o("div",Dt,[be.value?(a(),i("span",It,h(be.value),1)):d("",!0)])])):d("",!0)]),actions:c(()=>[y(Xe,{st:l(me),onToggleConnection:je},null,8,["st"])]),_:1},8,["title","icon"]),o("div",{class:oe(["grid grid-cols-1 gap-4 md:grid-cols-2 md:grid-rows-2 xl:grid-rows-1",{"xl:grid-cols-[1fr_280px_250px_300px]":t.value==="ip"||t.value==="subnet","lg:grid-cols-[1fr_350px]":t.value==="port","xl:grid-cols-[1fr_250px_350px]":t.value==="geo"||t.value==="honeypot"}])},[(a(),m(mt,{"selected-points":G.value,"onUpdate:selectedPoints":s[0]||(s[0]=n=>G.value=n),"selected-i-ps":ae.value,"onUpdate:selectedIPs":s[1]||(s[1]=n=>ae.value=n),chartData:l(pe),"local-filter-actions":l(b),title:"Activity Timeline",loading:l(te),key:A.value,"chart-link":He.value,"is-port":t.value==="port","is-honeypot":t.value==="honeypot"},null,8,["selected-points","selected-i-ps","chartData","local-filter-actions","loading","chart-link","is-port","is-honeypot"])),t.value==="ip"||t.value==="subnet"?(a(),m(j,{key:0,title:`Blocklist History (${v.value?.blocklist?.length||0})`,icon:l(r).blocked},{default:c(()=>[o("div",Tt,[L.value?(a(),i("div",At," Loading... ")):v.value?.blocklist?.length?d("",!0):(a(),i("div",Lt," No blocklist history ")),(a(!0),i(I,null,E(v.value?.blocklist||[],n=>(a(),i("div",{key:n.id,class:"my-1 flex items-center justify-between gap-2"},[o("div",Ct,[t.value==="subnet"?(a(),i(I,{key:0},[x(h(n.address)+" ",1),s[5]||(s[5]=o("br",null,null,-1))],64)):d("",!0),x(" "+h(l(ue)(n.timestamp,!0)),1)]),o("div",Vt,[(a(!0),i(I,null,E(n.reason.split(","),V=>(a(),m(we,{key:V,tag:V.trim()},null,8,["tag"]))),128))])]))),128))])]),_:1},8,["title","icon"])):d("",!0),t.value!=="port"?(a(),m(j,{key:1,title:"Top Ports",icon:l(r).port},{default:c(()=>[y(F,{items:le.value,loading:L.value,"bar-min-width":"10px",class:"max-h-75"},null,8,["items","loading"])]),_:1},8,["icon"])):d("",!0),t.value==="ip"?(a(),m(j,{key:2,title:`Subnet (${ye.value.length})`,icon:l(r).subnet},{"header-right":c(()=>[o("div",Bt,[o("div",Ft,[Ze(o("select",{"onUpdate:modelValue":s[2]||(s[2]=n=>H.value=n),class:"rounded border border-stone-700 bg-stone-800 px-2 py-0.5 text-xs text-stone-400 transition-colors hover:bg-stone-700"},[(a(),i(I,null,E([24,22,20,18,16,12,8],n=>o("option",{key:n,value:n}," /"+h(n),9,Nt)),64))],512),[[et,H.value]])]),y(w,{to:`/ip/${p.value}/${H.value}`,class:"btn-secondary p-0.5 text-[10px]",title:"View full subnet details"},{default:c(()=>[(a(),m(K(l(r).subnet)))]),_:1},8,["to"])])]),default:c(()=>[y(F,{items:ye.value,loading:Z.value,"bar-min-width":"10px",class:"max-h-75"},null,8,["items","loading"])]),_:1},8,["title","icon"])):d("",!0),t.value==="subnet"?(a(),m(j,{key:3,title:`Active Addresses (${he.value.length})`,icon:l(r).address},{default:c(()=>[y(F,{items:he.value,loading:ee.value,"bar-min-width":"10px",class:"max-h-[300px]"},null,8,["items","loading"])]),_:1},8,["title","icon"])):d("",!0),t.value==="geo"?(a(),m(j,{key:4,title:q.value?"Top Domains":"Top Addresses",icon:q.value?l(r).domain:l(r).address},{default:c(()=>[o("div",qt,[o("div",Et,[o("button",{onClick:s[3]||(s[3]=n=>q.value=!1),class:oe(["rounded px-2 py-0.5 text-xs font-medium transition-colors",q.value?"text-stone-400 hover:text-stone-200":"bg-stone-700 text-stone-200 shadow-sm"])},[(a(),m(K(l(r).address),{size:"20"})),s[6]||(s[6]=x(" IP ",-1))],2),o("button",{onClick:s[4]||(s[4]=n=>q.value=!0),class:oe(["rounded px-2 py-0.5 text-xs font-medium transition-colors",q.value?"bg-stone-700 text-stone-200 shadow-sm":"text-stone-400 hover:text-stone-200"])},[(a(),m(K(l(r).domain),{size:"20"})),s[7]||(s[7]=x(" Domain ",-1))],2)])]),y(F,{items:q.value?Me.value:fe.value,loading:L.value,"bar-min-width":"10px",class:"max-h-75"},null,8,["items","loading"])]),_:1},8,["title","icon"])):d("",!0),t.value==="port"||t.value==="honeypot"?(a(),m(j,{key:5,title:"Top Addresses",icon:l(r).address},{default:c(()=>[y(F,{items:fe.value,loading:L.value,"bar-min-width":"10px",class:"max-h-[400px]"},null,8,["items","loading"])]),_:1},8,["icon"])):d("",!0)],2),o("div",Rt,[y(M,{label:"Event Types",icon:l(r).eventType},{default:c(()=>[o("div",jt,[y(F,{items:ze.value,loading:l(te)},null,8,["items","loading"])])]),_:1},8,["icon"]),y(M,{label:"Recent Activity",icon:l(r).activity},{default:c(()=>[y(tt,{data:Re.value,class:"h-32"},null,8,["data"])]),_:1},8,["icon"]),y(M,{label:"Total Events",value:v.value?.total_events,icon:l(r).total},null,8,["value","icon"]),t.value!=="honeypot"?(a(),m(M,{key:0,label:"Dates",icon:l(r).time},{default:c(()=>[s[8]||(s[8]=o("div",{class:"stat-label mt-4"},"First Seen:",-1)),o("div",zt,[x(h(l(ie)(v.value?.first_seen))+" ",1),o("span",Mt," ("+h(v.value?.first_seen?l(ue)(v.value.first_seen):"")+") ",1)]),s[9]||(s[9]=o("div",{class:"stat-label mt-4"},"Last Seen:",-1)),o("div",Ht,[x(h(l(ie)(v.value?.last_seen))+" ",1),o("span",Ut," ("+h(v.value?.last_seen?l(ue)(v.value.last_seen):"")+") ",1)])]),_:1},8,["icon"])):d("",!0),t.value==="honeypot"?(a(),m(M,{key:1,label:"Destination Ports",value:le.value.length,icon:l(r).port},{default:c(()=>[y(F,{items:le.value,loading:l(te),"bar-min-width":"10px",class:"max-h-[100px]"},null,8,["items","loading"])]),_:1},8,["value","icon"])):d("",!0)]),_e.value.length>0?(a(),i("details",Ot,[s[10]||(s[10]=o("summary",{class:"text-sm text-stone-400"},"Show more stats",-1)),o("div",Gt,[(a(!0),i(I,null,E(_e.value,n=>(a(),m(M,{key:n,label:n},{default:c(()=>[y(F,{items:O.value[n]||[],loading:L.value,class:"max-h-[300px]","label-column-width":"w-[min-content] max-w-48 truncate","add-title":!0},null,8,["items","loading"])]),_:2},1032,["label"]))),128))])])):d("",!0),y(Qe,{events:l(Be),"total-events":l(Fe),loading:l(Ne),columns:se.value,"filter-actions":l(b)},{"header-right":c(()=>[o("div",Wt,[x(h(l(re)(v.value?.total_events||0))+" total events ",1),G.value>0?(a(),i(I,{key:0},[x(" ("+h(l(re)(G.value))+" events, "+h(l(re)(ae.value))+" IPs selected) ",1)],64)):d("",!0)])]),rows:c(({events:n})=>[l(ne)>768?(a(!0),i(I,{key:0},E(n,V=>(a(),m(at,{key:V.id,evt:V,columns:se.value,"filter-actions":l(b),width:l(ne)},null,8,["evt","columns","filter-actions","width"]))),128)):(a(!0),i(I,{key:1},E(n,V=>(a(),m(lt,{key:`mobile-${V.id}`,evt:V,columns:se.value,"filter-actions":l(b),width:l(ne)},null,8,["evt","columns","filter-actions","width"]))),128))]),_:1},8,["events","total-events","loading","columns","filter-actions"])])}}});export{Zt as default};