Add more connection details

This commit is contained in:
xishang0128 2024-11-20 20:10:57 +08:00
parent e2653170c0
commit c338051802
2 changed files with 41 additions and 20 deletions

View File

@ -12,7 +12,7 @@ interface Props {
const CopyableSettingItem: React.FC<{ const CopyableSettingItem: React.FC<{
title: string title: string
value: string value: string | string[]
displayName?: string displayName?: string
prefix?: string[] prefix?: string[]
suffix?: string suffix?: string
@ -23,18 +23,23 @@ const CopyableSettingItem: React.FC<{
: domain.split('.').map((_, i, parts) => parts.slice(i).join('.')).slice(0, -1) : domain.split('.').map((_, i, parts) => parts.slice(i).join('.')).slice(0, -1)
const menuItems = [ const menuItems = [
{ key: 'raw', text: value }, { key: 'raw', text: displayName || (Array.isArray(value) ? value.join(', ') : value) },
...prefix.flatMap(p => ...(Array.isArray(value) && value.length === prefix.length
? prefix.map((p, i) => value[i] ? ({
key: `${p},${value[i]}${suffix}`,
text: `${p},${value[i]}${suffix}`
}) : null).filter(Boolean)
: prefix.flatMap(p =>
(p === 'DOMAIN-SUFFIX' (p === 'DOMAIN-SUFFIX'
? getSubDomains(value) ? getSubDomains(Array.isArray(value) ? value[0] : value)
: p === 'IP-ASN' : p === 'IP-ASN'
? [value.split(' ')[0]] ? [(Array.isArray(value) ? value[0] : value).split(' ')[0]]
: [value] : [Array.isArray(value) ? value[0] : value]
).map(v => ({ ).map(v => ({
key: `${p},${v}${suffix}`, key: `${p},${v}${suffix}`,
text: `${p},${v}${suffix}` text: `${p},${v}${suffix}`
})) }))
) ))
] ]
return ( return (
@ -49,17 +54,17 @@ const CopyableSettingItem: React.FC<{
</DropdownTrigger> </DropdownTrigger>
<DropdownMenu <DropdownMenu
onAction={key => onAction={key =>
navigator.clipboard.writeText(key === 'raw' ? value : key as string) navigator.clipboard.writeText(key === 'raw' ? (Array.isArray(value) ? value.join(', ') : value) : key as string)
} }
> >
{menuItems.map(({ key, text }) => ( {menuItems.filter(item => item !== null).map(({ key, text }) => (
<DropdownItem key={key}>{text}</DropdownItem> <DropdownItem key={key}>{text}</DropdownItem>
))} ))}
</DropdownMenu> </DropdownMenu>
</Dropdown> </Dropdown>
} }
> >
{displayName || value} {displayName || (Array.isArray(value) ? value.join(', ') : value)}
</SettingItem> </SettingItem>
) )
} }
@ -91,9 +96,9 @@ const ConnectionDetailModal: React.FC<Props> = (props) => {
<SettingItem title='下载量'>{calcTraffic(connection.download)}</SettingItem> <SettingItem title='下载量'>{calcTraffic(connection.download)}</SettingItem>
<CopyableSettingItem <CopyableSettingItem
title='连接类型' title='连接类型'
value={connection.metadata.type} value={[connection.metadata.type, connection.metadata.network]}
displayName={`${connection.metadata.type}(${connection.metadata.network})`} displayName={`${connection.metadata.type}(${connection.metadata.network})`}
prefix={['IN-TYPE']} prefix={['IN-TYPE', 'NETWORK']}
/> />
{connection.metadata.host && ( {connection.metadata.host && (
<CopyableSettingItem <CopyableSettingItem
@ -112,9 +117,9 @@ const ConnectionDetailModal: React.FC<Props> = (props) => {
{connection.metadata.process && ( {connection.metadata.process && (
<CopyableSettingItem <CopyableSettingItem
title='进程名' title='进程名'
value={connection.metadata.process} value={[connection.metadata.process, connection.metadata.uid ? connection.metadata.uid.toString() : '']}
displayName={`${connection.metadata.process}${connection.metadata.uid ? `(${connection.metadata.uid})` : ''}`} displayName={`${connection.metadata.process}${connection.metadata.uid ? `(${connection.metadata.uid})` : ''}`}
prefix={['PROCESS-NAME']} prefix={['PROCESS-NAME', 'UID']}
/> />
)} )}
{connection.metadata.processPath && ( {connection.metadata.processPath && (
@ -132,6 +137,20 @@ const ConnectionDetailModal: React.FC<Props> = (props) => {
suffix='/32' suffix='/32'
/> />
)} )}
{connection.metadata.sourceGeoIP && (
<CopyableSettingItem
title='来源GeoIP'
value={connection.metadata.sourceGeoIP}
prefix={['SRC-GEOIP']}
/>
)}
{connection.metadata.sourceIPASN && (
<CopyableSettingItem
title='来源ASN'
value={connection.metadata.sourceIPASN}
prefix={['SRC-IP-ASN']}
/>
)}
{connection.metadata.destinationIP && ( {connection.metadata.destinationIP && (
<CopyableSettingItem <CopyableSettingItem
title='目标IP' title='目标IP'

View File

@ -88,6 +88,8 @@ interface IMihomoConnectionDetail {
network: 'tcp' | 'udp' network: 'tcp' | 'udp'
type: string type: string
sourceIP: string sourceIP: string
sourceGeoIP: string
sourceIPASN: string
destinationIP: string destinationIP: string
destinationGeoIP: string destinationGeoIP: string
destinationIPASN: string destinationIPASN: string