Skip to content

Commit 28a893f

Browse files
feat(frontend): warn about catch-all rules in the routing list
Marks the catch-all rule and the rules it makes unreachable, so a terminal rule stops silently swallowing the rest of the chain.
1 parent b4124ee commit 28a893f

9 files changed

Lines changed: 38 additions & 2 deletions

File tree

frontend/src/features/settings/sections/RoutingSection.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import type { RoutingRule } from "../../../generated/bindings";
1414
import { useFormatters, useT } from "../../../i18n";
1515
import type { AdvancedSettings } from "../../../lib/bridge";
1616
import { getRuntimeBridgeMode } from "../../../lib/ksu-webui";
17-
import { ruleIcon, ruleSummary } from "../helpers";
17+
import { isCatchAllRule, ruleIcon, ruleSummary } from "../helpers";
1818
import { makePresetRule, RULE_PRESETS } from "../rule-presets";
1919

2020
export function RoutingSection({
@@ -51,6 +51,7 @@ export function RoutingSection({
5151
const profileName = (tag: string) => profiles.find((p) => p.id === tag)?.remarks;
5252
const domainStrategy4Xray = settings.domainStrategy;
5353
const domainStrategy4Singbox = settings.domainStrategy4Singbox;
54+
const catchAllIndex = routingRules.findIndex(isCatchAllRule);
5455

5556
return (
5657
<>
@@ -204,7 +205,21 @@ export function RoutingSection({
204205
key={rule.id}
205206
icon={ruleIcon(rule)}
206207
title={rule.remarks || t("settings.routingRuleDefault", { n: index + 1 })}
207-
sub={ruleSummary(rule, t, formatters, profileName)}
208+
sub={
209+
<>
210+
{ruleSummary(rule, t, formatters, profileName)}
211+
{index === catchAllIndex && (
212+
<div style={{ color: "var(--warn)", marginTop: 2 }}>
213+
{t("settings.routingCatchAll")}
214+
</div>
215+
)}
216+
{catchAllIndex >= 0 && index > catchAllIndex && rule.enabled && (
217+
<div style={{ color: "var(--on-surface-faint)", marginTop: 2 }}>
218+
{t("settings.routingUnreachable")}
219+
</div>
220+
)}
221+
</>
222+
}
208223
onClick={() => onEditRule(rule)}
209224
right={
210225
<div style={{ display: "flex", alignItems: "center", gap: 6 }}>

frontend/src/i18n/ar.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,8 @@ const ar = {
736736
"settings.routingAddRule": "إضافة قاعدة",
737737
"settings.routingEmpty": "لا توجد قواعد توجيه بعد.",
738738
"settings.routingRuleDefault": "القاعدة {n}",
739+
"settings.routingCatchAll": "يطابق كل اتصال — القواعد أدناه وفحص IP التلقائي لن تُنفَّذ.",
740+
"settings.routingUnreachable": "لا يتم الوصول إليها أبدًا.",
739741
"settings.routingRuleDomains": plural("count", {
740742
zero: "لا نطاقات",
741743
one: "نطاق واحد",

frontend/src/i18n/en.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,9 @@ const en = {
625625
"settings.routingAddRule": "Add rule",
626626
"settings.routingEmpty": "No routing rules yet.",
627627
"settings.routingRuleDefault": "Rule {n}",
628+
"settings.routingCatchAll":
629+
"Matches every connection — the rules below and the automatic IP check never run.",
630+
"settings.routingUnreachable": "Never reached.",
628631
"settings.routingRuleDomains": plural("count", {
629632
one: "# domain",
630633
other: "# domains",

frontend/src/i18n/es.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,9 @@ const es = {
619619
"settings.routingAddRule": "Añadir regla",
620620
"settings.routingEmpty": "Aún no hay reglas de enrutamiento.",
621621
"settings.routingRuleDefault": "Regla {n}",
622+
"settings.routingCatchAll":
623+
"Coincide con todas las conexiones: las reglas siguientes y la comprobación automática de IP nunca se ejecutan.",
624+
"settings.routingUnreachable": "Nunca se alcanza.",
622625
"settings.routingRuleDomains": plural("count", {
623626
one: "# dominio",
624627
other: "# dominios",

frontend/src/i18n/hi.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,8 @@ const hi = {
610610
"settings.routingAddRule": "नियम जोड़ें",
611611
"settings.routingEmpty": "अभी कोई रूटिंग नियम नहीं हैं।",
612612
"settings.routingRuleDefault": "नियम {n}",
613+
"settings.routingCatchAll": "हर कनेक्शन से मेल खाता है — नीचे के नियम और स्वचालित IP जाँच कभी नहीं चलते।",
614+
"settings.routingUnreachable": "कभी लागू नहीं होता।",
613615
"settings.routingRuleDomains": plural("count", {
614616
one: "# डोमेन",
615617
other: "# डोमेन",

frontend/src/i18n/pt.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,9 @@ const pt = {
618618
"settings.routingAddRule": "Adicionar regra",
619619
"settings.routingEmpty": "Ainda não há regras de roteamento.",
620620
"settings.routingRuleDefault": "Regra {n}",
621+
"settings.routingCatchAll":
622+
"Corresponde a todas as conexões — as regras abaixo e a verificação automática de IP nunca são executadas.",
623+
"settings.routingUnreachable": "Nunca é alcançada.",
621624
"settings.routingRuleDomains": plural("count", {
622625
one: "# domínio",
623626
other: "# domínios",

frontend/src/i18n/ru.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,9 @@ const ru = {
654654
"settings.routingAddRule": "Добавить правило",
655655
"settings.routingEmpty": "Правил маршрутизации пока нет.",
656656
"settings.routingRuleDefault": "Правило {n}",
657+
"settings.routingCatchAll":
658+
"Перехватывает весь трафик — правила ниже и автопроверка по IP не сработают.",
659+
"settings.routingUnreachable": "Никогда не сработает.",
657660
"settings.routingRuleDomains": plural("count", {
658661
one: "# домен",
659662
few: "# домена",

frontend/src/i18n/vi.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,9 @@ const vi = {
614614
"settings.routingAddRule": "Thêm quy tắc",
615615
"settings.routingEmpty": "Chưa có quy tắc định tuyến nào.",
616616
"settings.routingRuleDefault": "Quy tắc {n}",
617+
"settings.routingCatchAll":
618+
"Khớp mọi kết nối — các quy tắc bên dưới và bước kiểm tra IP tự động sẽ không chạy.",
619+
"settings.routingUnreachable": "Không bao giờ được dùng.",
617620
"settings.routingRuleDomains": plural("count", {
618621
one: "# domain",
619622
other: "# domain",

frontend/src/i18n/zh.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,8 @@ const zh = {
610610
"settings.routingAddRule": "添加规则",
611611
"settings.routingEmpty": "暂无路由规则。",
612612
"settings.routingRuleDefault": "规则 {n}",
613+
"settings.routingCatchAll": "匹配所有连接 — 下方规则和自动 IP 检查都不会执行。",
614+
"settings.routingUnreachable": "永远不会生效。",
613615
"settings.routingRuleDomains": plural("count", {
614616
one: "# 个域名",
615617
other: "# 个域名",

0 commit comments

Comments
 (0)