('[data-connection-field]')
+ ?.dataset.connectionField
+ : undefined
+ const preferredKind =
+ field === 'process'
+ ? 'process'
+ : field === 'source'
+ ? 'source'
+ : field === 'remoteDestination'
+ ? 'destination'
+ : 'domain'
+ onShowDetail(row.id, preferredKind)
+ },
[onShowDetail, row.id],
)
const snapshot = getSnapshot(row)
@@ -285,6 +301,7 @@ const RowComponent = memo(
{columns.map((column) => (
void
+ onShowDetail: (id: string, preferredKind?: ConnectionRuleKind) => void
columnManagerOpen: boolean
onCloseColumnManager: () => void
}
@@ -333,7 +350,8 @@ export const ConnectionTable = (props: Props) => {
const onShowDetailRef = useRef(rawOnShowDetail)
onShowDetailRef.current = rawOnShowDetail
const onShowDetail = useCallback(
- (id: string) => onShowDetailRef.current(id),
+ (id: string, preferredKind?: ConnectionRuleKind) =>
+ onShowDetailRef.current(id, preferredKind),
[],
)
const { t } = useTranslation()
diff --git a/src/locales/ar/connections.json b/src/locales/ar/connections.json
index 370c63e79..24696ce9f 100644
--- a/src/locales/ar/connections.json
+++ b/src/locales/ar/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/de/connections.json b/src/locales/de/connections.json
index d62a076cc..8c4806587 100644
--- a/src/locales/de/connections.json
+++ b/src/locales/de/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/en/connections.json b/src/locales/en/connections.json
index 09b9854b5..ea8f9686a 100644
--- a/src/locales/en/connections.json
+++ b/src/locales/en/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/es/connections.json b/src/locales/es/connections.json
index ee8eef59c..8c27586a6 100644
--- a/src/locales/es/connections.json
+++ b/src/locales/es/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/fa/connections.json b/src/locales/fa/connections.json
index 7bd73b7c5..2b1ba8364 100644
--- a/src/locales/fa/connections.json
+++ b/src/locales/fa/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/id/connections.json b/src/locales/id/connections.json
index 3757fc227..e8f0a299f 100644
--- a/src/locales/id/connections.json
+++ b/src/locales/id/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/jp/connections.json b/src/locales/jp/connections.json
index c633e02d7..018bb9abe 100644
--- a/src/locales/jp/connections.json
+++ b/src/locales/jp/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/ko/connections.json b/src/locales/ko/connections.json
index 235fb8916..3b834e12d 100644
--- a/src/locales/ko/connections.json
+++ b/src/locales/ko/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/pt/connections.json b/src/locales/pt/connections.json
index 25ec983c7..6678de1ee 100644
--- a/src/locales/pt/connections.json
+++ b/src/locales/pt/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/ru/connections.json b/src/locales/ru/connections.json
index da41ee087..d59d06983 100644
--- a/src/locales/ru/connections.json
+++ b/src/locales/ru/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/tr/connections.json b/src/locales/tr/connections.json
index 012e435ee..ac5a24cf7 100644
--- a/src/locales/tr/connections.json
+++ b/src/locales/tr/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/tt/connections.json b/src/locales/tt/connections.json
index cea7dada1..8b43373f3 100644
--- a/src/locales/tt/connections.json
+++ b/src/locales/tt/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/locales/zh/connections.json b/src/locales/zh/connections.json
index 94954042b..0dc379ca1 100644
--- a/src/locales/zh/connections.json
+++ b/src/locales/zh/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "规则未能应用,已保留当前选择。",
"unsupportedValue": "此内容包含快捷规则不支持的字符。",
"saved": "规则已保存,配置已应用。",
- "noMetadata": "此连接没有可用于添加规则的域名或进程信息。",
+ "noMetadata": "此连接没有可用于设置规则的域名、进程或 IP 信息。",
"noProfile": "当前没有可编辑规则扩展的活动订阅。",
"entry": "设置规则…",
"modifyTitle": "修改规则",
@@ -56,6 +56,10 @@
"policyUnavailable": "此策略已不可用,请选择其他策略。",
"editDestination": "修改「{{name}}」中的现有规则,保留排序。",
"saveAndApply": "保存并应用",
+ "sourceIp": "源 IP",
+ "destinationIp": "目标 IP",
+ "sourceHint": "匹配来自此 IP 的所有请求,可能包含其他应用,不限定端口。",
+ "destinationHint": "匹配访问此目标 IP 的请求,覆盖所有域名,不限定端口。",
"fullPath": "完整路径"
}
}
diff --git a/src/locales/zhtw/connections.json b/src/locales/zhtw/connections.json
index 4b6c094ed..574d109ed 100644
--- a/src/locales/zhtw/connections.json
+++ b/src/locales/zhtw/connections.json
@@ -46,7 +46,7 @@
"applyFailed": "The rule could not be applied. Your selection has been kept.",
"unsupportedValue": "This value contains characters that cannot be used in a quick rule.",
"saved": "Rule saved and configuration applied.",
- "noMetadata": "This connection has no domain or process information for adding a rule.",
+ "noMetadata": "This connection has no domain, process or IP information for configuring a rule.",
"noProfile": "No active profile with an editable rule extension is available.",
"entry": "Configure rule…",
"modifyTitle": "Modify rule",
@@ -56,6 +56,10 @@
"policyUnavailable": "This policy is no longer available. Choose another policy.",
"editDestination": "Update the existing rule in “{{name}}”, keeping its position.",
"saveAndApply": "Save and apply",
+ "sourceIp": "Source IP",
+ "destinationIp": "Destination IP",
+ "sourceHint": "Matches all requests from this IP, including requests from other applications. No port filtering.",
+ "destinationHint": "Matches this destination IP across all domains. No port filtering.",
"fullPath": "Full path"
}
}
diff --git a/src/pages/connections.tsx b/src/pages/connections.tsx
index 7a11a1497..80df49cb8 100644
--- a/src/pages/connections.tsx
+++ b/src/pages/connections.tsx
@@ -35,6 +35,7 @@ import {
getConnectionStartTime,
useConnectionRowViews,
} from '@/components/connection/connection-row-view'
+import type { ConnectionRuleKind } from '@/components/connection/connection-rule'
import { ConnectionTable } from '@/components/connection/connection-table'
import { useConnectionData } from '@/hooks/use-connection-data'
import { useConnectionSetting } from '@/hooks/use-connection-setting'
@@ -161,10 +162,14 @@ const ConnectionsPage = () => {
)
const showDetailById = useCallback(
- (id: string) => {
+ (id: string, preferredKind: ConnectionRuleKind = 'domain') => {
const connection = filterConn.find((item) => item.id === id)
if (connection) {
- detailRef.current?.open(connection, connectionsType === 'closed')
+ detailRef.current?.open(
+ connection,
+ connectionsType === 'closed',
+ preferredKind,
+ )
}
},
[connectionsType, filterConn],
diff --git a/src/types/generated/i18n-keys.ts b/src/types/generated/i18n-keys.ts
index 22a4ad9b2..2440917a8 100644
--- a/src/types/generated/i18n-keys.ts
+++ b/src/types/generated/i18n-keys.ts
@@ -46,6 +46,10 @@ export const translationKeys = [
'connections.ruleDialog.policyUnavailable',
'connections.ruleDialog.editDestination',
'connections.ruleDialog.saveAndApply',
+ 'connections.ruleDialog.sourceIp',
+ 'connections.ruleDialog.destinationIp',
+ 'connections.ruleDialog.sourceHint',
+ 'connections.ruleDialog.destinationHint',
'connections.ruleDialog.fullPath',
'home.page.tooltips.lightweightMode',
'home.page.tooltips.manual',
diff --git a/src/types/generated/i18n-resources.ts b/src/types/generated/i18n-resources.ts
index a3c90b136..3a97e0a2e 100644
--- a/src/types/generated/i18n-resources.ts
+++ b/src/types/generated/i18n-resources.ts
@@ -41,6 +41,8 @@ export interface TranslationResources {
allSubdomains: string
applyFailed: string
destination: string
+ destinationHint: string
+ destinationIp: string
domain: string
domainScope: string
editDestination: string
@@ -59,6 +61,8 @@ export interface TranslationResources {
ruleModeHint: string
saveAndApply: string
saved: string
+ sourceHint: string
+ sourceIp: string
title: string
unavailable: string
unsupportedValue: string