diff --git a/luci-app-homeproxy-pro/Makefile b/luci-app-homeproxy-pro/Makefile
index f0121096b..b76eedb5c 100644
--- a/luci-app-homeproxy-pro/Makefile
+++ b/luci-app-homeproxy-pro/Makefile
@@ -23,7 +23,7 @@ LUCI_DEPENDS:= \
PKG_NAME:=luci-app-homeproxy-pro
PKG_VERSION:=28.9.1.14
-PKG_RELEASE:=12
+PKG_RELEASE:=13
# Only files the package actually ships belong here. The previous list named
# four paths that exist nowhere in the tree - certs/ and ruleset/ are created at
diff --git a/luci-app-homeproxy-pro/README.md b/luci-app-homeproxy-pro/README.md
index 3ef0fe24e..7c64b2ee3 100644
--- a/luci-app-homeproxy-pro/README.md
+++ b/luci-app-homeproxy-pro/README.md
@@ -79,9 +79,6 @@
- **试验性**:不承诺 API/配置稳定,重大变更可能在 minor 版本里发生。
- **真机实测单平台**:本仓库只在 x86-64 软路由上做过端到端验证。
- 本包不会编译 sing-box。系统固件必须自带 sing-box 1.14+;否则依赖解析直接失败。
-- **升级后留意 `/etc` 下的 `.apk-new`**:apk 会保护被本地改动过的包文件——新版本写成同名的 `.apk-new` 而不覆盖它。本项目实测到 `/etc/init.d/homeproxy-pro` 如此,结果是 reload 去抖在升级后静默不生效,直到把两者合并。升级后跑一次 `find /etc -name '*.apk-new'` 确认。
-- **关闭 `ipv6_support` 会阻断 IPv6 转发**:此时 nft 会拒绝所有 IPv6 转发(包括 LAN 内部),DNS 侧同时把 AAAA 应答改为 REFUSED。这是“本路由不使用 IPv6”的完整语义——只靠 DNS 拒绝挡不住自带解析器或已缓存的地址;如果仍需要 IPv6 直连,请把该开关打开。
-- **`gfwlist` 模式依赖 dnsmasq 的地址集合**:该模式用 dnsmasq 的 `nftset=` 把解析结果写进 `homeproxy_gfw_list_v4/v6`,nft 再依据该集合决定哪些目的地进入代理(集合外直连)。如果 LAN 客户端用自带 DoH/DoT 绕过了路由器 DNS,集合不会被填充,效果是**全部直连**。所以该模式要求客户端使用路由器下发的 DNS。
## 贡献
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/homeproxy-pro.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/homeproxy-pro.js
index 09fcb018d..8949aedb8 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/homeproxy-pro.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/homeproxy-pro.js
@@ -1128,35 +1128,6 @@ return baseclass.extend({
return true;
},
- /* A regular expression that does not compile reaches sing-box as-is and
- * takes the whole configuration with it, so the reload keeps the previous
- * one and the user only sees "my setting did not take". Go's RE2 and this
- * engine differ in the corners, but every typo is caught here. */
- validateRegex(section_id, value) {
- if (section_id && value) {
- try {
- new RegExp(value);
- } catch (e) {
- return _('Expecting: %s').format(_('valid regular expression'));
- }
- }
-
- return true;
- },
-
- /* sing-box resolves a DNS query type name through miekg/dns's uppercase
- * type table (option/types.go), so "aaaa" is an "unknown DNS query type"
- * and takes the configuration down with it. A numeric code up to 65535 is
- * valid as-is. */
- validateQueryType(section_id, value) {
- if (section_id && value) {
- if (!((/^[0-9]{1,5}$/.test(value) && parseInt(value, 10) <= 65535) || /^[A-Z][A-Z0-9-]*$/.test(value)))
- return _('Expecting: %s').format(_('a numeric code or an uppercase type name (for example AAAA)'));
- }
-
- return true;
- },
-
validateUniqueValue(uciconfig, ucisection, ucioption, section_id, value) {
if (section_id) {
if (!value)
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client.js
index e052eadf5..be5e03ae9 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client.js
@@ -160,12 +160,12 @@ return view.extend({
/* Tab ordering follows the order of these calls: routing,
* routing_node, routing_rule, dns, dns_server, dns_rule, ruleset,
- * control, udp_nat, tun_dns. The DNS tab sits before Access Control
- * because the pages a preset-routing-mode user actually sees are
- * Routing Settings, DNS Settings, Access Control, UDP NAT Settings
- * and TUN DNS, in that order. The shared rule-section bodies live in
- * common.js and are called out-of-order with respect to their file to
- * keep the rendering sequence intact. */
+ * dns_cache, control, udp_nat, tun_dns. The DNS tab sits before
+ * Access Control because the pages a preset-routing-mode user
+ * actually sees are Routing Settings, DNS Settings, Access Control,
+ * UDP NAT Settings and TUN DNS, in that order. The shared
+ * rule-section bodies live in common.js and are called out-of-order
+ * with respect to their file to keep the rendering sequence intact. */
routing.render(ctx);
nodes.renderRoutingNodes(ctx);
routing.renderRoutingRules(ctx);
@@ -173,6 +173,7 @@ return view.extend({
nodes.renderDnsServers(ctx);
dns.renderDnsRules(ctx);
subscription.render(ctx);
+ dns.renderDnsCache(ctx);
access.render(ctx);
udp_nat.renderUdpNat(ctx);
tun_dns.renderTunDns(ctx);
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/access.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/access.js
index 65ec18c43..ea2a2f09d 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/access.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/access.js
@@ -44,9 +44,8 @@ function render(ctx) {
/* LAN IP policy start */
ss.tab('lan_ip_policy', _('LAN IP Policy'));
- so = ss.taboption('lan_ip_policy', form.ListValue, 'lan_proxy_mode', _('Proxy filter mode'),
- _('"No filter" proxies every LAN client, which is the default; the other two values select clients by the lists below.'));
- so.value('disabled', _('No filter (proxy every client)'));
+ so = ss.taboption('lan_ip_policy', form.ListValue, 'lan_proxy_mode', _('Proxy filter mode'));
+ so.value('disabled', _('Disable'));
so.value('listed_only', _('Proxy listed only'));
so.value('except_listed', _('Proxy all except listed'));
so.default = 'disabled';
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/common.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/common.js
index b45a84917..e57ff0666 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/common.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/common.js
@@ -113,7 +113,6 @@ function renderRuleSection(s, kind, self) {
if (is_dns) {
so = ss.taboption('field_other', form.DynamicList, 'query_type', _('Query type'),
_('Match query type.'));
- so.validate = hp.validateQueryType;
so.modalonly = true;
so = addNetwork();
@@ -146,7 +145,7 @@ function renderRuleSection(s, kind, self) {
delete this.vallist;
uci.sections('homeproxy-pro', 'ruleset', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -168,15 +167,12 @@ function renderRuleSection(s, kind, self) {
* (sniff/hijack are emitted by the proxy-mode builder,
* not exposed in the form).
*
- * `route-options` is offered for routing rules only. sing-box 1.14's DNS
- * rule action list does contain a `route-options`, but it takes a
- * different field set (cache / TTL / timeout / client-subnet, and no
- * outbound or override), which this shared form does not model - offering
- * it here would emit routing fields the DNS schema refuses. Earlier code
- * added it to both branches and the depends() guards for dns_disable_cache
- * / rewrite_ttl / client_subnet pinned a stale 'route-options' in UCI that
- * resurfaced as "unknown field" the next time the user flipped back to
- * 'route'. */
+ * `route-options` is a routing_rule-only action: sing-box 1.14's dns_rule
+ * schema has no such action, and emitting it would make the whole dns block
+ * fail with "unknown action". Earlier code added it to both branches and
+ * the depends() guards for dns_disable_cache / rewrite_ttl / client_subnet
+ * pinned a stale 'route-options' in the UCI that resurfaced as "unknown
+ * field" the next time the user flipped back to 'route'. */
so = ss.taboption('field_other', form.ListValue, 'action', _('Action'));
so.value('route', _('Route'));
so.value('reject', _('Reject'));
@@ -201,7 +197,7 @@ function renderRuleSection(s, kind, self) {
this.value('default-dns', _('Default DNS (issued by WAN)'));
this.value('system-dns', _('System DNS'));
uci.sections('homeproxy-pro', 'dns_server', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -338,7 +334,7 @@ function renderRuleSection(s, kind, self) {
this.value('direct-out', _('Direct'));
uci.sections('homeproxy-pro', 'routing_node', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -352,48 +348,39 @@ function renderRuleSection(s, kind, self) {
_('Override the connection destination address.'));
so.datatype = 'ipaddr';
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
so = ss.taboption('field_other', form.Value, 'override_port', _('Override port'),
_('Override the connection destination port.'));
so.datatype = 'port';
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
so = ss.taboption('field_other', form.Flag, 'udp_disable_domain_unmapping', _('Disable UDP domain unmapping'),
_('If enabled, for UDP proxy requests addressed to a domain, the original packet address will be sent in the response instead of the mapped domain.'));
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
so = ss.taboption('field_other', form.Flag, 'udp_connect', _('connect UDP connections'),
_('If enabled, attempts to connect UDP connection to the destination instead of listen.'));
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
so = ss.taboption('field_other', form.Value, 'udp_timeout', _('UDP timeout'),
_('Timeout for UDP connections.
Setting a larger value than the UDP timeout in inbounds will have no effect.'));
so.datatype = 'uinteger';
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
so = ss.taboption('field_other', form.Flag, 'tls_record_fragment', _('TLS record fragment'),
_('Fragment TLS handshake into multiple TLS records.'));
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
- so.depends({'tls_fragment': '1', '!reverse': true});
so = ss.taboption('field_other', form.Flag, 'tls_fragment', _('TLS fragment'),
_('Fragment TLS handshakes. Due to poor performance, try %s first.').format(
_('TLS record fragment')));
so.depends('action', 'route');
- so.depends('action', 'route-options');
- so.depends({'tls_record_fragment': '1', '!reverse': true});
so.modalonly = true;
so = ss.taboption('field_other', form.Value, 'tls_fragment_fallback_delay', _('Fragment fallback delay'),
@@ -407,7 +394,6 @@ function renderRuleSection(s, kind, self) {
_('Inject a forged TLS ClientHello carrying this SNI before the real one to fool SNI-filtering middleboxes. Requires elevated privileges.'));
so.datatype = 'hostname';
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.modalonly = true;
so = ss.taboption('field_other', form.ListValue, 'tls_spoof_method', _('TLS spoof method (1.14)'),
@@ -418,7 +404,6 @@ function renderRuleSection(s, kind, self) {
so.value('wrong-md5', _('wrong-md5'));
so.value('wrong-timestamp', _('wrong-timestamp'));
so.depends('action', 'route');
- so.depends('action', 'route-options');
so.depends('tls_spoof', /[\s\S]/);
so.modalonly = true;
@@ -432,7 +417,7 @@ function renderRuleSection(s, kind, self) {
this.value('default-dns', _('Default DNS (issued by WAN)'));
this.value('system-dns', _('System DNS'));
uci.sections('homeproxy-pro', 'dns_server', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -505,7 +490,6 @@ function renderRuleSection(s, kind, self) {
so = ss.taboption('field_host', form.DynamicList, 'domain_regex', _('Domain regex'),
_('Match domain using regular expression.'));
- so.validate = hp.validateRegex;
so.modalonly = true;
so = ss.taboption('field_host', form.DynamicList, 'source_ip_cidr', _('Source IP CIDR'),
@@ -576,7 +560,6 @@ function renderRuleSection(s, kind, self) {
so = ss.taboption('fields_process', form.DynamicList, 'process_path_regex', _('Process path (regex)'),
_('Match process path using regular expression.'));
- so.validate = hp.validateRegex;
so.modalonly = true;
}
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js
index 7d2ef492c..993a0e820 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js
@@ -13,20 +13,17 @@
'require homeproxy-pro as hp';
'require view.homeproxy-pro.client.common as common';
-/* DNS settings: both routing-mode families in one tab.
+/* The four cache options exist on the 'dns' NamedSection in both the custom
+ * mode tab (renderDnsSettings) and the preset mode tab (renderDnsCache).
+ * Both used to spell them out separately, which registered the same four
+ * option names twice in one map: LuCI keeps the first registration for writes
+ * and lookupOption(), so the second copy's dependencies did nothing while its
+ * description could drift. They are declared here once and rendered from
+ * wherever the tab needs them, in the original order.
*
- * They used to be two tabs with the same title ('dns' and 'dns_cache'), each
- * wrapping the same 'dns' NamedSection. Two form.NamedSection instances over
- * one UCI section produce identical cbids, and LuCI resolves a cbid by taking
- * the first matching element in DOM order - which follows tab registration,
- * i.e. the custom-mode tab. The four cache options were registered in both,
- * so under a preset routing mode the controls the user could actually see were
- * reading and writing an element inside a hidden tab: "Store DNS cache" and
- * "DNS query timeout" did not take.
- *
- * The tab is declared once now and no option name is registered twice, so
- * there is no first-match to get wrong. Each option carries the routing mode
- * it belongs to as a depends(). */
+ * The depends() are the custom-mode copy's: with the cache disabled the
+ * optimistic cache and its persisted file have no effect, so both are hidden
+ * (disable_cache_expire is itself conditional on disable_cache). */
function renderDnsCacheOptions(ss) {
let so;
@@ -53,23 +50,85 @@ function renderDnsCacheOptions(ss) {
* routing.renderRoutingRules() so the NamedSection chain reads
* config -> routing_node -> routing_rule -> dns from left to right. */
function renderDnsSettings(ctx) {
- const { s, stubValidator } = ctx;
+ const { s } = ctx;
let o, ss, so;
s.tab('dns', _('DNS Settings'));
+ o = s.taboption('dns', form.SectionValue, '_dns', form.NamedSection, 'dns', 'homeproxy-pro');
+ o.depends('routing_mode', 'custom');
- /* The preset-mode fields. They belong to the 'config' section, not to
- * 'dns', so they were never part of the duplicate-cbid problem above -
- * they are rendered here because this is the only DNS tab now.
- *
- * The name says overseas because that is the only thing that belongs
+ ss = o.subsection;
+ so = ss.option(form.ListValue, 'default_strategy', _('Default DNS strategy'),
+ _('The DNS strategy for resolving the domain name in the address.'));
+ for (let i in hp.dns_strategy)
+ so.value(i, hp.dns_strategy[i]);
+
+ so = ss.option(form.ListValue, 'default_server', _('Default DNS server'));
+ so.load = function(section_id) {
+ delete this.keylist;
+ delete this.vallist;
+
+ this.value('default-dns', _('Default DNS (issued by WAN)'));
+ this.value('system-dns', _('System DNS'));
+ uci.sections('homeproxy-pro', 'dns_server', (res) => {
+ if (res.enabled === '1')
+ this.value(res['.name'], res.label);
+ });
+
+ return this.super('load', section_id);
+ }
+ so.default = 'default-dns';
+ so.rmempty = false;
+
+ so = ss.option(form.Flag, 'disable_cache', _('Disable DNS cache'));
+
+ so = ss.option(form.Flag, 'disable_cache_expire', _('Disable cache expire'));
+ so.depends('disable_cache', '0');
+
+ so = ss.option(form.Value, 'client_subnet', _('EDNS Client subnet'),
+ _('Append a edns0-subnet OPT extra record with the specified IP prefix to every query by default.
' +
+ 'If value is an IP address instead of prefix, /32 or /128 will be appended automatically.'));
+ so.datatype = 'or(cidr, ipaddr)';
+
+ renderDnsCacheOptions(ss);
+ /* DNS settings end */
+}
+
+/* DNS rules sub-section. Split out from renderDnsSettings() so the
+ * orchestrator can call it after nodes.renderDnsServers() and preserve
+ * the original tab ordering (dns, dns_server, dns_rule). */
+function renderDnsRules(ctx) {
+ const { s, self } = ctx;
+
+ /* DNS rules start */
+ common.renderRuleSection(s, 'dns', self);
+ /* DNS rules end */
+}
+
+/* DNS tab for the preset routing modes. Titled 'DNS Settings' exactly like
+ * the custom-mode tab in renderDnsSettings(): the two are mutually exclusive
+ * (custom vs the presets), so whichever one a user lands on is called the
+ * same thing.
+ *
+ * The three server options below are config.* (not dns.*) options that used
+ * to live on the routing tab. They are DNS settings, and the routing page
+ * only carried them because of the order the old monolithic client.js
+ * happened to be written in. They stay on the 'config' NamedSection, so
+ * only the tab they render under changed. */
+function renderDnsCache(ctx) {
+ const { s, stubValidator } = ctx;
+ let o, ss;
+
+ s.tab('dns_cache', _('DNS Settings'));
+
+ /* The name says overseas because that is the only thing that belongs
* here: every query this field answers goes to a domain that is not on
* the China path, and a domestic resolver answers those with polluted or
* NXDOMAIN results. The Chinese public resolvers that used to be listed
* below a divider were therefore a footgun with a helpful-looking label -
* the one combination that reliably breaks a working proxy. Only the
* overseas public resolvers are offered now. */
- o = s.taboption('dns', form.Value, 'dns_server', _('Overseas DNS server'),
+ o = s.taboption('dns_cache', form.Value, 'dns_server', _('Overseas DNS server'),
_('Resolves every domain that is not on the China DNS path, through the selected proxy node. ' +
'A domestic resolver answers these queries with polluted or NXDOMAIN results, which is what ' +
'makes a foreign site fail to resolve while the proxy itself works - so only overseas services ' +
@@ -105,13 +164,11 @@ function renderDnsSettings(ctx) {
return true;
}
- o = s.taboption('dns', form.Value, 'china_dns_server', _('China DNS server'),
+ o = s.taboption('dns_cache', form.Value, 'china_dns_server', _('China DNS server'),
_('Resolves the domains on the China path, so it has to be a domestic service to get the ' +
'correct local CDN answers. Keep the default; the upstream may block UDP/53, in which case ' +
'a DoH address (https://dns.alidns.com/dns-query, https://doh.pub/dns-query) also works. ' +
- 'Support UDP, TCP, DoH, DoQ, DoT. A DoH/DoT address here also sends the bootstrap ' +
- 'lookup back to the WAN resolver: only a bare IP can resolve the proxy DNS endpoint ' +
- 'without the ISP.'));
+ 'Support UDP, TCP, DoH, DoQ, DoT.'));
o.value('wan', _('WAN DNS (read from interface)'));
o.value('223.5.5.5', _('Aliyun Public DNS (223.5.5.5)'));
o.value('210.2.4.8', _('CNNIC Public DNS (210.2.4.8)'));
@@ -144,67 +201,16 @@ function renderDnsSettings(ctx) {
return true;
}
- o = s.taboption('dns', form.Flag, 'cn_ip_fallback', _('CN-IP DNS fallback (sing-box 1.14)'),
+ o = s.taboption('dns_cache', form.Flag, 'cn_ip_fallback', _('CN-IP DNS fallback (sing-box 1.14)'),
_('When the main DNS returns a mainland China IP, re-resolve via China DNS using evaluate/match_response.'));
o.depends('routing_mode', 'bypass_mainland_china');
o.rmempty = false;
- /* The 'dns' section, registered exactly once: see the file header. The
- * custom-only options below keep their own depends() because the section
- * is visible in both routing-mode families. */
- o = s.taboption('dns', form.SectionValue, '_dns', form.NamedSection, 'dns', 'homeproxy-pro');
+ o = s.taboption('dns_cache', form.SectionValue, '_dns_cache', form.NamedSection, 'dns', 'homeproxy-pro');
+ o.depends({'routing_mode': 'custom', '!reverse': true});
ss = o.subsection;
- so = ss.option(form.ListValue, 'default_strategy', _('Default DNS strategy'),
- _('The DNS strategy for resolving the domain name in the address.'));
- for (let i in hp.dns_strategy)
- so.value(i, hp.dns_strategy[i]);
- so.depends('routing_mode', 'custom');
-
- so = ss.option(form.ListValue, 'default_server', _('Default DNS server'));
- so.load = function(section_id) {
- delete this.keylist;
- delete this.vallist;
-
- this.value('default-dns', _('Default DNS (issued by WAN)'));
- this.value('system-dns', _('System DNS'));
- uci.sections('homeproxy-pro', 'dns_server', (res) => {
- if (res.enabled !== '0')
- this.value(res['.name'], res.label);
- });
-
- return this.super('load', section_id);
- }
- so.default = 'default-dns';
- so.rmempty = false;
- so.depends('routing_mode', 'custom');
-
- so = ss.option(form.Flag, 'disable_cache', _('Disable DNS cache'));
-
- so = ss.option(form.Flag, 'disable_cache_expire', _('Disable cache expire'));
- so.depends('disable_cache', '0');
-
- so = ss.option(form.Value, 'client_subnet', _('EDNS Client subnet'),
- _('Append a edns0-subnet OPT extra record with the specified IP prefix to every query by default.
' +
- 'If value is an IP address instead of prefix, /32 or /128 will be appended automatically.'));
- so.datatype = 'or(cidr, ipaddr)';
- so.depends('routing_mode', 'custom');
-
- /* The four cache options are common to both families, so they are
- * registered once, with no routing-mode dependency of their own. */
renderDnsCacheOptions(ss);
- /* DNS settings end */
}
-/* DNS rules sub-section. Split out from renderDnsSettings() so the
- * orchestrator can call it after nodes.renderDnsServers() and preserve
- * the original tab ordering (dns, dns_server, dns_rule). */
-function renderDnsRules(ctx) {
- const { s, self } = ctx;
-
- /* DNS rules start */
- common.renderRuleSection(s, 'dns', self);
- /* DNS rules end */
-}
-
-return baseclass.extend({ renderDnsSettings, renderDnsRules });
+return baseclass.extend({ renderDnsSettings, renderDnsRules, renderDnsCache });
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js
index f10d9489c..3039a1668 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js
@@ -65,7 +65,7 @@ function renderRoutingNodes(ctx) {
this.value('default-dns', _('Default DNS (issued by WAN)'));
this.value('system-dns', _('System DNS'));
uci.sections('homeproxy-pro', 'dns_server', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -96,7 +96,7 @@ function renderRoutingNodes(ctx) {
this.value('', _('Direct'));
uci.sections('homeproxy-pro', 'routing_node', (res) => {
- if (res['.name'] !== section_id && res.enabled !== '0')
+ if (res['.name'] !== section_id && res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -264,7 +264,7 @@ function renderDnsServers(ctx) {
so.modalonly = true;
so = ss.option(form.DynamicList, 'headers', _('Headers'),
- _('Additional headers to be sent to the DNS server, one Name: Value per line.'));
+ _('Additional headers to be sent to the DNS server.'));
so.depends('type', 'https');
so.depends('type', 'h3');
so.modalonly = true;
@@ -287,7 +287,7 @@ function renderDnsServers(ctx) {
this.value('default-dns', _('Default DNS (issued by WAN)'));
this.value('system-dns', _('System DNS'));
uci.sections('homeproxy-pro', 'dns_server', (res) => {
- if (res['.name'] !== section_id && res.enabled !== '0')
+ if (res['.name'] !== section_id && res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -324,7 +324,7 @@ function renderDnsServers(ctx) {
this.value('direct-out', _('Direct'));
uci.sections('homeproxy-pro', 'routing_node', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js
index 0a0d697ed..842f8cf64 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js
@@ -108,11 +108,7 @@ function render(ctx) {
let ports = [];
for (let i of value.split(',')) {
- /* A bare decimal port only: the backend's ports_to_nftarr()
- * (firewall_utils.uc) keeps nothing else, so a range like
- * "80-90" was accepted here and then dropped without a word -
- * the port the user asked for was simply never proxied. */
- if (!stubValidator.apply('port', i) || i === '0')
+ if (!stubValidator.apply('port', i) && !stubValidator.apply('portrange', i))
return _('Expecting: %s').format(_('valid port value'));
if (ports.includes(i))
return _('Port %s alrealy exists!').format(i);
@@ -214,7 +210,7 @@ function render(ctx) {
this.value('direct-out', _('Direct'));
this.value('block-out', _('Block'));
uci.sections('homeproxy-pro', 'routing_node', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
@@ -232,7 +228,7 @@ function render(ctx) {
this.value('default-dns', _('Default DNS (issued by WAN)'));
this.value('system-dns', _('System DNS'));
uci.sections('homeproxy-pro', 'dns_server', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js
index ecaac7c5b..aed378dcf 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js
@@ -52,16 +52,11 @@ function render(ctx) {
so.default = 'remote';
so.rmempty = false;
- so = ss.option(form.ListValue, 'format', _('Format'),
- _('Leave empty to infer it from a .json or .srs path/url; sing-box requires it for any other extension.'));
- so.value('', _('Automatic (by extension)'));
+ so = ss.option(form.ListValue, 'format', _('Format'));
so.value('binary', _('Binary file'));
so.value('source', _('Source file'));
- /* Not `binary` by default: sing-box only infers the format when the
- * field is absent, and an explicit value wins. Defaulting to binary
- * meant every local rule-set pointing at a .json file was parsed as a
- * compiled .srs unless the user remembered to change the dropdown. */
- so.rmempty = true;
+ so.default = 'binary';
+ so.rmempty = false;
so = ss.option(form.Value, 'path', _('Path'));
so.datatype = 'file';
@@ -104,7 +99,7 @@ function render(ctx) {
this.value('', _('Default'));
this.value('direct-out', _('Direct'));
uci.sections('homeproxy-pro', 'routing_node', (res) => {
- if (res.enabled !== '0')
+ if (res.enabled === '1')
this.value(res['.name'], res.label);
});
diff --git a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/status.js b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/status.js
index 8dd7c8428..e30b3793d 100644
--- a/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/status.js
+++ b/luci-app-homeproxy-pro/htdocs/luci-static/resources/view/homeproxy-pro/status.js
@@ -98,38 +98,6 @@ function getConnStat(o, site) {
]);
}
-/* The gfwlist routing mode routes by an nft set that dnsmasq fills through
- * `nftset=`. A LAN client with its own DoH/DoT never asks this router's DNS,
- * so the set stays empty and the mode silently degrades to direct routing.
- * The count is what tells "the mode is working" from "the mode is doing
- * nothing", so it sits next to the resource versions. */
-function getGfwSetStat(o) {
- return hp.rpcCall('gfw_set_counts', [], { expect: { '': {} } }).then((res) => {
- let field = E('div', { 'style': 'cbi-value-field' });
- let warn = false;
-
- [ [ 'IPv4', res.v4 ], [ 'IPv6', res.v6 ] ].forEach(([ label, count ]) => {
- let value;
-
- if (count == null)
- value = E('em', {}, _('not installed'));
- else if (count === 0) {
- value = E('strong', { 'style': 'color:orange' }, '%d'.format(count));
- warn = warn || (label === 'IPv4');
- } else
- value = E('strong', { 'style': 'color:green' }, '%d'.format(count));
-
- field.appendChild(E('span', {}, [ label + ': ', value ]));
- field.appendChild(document.createTextNode(' '));
- });
-
- if (warn)
- field.appendChild(E('em', {}, _('empty: clients may be bypassing this router\'s DNS')));
-
- return field;
- });
-}
-
function getResVersion(o, type) {
return hp.rpcCall('resources_get_version', [type],
{ params: ['type'], expect: { '': {} } }).then((res) => {
@@ -306,9 +274,6 @@ return view.extend({
o.cfgvalue = L.bind(getResVersion, this, o, 'gfw_list');
o.rawhtml = true;
- o = s.option(form.DummyValue, '_gfw_set_size', _('GFW list addresses'));
- o.cfgvalue = L.bind(getGfwSetStat, this, o);
-
o = s.option(form.Value, 'github_token', _('GitHub token'));
o.password = true;
o.renderWidget = function() {
diff --git a/luci-app-homeproxy-pro/po/templates/homeproxy-pro.pot b/luci-app-homeproxy-pro/po/templates/homeproxy-pro.pot
index e532a1175..1364526cd 100644
--- a/luci-app-homeproxy-pro/po/templates/homeproxy-pro.pot
+++ b/luci-app-homeproxy-pro/po/templates/homeproxy-pro.pot
@@ -1,13 +1,7 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:48
-msgid ""
-"\"No filter\" proxies every LAN client, which is the default; the other two "
-"values select clients by the lists below."
-msgstr ""
-
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:254
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:222
msgid "%s log"
msgstr ""
@@ -19,11 +13,11 @@ msgstr ""
msgid "(empty)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:142
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:110
msgid "(last updated %s)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:143
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:111
msgid "(never updated on this device)"
msgstr ""
@@ -31,7 +25,7 @@ msgstr ""
msgid "/etc/homeproxy-pro/certs/..., /etc/acme/..., /etc/ssl/..."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:234
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:230
msgid ""
"1 matches the latest untagged evaluate result; other values match an "
"evaluate tag (1.14)."
@@ -41,8 +35,8 @@ msgstr ""
msgid "4 or 6. Not limited if empty."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:301
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:451
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:297
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:436
msgid ""
"%s will be temporarily overwritten to %s after 50 "
"triggers in 30s if not enabled."
@@ -91,7 +85,7 @@ msgstr ""
msgid "Access key secret"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:180
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:176
msgid "Action"
msgstr ""
@@ -124,9 +118,7 @@ msgid "Add a server"
msgstr ""
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:267
-msgid ""
-"Additional headers to be sent to the DNS server, one Name: Value"
-"code> per line."
+msgid "Additional headers to be sent to the DNS server."
msgstr ""
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:249
@@ -160,7 +152,7 @@ msgstr ""
msgid "Alibaba Cloud DNS"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:116
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:173
msgid "Aliyun Public DNS (223.5.5.5)"
msgstr ""
@@ -189,11 +181,11 @@ msgstr ""
msgid "Allowed payload size is in the request."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:129
msgid "Already at the latest version."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:126
msgid "Already in updating."
msgstr ""
@@ -210,7 +202,7 @@ msgstr ""
msgid "Alternative TLS port"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:318
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:314
msgid "Answer"
msgstr ""
@@ -222,9 +214,9 @@ msgstr ""
msgid "AnyTLS padding scheme in array."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:227
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:475
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:188
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:223
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:460
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:89
msgid ""
"Append a edns0-subnet OPT extra record with the specified IP "
"prefix to every query by default.
If value is an IP address instead of "
@@ -272,10 +264,6 @@ msgstr ""
msgid "Auto update subscriptions and geodata."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:57
-msgid "Automatic (by extension)"
-msgstr ""
-
#: htdocs/luci-static/resources/homeproxy-pro.js:325
msgid "BBR"
msgstr ""
@@ -288,7 +276,7 @@ msgstr ""
msgid "BBR profile (1.14)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:284
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:252
msgid "BaiDu"
msgstr ""
@@ -296,11 +284,11 @@ msgstr ""
msgid "Base64"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:174
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:170
msgid "Based on google/gvisor."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:58
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:56
msgid "Binary file"
msgstr ""
@@ -323,7 +311,7 @@ msgstr ""
msgid "Blacklist mode"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:215
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:211
msgid "Block"
msgstr ""
@@ -333,7 +321,7 @@ msgstr ""
msgid "Both"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:194
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:190
msgid "Bypass CN traffic"
msgstr ""
@@ -341,7 +329,7 @@ msgstr ""
msgid "Bypass mainland China"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:195
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:191
msgid "Bypass mainland China traffic via firewall rules by default."
msgstr ""
@@ -349,11 +337,11 @@ msgstr ""
msgid "CA provider"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:147
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:204
msgid "CN-IP DNS fallback (sing-box 1.14)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:117
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:174
msgid "CNNIC Public DNS (210.2.4.8)"
msgstr ""
@@ -374,27 +362,27 @@ msgstr ""
msgid "Check"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:171
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:139
msgid "Check update"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:108
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:167
msgid "China DNS server"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:293
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:261
msgid "China IPv4 list version"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:297
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:265
msgid "China IPv6 list version"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:301
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:269
msgid "China list version"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:126
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:125
msgid "Chromium / Cronet"
msgstr ""
@@ -402,15 +390,15 @@ msgstr ""
msgid "Cipher suites"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:78
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:137
msgid "Cisco Public DNS (208.67.222.222)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:263
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:231
msgid "Clean log"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:124
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:123
msgid "Client"
msgstr ""
@@ -422,7 +410,7 @@ msgstr ""
msgid "Client version"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:77
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:136
msgid "CloudFlare Public DNS (1.1.1.1)"
msgstr ""
@@ -432,7 +420,7 @@ msgstr ""
#: htdocs/luci-static/resources/view/homeproxy-pro/client.js:130
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:146
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:244
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:212
msgid "Collecting data..."
msgstr ""
@@ -444,7 +432,7 @@ msgstr ""
msgid "Congestion control algorithm"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:281
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:249
msgid "Connection check"
msgstr ""
@@ -476,7 +464,8 @@ msgstr ""
msgid "DNS Servers"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:59
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:56
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:122
msgid "DNS Settings"
msgstr ""
@@ -484,7 +473,7 @@ msgstr ""
msgid "DNS provider"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:42
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:39
msgid "DNS query timeout"
msgstr ""
@@ -492,7 +481,7 @@ msgstr ""
msgid "DNS rule"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:425
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:410
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:221
msgid "DNS server"
msgstr ""
@@ -505,49 +494,49 @@ msgstr ""
msgid "DTLS"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:211
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:179
msgid "Debug"
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:62
#: htdocs/luci-static/resources/homeproxy-pro.js:334
#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:73
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:431
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:416
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:64
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:104
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:99
msgid "Default"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:201
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:432
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:169
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:197
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:417
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:71
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:65
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:287
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:232
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:228
msgid "Default DNS (issued by WAN)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:164
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:66
msgid "Default DNS server"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:227
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:223
msgid "Default DNS server for resolving domain name in the server address."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:61
msgid "Default DNS strategy"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:207
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:203
msgid "Default outbound"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:226
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:222
msgid "Default outbound DNS"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:208
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:204
msgid "Default outbound for connections not matched by any routing rules."
msgstr ""
@@ -559,39 +548,40 @@ msgstr ""
msgid "Default server name"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:43
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:40
msgid "Default timeout per DNS query in seconds (sing-box default: 10)."
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:130
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:339
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:335
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:97
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:325
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:214
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:105
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:210
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:100
msgid "Direct"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:166
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:165
msgid "Direct Domain List"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:55
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:100
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:54
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:99
msgid "Direct IPv4 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:58
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:103
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:57
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:102
msgid "Direct IPv6 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:61
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:60
msgid "Direct MAC-s"
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:257
#: htdocs/luci-static/resources/homeproxy-pro.js:270
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:48
#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:26
#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:54
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:93
@@ -600,7 +590,7 @@ msgstr ""
msgid "Disable"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:213
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:209
msgid "Disable (the service)"
msgstr ""
@@ -615,12 +605,12 @@ msgid ""
"or the handshake otherwise fails."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:463
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:182
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:448
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:83
msgid "Disable DNS cache"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:464
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:449
msgid "Disable DNS cache in this query."
msgstr ""
@@ -632,32 +622,32 @@ msgstr ""
msgid "Disable TLS ALPN challenge"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:365
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:359
msgid "Disable UDP domain unmapping"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:216
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:212
msgid "Disable cache and save cache in this query."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:184
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:85
msgid "Disable cache expire"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:215
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:211
msgid "Disable dns cache"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:255
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:251
msgid "Disable optimistic DNS caching for this query."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:482
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:467
msgid "Disable optimistic DNS caching in this lookup (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:254
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:481
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:250
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:466
msgid "Disable optimistic cache"
msgstr ""
@@ -665,15 +655,15 @@ msgstr ""
msgid "Disabled"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:502
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:487
msgid "Domain keyword"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:493
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:478
msgid "Domain name"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:506
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:491
msgid "Domain regex"
msgstr ""
@@ -682,15 +672,15 @@ msgid "Domain resolver"
msgstr ""
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:77
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:202
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:198
msgid "Domain strategy"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:457
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:442
msgid "Domain strategy for resolving the domain names."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:498
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:483
msgid "Domain suffix"
msgstr ""
@@ -698,11 +688,11 @@ msgstr ""
msgid "Domains"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:450
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:435
msgid "Don't drop packets"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:300
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:296
msgid "Don't drop requests"
msgstr ""
@@ -714,13 +704,13 @@ msgstr ""
msgid "Download bandwidth in Mbps."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:446
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:452
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:431
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:437
msgid "Drop packets"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:295
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:302
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:291
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:298
msgid "Drop requests"
msgstr ""
@@ -762,9 +752,9 @@ msgstr ""
msgid "ECH key"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:226
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:474
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:187
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:222
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:459
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:88
msgid "EDNS Client subnet"
msgstr ""
@@ -833,11 +823,11 @@ msgstr ""
msgid "Enable connection reuse (the Snell v2 CONNECT command)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:179
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:175
msgid "Enable endpoint-independent NAT"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:199
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:195
msgid ""
"Enable neighbor resolution so rules can match LAN devices by hostname (1.14)."
msgstr ""
@@ -866,15 +856,15 @@ msgstr ""
msgid "Endpoint independent"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:214
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:182
msgid "Error"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:185
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:181
msgid "Evaluate (1.14)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:238
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:234
msgid "Evaluate tag"
msgstr ""
@@ -883,30 +873,28 @@ msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:1093
#: htdocs/luci-static/resources/homeproxy-pro.js:1106
#: htdocs/luci-static/resources/homeproxy-pro.js:1125
-#: htdocs/luci-static/resources/homeproxy-pro.js:1140
+#: htdocs/luci-static/resources/homeproxy-pro.js:1134
+#: htdocs/luci-static/resources/homeproxy-pro.js:1145
#: htdocs/luci-static/resources/homeproxy-pro.js:1154
-#: htdocs/luci-static/resources/homeproxy-pro.js:1163
-#: htdocs/luci-static/resources/homeproxy-pro.js:1174
-#: htdocs/luci-static/resources/homeproxy-pro.js:1183
-#: htdocs/luci-static/resources/homeproxy-pro.js:1185
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:159
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:204
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:86
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:98
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:102
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:126
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:137
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:141
+#: htdocs/luci-static/resources/homeproxy-pro.js:1156
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:203
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:145
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:157
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:183
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:194
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:198
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:141
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:155
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:158
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:116
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:77
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:112
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:72
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:75
#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:80
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:85
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:88
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:128
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:131
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:83
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:123
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:126
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:484
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:741
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:744
@@ -927,16 +915,16 @@ msgstr ""
msgid "External account key ID"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:328
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:324
msgid "Extra records"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:122
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:117
msgid ""
"Extra rule-set tags sharing these options. Requires {tag} in path/url (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:121
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:116
msgid "Extra tags"
msgstr ""
@@ -948,8 +936,8 @@ msgstr ""
msgid "Failed to generate %s, error: %s."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:125
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:178
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:124
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:177
msgid "Failed to read domain list: %s."
msgstr ""
@@ -957,7 +945,7 @@ msgstr ""
msgid "Failed to upload %s, error: %s."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:215
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:183
msgid "Fatal"
msgstr ""
@@ -969,11 +957,11 @@ msgstr ""
msgid "Filter nodes"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:198
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:194
msgid "Find neighbor hosts"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:127
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:126
msgid "Firefox / uquic firefox"
msgstr ""
@@ -994,16 +982,16 @@ msgstr ""
msgid "Format"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:385
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:376
msgid "Fragment TLS handshake into multiple TLS records."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:392
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:381
msgid ""
"Fragment TLS handshakes. Due to poor performance, try %s first."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:399
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:386
msgid "Fragment fallback delay"
msgstr ""
@@ -1011,11 +999,7 @@ msgstr ""
msgid "GET"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:309
-msgid "GFW list addresses"
-msgstr ""
-
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:305
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:273
msgid "GFW list version"
msgstr ""
@@ -1023,15 +1007,15 @@ msgstr ""
msgid "GFWList"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:73
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:72
msgid "Gaming mode IPv4 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:75
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:74
msgid "Gaming mode IPv6 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:78
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:77
msgid "Gaming mode MAC-s"
msgstr ""
@@ -1045,7 +1029,7 @@ msgstr ""
msgid "Generate"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:312
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:277
msgid "GitHub token"
msgstr ""
@@ -1057,15 +1041,15 @@ msgstr ""
msgid "Global padding"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:80
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:79
msgid "Global proxy IPv4 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:83
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:82
msgid "Global proxy IPv6 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:86
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:85
msgid "Global proxy MAC-s"
msgstr ""
@@ -1073,11 +1057,11 @@ msgstr ""
msgid "Global settings"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:287
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:255
msgid "Google"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:79
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:138
msgid "Google Public DNS (8.8.8.8)"
msgstr ""
@@ -1149,7 +1133,7 @@ msgstr ""
#: htdocs/luci-static/resources/view/homeproxy-pro/client.js:70
#: htdocs/luci-static/resources/view/homeproxy-pro/client.js:119
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:334
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:299
#: root/usr/share/luci/menu.d/luci-app-homeproxy-pro.json:3
msgid "HomeProxy"
msgstr ""
@@ -1191,7 +1175,7 @@ msgid ""
"command (in seconds)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:414
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:400
msgid "How the forged segment is rejected by the real server."
msgstr ""
@@ -1203,7 +1187,7 @@ msgstr ""
msgid "Hysteria2"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:519
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:503
msgid "IP CIDR"
msgstr ""
@@ -1227,7 +1211,7 @@ msgstr ""
msgid "IPv6 only"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:139
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:135
msgid "IPv6 support"
msgstr ""
@@ -1244,13 +1228,13 @@ msgstr ""
msgid "Idle timeout"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:372
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:365
msgid ""
"If enabled, attempts to connect UDP connection to the destination instead of "
"listen."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:366
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:360
msgid ""
"If enabled, for UDP proxy requests addressed to a domain, the original "
"packet address will be sent in the response instead of the mapped domain."
@@ -1262,7 +1246,7 @@ msgid ""
"connections."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:203
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:199
msgid ""
"If set, the requested domain name will be resolved to IP before routing."
msgstr ""
@@ -1299,7 +1283,7 @@ msgid ""
"manually."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:187
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:183
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:615
msgid "In seconds."
msgstr ""
@@ -1319,15 +1303,15 @@ msgid ""
"seconds."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:212
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:180
msgid "Info"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:115
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:110
msgid "Initial path"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:407
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:394
msgid ""
"Inject a forged TLS ClientHello carrying this SNI before the real one to "
"fool SNI-filtering middleboxes. Requires elevated privileges."
@@ -1355,15 +1339,15 @@ msgid ""
"seconds)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:160
msgid "Invert"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:162
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:161
msgid "Invert match result."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:244
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:240
msgid ""
"Judge this response-dependent rule in parallel; first match wins (1.14)."
msgstr ""
@@ -1385,12 +1369,6 @@ msgstr ""
msgid "Label"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:56
-msgid ""
-"Leave empty to infer it from a .json or .srs path/"
-"url; sing-box requires it for any other extension."
-msgstr ""
-
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:258
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:305
msgid ""
@@ -1398,7 +1376,7 @@ msgid ""
"compatibility purposes only, use of alterId > 1 is not recommended."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:176
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:172
msgid "Less compatibility and sometimes better performance."
msgstr ""
@@ -1421,15 +1399,15 @@ msgstr ""
msgid "List of supported application level protocols, in order of preference."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:319
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:315
msgid "List of text DNS record to respond as answers."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:329
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:325
msgid "List of text DNS record to respond as extra records."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:324
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:320
msgid "List of text DNS record to respond as name servers."
msgstr ""
@@ -1445,7 +1423,7 @@ msgstr ""
msgid "Listen port"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:242
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:210
msgid "Loading"
msgstr ""
@@ -1457,7 +1435,7 @@ msgstr ""
msgid "Local address"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:116
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:111
msgid ""
"Local file with initial rule-set content; avoids blocking startup on first "
"download (1.14)."
@@ -1483,11 +1461,11 @@ msgstr ""
msgid "Main node"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:157
msgid "Make IP CIDR in rule set used to match the source IP."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:157
msgid "Make IP CIDR in rule sets match the source IP."
msgstr ""
@@ -1495,78 +1473,78 @@ msgstr ""
msgid "Masquerade"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:544
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:528
msgid "Match DNSSEC OK"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:520
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:504
msgid ""
"Match IP CIDR with the evaluated response (needs match_response; old rules "
"are auto-wrapped in 1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:521
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:505
msgid "Match IP CIDR."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:530
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:514
msgid "Match LAN device by MAC address."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:535
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:519
msgid ""
"Match LAN device hostname via neighbor resolution; enable find_neighbor."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:499
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:484
msgid "Match domain suffix."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:503
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:488
msgid "Match domain using keyword."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:507
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:492
msgid "Match domain using regular expression."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:494
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:479
msgid "Match full domain."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:565
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:549
msgid "Match port range. Format as START:/:END/START:END."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:560
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:544
msgid "Match port."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:525
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:509
msgid "Match private IP"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:526
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:510
msgid "Match private IP with the evaluated response (needs match_response)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:516
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:500
msgid "Match private source IP"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:570
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:554
msgid "Match process name."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:578
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:562
msgid "Match process path using regular expression."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:574
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:558
msgid "Match process path."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:545
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:529
msgid "Match queries with the DNSSEC OK bit set (1.14)."
msgstr ""
@@ -1574,44 +1552,44 @@ msgstr ""
msgid "Match query type."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:233
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:229
msgid "Match response"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:142
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:141
msgid ""
"Match rule set. DNS: rules referencing rule-sets that contain query_type are "
"incompatible with legacy address filters (ip_cidr / ip_is_private) — use "
"match_response instead (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:143
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:142
msgid ""
"Match rule set. Since 1.14: a rule-set holding a single default rule is "
"merged into this rule; any other rule-set matches as an OR collection."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:512
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:496
msgid "Match source IP CIDR."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:555
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:539
msgid "Match source port range. Format as START:/:END/START:END."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:550
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:534
msgid "Match source port."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:540
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:524
msgid "Match the EDNS Client Subnet in the query (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:274
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:270
msgid "Match the evaluated response code (requires match_response)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:138
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:137
msgid "Match user name."
msgstr ""
@@ -1631,7 +1609,7 @@ msgstr ""
msgid "Max obfs packet size (1.14)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:40
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:37
msgid "Max time an expired entry may be served. Examples: 3d, 1h."
msgstr ""
@@ -1677,10 +1655,10 @@ msgid "Maximum streams"
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:581
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:293
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:302
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:444
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:452
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:289
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:298
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:429
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:437
msgid "Method"
msgstr ""
@@ -1711,11 +1689,11 @@ msgid "Minimum streams"
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:136
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:157
msgid "Mixed"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:172
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:168
msgid "Mixed system TCP stack and gVisor UDP stack."
msgstr ""
@@ -1744,7 +1722,7 @@ msgstr ""
msgid "NOTE: Save current settings before updating subscriptions."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:323
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:319
msgid "NS"
msgstr ""
@@ -1774,10 +1752,6 @@ msgstr ""
msgid "No additional encryption support: It's basically duplicate encryption."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:49
-msgid "No filter (proxy every client)"
-msgstr ""
-
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:797
msgid "No subscription available"
msgstr ""
@@ -1827,8 +1801,8 @@ msgstr ""
msgid "Obfuscation mode"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:115
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:172
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:114
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:171
msgid ""
"One domain per line. No spaces, no comments, no wildcards; the backend "
"rejects invalid characters and tells you which line."
@@ -1842,15 +1816,15 @@ msgstr ""
msgid "Only proxy mainland China"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:33
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:30
msgid "Optimistic DNS cache"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:39
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:36
msgid "Optimistic cache timeout"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:239
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:235
msgid "Optional tag for this evaluate result."
msgstr ""
@@ -1862,10 +1836,10 @@ msgstr ""
msgid "Other fields"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:333
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:329
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:91
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:319
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:98
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:93
msgid "Outbound"
msgstr ""
@@ -1873,36 +1847,36 @@ msgstr ""
msgid "Outbound node"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:99
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:94
msgid ""
"Outbound used to download this rule-set (via sing-box 1.14 http_clients)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:351
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:347
msgid "Override address"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:487
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:472
msgid "Override dns.timeout for this lookup, in seconds (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:261
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:257
msgid "Override dns.timeout for this query, in seconds."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:358
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:353
msgid "Override port"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:352
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:348
msgid "Override the connection destination address."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:359
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:354
msgid "Override the connection destination port."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:72
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:131
msgid "Overseas DNS server"
msgstr ""
@@ -1922,7 +1896,7 @@ msgstr ""
msgid "Padding scheme"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:216
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:184
msgid "Panic"
msgstr ""
@@ -1934,7 +1908,7 @@ msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:576
#: htdocs/luci-static/resources/homeproxy-pro.js:610
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:259
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:66
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:61
msgid "Path"
msgstr ""
@@ -1942,13 +1916,13 @@ msgstr ""
msgid "Peer pubkic key"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:180
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:176
msgid ""
"Performance may degrade slightly, so it is not recommended to enable on when "
"it is not needed."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:47
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:44
msgid "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC)."
msgstr ""
@@ -1968,13 +1942,13 @@ msgstr ""
msgid "Plugin opts"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:559
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:543
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:254
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:63
msgid "Port"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:118
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:114
msgid "Port %s alrealy exists!"
msgstr ""
@@ -1986,7 +1960,7 @@ msgstr ""
msgid "Port hopping interval in seconds."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:564
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:548
msgid "Port range"
msgstr ""
@@ -1994,7 +1968,7 @@ msgstr ""
msgid "Pre-shared key"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:184
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:180
msgid "Predefined"
msgstr ""
@@ -2023,15 +1997,15 @@ msgstr ""
msgid "Process fields"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:569
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:553
msgid "Process name"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:573
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:557
msgid "Process path"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:577
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:561
msgid "Process path (regex)"
msgstr ""
@@ -2052,25 +2026,25 @@ msgid ""
"default in v2ray and cannot be disabled)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:109
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:108
msgid "Proxy Domain List"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:64
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:93
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:63
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:92
msgid "Proxy IPv4 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:67
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:96
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:66
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:95
msgid "Proxy IPv6 IP-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:70
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:69
msgid "Proxy MAC-s"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:51
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:50
msgid "Proxy all except listed"
msgstr ""
@@ -2078,11 +2052,11 @@ msgstr ""
msgid "Proxy filter mode"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:50
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:49
msgid "Proxy listed only"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:126
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:122
msgid "Proxy mode"
msgstr ""
@@ -2101,12 +2075,12 @@ msgstr ""
msgid "QUIC congestion control algorithm."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:539
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:523
msgid "Query EDNS client subnet"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:260
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:486
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:256
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:471
msgid "Query timeout"
msgstr ""
@@ -2114,7 +2088,7 @@ msgstr ""
msgid "Query type"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:306
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:302
msgid "RCode"
msgstr ""
@@ -2145,7 +2119,7 @@ msgstr ""
msgid "RUNNING"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:243
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:239
msgid "Race"
msgstr ""
@@ -2161,19 +2135,19 @@ msgstr ""
msgid "Recursive resolver detected!"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:127
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:123
msgid "Redirect TCP"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:129
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:125
msgid "Redirect TCP + TProxy UDP"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:131
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:127
msgid "Redirect TCP + Tun UDP"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:268
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:236
msgid "Refresh every %s seconds."
msgstr ""
@@ -2181,7 +2155,7 @@ msgstr ""
msgid "Region ID"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:182
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:178
msgid "Reject"
msgstr ""
@@ -2193,7 +2167,7 @@ msgstr ""
msgid "Remove %s nodes"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:267
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:263
msgid "Remove EDNS client subnet"
msgstr ""
@@ -2201,15 +2175,15 @@ msgstr ""
msgid "Remove all nodes from subscriptions"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:268
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:264
msgid "Remove the edns0-subnet record from the query (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:294
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:290
msgid "Reply with REFUSED"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:445
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:430
msgid "Reply with TCP RST / ICMP port unreachable"
msgstr ""
@@ -2217,15 +2191,15 @@ msgstr ""
msgid "Reserved field bytes"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:188
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:184
msgid "Resolve"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:456
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:441
msgid "Resolve strategy"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:73
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:132
msgid ""
"Resolves every domain that is not on the China DNS path, through the "
"selected proxy node. A domestic resolver answers these queries with polluted "
@@ -2234,37 +2208,35 @@ msgid ""
"Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:109
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:168
msgid ""
"Resolves the domains on the China path, so it has to be a domestic service "
"to get the correct local CDN answers. Keep the default; the upstream may "
"block UDP/53, in which case a DoH address (https://dns.alidns.com/dns-query, "
-"https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT. A "
-"DoH/DoT address here also sends the bootstrap lookup back to the WAN "
-"resolver: only a bare IP can resolve the proxy DNS endpoint without the ISP."
+"https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:290
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:258
msgid "Resources management"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:285
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:281
msgid "Response NS"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:273
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:269
msgid "Response RCode"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:280
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:276
msgid "Response answer"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:289
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:285
msgid "Response extra"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:34
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:31
msgid ""
"Return expired cache immediately and refresh in background (sing-box 1.14)."
msgstr ""
@@ -2277,21 +2249,21 @@ msgstr ""
msgid "Reuse listener address."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:220
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:468
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:216
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:453
msgid "Rewrite TTL"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:221
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:469
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:217
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:454
msgid "Rewrite TTL in DNS responses."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:181
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:177
msgid "Route"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:187
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:183
msgid "Route options"
msgstr ""
@@ -2327,16 +2299,16 @@ msgstr ""
msgid "Rule Set"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:141
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:140
#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:31
msgid "Rule set"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:157
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:156
msgid "Rule set IP CIDR as source IP"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:73
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:68
msgid "Rule set URL"
msgstr ""
@@ -2357,7 +2329,7 @@ msgstr ""
msgid "SUoT version"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:129
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:128
msgid "Safari / Apple Network API"
msgstr ""
@@ -2369,8 +2341,8 @@ msgstr ""
msgid "Same as main node"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:319
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:325
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:284
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:290
msgid "Save"
msgstr ""
@@ -2382,11 +2354,11 @@ msgstr ""
msgid "Save subscriptions settings"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:249
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:245
msgid "Send the query before pending race rules are judged (1.14)."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:195
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:191
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:176
msgid "Server"
msgstr ""
@@ -2438,7 +2410,7 @@ msgstr ""
msgid "Snell version"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:125
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:124
msgid "Sniffed client type (QUIC client type or SSH client name)."
msgstr ""
@@ -2448,7 +2420,7 @@ msgid ""
"box.sagernet.org/configuration/route/sniff/\">Sniff for details."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:147
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:143
msgid "Sniffer: advanced mode (100ms, universal list)"
msgstr ""
@@ -2472,31 +2444,31 @@ msgstr ""
msgid "Socks5"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:511
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:495
msgid "Source IP CIDR"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:529
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:513
msgid "Source MAC address"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:59
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:57
msgid "Source file"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:534
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:518
msgid "Source hostname"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:549
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:533
msgid "Source port"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:554
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:538
msgid "Source port range"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:426
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:411
msgid ""
"Specifies DNS server tag to use instead of selecting through DNS routing."
msgstr ""
@@ -2530,7 +2502,7 @@ msgid ""
"commas."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:248
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:244
msgid "Speculative"
msgstr ""
@@ -2538,7 +2510,7 @@ msgstr ""
msgid "Standard (default)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:46
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:43
msgid "Store DNS cache"
msgstr ""
@@ -2578,7 +2550,7 @@ msgstr ""
msgid "Successfully imported %s nodes of total %s."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:152
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:120
msgid "Successfully updated."
msgstr ""
@@ -2589,16 +2561,16 @@ msgid ""
"online configuration delivery standard."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:164
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:160
msgid "System"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:202
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:433
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:170
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:198
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:418
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:72
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:66
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:288
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:233
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:229
msgid "System DNS"
msgstr ""
@@ -2613,11 +2585,11 @@ msgstr ""
msgid "TCP fast open"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:154
msgid "TCP/IP stack"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:159
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:155
msgid "TCP/IP stack."
msgstr ""
@@ -2636,7 +2608,7 @@ msgstr ""
msgid "TLS SNI"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:391
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:380
msgid "TLS fragment"
msgstr ""
@@ -2648,16 +2620,16 @@ msgstr ""
msgid "TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:384
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:393
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:375
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:382
msgid "TLS record fragment"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:406
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:393
msgid "TLS spoof SNI (1.14)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:413
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:399
msgid "TLS spoof method (1.14)"
msgstr ""
@@ -2683,11 +2655,11 @@ msgstr ""
msgid "Tag of an outbound for connecting to the dns server."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:196
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:192
msgid "Tag of the target dns server."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:334
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:330
msgid "Tag of the target outbound."
msgstr ""
@@ -2696,7 +2668,7 @@ msgid ""
"Tell the client to use the BBR flow control algorithm instead of Hysteria CC."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:118
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:175
msgid "Tencent Public DNS (119.29.29.29)"
msgstr ""
@@ -2720,7 +2692,7 @@ msgstr ""
msgid "Test tolerance"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:281
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:277
msgid "Text DNS records to match in the evaluated answer."
msgstr ""
@@ -2728,7 +2700,7 @@ msgstr ""
msgid "The ACME CA provider to use."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:159
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:62
msgid "The DNS strategy for resolving the domain name in the address."
msgstr ""
@@ -2790,7 +2762,7 @@ msgid ""
"account."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:400
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:387
msgid ""
"The fallback value in milliseconds used when TLS segmentation cannot "
"automatically determine the wait time."
@@ -2852,7 +2824,7 @@ msgstr ""
msgid "The request %s failed: %s."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:307
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:303
msgid "The response code."
msgstr ""
@@ -2902,11 +2874,11 @@ msgid ""
"QUIC stream based UDP relay mode that TUIC does not provide."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:119
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:176
msgid "ThreatBook Public DNS (117.50.10.10)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:378
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:370
msgid ""
"Timeout for UDP connections.
Setting a larger value than the UDP timeout "
"in inbounds will have no effect."
@@ -2918,13 +2890,13 @@ msgid ""
"code>."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:134
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:130
msgid ""
"To enable Tun support, you need to install ip-full and "
"kmod-tun"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:210
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:178
msgid "Trace"
msgstr ""
@@ -2940,7 +2912,7 @@ msgstr ""
msgid "Tuic"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:132
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:128
msgid "Tun TCP/UDP"
msgstr ""
@@ -2965,7 +2937,7 @@ msgstr ""
msgid "UDP NAT Settings"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:186
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:182
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:614
msgid "UDP NAT expiration time"
msgstr ""
@@ -2998,7 +2970,7 @@ msgstr ""
msgid "UDP relay mode"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:377
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:369
msgid "UDP timeout"
msgstr ""
@@ -3018,7 +2990,7 @@ msgstr ""
msgid "UUID"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:164
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:132
msgid "Unknown error."
msgstr ""
@@ -3038,15 +3010,15 @@ msgstr ""
msgid "Update %s subscriptions"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:155
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:123
msgid "Update failed."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:137
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:132
msgid "Update interval"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:138
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:133
msgid "Update interval of rule set."
msgstr ""
@@ -3103,7 +3075,7 @@ msgstr ""
msgid "Use ACME TLS certificate issuer."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:148
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:144
msgid ""
"Use the tutorial-recommended sniffer profile (100ms timeout, http/tls/stun/"
"quic/dns). Default keeps the 300ms / unconstrained-list behaviour."
@@ -3119,7 +3091,7 @@ msgstr ""
msgid "Used to verify the hostname on the returned certificates."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:137
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:136
msgid "User"
msgstr ""
@@ -3144,15 +3116,15 @@ msgstr ""
msgid "VMess"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:115
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:172
msgid "WAN DNS (read from interface)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:91
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:90
msgid "WAN IP Policy"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:213
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:181
msgid "Warn"
msgstr ""
@@ -3160,7 +3132,7 @@ msgstr ""
msgid "WebSocket"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:148
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:205
msgid ""
"When the main DNS returns a mainland China IP, re-resolve via China DNS "
"using evaluate/match_response."
@@ -3203,16 +3175,12 @@ msgstr ""
msgid "ZeroSSL"
msgstr ""
-#: htdocs/luci-static/resources/homeproxy-pro.js:1154
-msgid "a numeric code or an uppercase type name (for example AAAA)"
-msgstr ""
-
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:438
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:527
msgid "certificate"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:371
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:364
msgid "connect UDP connections"
msgstr ""
@@ -3221,10 +3189,6 @@ msgstr ""
msgid "default"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:127
-msgid "empty: clients may be bypassing this router's DNS"
-msgstr ""
-
#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:91
msgid "failed"
msgstr ""
@@ -3241,7 +3205,7 @@ msgstr ""
msgid "gRPC service name"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:162
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:158
msgid "gVisor"
msgstr ""
@@ -3251,12 +3215,12 @@ msgid "http"
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:220
-#: htdocs/luci-static/resources/homeproxy-pro.js:1163
-#: htdocs/luci-static/resources/homeproxy-pro.js:1183
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:86
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:126
+#: htdocs/luci-static/resources/homeproxy-pro.js:1134
+#: htdocs/luci-static/resources/homeproxy-pro.js:1154
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:145
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:183
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:141
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:77
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:72
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:484
msgid "non-empty value"
msgstr ""
@@ -3269,10 +3233,6 @@ msgstr ""
msgid "none"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:115
-msgid "not installed"
-msgstr ""
-
#: htdocs/luci-static/resources/homeproxy-pro.js:632
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:776
msgid "packet addr (v2ray-core v5+)"
@@ -3286,11 +3246,11 @@ msgstr ""
msgid "private key"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:128
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:127
msgid "quic-go / uquic chrome"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:337
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:302
msgid "sing-box client"
msgstr ""
@@ -3312,7 +3272,7 @@ msgid ""
"(Password above) must be 12-255 bytes for v6."
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:340
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:305
msgid "sing-box server"
msgstr ""
@@ -3334,7 +3294,7 @@ msgstr ""
msgid "unique UCI identifier"
msgstr ""
-#: htdocs/luci-static/resources/homeproxy-pro.js:1174
+#: htdocs/luci-static/resources/homeproxy-pro.js:1145
msgid "unique value"
msgstr ""
@@ -3371,17 +3331,17 @@ msgstr ""
msgid "v6"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:98
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:102
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:137
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:141
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:157
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:194
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:198
msgid "valid DNS server address"
msgstr ""
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:155
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:158
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:85
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:88
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:80
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:83
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:741
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:744
msgid "valid URL"
@@ -3391,8 +3351,8 @@ msgstr ""
msgid "valid base64 key with %d characters"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:159
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:204
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:203
msgid "valid hostname"
msgstr ""
@@ -3400,43 +3360,39 @@ msgstr ""
msgid "valid port range (port1:port2)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:116
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:112
msgid "valid port value"
msgstr ""
-#: htdocs/luci-static/resources/homeproxy-pro.js:1140
-msgid "valid regular expression"
-msgstr ""
-
-#: htdocs/luci-static/resources/homeproxy-pro.js:1185
+#: htdocs/luci-static/resources/homeproxy-pro.js:1156
msgid "valid uuid"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:417
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:403
msgid "wrong-ack"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:416
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:402
msgid "wrong-checksum"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:418
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:404
msgid "wrong-md5"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:415
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:401
msgid "wrong-sequence (default)"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:419
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:405
msgid "wrong-timestamp"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:80
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:128
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:75
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:123
msgid "{tag} in URL when extra tags are used"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:131
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:126
msgid "{tag} in initial path when extra tags are used"
msgstr ""
diff --git a/luci-app-homeproxy-pro/po/zh_Hans/homeproxy-pro.po b/luci-app-homeproxy-pro/po/zh_Hans/homeproxy-pro.po
index 21c10d9f8..67a52dc6e 100644
--- a/luci-app-homeproxy-pro/po/zh_Hans/homeproxy-pro.po
+++ b/luci-app-homeproxy-pro/po/zh_Hans/homeproxy-pro.po
@@ -8,13 +8,7 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:48
-msgid ""
-"\"No filter\" proxies every LAN client, which is the default; the other two "
-"values select clients by the lists below."
-msgstr "“不过滤”会代理全部 LAN 客户端(默认值);另外两个取值按下方列表筛选客户端。"
-
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:254
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:222
msgid "%s log"
msgstr "%s 日志"
@@ -26,11 +20,11 @@ msgstr "移除了 %s 个节点"
msgid "(empty)"
msgstr "(空)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:142
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:110
msgid "(last updated %s)"
msgstr "(最后更新 %s)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:143
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:111
msgid "(never updated on this device)"
msgstr "(本设备从未更新)"
@@ -38,7 +32,7 @@ msgstr "(本设备从未更新)"
msgid "/etc/homeproxy-pro/certs/..., /etc/acme/..., /etc/ssl/..."
msgstr "/etc/homeproxy-pro/certs/...,/etc/acme/...,/etc/ssl/..."
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:234
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:230
msgid ""
"1 matches the latest untagged evaluate result; other values match an "
"evaluate tag (1.14)."
@@ -50,8 +44,8 @@ msgstr ""
msgid "4 or 6. Not limited if empty."
msgstr "4 或 6。留空不限制。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:301
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:451
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:297
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:436
msgid ""
"%s will be temporarily overwritten to %s after 50 "
"triggers in 30s if not enabled."
@@ -101,7 +95,7 @@ msgstr "访问密钥 ID"
msgid "Access key secret"
msgstr "访问密钥 Secret"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:180
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:176
msgid "Action"
msgstr "操作"
@@ -134,10 +128,8 @@ msgid "Add a server"
msgstr "新增服务器"
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:267
-msgid ""
-"Additional headers to be sent to the DNS server, one Name: Value"
-"code> per line."
-msgstr "发送到 DNS 服务器的附加标头,每行一个 Name: Value。"
+msgid "Additional headers to be sent to the DNS server."
+msgstr "发送到 DNS 服务器的附加标头。"
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:249
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:58
@@ -170,7 +162,7 @@ msgstr "激进"
msgid "Alibaba Cloud DNS"
msgstr "阿里云 DNS"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:116
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:173
msgid "Aliyun Public DNS (223.5.5.5)"
msgstr "阿里云公共 DNS(223.5.5.5)"
@@ -199,11 +191,11 @@ msgstr "从订阅获取节点时,默认允许不安全连接。"
msgid "Allowed payload size is in the request."
msgstr "请求中允许的载荷大小。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:129
msgid "Already at the latest version."
msgstr "已是最新版本。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:126
msgid "Already in updating."
msgstr "已在更新中。"
@@ -220,7 +212,7 @@ msgstr "替代 HTTP 端口"
msgid "Alternative TLS port"
msgstr "替代 HTTPS 端口"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:318
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:314
msgid "Answer"
msgstr "回答"
@@ -232,9 +224,9 @@ msgstr "AnyTLS"
msgid "AnyTLS padding scheme in array."
msgstr "AnyTLS 填充方案。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:227
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:475
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:188
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:223
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:460
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:89
msgid ""
"Append a edns0-subnet OPT extra record with the specified IP "
"prefix to every query by default.
If value is an IP address instead of "
@@ -285,10 +277,6 @@ msgstr "自动更新"
msgid "Auto update subscriptions and geodata."
msgstr "自动更新订阅和地理数据。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:57
-msgid "Automatic (by extension)"
-msgstr "自动(按扩展名)"
-
#: htdocs/luci-static/resources/homeproxy-pro.js:325
msgid "BBR"
msgstr "BBR"
@@ -301,7 +289,7 @@ msgstr "BBR 拥塞控制算法档位。仅 Hysteria2。"
msgid "BBR profile (1.14)"
msgstr "BBR 档位(1.14)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:284
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:252
msgid "BaiDu"
msgstr "百度"
@@ -309,11 +297,11 @@ msgstr "百度"
msgid "Base64"
msgstr "Base64"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:174
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:170
msgid "Based on google/gvisor."
msgstr "基于 google/gvisor。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:58
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:56
msgid "Binary file"
msgstr "二进制文件"
@@ -336,7 +324,7 @@ msgstr "BitTorrent"
msgid "Blacklist mode"
msgstr "黑名单模式"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:215
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:211
msgid "Block"
msgstr "封锁"
@@ -346,7 +334,7 @@ msgstr "封锁"
msgid "Both"
msgstr "全部"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:194
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:190
msgid "Bypass CN traffic"
msgstr "绕过中国流量"
@@ -354,7 +342,7 @@ msgstr "绕过中国流量"
msgid "Bypass mainland China"
msgstr "大陆白名单"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:195
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:191
msgid "Bypass mainland China traffic via firewall rules by default."
msgstr "默认使用防火墙规则绕过中国大陆流量。"
@@ -362,11 +350,11 @@ msgstr "默认使用防火墙规则绕过中国大陆流量。"
msgid "CA provider"
msgstr "CA 颁发机构"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:147
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:204
msgid "CN-IP DNS fallback (sing-box 1.14)"
msgstr "大陆 IP DNS 兜底(sing-box 1.14)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:117
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:174
msgid "CNNIC Public DNS (210.2.4.8)"
msgstr "CNNIC 公共 DNS(210.2.4.8)"
@@ -387,27 +375,27 @@ msgstr "证书路径"
msgid "Check"
msgstr "检查"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:171
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:139
msgid "Check update"
msgstr "检查更新"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:108
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:167
msgid "China DNS server"
msgstr "国内 DNS 服务器"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:293
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:261
msgid "China IPv4 list version"
msgstr "国内 IPv4 库版本"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:297
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:265
msgid "China IPv6 list version"
msgstr "国内 IPv6 库版本"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:301
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:269
msgid "China list version"
msgstr "国内域名列表版本"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:126
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:125
msgid "Chromium / Cronet"
msgstr "Chromium / Cronet"
@@ -415,15 +403,15 @@ msgstr "Chromium / Cronet"
msgid "Cipher suites"
msgstr "密码套件"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:78
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:137
msgid "Cisco Public DNS (208.67.222.222)"
msgstr "思科公共 DNS(208.67.222.222)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:263
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:231
msgid "Clean log"
msgstr "清空日志"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:124
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:123
msgid "Client"
msgstr "客户端"
@@ -435,7 +423,7 @@ msgstr "客户端设置"
msgid "Client version"
msgstr "客户端版本"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:77
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:136
msgid "CloudFlare Public DNS (1.1.1.1)"
msgstr "CloudFlare 公共 DNS(1.1.1.1)"
@@ -445,7 +433,7 @@ msgstr "Cloudflare"
#: htdocs/luci-static/resources/view/homeproxy-pro/client.js:130
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:146
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:244
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:212
msgid "Collecting data..."
msgstr "正在收集数据中..."
@@ -457,7 +445,7 @@ msgstr "仅常用端口(绕过 P2P 流量)"
msgid "Congestion control algorithm"
msgstr "拥塞控制算法"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:281
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:249
msgid "Connection check"
msgstr "连接检查"
@@ -489,7 +477,8 @@ msgstr "DNS 规则"
msgid "DNS Servers"
msgstr "DNS 服务器"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:59
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:56
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:122
msgid "DNS Settings"
msgstr "DNS 设置"
@@ -497,7 +486,7 @@ msgstr "DNS 设置"
msgid "DNS provider"
msgstr "DNS 提供商"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:42
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:39
msgid "DNS query timeout"
msgstr "DNS 查询超时"
@@ -505,7 +494,7 @@ msgstr "DNS 查询超时"
msgid "DNS rule"
msgstr "DNS 规则"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:425
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:410
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:221
msgid "DNS server"
msgstr "DNS 服务器"
@@ -518,49 +507,49 @@ msgstr "DNS01 验证"
msgid "DTLS"
msgstr "DTLS"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:211
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:179
msgid "Debug"
msgstr "调试"
#: htdocs/luci-static/resources/homeproxy-pro.js:62
#: htdocs/luci-static/resources/homeproxy-pro.js:334
#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:73
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:431
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:416
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:64
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:104
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:99
msgid "Default"
msgstr "默认"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:201
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:432
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:169
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:197
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:417
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:71
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:65
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:287
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:232
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:228
msgid "Default DNS (issued by WAN)"
msgstr "默认 DNS(由 WAN 下发)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:164
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:66
msgid "Default DNS server"
msgstr "默认 DNS 服务器"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:227
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:223
msgid "Default DNS server for resolving domain name in the server address."
msgstr "用于解析服务器地址中的域名的默认 DNS 服务器。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:61
msgid "Default DNS strategy"
msgstr "默认 DNS 解析策略"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:207
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:203
msgid "Default outbound"
msgstr "默认出站"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:226
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:222
msgid "Default outbound DNS"
msgstr "默认出站 DNS"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:208
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:204
msgid "Default outbound for connections not matched by any routing rules."
msgstr "用于未被任何路由规则匹配的连接的默认出站。"
@@ -572,39 +561,40 @@ msgstr "默认包封装格式"
msgid "Default server name"
msgstr "默认服务器名称"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:43
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:40
msgid "Default timeout per DNS query in seconds (sing-box default: 10)."
msgstr "每次 DNS 查询的默认超时时间(秒,sing-box 默认为 10)。"
#: htdocs/luci-static/resources/homeproxy-pro.js:130
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:339
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:335
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:97
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:325
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:214
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:105
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:210
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:100
msgid "Direct"
msgstr "直连"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:166
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:165
msgid "Direct Domain List"
msgstr "直连域名列表"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:55
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:100
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:54
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:99
msgid "Direct IPv4 IP-s"
msgstr "直连 IPv4 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:58
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:103
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:57
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:102
msgid "Direct IPv6 IP-s"
msgstr "直连 IPv6 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:61
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:60
msgid "Direct MAC-s"
msgstr "直连 MAC 地址"
#: htdocs/luci-static/resources/homeproxy-pro.js:257
#: htdocs/luci-static/resources/homeproxy-pro.js:270
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:48
#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:26
#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:54
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:93
@@ -613,7 +603,7 @@ msgstr "直连 MAC 地址"
msgid "Disable"
msgstr "禁用"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:213
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:209
msgid "Disable (the service)"
msgstr "禁用(服务)"
@@ -630,12 +620,12 @@ msgstr ""
"禁用自 sing-box 1.14 起默认开启的 Chrome QUIC 握手伪装。仅在服务器证书为 "
"Ed25519 或握手失败时才需要开启。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:463
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:182
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:448
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:83
msgid "Disable DNS cache"
msgstr "禁用 DNS 缓存"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:464
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:449
msgid "Disable DNS cache in this query."
msgstr "在本次查询中禁用 DNS 缓存。"
@@ -647,32 +637,32 @@ msgstr "禁用 HTTP 验证"
msgid "Disable TLS ALPN challenge"
msgstr "禁用 TLS ALPN 认证"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:365
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:359
msgid "Disable UDP domain unmapping"
msgstr "禁用 UDP 域名映射"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:216
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:212
msgid "Disable cache and save cache in this query."
msgstr "在本次查询中禁用缓存。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:184
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:85
msgid "Disable cache expire"
msgstr "缓存永不过期"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:215
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:211
msgid "Disable dns cache"
msgstr "禁用 DNS 缓存"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:255
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:251
msgid "Disable optimistic DNS caching for this query."
msgstr "对此查询禁用乐观 DNS 缓存。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:482
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:467
msgid "Disable optimistic DNS caching in this lookup (1.14)."
msgstr "关闭本次查询解析的乐观 DNS 缓存(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:254
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:481
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:250
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:466
msgid "Disable optimistic cache"
msgstr "禁用乐观缓存"
@@ -680,15 +670,15 @@ msgstr "禁用乐观缓存"
msgid "Disabled"
msgstr "禁用"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:502
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:487
msgid "Domain keyword"
msgstr "域名关键词"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:493
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:478
msgid "Domain name"
msgstr "域名"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:506
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:491
msgid "Domain regex"
msgstr "域名正则表达式"
@@ -697,15 +687,15 @@ msgid "Domain resolver"
msgstr "域名解析器"
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:77
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:202
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:198
msgid "Domain strategy"
msgstr "域名解析策略"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:457
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:442
msgid "Domain strategy for resolving the domain names."
msgstr "目标域名的解析策略。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:498
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:483
msgid "Domain suffix"
msgstr "域名后缀"
@@ -713,11 +703,11 @@ msgstr "域名后缀"
msgid "Domains"
msgstr "域名"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:450
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:435
msgid "Don't drop packets"
msgstr "不丢弃数据包"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:300
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:296
msgid "Don't drop requests"
msgstr "不丢弃请求"
@@ -729,13 +719,13 @@ msgstr "下载带宽"
msgid "Download bandwidth in Mbps."
msgstr "下载带宽(单位:Mbps)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:446
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:452
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:431
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:437
msgid "Drop packets"
msgstr "丢弃数据包"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:295
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:302
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:291
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:298
msgid "Drop requests"
msgstr "丢弃请求"
@@ -788,9 +778,9 @@ msgstr "ECH 配置路径"
msgid "ECH key"
msgstr "ECH 密钥"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:226
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:474
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:187
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:222
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:459
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:88
msgid "EDNS Client subnet"
msgstr "EDNS 客户端子网"
@@ -861,11 +851,11 @@ msgstr "启用 UDP 分片。"
msgid "Enable connection reuse (the Snell v2 CONNECT command)."
msgstr "启用连接复用(Snell v2 CONNECT 指令)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:179
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:175
msgid "Enable endpoint-independent NAT"
msgstr "启用端点独立 NAT"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:199
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:195
msgid ""
"Enable neighbor resolution so rules can match LAN devices by hostname (1.14)."
msgstr "启用邻居解析,使规则可按主机名匹配局域网设备(1.14)。"
@@ -894,15 +884,15 @@ msgstr "加密方式"
msgid "Endpoint independent"
msgstr "端点无关"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:214
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:182
msgid "Error"
msgstr "错误"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:185
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:181
msgid "Evaluate (1.14)"
msgstr "Evaluate(1.14)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:238
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:234
msgid "Evaluate tag"
msgstr "Evaluate 标签"
@@ -911,30 +901,28 @@ msgstr "Evaluate 标签"
#: htdocs/luci-static/resources/homeproxy-pro.js:1093
#: htdocs/luci-static/resources/homeproxy-pro.js:1106
#: htdocs/luci-static/resources/homeproxy-pro.js:1125
-#: htdocs/luci-static/resources/homeproxy-pro.js:1140
+#: htdocs/luci-static/resources/homeproxy-pro.js:1134
+#: htdocs/luci-static/resources/homeproxy-pro.js:1145
#: htdocs/luci-static/resources/homeproxy-pro.js:1154
-#: htdocs/luci-static/resources/homeproxy-pro.js:1163
-#: htdocs/luci-static/resources/homeproxy-pro.js:1174
-#: htdocs/luci-static/resources/homeproxy-pro.js:1183
-#: htdocs/luci-static/resources/homeproxy-pro.js:1185
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:159
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:204
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:86
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:98
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:102
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:126
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:137
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:141
+#: htdocs/luci-static/resources/homeproxy-pro.js:1156
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:203
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:145
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:157
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:183
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:194
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:198
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:141
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:155
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:158
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:116
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:77
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:112
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:72
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:75
#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:80
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:85
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:88
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:128
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:131
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:83
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:123
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:126
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:484
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:741
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:744
@@ -955,17 +943,17 @@ msgstr "外部账户 MAC 密钥"
msgid "External account key ID"
msgstr "外部账户密钥标识符"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:328
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:324
msgid "Extra records"
msgstr "附加记录"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:122
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:117
msgid ""
"Extra rule-set tags sharing these options. Requires {tag} in path/url (1.14)."
msgstr ""
"共享这些选项的额外规则集标签。使用多标签时 path/url 需包含 {tag}(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:121
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:116
msgid "Extra tags"
msgstr "额外标签"
@@ -977,8 +965,8 @@ msgstr "关闭导入对话框失败:%s"
msgid "Failed to generate %s, error: %s."
msgstr "生成 %s 失败,错误:%s。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:125
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:178
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:124
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:177
msgid "Failed to read domain list: %s."
msgstr "读取域名列表失败:%s。"
@@ -986,7 +974,7 @@ msgstr "读取域名列表失败:%s。"
msgid "Failed to upload %s, error: %s."
msgstr "上传 %s 失败,错误:%s。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:215
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:183
msgid "Fatal"
msgstr "致命"
@@ -998,11 +986,11 @@ msgstr "过滤关键词"
msgid "Filter nodes"
msgstr "过滤节点"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:198
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:194
msgid "Find neighbor hosts"
msgstr "发现邻居主机"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:127
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:126
msgid "Firefox / uquic firefox"
msgstr "Firefox / uquic firefox"
@@ -1023,16 +1011,16 @@ msgstr "用于解析服务器地址中的域名。"
msgid "Format"
msgstr "格式"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:385
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:376
msgid "Fragment TLS handshake into multiple TLS records."
msgstr "将 TLS 握手分片为多个 TLS 记录"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:392
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:381
msgid ""
"Fragment TLS handshakes. Due to poor performance, try %s first."
msgstr "分片 TLS 握手。由于性能较差,请先尝试 %s。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:399
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:386
msgid "Fragment fallback delay"
msgstr "分片回退延迟"
@@ -1040,11 +1028,7 @@ msgstr "分片回退延迟"
msgid "GET"
msgstr "GET"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:309
-msgid "GFW list addresses"
-msgstr "GFW 列表地址数"
-
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:305
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:273
msgid "GFW list version"
msgstr "GFW 域名列表版本"
@@ -1052,15 +1036,15 @@ msgstr "GFW 域名列表版本"
msgid "GFWList"
msgstr "GFWList"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:73
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:72
msgid "Gaming mode IPv4 IP-s"
msgstr "游戏模式 IPv4 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:75
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:74
msgid "Gaming mode IPv6 IP-s"
msgstr "游戏模式 IPv6 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:78
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:77
msgid "Gaming mode MAC-s"
msgstr "游戏模式 MAC 地址"
@@ -1074,7 +1058,7 @@ msgstr "Gecko(1.14)"
msgid "Generate"
msgstr "生成"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:312
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:277
msgid "GitHub token"
msgstr "GitHub 令牌"
@@ -1086,15 +1070,15 @@ msgstr "全局"
msgid "Global padding"
msgstr "全局填充"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:80
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:79
msgid "Global proxy IPv4 IP-s"
msgstr "全局代理 IPv4 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:83
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:82
msgid "Global proxy IPv6 IP-s"
msgstr "全局代理 IPv6 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:86
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:85
msgid "Global proxy MAC-s"
msgstr "全局代理 MAC 地址"
@@ -1102,11 +1086,11 @@ msgstr "全局代理 MAC 地址"
msgid "Global settings"
msgstr "全局设置"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:287
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:255
msgid "Google"
msgstr "谷歌"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:79
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:138
msgid "Google Public DNS (8.8.8.8)"
msgstr "谷歌公共 DNS(8.8.8.8)"
@@ -1178,7 +1162,7 @@ msgstr "劫持"
#: htdocs/luci-static/resources/view/homeproxy-pro/client.js:70
#: htdocs/luci-static/resources/view/homeproxy-pro/client.js:119
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:334
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:299
#: root/usr/share/luci/menu.d/luci-app-homeproxy-pro.json:3
msgid "HomeProxy"
msgstr "HomeProxy"
@@ -1220,7 +1204,7 @@ msgid ""
"command (in seconds)."
msgstr "服务器等待客户端发送认证命令的时间(单位:秒)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:414
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:400
msgid "How the forged segment is rejected by the real server."
msgstr "伪造段被真实服务器拒绝的方式。"
@@ -1232,7 +1216,7 @@ msgstr "Hysteria"
msgid "Hysteria2"
msgstr "Hysteria2"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:519
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:503
msgid "IP CIDR"
msgstr "IP CIDR"
@@ -1256,7 +1240,7 @@ msgstr "IPv6"
msgid "IPv6 only"
msgstr "仅 IPv6"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:139
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:135
msgid "IPv6 support"
msgstr "IPv6 支持"
@@ -1273,13 +1257,13 @@ msgstr "空闲会话检查超时"
msgid "Idle timeout"
msgstr "空闲超时"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:372
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:365
msgid ""
"If enabled, attempts to connect UDP connection to the destination instead of "
"listen."
msgstr "如果启用,尝试主动连接到目标的 UDP 而不是监听。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:366
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:360
msgid ""
"If enabled, for UDP proxy requests addressed to a domain, the original "
"packet address will be sent in the response instead of the mapped domain."
@@ -1293,7 +1277,7 @@ msgid ""
"connections."
msgstr "如果启用,客户端传输即使没有活动连接也会发送 keepalive ping。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:203
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:199
msgid ""
"If set, the requested domain name will be resolved to IP before routing."
msgstr "如果设置,请求的域名将在路由前被解析为 IP 地址。"
@@ -1333,7 +1317,7 @@ msgid ""
"manually."
msgstr "节点已导入,但对话框未能自动关闭。请手动关闭。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:187
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:183
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:615
msgid "In seconds."
msgstr "单位:秒。"
@@ -1353,15 +1337,15 @@ msgid ""
"seconds."
msgstr "在检查中,关闭空闲时间超过此值的会话(单位:秒)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:212
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:180
msgid "Info"
msgstr "信息"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:115
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:110
msgid "Initial path"
msgstr "初始路径"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:407
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:394
msgid ""
"Inject a forged TLS ClientHello carrying this SNI before the real one to "
"fool SNI-filtering middleboxes. Requires elevated privileges."
@@ -1391,15 +1375,15 @@ msgid ""
"seconds)."
msgstr "发送心跳包以保持连接存活的时间间隔(单位:秒)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:160
msgid "Invert"
msgstr "反转"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:162
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:161
msgid "Invert match result."
msgstr "反转匹配结果"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:244
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:240
msgid ""
"Judge this response-dependent rule in parallel; first match wins (1.14)."
msgstr "并行判定此响应依赖规则,首个命中即生效(1.14)。"
@@ -1421,14 +1405,6 @@ msgstr "LAN IP 策略"
msgid "Label"
msgstr "标签"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:56
-msgid ""
-"Leave empty to infer it from a .json or .srs path/"
-"url; sing-box requires it for any other extension."
-msgstr ""
-"留空则按 .json 或 .srs 路径/URL 推断格式;其他扩展"
-"名必须显式指定。"
-
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:258
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:305
msgid ""
@@ -1438,7 +1414,7 @@ msgstr ""
"仅为兼容目的提供旧协议(VMess MD5 认证)支持,不建议使用大于 1 的 alterId。提"
"供旧协议支持(VMess MD5 身份验证)仅出于兼容性目的,不建议使用 alterId > 1。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:176
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:172
msgid "Less compatibility and sometimes better performance."
msgstr "有时性能更好。"
@@ -1461,15 +1437,15 @@ msgstr "要测试的节点列表。"
msgid "List of supported application level protocols, in order of preference."
msgstr "支持的应用层协议协商列表,按顺序排列。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:319
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:315
msgid "List of text DNS record to respond as answers."
msgstr "要响应的 DNS 记录列表。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:329
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:325
msgid "List of text DNS record to respond as extra records."
msgstr "要响应的附加 DNS 记录列表。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:324
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:320
msgid "List of text DNS record to respond as name servers."
msgstr "要响应的域名服务器(NS) DNS 记录列表。"
@@ -1485,7 +1461,7 @@ msgstr "监听接口"
msgid "Listen port"
msgstr "监听端口"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:242
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:210
msgid "Loading"
msgstr "加载中"
@@ -1497,7 +1473,7 @@ msgstr "本地"
msgid "Local address"
msgstr "本地地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:116
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:111
msgid ""
"Local file with initial rule-set content; avoids blocking startup on first "
"download (1.14)."
@@ -1523,11 +1499,11 @@ msgstr "主 UDP 节点"
msgid "Main node"
msgstr "主节点"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:157
msgid "Make IP CIDR in rule set used to match the source IP."
msgstr "使规则集中的 IP CIDR 用于匹配源 IP。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:157
msgid "Make IP CIDR in rule sets match the source IP."
msgstr "使规则集中的 IP CIDR 匹配源 IP。"
@@ -1535,79 +1511,79 @@ msgstr "使规则集中的 IP CIDR 匹配源 IP。"
msgid "Masquerade"
msgstr "伪装"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:544
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:528
msgid "Match DNSSEC OK"
msgstr "匹配 DNSSEC OK"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:520
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:504
msgid ""
"Match IP CIDR with the evaluated response (needs match_response; old rules "
"are auto-wrapped in 1.14)."
msgstr ""
"以已评估的响应匹配 IP CIDR(需要 match_response;旧规则在 1.14 自动包装)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:521
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:505
msgid "Match IP CIDR."
msgstr "匹配 IP CIDR。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:530
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:514
msgid "Match LAN device by MAC address."
msgstr "按 MAC 地址匹配局域网设备。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:535
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:519
msgid ""
"Match LAN device hostname via neighbor resolution; enable find_neighbor."
msgstr "通过邻居解析按主机名匹配局域网设备;需启用 find_neighbor。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:499
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:484
msgid "Match domain suffix."
msgstr "匹配域名后缀。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:503
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:488
msgid "Match domain using keyword."
msgstr "使用关键词匹配域名。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:507
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:492
msgid "Match domain using regular expression."
msgstr "使用正则表达式匹配域名。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:494
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:479
msgid "Match full domain."
msgstr "匹配完整域名。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:565
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:549
msgid "Match port range. Format as START:/:END/START:END."
msgstr "匹配端口范围。格式为 START:/:END/START:END。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:560
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:544
msgid "Match port."
msgstr "匹配端口。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:525
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:509
msgid "Match private IP"
msgstr "匹配私有 IP"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:526
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:510
msgid "Match private IP with the evaluated response (needs match_response)."
msgstr "以已评估的响应匹配私网 IP(需要 match_response)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:516
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:500
msgid "Match private source IP"
msgstr "匹配私有源 IP"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:570
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:554
msgid "Match process name."
msgstr "匹配进程名。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:578
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:562
msgid "Match process path using regular expression."
msgstr "使用正则表达式匹配进程路径。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:574
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:558
msgid "Match process path."
msgstr "匹配进程路径。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:545
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:529
msgid "Match queries with the DNSSEC OK bit set (1.14)."
msgstr "匹配设置了 DNSSEC OK 位的查询(1.14)。"
@@ -1615,11 +1591,11 @@ msgstr "匹配设置了 DNSSEC OK 位的查询(1.14)。"
msgid "Match query type."
msgstr "匹配请求类型。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:233
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:229
msgid "Match response"
msgstr "匹配响应"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:142
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:141
msgid ""
"Match rule set. DNS: rules referencing rule-sets that contain query_type are "
"incompatible with legacy address filters (ip_cidr / ip_is_private) — use "
@@ -1628,7 +1604,7 @@ msgstr ""
"匹配规则集。DNS:引用含 query_type 规则集的规则与 legacy 地址过滤(ip_cidr / "
"ip_is_private)不兼容——请改用 match_response(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:143
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:142
msgid ""
"Match rule set. Since 1.14: a rule-set holding a single default rule is "
"merged into this rule; any other rule-set matches as an OR collection."
@@ -1636,27 +1612,27 @@ msgstr ""
"匹配规则集。自 1.14:仅含单条 default 规则的规则集字段会合并进本条规则;其余"
"规则集整体按 OR 集合匹配。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:512
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:496
msgid "Match source IP CIDR."
msgstr "匹配源 IP CIDR。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:555
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:539
msgid "Match source port range. Format as START:/:END/START:END."
msgstr "匹配源端口范围。格式为 START:/:END/START:END。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:550
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:534
msgid "Match source port."
msgstr "匹配源端口。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:540
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:524
msgid "Match the EDNS Client Subnet in the query (1.14)."
msgstr "匹配查询中的 EDNS Client Subnet(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:274
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:270
msgid "Match the evaluated response code (requires match_response)."
msgstr "匹配已评估响应的响应码(需 match_response)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:138
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:137
msgid "Match user name."
msgstr "匹配用户名。"
@@ -1676,7 +1652,7 @@ msgstr "最大跳变间隔(1.14)"
msgid "Max obfs packet size (1.14)"
msgstr "最大混淆包长(1.14)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:40
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:37
msgid "Max time an expired entry may be served. Examples: 3d, 1h."
msgstr "过期缓存项可被乐观返回的最长时间。示例:3d、1h。"
@@ -1724,10 +1700,10 @@ msgid "Maximum streams"
msgstr "最大流数量"
#: htdocs/luci-static/resources/homeproxy-pro.js:581
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:293
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:302
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:444
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:452
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:289
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:298
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:429
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:437
msgid "Method"
msgstr "方式"
@@ -1758,11 +1734,11 @@ msgid "Minimum streams"
msgstr "最小流数量"
#: htdocs/luci-static/resources/homeproxy-pro.js:136
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:157
msgid "Mixed"
msgstr "混合"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:172
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:168
msgid "Mixed system TCP stack and gVisor UDP stack."
msgstr "混合系统 TCP 栈和 gVisor UDP 栈。"
@@ -1791,7 +1767,7 @@ msgstr "未运行"
msgid "NOTE: Save current settings before updating subscriptions."
msgstr "注意:更新订阅前先保存当前配置。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:323
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:319
msgid "NS"
msgstr "NS"
@@ -1821,10 +1797,6 @@ msgstr "无 TCP 传输层, 纯 HTTP 已合并到 HTTP 传输层。"
msgid "No additional encryption support: It's basically duplicate encryption."
msgstr "无额外加密支持:它基本上是重复加密。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:49
-msgid "No filter (proxy every client)"
-msgstr "不过滤(代理全部客户端)"
-
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:797
msgid "No subscription available"
msgstr "无可用订阅"
@@ -1874,8 +1846,8 @@ msgstr "混淆主机"
msgid "Obfuscation mode"
msgstr "混淆模式"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:115
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:172
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:114
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:171
msgid ""
"One domain per line. No spaces, no comments, no wildcards; the backend "
"rejects invalid characters and tells you which line."
@@ -1889,15 +1861,15 @@ msgstr "只处理来自指定接口的流量。留空表示全部。"
msgid "Only proxy mainland China"
msgstr "仅代理中国大陆"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:33
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:30
msgid "Optimistic DNS cache"
msgstr "乐观 DNS 缓存"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:39
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:36
msgid "Optimistic cache timeout"
msgstr "乐观缓存超时"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:239
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:235
msgid "Optional tag for this evaluate result."
msgstr "此 evaluate 结果的可选标签。"
@@ -1909,10 +1881,10 @@ msgstr "可选;仅在连接多用户 Snell 服务器时需要。"
msgid "Other fields"
msgstr "其他字段"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:333
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:329
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:91
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:319
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:98
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:93
msgid "Outbound"
msgstr "出站"
@@ -1920,36 +1892,36 @@ msgstr "出站"
msgid "Outbound node"
msgstr "出站节点"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:99
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:94
msgid ""
"Outbound used to download this rule-set (via sing-box 1.14 http_clients)."
msgstr "下载此规则集所使用的出站(经 sing-box 1.14 http_clients 生效)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:351
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:347
msgid "Override address"
msgstr "覆盖地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:487
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:472
msgid "Override dns.timeout for this lookup, in seconds (1.14)."
msgstr "覆盖本次查询解析的 dns.timeout(秒)(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:261
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:257
msgid "Override dns.timeout for this query, in seconds."
msgstr "覆盖本次查询的 dns.timeout,单位秒。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:358
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:353
msgid "Override port"
msgstr "覆盖端口"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:352
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:348
msgid "Override the connection destination address."
msgstr "覆盖目标连接地址。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:359
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:354
msgid "Override the connection destination port."
msgstr "覆盖目标连接端口。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:72
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:131
msgid "Overseas DNS server"
msgstr "国外 DNS 服务器"
@@ -1969,7 +1941,7 @@ msgstr "数据包编码"
msgid "Padding scheme"
msgstr "填充方案"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:216
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:184
msgid "Panic"
msgstr "崩溃"
@@ -1981,7 +1953,7 @@ msgstr "密码"
#: htdocs/luci-static/resources/homeproxy-pro.js:576
#: htdocs/luci-static/resources/homeproxy-pro.js:610
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:259
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:66
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:61
msgid "Path"
msgstr "路径"
@@ -1989,13 +1961,13 @@ msgstr "路径"
msgid "Peer pubkic key"
msgstr "对端公钥"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:180
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:176
msgid ""
"Performance may degrade slightly, so it is not recommended to enable on when "
"it is not needed."
msgstr "性能可能会略有下降,建议仅在需要时开启。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:47
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:44
msgid "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC)."
msgstr "重启后持久化 DNS 缓存(sing-box 1.14,替代 Store RDRC)。"
@@ -2015,13 +1987,13 @@ msgstr "插件"
msgid "Plugin opts"
msgstr "插件参数"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:559
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:543
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:254
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:63
msgid "Port"
msgstr "端口"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:118
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:114
msgid "Port %s alrealy exists!"
msgstr "端口 %s 已存在!"
@@ -2033,7 +2005,7 @@ msgstr "端口字段"
msgid "Port hopping interval in seconds."
msgstr "端口跳跃间隔(单位:秒)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:564
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:548
msgid "Port range"
msgstr "端口范围"
@@ -2041,7 +2013,7 @@ msgstr "端口范围"
msgid "Pre-shared key"
msgstr "预共享密钥"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:184
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:180
msgid "Predefined"
msgstr "预定义"
@@ -2070,15 +2042,15 @@ msgstr "新证书的私钥类型(1.14)。留空使用默认值。"
msgid "Process fields"
msgstr "进程字段"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:569
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:553
msgid "Process name"
msgstr "进程名"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:573
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:557
msgid "Process path"
msgstr "进程路径"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:577
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:561
msgid "Process path (regex)"
msgstr "进程路径(正则表达式)"
@@ -2099,25 +2071,25 @@ msgid ""
"default in v2ray and cannot be disabled)."
msgstr "协议参数。 如启用会随机浪费流量(在 v2ray 中默认启用并且无法禁用)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:109
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:108
msgid "Proxy Domain List"
msgstr "代理域名列表"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:64
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:93
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:63
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:92
msgid "Proxy IPv4 IP-s"
msgstr "代理 IPv4 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:67
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:96
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:66
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:95
msgid "Proxy IPv6 IP-s"
msgstr "代理 IPv6 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:70
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:69
msgid "Proxy MAC-s"
msgstr "代理 MAC 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:51
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:50
msgid "Proxy all except listed"
msgstr "仅允许列表外"
@@ -2125,11 +2097,11 @@ msgstr "仅允许列表外"
msgid "Proxy filter mode"
msgstr "代理过滤模式"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:50
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:49
msgid "Proxy listed only"
msgstr "仅允许列表内"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:126
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:122
msgid "Proxy mode"
msgstr "代理模式"
@@ -2148,12 +2120,12 @@ msgstr "QUIC"
msgid "QUIC congestion control algorithm."
msgstr "QUIC 拥塞控制算法。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:539
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:523
msgid "Query EDNS client subnet"
msgstr "查询 EDNS Client Subnet"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:260
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:486
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:256
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:471
msgid "Query timeout"
msgstr "查询超时"
@@ -2161,7 +2133,7 @@ msgstr "查询超时"
msgid "Query type"
msgstr "请求类型"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:306
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:302
msgid "RCode"
msgstr "RCode"
@@ -2192,7 +2164,7 @@ msgstr "REALITY 标识符"
msgid "RUNNING"
msgstr "运行中"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:243
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:239
msgid "Race"
msgstr "并行竞争"
@@ -2208,19 +2180,19 @@ msgstr "检测到递归出站!"
msgid "Recursive resolver detected!"
msgstr "检测到递归解析器!"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:127
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:123
msgid "Redirect TCP"
msgstr "Redirect TCP"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:129
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:125
msgid "Redirect TCP + TProxy UDP"
msgstr "Redirect TCP + TProxy UDP"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:131
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:127
msgid "Redirect TCP + Tun UDP"
msgstr "Redirect TCP + Tun UDP"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:268
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:236
msgid "Refresh every %s seconds."
msgstr "每 %s 秒刷新。"
@@ -2228,7 +2200,7 @@ msgstr "每 %s 秒刷新。"
msgid "Region ID"
msgstr "区域 ID"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:182
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:178
msgid "Reject"
msgstr "拒绝"
@@ -2240,7 +2212,7 @@ msgstr "远程"
msgid "Remove %s nodes"
msgstr "移除 %s 个节点"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:267
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:263
msgid "Remove EDNS client subnet"
msgstr "移除 EDNS Client Subnet"
@@ -2248,15 +2220,15 @@ msgstr "移除 EDNS Client Subnet"
msgid "Remove all nodes from subscriptions"
msgstr "移除所有订阅节点"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:268
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:264
msgid "Remove the edns0-subnet record from the query (1.14)."
msgstr "从查询中移除 edns0-subnet 记录(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:294
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:290
msgid "Reply with REFUSED"
msgstr "回复 REFUSED"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:445
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:430
msgid "Reply with TCP RST / ICMP port unreachable"
msgstr "回复 TCP RST / ICMP 端口不可达"
@@ -2264,15 +2236,15 @@ msgstr "回复 TCP RST / ICMP 端口不可达"
msgid "Reserved field bytes"
msgstr "保留字段字节"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:188
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:184
msgid "Resolve"
msgstr "解析"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:456
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:441
msgid "Resolve strategy"
msgstr "解析策略"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:73
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:132
msgid ""
"Resolves every domain that is not on the China DNS path, through the "
"selected proxy node. A domestic resolver answers these queries with polluted "
@@ -2284,37 +2256,38 @@ msgstr ""
"回被污染或 NXDOMAIN 的结果,这正是代理本身正常、境外网站却解析失败的原因,因"
"此这里只提供境外服务。支持 UDP、TCP、DoH、DoQ、DoT,未指定协议时使用 TCP。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:109
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:168
msgid ""
"Resolves the domains on the China path, so it has to be a domestic service "
"to get the correct local CDN answers. Keep the default; the upstream may "
"block UDP/53, in which case a DoH address (https://dns.alidns.com/dns-query, "
-"https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT. A "
-"DoH/DoT address here also sends the bootstrap lookup back to the WAN "
-"resolver: only a bare IP can resolve the proxy DNS endpoint without the ISP."
-msgstr "解析走 China 路径的域名,因此必须是国内服务才能拿到正确的本地 CDN 结果。保持默认值;上游可能屏蔽 UDP/53,此时 DoH 地址(https://dns.alidns.com/dns-query、https://doh.pub/dns-query)也可用。支持 UDP、TCP、DoH、DoQ、DoT。填 DoH/DoT 地址还会让引导解析回退到 WAN 解析器:只有裸 IP 才能在不依赖 ISP 的情况下解析出代理 DNS 端点。"
+"https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT."
+msgstr ""
+"解析中国路径上的域名,必须是国内服务才能获得正确的本地 CDN 结果。建议保持默认"
+"值;若上游封禁 UDP/53,也可使用 DoH 地址(https://dns.alidns.com/dns-query、"
+"https://doh.pub/dns-query)。支持 UDP、TCP、DoH、DoQ、DoT。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:290
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:258
msgid "Resources management"
msgstr "资源管理"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:285
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:281
msgid "Response NS"
msgstr "响应 NS 记录"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:273
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:269
msgid "Response RCode"
msgstr "响应 RCode"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:280
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:276
msgid "Response answer"
msgstr "响应 Answer 记录"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:289
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:285
msgid "Response extra"
msgstr "响应 Extra 记录"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:34
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:31
msgid ""
"Return expired cache immediately and refresh in background (sing-box 1.14)."
msgstr "立即返回已过期缓存并在后台刷新(sing-box 1.14)。"
@@ -2327,21 +2300,21 @@ msgstr "复用地址"
msgid "Reuse listener address."
msgstr "复用监听地址。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:220
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:468
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:216
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:453
msgid "Rewrite TTL"
msgstr "重写 TTL"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:221
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:469
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:217
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:454
msgid "Rewrite TTL in DNS responses."
msgstr "在 DNS 响应中重写 TTL。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:181
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:177
msgid "Route"
msgstr "路由"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:187
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:183
msgid "Route options"
msgstr "路由选项"
@@ -2377,16 +2350,16 @@ msgstr "路由规则"
msgid "Rule Set"
msgstr "规则集"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:141
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:140
#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:31
msgid "Rule set"
msgstr "规则集"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:157
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:156
msgid "Rule set IP CIDR as source IP"
msgstr "规则集 IP CIDR 作为源 IP"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:73
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:68
msgid "Rule set URL"
msgstr "规则集 URL"
@@ -2407,7 +2380,7 @@ msgstr "STUN"
msgid "SUoT version"
msgstr "SUoT 版本"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:129
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:128
msgid "Safari / Apple Network API"
msgstr "Safari / Apple Network API"
@@ -2419,8 +2392,8 @@ msgstr "Salamander"
msgid "Same as main node"
msgstr "保持与主节点一致"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:319
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:325
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:284
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:290
msgid "Save"
msgstr "保存"
@@ -2432,11 +2405,11 @@ msgstr "保存当前设置"
msgid "Save subscriptions settings"
msgstr "保存订阅设置"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:249
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:245
msgid "Send the query before pending race rules are judged (1.14)."
msgstr "在待定 race 规则判定前即发送查询(1.14)。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:195
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:191
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:176
msgid "Server"
msgstr "服务器"
@@ -2491,7 +2464,7 @@ msgstr "Snell(1.14)"
msgid "Snell version"
msgstr "Snell 版本"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:125
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:124
msgid "Sniffed client type (QUIC client type or SSH client name)."
msgstr "嗅探到的客户端类型(QUIC 客户端类型或 SSH 客户端名称)。"
@@ -2503,7 +2476,7 @@ msgstr ""
"嗅探到的协议,详情请参阅 嗅探。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:147
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:143
msgid "Sniffer: advanced mode (100ms, universal list)"
msgstr "嗅探:进阶模式(100ms,全协议列表)"
@@ -2527,31 +2500,31 @@ msgstr "Socks4A"
msgid "Socks5"
msgstr "Socks5"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:511
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:495
msgid "Source IP CIDR"
msgstr "源 IP CIDR"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:529
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:513
msgid "Source MAC address"
msgstr "来源 MAC 地址"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:59
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:57
msgid "Source file"
msgstr "源文件"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:534
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:518
msgid "Source hostname"
msgstr "来源主机名"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:549
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:533
msgid "Source port"
msgstr "源端口"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:554
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:538
msgid "Source port range"
msgstr "源端口范围"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:426
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:411
msgid ""
"Specifies DNS server tag to use instead of selecting through DNS routing."
msgstr "指定使用的 DNS 服务器,而不是通过 DNS 规则选择。"
@@ -2594,7 +2567,7 @@ msgid ""
"commas."
msgstr "指定需要被代理的目标端口。多个端口必须用逗号隔开。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:248
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:244
msgid "Speculative"
msgstr "抢先查询"
@@ -2602,7 +2575,7 @@ msgstr "抢先查询"
msgid "Standard (default)"
msgstr "标准(默认)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:46
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:43
msgid "Store DNS cache"
msgstr "存储 DNS 缓存"
@@ -2642,7 +2615,7 @@ msgstr "订阅"
msgid "Successfully imported %s nodes of total %s."
msgstr "成功导入 %s 个节点,共 %s 个。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:152
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:120
msgid "Successfully updated."
msgstr "更新成功。"
@@ -2655,16 +2628,16 @@ msgstr ""
"支持 Hysteria、Shadowsocks、Trojan、v2rayN(VMess)和 XTLS(VLESS)在线配置交"
"付标准。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:164
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:160
msgid "System"
msgstr "系统"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:202
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:433
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:170
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:198
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:418
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:72
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:66
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:288
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:233
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:229
msgid "System DNS"
msgstr "系统 DNS"
@@ -2679,11 +2652,11 @@ msgstr "TCP"
msgid "TCP fast open"
msgstr "TCP 快速打开"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:154
msgid "TCP/IP stack"
msgstr "TCP/IP 协议栈"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:159
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:155
msgid "TCP/IP stack."
msgstr "TCP/IP 协议栈。"
@@ -2702,7 +2675,7 @@ msgstr "TLS ALPN"
msgid "TLS SNI"
msgstr "TLS SNI"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:391
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:380
msgid "TLS fragment"
msgstr "TLS 分片"
@@ -2714,16 +2687,16 @@ msgstr "TLS 握手超时(秒)。默认 15 秒。"
msgid "TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used."
msgstr "不强制执行 TLS。如未配置 TLS,将使用纯 HTTP 1.1。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:384
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:393
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:375
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:382
msgid "TLS record fragment"
msgstr "TLS 记录分片"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:406
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:393
msgid "TLS spoof SNI (1.14)"
msgstr "TLS spoof SNI(1.14)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:413
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:399
msgid "TLS spoof method (1.14)"
msgstr "TLS spoof 方式(1.14)"
@@ -2751,11 +2724,11 @@ msgstr ""
msgid "Tag of an outbound for connecting to the dns server."
msgstr "用于连接到 DNS 服务器的出站标签。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:196
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:192
msgid "Tag of the target dns server."
msgstr "目标 DNS 服务器标签。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:334
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:330
msgid "Tag of the target outbound."
msgstr "目标出站标签。"
@@ -2764,7 +2737,7 @@ msgid ""
"Tell the client to use the BBR flow control algorithm instead of Hysteria CC."
msgstr "让客户端使用 BBR 流控算法。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:118
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:175
msgid "Tencent Public DNS (119.29.29.29)"
msgstr "腾讯公共 DNS(119.29.29.29)"
@@ -2788,7 +2761,7 @@ msgstr "测试间隔时间必须小于或等于空闲超时时间。"
msgid "Test tolerance"
msgstr "测试容差"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:281
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:277
msgid "Text DNS records to match in the evaluated answer."
msgstr "用于匹配已评估 Answer 的文本 DNS 记录。"
@@ -2796,7 +2769,7 @@ msgstr "用于匹配已评估 Answer 的文本 DNS 记录。"
msgid "The ACME CA provider to use."
msgstr "使用的 ACME CA 颁发机构。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:159
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:62
msgid "The DNS strategy for resolving the domain name in the address."
msgstr "解析域名的默认策略。"
@@ -2874,7 +2847,7 @@ msgid ""
"account."
msgstr "创建或选择现有 ACME 服务器帐户时使用的电子邮件地址。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:400
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:387
msgid ""
"The fallback value in milliseconds used when TLS segmentation cannot "
"automatically determine the wait time."
@@ -2936,7 +2909,7 @@ msgstr "v6 下,上方的预共享密钥(密码)长度须为 12-255 字节
msgid "The request %s failed: %s."
msgstr "请求 %s 失败:%s。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:307
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:303
msgid "The response code."
msgstr "响应代码。"
@@ -2993,11 +2966,11 @@ msgstr ""
"这是 UDP over TCP 协议的 TUIC 版本,旨在提供 TUIC 本身不具备的基于 QUIC 流的 "
"UDP 中继模式。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:119
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:176
msgid "ThreatBook Public DNS (117.50.10.10)"
msgstr "微步在线公共 DNS(117.50.10.10)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:378
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:370
msgid ""
"Timeout for UDP connections.
Setting a larger value than the UDP timeout "
"in inbounds will have no effect."
@@ -3010,14 +2983,14 @@ msgid ""
msgstr ""
"要与 Xray-core 兼容,请将其设置为 Sec-WebSocket-Protocol。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:134
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:130
msgid ""
"To enable Tun support, you need to install ip-full and "
"kmod-tun"
msgstr ""
"要启用 Tun 支持,你需要安装 ip-full 和 kmod-tun。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:210
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:178
msgid "Trace"
msgstr "跟踪"
@@ -3033,7 +3006,7 @@ msgstr "Trojan"
msgid "Tuic"
msgstr "Tuic"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:132
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:128
msgid "Tun TCP/UDP"
msgstr "Tun TCP/UDP"
@@ -3058,7 +3031,7 @@ msgstr "UDP 分片"
msgid "UDP NAT Settings"
msgstr "UDP NAT 设置"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:186
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:182
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:614
msgid "UDP NAT expiration time"
msgstr "UDP NAT 过期时间"
@@ -3091,7 +3064,7 @@ msgstr "UDP 包中继模式。"
msgid "UDP relay mode"
msgstr "UDP 中继模式"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:377
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:369
msgid "UDP timeout"
msgstr "UDP 超时"
@@ -3111,7 +3084,7 @@ msgstr "URLTest 节点"
msgid "UUID"
msgstr "UUID"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:164
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:132
msgid "Unknown error."
msgstr "未知错误。"
@@ -3131,15 +3104,15 @@ msgstr "不支持的指纹!"
msgid "Update %s subscriptions"
msgstr "更新 %s 个订阅"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:155
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:123
msgid "Update failed."
msgstr "更新失败。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:137
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:132
msgid "Update interval"
msgstr "更新间隔"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:138
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:133
msgid "Update interval of rule set."
msgstr "规则集更新间隔。"
@@ -3196,7 +3169,7 @@ msgstr "上传..."
msgid "Use ACME TLS certificate issuer."
msgstr "使用 ACME TLS 证书颁发机构。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:148
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:144
msgid ""
"Use the tutorial-recommended sniffer profile (100ms timeout, http/tls/stun/"
"quic/dns). Default keeps the 300ms / unconstrained-list behaviour."
@@ -3214,7 +3187,7 @@ msgstr "用于验证返回证书上的主机名。如允许不安全连接,此
msgid "Used to verify the hostname on the returned certificates."
msgstr "用于验证返回证书上的主机名。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:137
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:136
msgid "User"
msgstr "用户"
@@ -3239,15 +3212,15 @@ msgstr "VLESS"
msgid "VMess"
msgstr "VMess"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:115
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:172
msgid "WAN DNS (read from interface)"
msgstr "WAN DNS(从接口获取)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:91
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:90
msgid "WAN IP Policy"
msgstr "WAN IP 策略"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:213
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:181
msgid "Warn"
msgstr "警告"
@@ -3255,7 +3228,7 @@ msgstr "警告"
msgid "WebSocket"
msgstr "WebSocket"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:148
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:205
msgid ""
"When the main DNS returns a mainland China IP, re-resolve via China DNS "
"using evaluate/match_response."
@@ -3299,16 +3272,12 @@ msgstr "您的 %s 已成功上传。大小:%sB。"
msgid "ZeroSSL"
msgstr "ZeroSSL"
-#: htdocs/luci-static/resources/homeproxy-pro.js:1154
-msgid "a numeric code or an uppercase type name (for example AAAA)"
-msgstr "数字代码或大写类型名(例如 AAAA)"
-
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:438
#: htdocs/luci-static/resources/view/homeproxy-pro/server.js:527
msgid "certificate"
msgstr "证书"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:371
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:364
msgid "connect UDP connections"
msgstr "主动连接 UDP"
@@ -3317,10 +3286,6 @@ msgstr "主动连接 UDP"
msgid "default"
msgstr "默认"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:127
-msgid "empty: clients may be bypassing this router's DNS"
-msgstr "为空:客户端可能绕过了本路由器的 DNS"
-
#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:91
msgid "failed"
msgstr "失败"
@@ -3337,7 +3302,7 @@ msgstr "gRPC 允许无活动连接"
msgid "gRPC service name"
msgstr "gRPC 服务名称"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:162
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:158
msgid "gVisor"
msgstr "gVisor"
@@ -3347,12 +3312,12 @@ msgid "http"
msgstr ""
#: htdocs/luci-static/resources/homeproxy-pro.js:220
-#: htdocs/luci-static/resources/homeproxy-pro.js:1163
-#: htdocs/luci-static/resources/homeproxy-pro.js:1183
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:86
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:126
+#: htdocs/luci-static/resources/homeproxy-pro.js:1134
+#: htdocs/luci-static/resources/homeproxy-pro.js:1154
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:145
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:183
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:141
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:77
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:72
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:484
msgid "non-empty value"
msgstr "非空值"
@@ -3365,10 +3330,6 @@ msgstr "非空值"
msgid "none"
msgstr "无"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:115
-msgid "not installed"
-msgstr "未安装"
-
#: htdocs/luci-static/resources/homeproxy-pro.js:632
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:776
msgid "packet addr (v2ray-core v5+)"
@@ -3382,11 +3343,11 @@ msgstr "通过"
msgid "private key"
msgstr "私钥"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:128
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:127
msgid "quic-go / uquic chrome"
msgstr "quic-go / uquic chrome"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:337
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:302
msgid "sing-box client"
msgstr "sing-box 客户端"
@@ -3414,7 +3375,7 @@ msgstr ""
"sing-box 将 Snell v4/v5 线协议统一为 v4,另提供 v6;v6 的预共享密钥(上方密"
"码)长度须为 12-255 字节。"
-#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:340
+#: htdocs/luci-static/resources/view/homeproxy-pro/status.js:305
msgid "sing-box server"
msgstr "sing-box 服务端"
@@ -3438,7 +3399,7 @@ msgstr "未检查"
msgid "unique UCI identifier"
msgstr "独立 UCI 标识"
-#: htdocs/luci-static/resources/homeproxy-pro.js:1174
+#: htdocs/luci-static/resources/homeproxy-pro.js:1145
msgid "unique value"
msgstr "独立值"
@@ -3475,17 +3436,17 @@ msgstr ""
msgid "v6"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:98
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:102
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:137
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:141
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:157
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:161
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:194
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/dns.js:198
msgid "valid DNS server address"
msgstr "有效 DNS 服务器地址"
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:155
#: htdocs/luci-static/resources/view/homeproxy-pro/client/nodes.js:158
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:85
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:88
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:80
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:83
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:741
#: htdocs/luci-static/resources/view/homeproxy-pro/node.js:744
msgid "valid URL"
@@ -3495,8 +3456,8 @@ msgstr "有效网址"
msgid "valid base64 key with %d characters"
msgstr "包含 %d 个字符的有效 base64 密钥"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:159
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:204
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:158
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/access.js:203
msgid "valid hostname"
msgstr "有效主机名"
@@ -3504,58 +3465,43 @@ msgstr "有效主机名"
msgid "valid port range (port1:port2)"
msgstr "有效端口范围(port1:port2)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:116
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/routing.js:112
msgid "valid port value"
msgstr "有效端口值"
-#: htdocs/luci-static/resources/homeproxy-pro.js:1140
-msgid "valid regular expression"
-msgstr "有效的正则表达式"
-
-#: htdocs/luci-static/resources/homeproxy-pro.js:1185
+#: htdocs/luci-static/resources/homeproxy-pro.js:1156
msgid "valid uuid"
msgstr "有效 uuid"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:417
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:403
msgid "wrong-ack"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:416
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:402
msgid "wrong-checksum"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:418
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:404
msgid "wrong-md5"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:415
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:401
msgid "wrong-sequence (default)"
msgstr "wrong-sequence(默认)"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:419
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/common.js:405
msgid "wrong-timestamp"
msgstr ""
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:80
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:128
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:75
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:123
msgid "{tag} in URL when extra tags are used"
msgstr "使用额外标签时 URL 需包含 {tag}"
-#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:131
+#: htdocs/luci-static/resources/view/homeproxy-pro/client/subscription.js:126
msgid "{tag} in initial path when extra tags are used"
msgstr "使用额外标签时初始路径需包含 {tag}"
-#~ msgid ""
-#~ "Resolves the domains on the China path, so it has to be a domestic "
-#~ "service to get the correct local CDN answers. Keep the default; the "
-#~ "upstream may block UDP/53, in which case a DoH address (https://"
-#~ "dns.alidns.com/dns-query, https://doh.pub/dns-query) also works. Support "
-#~ "UDP, TCP, DoH, DoQ, DoT."
-#~ msgstr ""
-#~ "解析中国路径上的域名,必须是国内服务才能获得正确的本地 CDN 结果。建议保持"
-#~ "默认值;若上游封禁 UDP/53,也可使用 DoH 地址(https://dns.alidns.com/dns-"
-#~ "query、https://doh.pub/dns-query)。支持 UDP、TCP、DoH、DoQ、DoT。"
-
#~ msgid "Bootstrap DNS server"
#~ msgstr "引导 DNS 服务器"
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/firewall_post.ut b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/firewall_post.ut
index 6554a0706..7bd2c53ba 100755
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/firewall_post.ut
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/firewall_post.ut
@@ -281,12 +281,7 @@ set homeproxy_mainland_addr_v4 {
{% endfor %}
}
}
-{# The v6 mainland set is only ever matched inside `ipv6_support === '1'`
- blocks - every reference to it below is gated on that - so the old
- `|| china_dns_server` alternative only ever built a set nothing pointed
- at: 1033 prefixes loaded into the kernel on every fw4 reload for nothing.
- china_dns_server is a DNS-side setting and has no bearing on v6 routing. #}
-{% if (ipv6_support === '1'): %}
+{% if ((ipv6_support === '1') || china_dns_server): %}
set homeproxy_mainland_addr_v6 {
type ipv6_addr
flags interval
@@ -352,25 +347,6 @@ set homeproxy_routing_port {
}
{% endif %}
-{# IPv6 forwarding is refused outright when the switch is off.
- The DNS side already answers AAAA with REFUSED, but that only covers clients
- that ask *this* router: a cached address, a client with its own resolver, or
- an IPv6-only destination still reaches the WAN and bypasses both the proxy
- and the mainland split.
- fw4's own forward chain cannot be used for this - it jumps into the zone
- chains, whose accept rules end the traversal before anything appended at the
- end of the chain is reached - so this is a base chain of its own, ordered
- before fw4's forward (priority filter == 0).
- Intra-LAN IPv6 is covered as well, which is what "this router does not do
- IPv6" means for `ipv6_support` off. #}
-{% if (ipv6_support !== '1'): %}
-chain homeproxy_ipv6_guard {
- type filter hook forward priority mangle; policy accept
-
- meta nfproto ipv6 counter reject comment "!{{ cfgname }}: IPv6 forwarding is disabled (ipv6_support is off)"
-}
-{% endif %}
-
{# DNS hijack & TCP redirect #}
chain dstnat {
{% if ((dns_redirect === '1') && (dns_hijacked !== '1')): %}
@@ -586,14 +562,14 @@ chain homeproxy_mangle_prerouting {
{% if (ipv6_support === '1'): %}
ip6 daddr != @homeproxy_gfw_list_v6 counter return
{% endif /* ipv6_support */ %}
- udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: reject QUIC (UDP 80/443), clients fall back to TCP"
+ udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)"
{% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %}
ip daddr @homeproxy_mainland_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 daddr @homeproxy_mainland_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% if (routing_mode !== 'custom'): %}
- udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: reject QUIC (UDP 80/443), clients fall back to TCP"
+ udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)"
{% endif /* routing_mode */ %}
{% elif (routing_mode === 'proxy_mainland_china'): %}
ip daddr != @homeproxy_mainland_addr_v4 counter return
@@ -747,14 +723,14 @@ chain homeproxy_mangle_tun {
{% if (ipv6_support === '1'): %}
ip6 daddr != @homeproxy_gfw_list_v6 counter return
{% endif /* ipv6_support */ %}
- udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: reject QUIC (UDP 80/443), clients fall back to TCP"
+ udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)"
{% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %}
ip daddr @homeproxy_mainland_addr_v4 counter return
{% if (ipv6_support === '1'): %}
ip6 daddr @homeproxy_mainland_addr_v6 counter return
{% endif /* ipv6_support */ %}
{% if (routing_mode !== 'custom'): %}
- udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: reject QUIC (UDP 80/443), clients fall back to TCP"
+ udp dport { 80, 443 } counter reject comment "!{{ cfgname }}: Block QUIC (not proxyable)"
{% endif /* routing_mode */ %}
{% elif (routing_mode === 'proxy_mainland_china'): %}
ip daddr != @homeproxy_mainland_addr_v4 counter return
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/fw4_names.sh b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/fw4_names.sh
index e09d1b0fa..66fe94f73 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/fw4_names.sh
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/fw4_names.sh
@@ -31,7 +31,6 @@ HP_FW4_CHAINS="
homeproxy_mangle_mark
homeproxy_mangle_tun
homeproxy_mangle_tun_mark
- homeproxy_ipv6_guard
"
HP_FW4_SETS="
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generate_client.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generate_client.uc
index 5a1a238ae..d1bae8a85 100755
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generate_client.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generate_client.uc
@@ -25,7 +25,7 @@
'use strict';
import { connect } from 'ubus';
-import { mkdtemp, open, readfile, writefile } from 'fs';
+import { mkdtemp, readfile, writefile } from 'fs';
import { Loader } from './config/loader.uc';
import { generate } from './generator/client.uc';
@@ -52,23 +52,9 @@ function resolve_env(dm) {
const env = {
wan_dns: (ubus?.call('network.interface', 'status', {'interface': 'wan'}))?.['dns-server']?.[0],
direct_domain_list: [],
- proxy_domain_list: [],
- china_ip_ruleset_available: false
+ proxy_domain_list: []
};
- /* The route block references this file as a `type: local` rule-set, and
- * sing-box refuses the whole configuration when it cannot open the path.
- * service.sh generates it before the client configuration, so it is
- * normally there; a fresh install whose generation failed (no ucode, a
- * read-only filesystem, a full disk) is what this answers. The generator
- * is a pure function, so the existence check belongs on this side of the
- * boundary. open() rather than readfile(): the file is a few megabytes
- * and only its existence matters. */
- const china_ip_json = open(HP_DIR + '/resources/china_ip4.json');
- env.china_ip_ruleset_available = china_ip_json != null;
- if (china_ip_json)
- china_ip_json.close();
-
if (routing_mode !== 'custom') {
const direct_list_raw = readfile(HP_DIR + '/resources/direct_list.txt');
env.direct_domain_list = direct_list_raw ? split(trim(direct_list_raw), /[\r\n]/) : [];
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/common.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/common.uc
index d06176c5f..82395bc07 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/common.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/common.uc
@@ -52,15 +52,6 @@ export function get_outbound(cfg, dm) {
return cfg;
default:
const rn = ConfigQuery.find_by_name(dm.routing.nodes, cfg);
- /* A routing_node that was disabled after something started referring
- * to it is skipped by generate_outbound(), so the tag returned below
- * would exist nowhere: sing-box refuses the whole configuration with
- * "outbound not found: cfg--out", which does not name the node
- * the user actually turned off. Fail here instead, the way
- * get_resolver()/get_ruleset() already do. The caller passes the
- * section name, so it is what the message names. */
- if (rn && (rn.enabled === false || rn.enabled === '0'))
- die(sprintf("the routing node '%s' is disabled; enable it or point the rule at another outbound.", cfg));
if (!rn || isEmpty(rn.node))
die(sprintf("%s's node is missing, please check your configuration.", cfg));
else if (rn.node === 'urltest')
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/context.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/context.uc
index bd0d86d84..9fadeeff8 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/context.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/context.uc
@@ -153,11 +153,11 @@ export function build_context(dm, env) {
* its own outbound/rule tables (routing.default_outbound plus the
* routing_node / routing_rule / ruleset sections). A residual
* config.main_node must therefore not switch the generator back to
- * the preset path. LuCI itself does clear a field the user can no
- * longer see (depends() makes parse() remove the value), but UCI is
- * writable from anywhere - a script, an older version, a hand edit -
- * and the pre-refactor code read this value only when the mode was
- * not custom. Reading it here anyway silently dropped every custom
+ * the preset path: LuCI hides that field in custom mode but does not
+ * clear it (`rmempty = false`), so a router that was configured in a
+ * preset mode and then switched to custom keeps the old value in
+ * UCI - and the pre-refactor code read it only when the mode was not
+ * custom. Reading it here anyway silently dropped every custom
* routing rule and made route.final 'main-out'. */
main_node: (routing_mode === 'custom') ? null : dm.general.main_node,
main_udp_node: (routing_mode === 'custom') ? null : dm.general.main_udp_node,
@@ -248,14 +248,6 @@ export function build_context(dm, env) {
ctx.proxy_domain_list = env.proxy_domain_list || [];
}
- /* Whether the local china-ip rule-set file exists (the CLI resolved it;
- * see generate_client.uc). route.uc emits that rule-set - and the rule
- * that matches it - only when it does, so a file that is missing degrades
- * the mainland split to geoip-cn instead of making sing-box refuse the
- * whole configuration over a path it cannot open. A caller that does not
- * supply the flag keeps the previous behaviour. */
- ctx.china_ip_ruleset_available = env.china_ip_ruleset_available !== false;
-
/* `dedicated_udp_node` means main_udp_node was set to a different
* proxy-able node than main_node (the 'same'/'nil' sentinels don't
* qualify). Kept on ctx so both build_outbounds and build_route
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/dns.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/dns.uc
index 1a2eb2b7a..f3dfa1787 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/dns.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/dns.uc
@@ -72,50 +72,6 @@ function parse_dnsquery(strquery) {
return querys;
}
-/* Build the sing-box `headers` object from the UCI string list.
- *
- * sing-box types this field as `badoption.HTTPHeader`, i.e.
- * map[string][]string; an array (or a bare string) fails to decode and the
- * whole configuration is rejected. The LuCI form is a DynamicList, so every
- * entry lands in UCI as a string and the two sides disagreed on the shape:
- * `"headers": ["Name: value"]` is not a map.
- *
- * The form keeps its list widget and one entry is written `Name: Value`;
- * repeating a name appends to that name's value list, which is how HTTP
- * expresses a multi-valued header. An entry that does not fit the form is
- * named and rejected here rather than left for sing-box to report as
- * "cannot unmarshal array into Go value of type badoption.HTTPHeader". */
-function parse_http_headers(list, where) {
- if (isEmpty(list))
- return null;
-
- /* A single hand-written UCI option arrives as a string, not a list. */
- if (type(list) !== 'array')
- list = [ list ];
-
- const headers = {};
- for (let item in list) {
- const line = trim(item);
- if (line === '')
- continue;
-
- const sep = index(line, ':');
- if (sep <= 0)
- die(sprintf("homeproxy-pro: %s: header '%s' is not in 'Name: Value' form.", where, line));
-
- const name = trim(substr(line, 0, sep));
- const value = trim(substr(line, sep + 1));
- if (isEmpty(name) || isEmpty(value))
- die(sprintf("homeproxy-pro: %s: header '%s' is not in 'Name: Value' form.", where, line));
-
- if (!headers[name])
- headers[name] = [];
- push(headers[name], value);
- }
-
- return isEmpty(keys(headers)) ? null : headers;
-}
-
/* --- proxy routing-mode path (bypass_mainland_china / proxy / / gfwlist) -- */
/* Domains whose NAPTR (qtype 35) queries bypass china-dns. Aliyun
@@ -131,6 +87,7 @@ function parse_http_headers(list, where) {
* someone reads the comment and thinks "I know a domain that should
* go direct". */
const NAPTR_BYPASS_SUFFIXES = [
+ 'r.10086.cn',
'10086.cn',
'pub.3gppnetwork.org'
];
@@ -237,16 +194,7 @@ function append_proxy_dns(config, dm, ctx) {
server: 'main-dns'
});
- /* Reject SVCB/HTTPS queries: a client that learns the address from these
- * record types dials the embedded IP without asking again, which is what
- * lets a query slip past the DNS split (and, in the custom path, past
- * Fake-IP).
- *
- * It sits after the two domain lists on purpose, so a domain the user put
- * on a list keeps whatever resolver that list chose - the custom path
- * below puts the same reject first instead, because there the user's own
- * rules are the ones that must not be shadowed. The two orders are
- * deliberate; do not "fix" one into the other. */
+ /* Reject SVCB/HTTPS queries to avoid proxy DNS timeout on null domains */
push(config.dns.rules, {
query_type: [64, 65],
action: 'reject'
@@ -369,7 +317,7 @@ function append_custom_dns(config, dm, ctx) {
server: cfg.server,
server_port: strToInt(cfg.server_port),
path: cfg.path,
- headers: parse_http_headers(cfg.headers, sprintf("dns server '%s'", cfg.name)),
+ headers: cfg.headers,
tls: cfg.tls_sni ? {
enabled: true,
server_name: cfg.tls_sni
@@ -437,71 +385,24 @@ function append_custom_dns(config, dm, ctx) {
rule_set: get_ruleset(cfg.rule_set, dm),
rule_set_ip_cidr_match_source: strToBool(cfg.rule_set_ip_cidr_match_source),
invert: strToBool(cfg.invert),
+ race: strToBool(cfg.race),
+ speculative: strToBool(cfg.speculative),
action: cfg.action
};
- /* race/speculative are action fields, not match fields, and their
- * legality is decided at load time by sing-box's
- * validateDNSRuleAction() (route/rule/rule_dns.go):
- *
- * - race and speculative are mutually exclusive ("`race` and
- * `speculative` cannot be combined on the same rule");
- * - race is only allowed on a final action - route, respond,
- * reject, predefined - and "`race` requires a final action"
- * otherwise;
- * - speculative exists only in the route and evaluate option
- * structs, so on any other action it is an unknown field and
- * DisallowUnknownFields rejects the whole configuration.
- *
- * The old code emitted both unconditionally. The form hides them
- * with depends(), but LuCI does not delete the value of a hidden
- * option, so "tick race on a route rule, then switch the rule to
- * evaluate" left an illegal value behind. Gate by action and die
- * on the combination, naming the field rather than letting sing-box
- * answer with "unknown field". */
- const want_race = strToBool(cfg.race) === true,
- want_speculative = strToBool(cfg.speculative) === true;
-
- if (want_race && want_speculative)
- die(sprintf("homeproxy-pro: DNS rule '%s' enables both race and speculative; sing-box refuses that combination.", cfg.name));
-
- if (want_race) {
- if (!(cfg.action in ['route', 'reject', 'predefined']))
- die(sprintf("homeproxy-pro: DNS rule '%s' uses race with action '%s'; race is only allowed on a final action (route, reject, predefined).", cfg.name, cfg.action));
- rule.race = true;
- }
-
- if (want_speculative) {
- if (!(cfg.action in ['route', 'evaluate']))
- die(sprintf("homeproxy-pro: DNS rule '%s' uses speculative with action '%s'; speculative is only valid for route and evaluate.", cfg.name, cfg.action));
- rule.speculative = true;
- }
-
- /* `route` and `evaluate` (which needs a server for the eval step).
- * DNS rules have no `resolve` action - that one belongs to the route
- * rules - and the form does not offer it here. It used to be handled
- * anyway, which would have emitted an action sing-box does not know
- * the moment a stale UCI value carried it. */
- if (cfg.action === 'route' || cfg.action === 'evaluate') {
+ /* `route` (and `evaluate`, which needs a server for the eval step).
+ * `resolve` is also a possibility but is not currently exposed in
+ * the UI; if it ever is, this branch is where it lands. */
+ if (cfg.action === 'route' || cfg.action === 'evaluate' || cfg.action === 'resolve') {
rule.server = get_resolver(cfg.server, dm);
rule.disable_cache = strToBool(cfg.dns_disable_cache);
rule.disable_optimistic_cache = strToBool(cfg.disable_optimistic_cache);
rule.rewrite_ttl = strToInt(cfg.rewrite_ttl);
- /* Load-time mutual exclusion in validateDNSRuleAction():
- * "`client_subnet` and `remove_client_subnet` are mutually
- * exclusive". The form draws them as two independent
- * controls, so both can be left set. */
- if (!isEmpty(cfg.client_subnet) && strToBool(cfg.remove_client_subnet) === true)
- die(sprintf("homeproxy-pro: DNS rule '%s' sets both client_subnet and remove_client_subnet; sing-box refuses that combination.", cfg.name));
rule.client_subnet = cfg.client_subnet;
rule.remove_client_subnet = strToBool(cfg.remove_client_subnet);
}
- /* 1.14's evaluate action carries the same timeout override as route
- * (DNSEvaluateActionOptions embeds AbstractDNSRouteActionOptions), and
- * the form shows the field for both actions. Emitting it for route
- * only made the value disappear silently on an evaluate rule. */
- if (cfg.action === 'route' || cfg.action === 'evaluate')
+ if (cfg.action === 'route' || cfg.action === 'resolve')
rule.timeout = strToTime(cfg.dns_timeout);
/* `reject` only accepts method + no_drop. Anything else here is
@@ -575,13 +476,6 @@ function append_custom_dns(config, dm, ctx) {
rule.response_extra = cfg.response_extra;
}
- /* race also requires match_response in 1.14. This check has to sit
- * after every match_response assignment: the legacy address-filter
- * wrapping above gives one to those rules too, and that satisfies
- * sing-box just as well. */
- if (want_race && !rule.match_response)
- die(sprintf("homeproxy-pro: DNS rule '%s' enables race without match_response; sing-box requires one.", cfg.name));
-
push(builtin_dns_rules, rule);
}
config.dns.rules = builtin_dns_rules;
@@ -589,31 +483,6 @@ function append_custom_dns(config, dm, ctx) {
config.dns.final = get_resolver(ctx.dns_default_server, dm);
}
-/* Reject AAAA when this router does not proxy IPv6.
- *
- * Every IPv6 rule-set and rule in firewall_post.ut sits inside
- * `ipv6_support === '1'`, so with the switch off the router does not
- * intercept v6 at all - and nothing in this DNS block ever refused a AAAA
- * query. dns.strategy=ipv4_only on the preset paths is a resolution
- * preference, not a query block, and custom routing takes the UCI default
- * (prefer_ipv4). A dual-stack LAN therefore still received AAAA records and
- * connected straight out over the WAN, bypassing both the proxied resolver
- * and the destination-based split.
- *
- * Appended last so a user rule keeps precedence over it. A client with its
- * own DoH/DoT can still bypass this layer; a hard block would have to be an
- * nft rule, which changes the user-visible "IPv6 still works" behaviour of
- * the switch and is therefore not done here. */
-function append_ipv6_guard(config, ctx) {
- if (ctx.ipv6_support === '1')
- return;
-
- push(config.dns.rules, {
- query_type: [28],
- action: 'reject'
- });
-}
-
/* --- public entry ------------------------------------------------------ */
/* The always-on DNS block. Every routing mode (proxy and custom) gets
@@ -685,7 +554,5 @@ export function build_dns(config, dm, ctx) {
append_proxy_dns(config, dm, ctx);
}
- append_ipv6_guard(config, ctx);
-
return config;
};
\ No newline at end of file
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/outbound.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/outbound.uc
index 20cc226a8..ddd725794 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/outbound.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/outbound.uc
@@ -253,7 +253,7 @@ function buildCustomOutbounds(dm, config, ctx, direct_overrides) {
* comes from a routing_node. `|| {}` made it look non-null and the
* failure surfaced as a null dereference two lines later. */
if (isEmpty(outbound))
- die(sprintf("routing node '%s' refers to a node that does not exist.\n", cfg.name));
+ die(sprintf("routing node '%s' refers to a node that does not exist.\n", cfg['.name']));
if (outbound.type === 'wireguard') {
/* WireGuard goes through generate_endpoint() which tags
@@ -274,7 +274,7 @@ function buildCustomOutbounds(dm, config, ctx, direct_overrides) {
const ob = generate_outbound(outbound, mark, direct_overrides);
if (ob == null)
- die(sprintf("routing node '%s' cannot be built from node '%s'.\n", cfg.name, cfg.node));
+ die(sprintf("routing node '%s' cannot be built from node '%s'.\n", cfg['.name'], cfg.node));
ob.bind_interface = cfg.bind_interface;
ob.detour = get_outbound(cfg.outbound, dm);
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/route.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/route.uc
index 566b7b389..65319325d 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/route.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/route.uc
@@ -120,23 +120,17 @@ function build_route_proxy(config, dm, ctx, direct_overrides) {
outbound: ctx.proxy_fallback ? 'direct-out' : 'main-out'
});
}
- /* geoip-cn.srs is upstream's list; the firewall's mainland set is
- * built from our own china_ip4.txt (firewall_post.ut reads it
- * directly). The two disagree - the bundled list has 8.152.0.0/13
- * (Alibaba Cloud) and geoip-cn.srs does not - so a connection into
- * that range passes the firewall as "not mainland" and would then be
- * sent direct by the rule above instead of to the proxy. This local
- * rule-set is generated from the same china_ip4.txt, which is what
- * makes both sides decide from one list. In
- * proxy_mainland_china it is not needed twice: the geoip-cn rule
- * already selects the mainland side for the proxy.
- *
- * Only when the file is actually there: service.sh generates it before
- * the client configuration, but a fresh install whose generation failed
- * would otherwise leave a `type: local` rule-set pointing at a path
- * sing-box cannot open, which fails the whole configuration rather than
- * this one rule. The geoip-cn rule above still covers the split. */
- if (ctx.routing_mode === 'bypass_mainland_china' && ctx.china_ip_ruleset_available) {
+ if (ctx.routing_mode === 'bypass_mainland_china') {
+ /* geoip-cn.srs is upstream's list; the firewall's mainland set is
+ * built from our own china_ip4.txt (firewall_post.ut reads it
+ * directly). The two disagree - the bundled list has 8.152.0.0/13
+ * (Alibaba Cloud) and geoip-cn.srs does not - so a connection into
+ * that range passes the firewall as "not mainland" and would then be
+ * sent direct by the rule above instead of to the proxy. This local
+ * rule-set is generated from the same china_ip4.txt, which is what
+ * makes both sides decide from one list. In
+ * proxy_mainland_china it is not needed twice: the geoip-cn rule
+ * already selects the mainland side for the proxy. */
push(config.route.rules, {
rule_set: 'china-ip',
action: 'route',
@@ -258,14 +252,13 @@ function build_route_proxy(config, dm, ctx, direct_overrides) {
* file the running instance reloads it in place - no restart and,
* more importantly, no second copy of the list to keep in sync.
* China IPv6 is deliberately absent: the firewall only fills the v6
- * set when ipv6_support is on. Declared only when the file exists,
- * for the same reason as the rule that matches it (see above). */
- if (ctx.china_ip_ruleset_available)
- push(config.route.rule_set, {
- type: 'local',
- tag: 'china-ip',
- path: HP_DIR + '/resources/china_ip4.json'
- });
+ * set when ipv6_support is on, and the client refuses to resolve
+ * AAAA when it is off. */
+ push(config.route.rule_set, {
+ type: 'local',
+ tag: 'china-ip',
+ path: HP_DIR + '/resources/china_ip4.json'
+ });
}
if (isEmpty(config.route.rule_set))
@@ -310,6 +303,7 @@ function build_route_custom(config, dm, ctx, direct_overrides) {
ip_version: strToInt(cfg.ip_version),
protocol: cfg.protocol,
network: cfg.network,
+ client: cfg.client,
domain: cfg.domain,
domain_suffix: cfg.domain_suffix,
domain_keyword: cfg.domain_keyword,
@@ -334,15 +328,6 @@ function build_route_custom(config, dm, ctx, direct_overrides) {
source_hostname: cfg.source_hostname
};
- /* The sniffed client type is only set for QUIC and SSH traffic; the
- * form offers the field under those two protocols only, but a value
- * left behind by an earlier protocol would make the rule match
- * nothing, so it is emitted only when it can apply. */
- const protocols = type(cfg.protocol) === 'array' ? cfg.protocol
- : (isEmpty(cfg.protocol) ? [] : [ cfg.protocol ]);
- if ('quic' in protocols || 'ssh' in protocols)
- rule.client = cfg.client;
-
/* `route-options` only takes the override_* fields; `outbound` is the
* `route` action's field. The two used to share one branch and
* `route-options` ended up carrying an `outbound` sing-box then
@@ -362,39 +347,6 @@ function build_route_custom(config, dm, ctx, direct_overrides) {
rule.tls_spoof = cfg.tls_spoof || null;
rule.tls_spoof_method = cfg.tls_spoof_method || null;
}
-
- /* Load-time mutual exclusion in RouteOptionsActionOptions.UnmarshalJSON()
- * (option/rule_action.go): "`tls_fragment` and `tls_record_fragment`
- * are mutually exclusive". The form draws both switches for the
- * route action and neither hides the other, so a user following the
- * description ("try TLS record fragment first") can easily tick
- * both and lose the whole configuration. */
- if (strToBool(cfg.tls_fragment) === true && strToBool(cfg.tls_record_fragment) === true)
- die(sprintf("homeproxy-pro: routing rule '%s' enables both tls_fragment and tls_record_fragment; sing-box refuses that combination.", cfg.name));
-
- /* The same unmarshaller rejects an empty action object with "empty
- * route option action". Match fields belong to the rule, not to the
- * action payload, so a rule that selects Route options and fills in
- * none of the fields above fails the whole configuration with a
- * message that names nothing. The fields are judged on their parsed
- * values, not on the raw UCI strings: a UCI '0' becomes `false`,
- * which is the Go zero value and is not payload. */
- if (cfg.action === 'route-options') {
- const has_payload =
- !isEmpty(rule_override_address) ||
- !isEmpty(rule_override_port) ||
- strToBool(cfg.udp_disable_domain_unmapping) === true ||
- strToBool(cfg.udp_connect) === true ||
- !isEmpty(cfg.udp_timeout) ||
- strToBool(cfg.tls_fragment) === true ||
- !isEmpty(cfg.tls_fragment_fallback_delay) ||
- strToBool(cfg.tls_record_fragment) === true ||
- !isEmpty(cfg.tls_spoof) ||
- !isEmpty(cfg.tls_spoof_method);
-
- if (!has_payload)
- die(sprintf("homeproxy-pro: routing rule '%s' selects the route-options action but sets none of its fields; sing-box rejects an empty route option action.", cfg.name));
- }
/* `route` alone is the action that picks a destination - `route-options`
* adjusts the existing connection, so it does not take `outbound`. */
if (cfg.action === 'route')
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/ruleset.uc b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/ruleset.uc
index ef6ec55ed..374ef3446 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/ruleset.uc
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/generator/ruleset.uc
@@ -26,7 +26,7 @@
'use strict';
-import { isEmpty, strToTime, validateHomeProxyPath } from '../homeproxy-pro.uc';
+import { isEmpty, validateHomeProxyPath } from '../homeproxy-pro.uc';
import { get_outbound, isDirectOutboundTag } from './common.uc';
@@ -40,13 +40,6 @@ export function build_user_rulesets(rule_set_array, dm, ctx) {
if (!cfg.enabled)
continue;
- /* An inline rule-set is a `rules` array, and nothing in this package
- * ever writes one: the form only offers local and remote. Emitting
- * `{type: 'inline'}` without `rules` is rejected by sing-box, so a
- * hand-written UCI section is refused by name here. */
- if (cfg.type === 'inline')
- die(sprintf("homeproxy-pro: rule-set '%s' is declared inline, which this package cannot edit; use a local or remote rule-set.", cfg.name));
-
const extra_tags = cfg.extra_tags || [];
let rs_tag = 'cfg-' + cfg.name + '-rule';
if (length(extra_tags) && cfg.type !== 'inline') {
@@ -85,29 +78,18 @@ export function build_user_rulesets(rule_set_array, dm, ctx) {
format: cfg.format,
path: cfg.path,
url: cfg.url,
- /* A duration to sing-box: a bare number is rejected with
- * "time: missing unit in duration", taking the whole
- * configuration down, and the form only offers a placeholder
- * ("1d"), not a format check. Same treatment as the DNS
- * timeouts. */
- update_interval: strToTime(cfg.update_interval)
+ update_interval: cfg.update_interval
};
- /* download_detour is deprecated since 1.14 (removed in 1.16) and only
- * ever applied to remote rule-sets; emitting it at all makes sing-box
- * refuse the configuration. It is translated into http_clients right
- * below. */
+ /* download_detour is a pre-1.14 option that only makes sense for
+ remote rule-sets; emitting it for local/inline ones makes sing-box
+ * 1.14 reject the whole config. It is translated into http_clients
+ right below. */
if (cfg.type === 'remote')
ruleset.download_detour = get_outbound(cfg.outbound, dm) || get_outbound(ctx.default_outbound, dm);
- if (cfg.type === 'remote' && !isEmpty(cfg.initial_path)) {
- /* initial_path is read off the local disk as root; same whitelist
- * as the local ruleset path - and now the same fail-loud
- * treatment. Dropping it silently made a rule-set the user
- * believed had a local copy depend on a download at first start,
- * with nothing said about why. */
- if (!validateHomeProxyPath(cfg.initial_path))
- die(sprintf("homeproxy-pro: rule-set '%s' initial_path '%s' is outside the homeproxy-pro whitelist; choose a path under /etc/homeproxy-pro/.", cfg.name, cfg.initial_path));
- ruleset.initial_path = cfg.initial_path;
- }
+ if (cfg.type === 'remote' && !isEmpty(cfg.initial_path))
+ /* initial_path is read off the local disk as root; same
+ * whitelist as the local ruleset path. */
+ ruleset.initial_path = validateHomeProxyPath(cfg.initial_path) ? cfg.initial_path : null;
push(rule_set_array, ruleset);
}
};
@@ -132,21 +114,8 @@ export function build_http_clients(rule_set_array, dm, ctx) {
if (rs.type !== 'remote')
continue;
- if (isEmpty(detour)) {
- /* A remote rule-set still has to be fetched through something.
- * The preset modes used to fall back to direct-out, which fails
- * on a router that can only reach GitHub through the proxy - and
- * the only trace is a line in the sing-box log. Follow the
- * mode's main outbound instead, the way the built-in geoip-cn /
- * geosite-cn rule-sets already do (route.uc gives them
- * download_detour: main-out). */
- if (ctx.routing_mode === 'custom')
- detour = get_outbound(ctx.default_outbound, dm) || 'direct-out';
- else if (!isEmpty(ctx.main_node))
- detour = 'main-out';
- else
- detour = 'direct-out';
- }
+ if (isEmpty(detour))
+ detour = (ctx.routing_mode === 'custom') ? (get_outbound(ctx.default_outbound, dm) || 'direct-out') : 'direct-out';
const tag = 'hp-' + detour;
rs.http_client = tag;
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/config.sh b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/config.sh
index 6ee5e7827..2f5ec7ce9 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/config.sh
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/config.sh
@@ -149,29 +149,3 @@ hp_restore_known_good_uci() {
[ "$saved" = "1" ] && uci commit homeproxy-pro
-# Digest of , or nothing when it is missing or empty. The reload path
-# uses it to tell "the generator produced the same bytes as what is running"
-# from "something actually changed".
-hp_file_digest() {
- [ -s "$1" ] || return 1
-
- md5sum "$1" 2>"/dev/null" | awk '{ print $1 }'
-}
-
-# hp_config_changed
-# 0 when differs from (or does not exist), 1 when the
-# two are byte-identical. An empty means there was nothing
-# running to compare against, which counts as a change.
-hp_config_changed() {
- local live="$1"
- local before="$2"
- local now
-
- now="$(hp_file_digest "$live")" || return 0
-
- [ -n "$before" ] && [ "$now" = "$before" ] && return 1
-
- return 0
-}
diff --git a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/dns.sh b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/dns.sh
index 19824eb39..0b7084202 100644
--- a/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/dns.sh
+++ b/luci-app-homeproxy-pro/root/etc/homeproxy-pro/scripts/runtime/dns.sh
@@ -115,19 +115,7 @@ hp_dnsmasq_render_snippets() {
hp_dnsmasq_has_nftset || nftset_ok=0
case "$routing_mode" in
- "bypass_mainland_china"|"custom"|"global"|"proxy_mainland_china")
- # Every one of these hands all queries to sing-box, which is the only
- # DNS front end the mode needs.
- #
- # proxy_mainland_china used to be the exception: it expanded
- # china_list.txt (111353 domains in the bundled list) into one
- # `server=` line each, so that only those domains reached sing-box.
- # Measured on a real device (ImmortalWrt 25.12.2, x86-64, dnsmasq
- # 2.93) that costs about 25 MB of RSS - 1.0 MB empty, 27.2 MB with
- # the list - while the outcome is the same: this mode's dns.final is
- # default-dns (the WAN resolver), so a mainland domain resolves
- # through the ISP either way. The split that actually matters is
- # decided on the route side, by geoip-cn/china-ip.
+ "bypass_mainland_china"|"custom"|"global")
cat <<-EOF > "$stage/redirect-dns.conf" || return 1
no-poll
no-resolv
@@ -147,6 +135,12 @@ hp_dnsmasq_render_snippets() {
fi
fi
;;
+ "proxy_mainland_china")
+ if [ -s "$hp_dir/resources/china_list.txt" ]; then
+ sed -r -e "s/(.*)/server=\/\1\/127.0.0.1#$dns_port/g" \
+ "$hp_dir/resources/china_list.txt" > "$stage/china_list.conf" || return 1
+ fi
+ ;;
esac
if [ "$routing_mode" != "custom" ] && [ -s "$hp_dir/resources/proxy_list.txt" ]; then
diff --git a/luci-app-homeproxy-pro/root/etc/init.d/homeproxy-pro b/luci-app-homeproxy-pro/root/etc/init.d/homeproxy-pro
index 883684875..401367aed 100755
--- a/luci-app-homeproxy-pro/root/etc/init.d/homeproxy-pro
+++ b/luci-app-homeproxy-pro/root/etc/init.d/homeproxy-pro
@@ -515,21 +515,6 @@ reload_service() {
HP_CANDIDATE_CLIENT=0
HP_CANDIDATE_SERVER=0
- # Digest what is running *before* the generators overwrite it: a reload
- # that produces the same bytes must not stop and start the instances.
- # service_triggers() reloads on every `interface.*.up` for wan, and a
- # flapping PPPoE link would otherwise interrupt every connection even when
- # the WAN resolver - the only thing that trigger can change - came back
- # the same.
- local digest_c="" digest_s="" server_enabled
- if [ "$outbound_node" != "nil" ]; then
- digest_c="$(hp_file_digest "$RUN_DIR/sing-box-c.json")"
- fi
- config_get_bool server_enabled "server" "enabled" "0"
- if [ "$server_enabled" = "1" ]; then
- digest_s="$(hp_file_digest "$RUN_DIR/sing-box-s.json")"
- fi
-
if [ "$outbound_node" != "nil" ]; then
if ! ucode -S "$HP_DIR/scripts/generate_client.uc" 2>>"$LOG_PATH"; then
log "Error: new client configuration is invalid, reload aborted; the running configuration is kept."
@@ -538,6 +523,8 @@ reload_service() {
HP_CANDIDATE_CLIENT=1
fi
+ local server_enabled
+ config_get_bool server_enabled "server" "enabled" "0"
if [ "$server_enabled" = "1" ]; then
if ! ucode -S "$HP_DIR/scripts/generate_server.uc" 2>>"$LOG_PATH"; then
log "Error: new server configuration is invalid, reload aborted; the running configuration is kept."
@@ -546,23 +533,6 @@ reload_service() {
HP_CANDIDATE_SERVER=1
fi
- # Both sides regenerated to what is already live: keep them running. The
- # staged candidates are dropped too, so a later start that never validated
- # anything cannot pick them up.
- local reload_needed=0
- if [ "$outbound_node" != "nil" ] && hp_config_changed "$RUN_DIR/sing-box-c.json" "$digest_c"; then
- reload_needed=1
- fi
- if [ "$server_enabled" = "1" ] && hp_config_changed "$RUN_DIR/sing-box-s.json" "$digest_s"; then
- reload_needed=1
- fi
-
- if [ "$reload_needed" = "0" ]; then
- rm -rf "$RUN_DIR/candidate"
- log "Reload: the generated configuration is unchanged; the running instances are kept."
- return 0
- fi
-
# stop_service() deletes $RUN_DIR/sing-box-*.json (runtime state), so the
# file that was just validated would not survive to start_service. Stage a
# copy of each validated side first; the stop that follows cannot reach it,
diff --git a/luci-app-homeproxy-pro/root/usr/share/rpcd/acl.d/luci-app-homeproxy-pro.json b/luci-app-homeproxy-pro/root/usr/share/rpcd/acl.d/luci-app-homeproxy-pro.json
index cecb61225..4b9edac6f 100644
--- a/luci-app-homeproxy-pro/root/usr/share/rpcd/acl.d/luci-app-homeproxy-pro.json
+++ b/luci-app-homeproxy-pro/root/usr/share/rpcd/acl.d/luci-app-homeproxy-pro.json
@@ -12,7 +12,6 @@
"luci.homeproxy-pro": [
"acllist_read",
"connection_check",
- "gfw_set_counts",
"node_parse",
"resources_get_version",
"singbox_get_features",
diff --git a/luci-app-homeproxy-pro/root/usr/share/rpcd/ucode/luci.homeproxy-pro b/luci-app-homeproxy-pro/root/usr/share/rpcd/ucode/luci.homeproxy-pro
index ea46dcbe1..c0896a492 100644
--- a/luci-app-homeproxy-pro/root/usr/share/rpcd/ucode/luci.homeproxy-pro
+++ b/luci-app-homeproxy-pro/root/usr/share/rpcd/ucode/luci.homeproxy-pro
@@ -18,11 +18,6 @@ function hasKernelModule(kmod) {
return (system(sprintf('[ -e "/lib/modules/$(uname -r)"/%s ]', shellQuote(kmod))) === 0);
}
-/* The nft sets gfw_set_counts() reports on. A named constant rather than an
- * `in [...]` literal: this file keeps its membership tests on index() and
- * named arrays (arch-guard checks both). */
-const GFW_SET_FAMILIES = ['v4', 'v6'];
-
const HP_DIR = '/etc/homeproxy-pro';
const RUN_DIR = '/var/run/homeproxy-pro';
const LOG_PATH = `${RUN_DIR}/homeproxy-pro.log`;
@@ -56,37 +51,6 @@ function collectFeatures() {
return features;
}
-/* Element count of an nft set, or null when the set does not exist. Used by
- * gfw_set_counts(): the gfwlist routing mode decides with a set that dnsmasq
- * fills through `nftset=`, so an empty set means the mode is silently routing
- * everything direct. */
-function nft_set_size(name) {
- const ret = executeCommand('nft', '-j', 'list', 'set', 'inet', 'fw4', shellQuote(name));
-
- if (ret == null || ret.exitcode !== 0 || isEmpty(ret.stdout))
- return null;
-
- let doc;
- try {
- doc = json(ret.stdout);
- } catch (e) {
- return null;
- }
-
- /* `elem` is what nft 1.1.6 emits (`nft -j list set`); older builds used
- * `elements`. Accepting both keeps the count right on either, because
- * the wrong key silently reads as "0 elements" - the very answer this
- * method exists to distinguish from "not filled". */
- for (let item in (doc?.nftables || [])) {
- const elements = item.set ? (item.set.elem || item.set.elements) : null;
-
- if (elements)
- return length(elements);
- }
-
- return 0;
-}
-
const methods = {
acllist_read: {
args: { type: 'type' },
@@ -472,23 +436,6 @@ const methods = {
return { running, log_tail: tail };
}
- },
-
- /* The gfwlist mode routes by an nft set that dnsmasq populates through
- * `nftset=`. A LAN client with its own DoH/DoT never asks this router's
- * DNS, the set stays empty, and the mode degrades to direct routing with
- * no visible symptom - the count is what separates "the mode is working"
- * from "the mode is doing nothing". */
- gfw_set_counts: {
- args: {},
- call: function() {
- let counts = {};
-
- for (let family in GFW_SET_FAMILIES)
- counts[family] = nft_set_size('homeproxy_gfw_list_' + family);
-
- return counts;
- }
}
};
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/dns_action_guards.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/dns_action_guards.uci
deleted file mode 100644
index abfcb0123..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/dns_action_guards.uci
+++ /dev/null
@@ -1,51 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# DNS rule action fields that sing-box validates at load time
-# (route/rule/rule_dns.go, validateDNSRuleAction):
-#
-# * `race` and `speculative` cannot be combined on the same rule;
-# * `client_subnet` and `remove_client_subnet` are mutually exclusive.
-#
-# The rules below are a *legal* baseline: both sides of each pair are off.
-# The testbed opens one side with a one-line sed variation, so the case that
-# must be refused differs from the case that must pass by exactly the flag
-# under test.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config dns_rule 'dr_race'
- option enabled '1'
- option label 'dr-race'
- option action 'route'
- option server 'default-dns'
- option race '0'
- option speculative '0'
-
-config dns_rule 'dr_subnet'
- option enabled '1'
- option label 'dr-subnet'
- option action 'route'
- option server 'default-dns'
- option client_subnet '1.2.3.0/24'
- option remove_client_subnet '0'
-
-config dns_rule 'dr_eval'
- option enabled '1'
- option label 'dr-eval'
- option action 'evaluate'
- option server 'default-dns'
- option dns_timeout '5'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/dns_headers.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/dns_headers.uci
deleted file mode 100644
index cbff936ed..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/dns_headers.uci
+++ /dev/null
@@ -1,33 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# A DNS server carrying HTTP headers. UCI stores them as a string list
-# ("Name: Value" per entry), sing-box wants map[string][]string, and emitting
-# the UCI list verbatim makes sing-box refuse the whole configuration
-# ("cannot unmarshal array into Go value of type badoption.HTTPHeader").
-# The generator converts one shape into the other; a name that appears twice
-# becomes a two-value header.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config dns_server 'ds_https'
- option enabled '1'
- option type 'https'
- option server '1.1.1.1'
- option path '/dns-query'
- list headers 'X-Test: one'
- list headers 'X-Test: two'
- list headers 'Authorization: Bearer t'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_disabled_node.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_disabled_node.uci
deleted file mode 100644
index 8d96cfcb3..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_disabled_node.uci
+++ /dev/null
@@ -1,39 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# A routing rule pointing at a routing_node that was switched off afterwards.
-# generate_outbound() skips disabled nodes, so the tag the rule refers to is
-# generated nowhere and sing-box refuses the whole configuration with
-# "outbound not found: cfg-rn_off-out" - a message that never names the node
-# the user turned off. get_outbound() now refuses it the way
-# get_resolver()/get_ruleset() already do.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config node 'n_direct'
- option label 'n-direct'
- option type 'direct'
-
-config routing_node 'rn_off'
- option enabled '0'
- option label 'rn-off'
- option node 'n_direct'
-
-config routing_rule 'rr_off'
- option enabled '1'
- option label 'rr-off'
- option action 'route'
- option outbound 'rn_off'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_route_options_empty.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_route_options_empty.uci
deleted file mode 100644
index 0782ce00b..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_route_options_empty.uci
+++ /dev/null
@@ -1,29 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# A routing rule on the action the UI offers but gives no field to fill.
-# Match fields belong to the rule, not to the action payload, so this rule
-# reaches sing-box as `{"action": "route-options", ...}` with an empty action
-# object, and RouteOptionsActionOptions.UnmarshalJSON() refuses exactly that
-# with "empty route option action" - taking the whole configuration with it.
-# The generator refuses it by name before writing anything.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config routing_rule 'rr_empty'
- option enabled '1'
- option label 'rr-empty'
- option action 'route-options'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_tls_fragment.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_tls_fragment.uci
deleted file mode 100644
index 10c7ef2f4..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/routing_rule_tls_fragment.uci
+++ /dev/null
@@ -1,32 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Both TLS fragmentation switches at once. RouteOptionsActionOptions's
-# UnmarshalJSON() treats them as mutually exclusive
-# ("`tls_fragment` and `tls_record_fragment` are mutually exclusive"), and
-# the form shows both switches without hiding either when the other is on -
-# a user following the description ("try TLS record fragment first") can
-# easily tick both.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config routing_rule 'rr_tls'
- option enabled '1'
- option label 'rr-tls'
- option action 'route'
- option outbound 'direct-out'
- option tls_fragment '1'
- option tls_record_fragment '1'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_bad_initial_path.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_bad_initial_path.uci
deleted file mode 100644
index 5da314be7..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_bad_initial_path.uci
+++ /dev/null
@@ -1,38 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# A remote rule-set whose initial_path points outside the homeproxy-pro whitelist.
-# The path is read off the local disk as root, so the same gate as a local
-# rule-set's path applies - and it has to fail the same way. It used to be
-# dropped silently (initial_path := null), which left a rule-set the user
-# believed had a local copy downloading at first start instead.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config ruleset 'rs_seed'
- option enabled '1'
- option label 'rs-seed'
- option type 'remote'
- option format 'binary'
- option url 'https://example.invalid/ruleset.srs'
- option initial_path '/etc/passwd'
-
-config routing_rule 'rr_seed'
- option enabled '1'
- option label 'rr-seed'
- option action 'route'
- option outbound 'direct-out'
- option rule_set 'rs_seed'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_preset.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_preset.uci
deleted file mode 100644
index 26203ed6c..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_preset.uci
+++ /dev/null
@@ -1,51 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# A remote rule-set in a preset routing mode. It used to be fetched through
-# direct-out regardless of the mode, which fails on a router that can only
-# reach the rule-set host through the proxy - and the only trace is a line in
-# the sing-box log. The built-in geoip-cn / geosite-cn rule-sets already
-# download through main-out (route.uc sets download_detour for them).
-
-config homeproxy-pro 'config'
- option routing_mode 'bypass_mainland_china'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
- option main_node 'n_vless'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config node 'n_vless'
- option label 'n-vless'
- option type 'vless'
- option address 'example.invalid'
- option port '443'
- option uuid '00000000-0000-0000-0000-000000000000'
- option tls '1'
- option tls_sni 'example.invalid'
-
-config routing_node 'rn_main'
- option enabled '1'
- option label 'rn-main'
- option node 'n_vless'
-
-config ruleset 'rs_remote'
- option enabled '1'
- option label 'rs-remote'
- option type 'remote'
- option format 'binary'
- option url 'https://example.invalid/ruleset.srs'
-
-config routing_rule 'rr_rs'
- option enabled '1'
- option label 'rr-rs'
- option action 'route'
- option outbound 'rn_main'
- option rule_set 'rs_remote'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_update_interval.uci b/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_update_interval.uci
deleted file mode 100644
index 5938da360..000000000
--- a/luci-app-homeproxy-pro/tests/fixtures/generators/ruleset_remote_update_interval.uci
+++ /dev/null
@@ -1,38 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# A remote rule-set whose update_interval is a bare number. sing-box parses
-# the field as a duration and refuses a number without a unit
-# ("time: missing unit in duration"), which rejects the whole configuration -
-# the same failure the DNS timeouts are normalised for. The form only offers
-# a placeholder ("1d"), not a format check.
-
-config homeproxy-pro 'config'
- option routing_mode 'custom'
- option proxy_mode 'redirect_tproxy'
- option ipv6_support '1'
- option log_level 'error'
-
-config homeproxy-pro 'routing'
- option default_outbound 'direct-out'
- option default_outbound_dns 'default-dns'
-
-config homeproxy-pro 'infra'
- option mixed_port '5330'
- option dns_port '5333'
- option redirect_port '5331'
- option self_mark '100'
-
-config ruleset 'rs_remote'
- option enabled '1'
- option label 'rs-remote'
- option type 'remote'
- option format 'binary'
- option url 'https://example.invalid/ruleset.srs'
- option update_interval '3600'
-
-config routing_rule 'rr_rs'
- option enabled '1'
- option label 'rr-rs'
- option action 'route'
- option outbound 'direct-out'
- option rule_set 'rs_remote'
diff --git a/luci-app-homeproxy-pro/tests/fixtures/runtime/trace.golden.txt b/luci-app-homeproxy-pro/tests/fixtures/runtime/trace.golden.txt
index 75421c238..29d7705aa 100644
--- a/luci-app-homeproxy-pro/tests/fixtures/runtime/trace.golden.txt
+++ b/luci-app-homeproxy-pro/tests/fixtures/runtime/trace.golden.txt
@@ -109,8 +109,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -303,8 +301,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -389,8 +385,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -532,8 +526,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -737,8 +729,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -837,8 +827,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -981,8 +969,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1134,8 +1120,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1220,8 +1204,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1429,8 +1411,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1496,8 +1476,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1645,8 +1623,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1829,8 +1805,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
@@ -1952,8 +1926,6 @@ nft flush chain inet fw4 homeproxy_mangle_tun
nft delete chain inet fw4 homeproxy_mangle_tun
nft flush chain inet fw4 homeproxy_mangle_tun_mark
nft delete chain inet fw4 homeproxy_mangle_tun_mark
-nft flush chain inet fw4 homeproxy_ipv6_guard
-nft delete chain inet fw4 homeproxy_ipv6_guard
nft flush set inet fw4 homeproxy_local_addr_v4
nft delete set inet fw4 homeproxy_local_addr_v4
nft flush set inet fw4 homeproxy_local_addr_v6
diff --git a/luci-app-homeproxy-pro/tests/frontend-validators.js b/luci-app-homeproxy-pro/tests/frontend-validators.js
index ee4f72865..693a19c30 100644
--- a/luci-app-homeproxy-pro/tests/frontend-validators.js
+++ b/luci-app-homeproxy-pro/tests/frontend-validators.js
@@ -133,35 +133,5 @@ check('cert path ignores an empty value',
check('cert path ignores a missing section',
hp.validateCertificatePath(null, '/etc/passwd') === true);
-/* A query type name reaches sing-box's miekg/dns uppercase table
- * (option/types.go); a lowercase name is an "unknown DNS query type" and the
- * whole configuration is refused, which the user only ever saw as the reload
- * keeping the previous state. A numeric code is valid as-is. */
-check('query type accepts an uppercase name',
- hp.validateQueryType('sec1', 'AAAA') === true);
-check('query type accepts a numeric code',
- hp.validateQueryType('sec1', '65') === true);
-check('query type rejects a lowercase name',
- isError(hp.validateQueryType('sec1', 'aaaa')));
-check('query type rejects a name with a trailing space',
- isError(hp.validateQueryType('sec1', 'A ')));
-check('query type rejects a code above 65535',
- isError(hp.validateQueryType('sec1', '70000')));
-check('query type ignores an empty value',
- hp.validateQueryType('sec1', '') === true);
-check('query type ignores a missing section',
- hp.validateQueryType(null, 'aaaa') === true);
-
-/* An uncompilable regex is not caught anywhere downstream either: sing-box
- * rejects the configuration as a whole. */
-check('regex accepts a valid pattern',
- hp.validateRegex('sec1', '^stun\\..+') === true);
-check('regex rejects an unbalanced group',
- isError(hp.validateRegex('sec1', '(unclosed')));
-check('regex ignores an empty value',
- hp.validateRegex('sec1', '') === true);
-check('regex ignores a missing section',
- hp.validateRegex(null, '(unclosed') === true);
-
console.log(`frontend validators: ${checks} checks, ${failures} failures`);
process.exit(failures ? 1 : 0);
diff --git a/luci-app-homeproxy-pro/tests/runtime/test_config_transaction.sh b/luci-app-homeproxy-pro/tests/runtime/test_config_transaction.sh
index f7e14f152..c88eafcc5 100644
--- a/luci-app-homeproxy-pro/tests/runtime/test_config_transaction.sh
+++ b/luci-app-homeproxy-pro/tests/runtime/test_config_transaction.sh
@@ -378,29 +378,5 @@ reset_samples
hp_wait_instance "sing-box-c" "$CFG" 1
expect "wait_instance (compat): times out when down" "$?" "1"
-# A reload that regenerates identical bytes must not restart the instances:
-# service_triggers() reloads on every `interface.*.up` for wan, so a flapping
-# link used to interrupt every connection for a configuration that had not
-# changed. hp_config_changed() is the decision, and it is pure shell.
-printf 'configuration one\n' > "$WORK/live.json"
-DIGEST="$(hp_file_digest "$WORK/live.json")"
-expect "digest is stable" "$(hp_file_digest "$WORK/live.json")" "$DIGEST"
-
-hp_config_changed "$WORK/live.json" "$DIGEST" && RC=1 || RC=0
-expect "an identical file is not a change" "$RC" "0"
-
-printf 'configuration two\n' > "$WORK/live.json"
-hp_config_changed "$WORK/live.json" "$DIGEST" && RC=1 || RC=0
-expect "a rewritten file is a change" "$RC" "1"
-
-hp_config_changed "$WORK/missing.json" "$DIGEST" && RC=1 || RC=0
-expect "a missing live file is a change" "$RC" "1"
-
-hp_config_changed "$WORK/live.json" "" && RC=1 || RC=0
-expect "nothing to compare against is a change" "$RC" "1"
-
-: > "$WORK/empty.json"
-expect "an empty file has no digest" "$(hp_file_digest "$WORK/empty.json")" ""
-
printf '%d checks, %d failures\n' "$CHECKS" "$FAILURES"
exit $FAILED
diff --git a/luci-app-homeproxy-pro/tests/runtime/test_dns_snippets.sh b/luci-app-homeproxy-pro/tests/runtime/test_dns_snippets.sh
index 1d4a54adf..655027569 100755
--- a/luci-app-homeproxy-pro/tests/runtime/test_dns_snippets.sh
+++ b/luci-app-homeproxy-pro/tests/runtime/test_dns_snippets.sh
@@ -242,22 +242,6 @@ expect "an unusable dns_port does not restart dnsmasq" "$(restart_count)" "$GOOD
expect "an unusable dns_port is reported in the log" \
"$(grep -c 'dns_port' "$LOG")" "1"
-echo
-echo "== proxy_mainland_china: every query goes to sing-box =="
-
-# This mode used to expand china_list.txt (111353 domains in the bundled list)
-# into one `server=` line each, which measured at about 25 MB of dnsmasq RSS on
-# a real device (1.0 MB empty, 27.2 MB with the list) for no behavioural
-# difference: the mode's dns.final is default-dns, the WAN resolver, so a
-# mainland domain resolves through the ISP either way.
-run "proxy_mainland_china"
-expect "proxy_mainland_china installs the global redirect snippet" \
- "$(exists "$DNS_DIR/redirect-dns.conf")" "yes"
-expect "proxy_mainland_china no longer expands china_list.txt" \
- "$(exists "$DNS_DIR/china_list.conf")" "no"
-expect "the redirect snippet points at sing-box" \
- "$(grep -c "server=127.0.0.1#" "$DNS_DIR/redirect-dns.conf")" "1"
-
echo
printf '%s checks, %s failures\n' "$CHECKS" "$FAILURES"
if [ "$FAILED" != 0 ]; then
diff --git a/luci-app-homeproxy-pro/tests/snapshots/client.json b/luci-app-homeproxy-pro/tests/snapshots/client.json
index b29853695..96177f007 100644
--- a/luci-app-homeproxy-pro/tests/snapshots/client.json
+++ b/luci-app-homeproxy-pro/tests/snapshots/client.json
@@ -40,6 +40,10 @@
"ruleset",
"Rule Set"
],
+ [
+ "dns_cache",
+ "DNS Settings"
+ ],
[
"control",
"Access Control"
@@ -271,7 +275,7 @@
],
"subsection": null,
"props": {
- "validate": "fn(349:31d7a7fd11ff)"
+ "validate": "fn(376:3a1eaf5f61c2)"
}
},
{
@@ -494,7 +498,7 @@
"subsection": null,
"props": {
"default": "nil",
- "load": "fn(347:1e6b4e82357b)",
+ "load": "fn(347:bdff551797c2)",
"rmempty": false
}
},
@@ -508,7 +512,7 @@
"subsection": null,
"props": {
"default": "default-dns",
- "load": "fn(326:b9d3cd52289f)",
+ "load": "fn(326:345de0db50cf)",
"rmempty": false
}
}
@@ -593,7 +597,7 @@
"values": [],
"subsection": null,
"props": {
- "load": "fn(356:8d5ad606a86f)",
+ "load": "fn(356:d9c0755071ec)",
"modalonly": true
}
},
@@ -669,7 +673,7 @@
"subsection": null,
"props": {
"editable": true,
- "load": "fn(284:01fc7f231969)",
+ "load": "fn(284:530aca6575b5)",
"validate": "fn(487:34bee8692641)"
}
},
@@ -1024,7 +1028,7 @@
"values": [],
"subsection": null,
"props": {
- "load": "fn(219:0275f2977497)",
+ "load": "fn(219:b7b6c816012f)",
"modalonly": true
}
},
@@ -1098,7 +1102,7 @@
"subsection": null,
"props": {
"editable": true,
- "load": "fn(263:a19a1b2bf7ba)",
+ "load": "fn(263:6f52e51cea77)",
"rmempty": false
}
},
@@ -1111,10 +1115,6 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
]
],
"values": [],
@@ -1133,10 +1133,6 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
]
],
"values": [],
@@ -1155,10 +1151,6 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
]
],
"values": [],
@@ -1176,10 +1168,6 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
]
],
"values": [],
@@ -1197,10 +1185,6 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
]
],
"values": [],
@@ -1219,15 +1203,7 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
- ],
- {
- "tls_fragment": "1",
- "!reverse": true
- }
+ ]
],
"values": [],
"subsection": null,
@@ -1244,15 +1220,7 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
- ],
- {
- "tls_record_fragment": "1",
- "!reverse": true
- }
+ ]
],
"values": [],
"subsection": null,
@@ -1288,10 +1256,6 @@
[
"action",
"route"
- ],
- [
- "action",
- "route-options"
]
],
"values": [],
@@ -1311,10 +1275,6 @@
"action",
"route"
],
- [
- "action",
- "route-options"
- ],
[
"tls_spoof",
{}
@@ -1361,7 +1321,7 @@
"values": [],
"subsection": null,
"props": {
- "load": "fn(356:8d5ad606a86f)",
+ "load": "fn(356:d9c0755071ec)",
"modalonly": true
}
},
@@ -1580,8 +1540,7 @@
"values": [],
"subsection": null,
"props": {
- "modalonly": true,
- "validate": "fn(184:0290625d9d6f)"
+ "modalonly": true
}
},
{
@@ -1744,8 +1703,7 @@
"values": [],
"subsection": null,
"props": {
- "modalonly": true,
- "validate": "fn(184:0290625d9d6f)"
+ "modalonly": true
}
}
],
@@ -1753,100 +1711,16 @@
},
"props": {}
},
- {
- "kind": "Value",
- "name": "dns_server",
- "title": "Overseas DNS server",
- "description": "Resolves every domain that is not on the China DNS path, through the selected proxy node. A domestic resolver answers these queries with polluted or NXDOMAIN results, which is what makes a foreign site fail to resolve while the proxy itself works - so only overseas services are offered here. Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.",
- "depends": [
- {
- "routing_mode": "custom",
- "!reverse": true
- }
- ],
- "values": [
- [
- "1.1.1.1",
- "CloudFlare Public DNS (1.1.1.1)"
- ],
- [
- "208.67.222.222",
- "Cisco Public DNS (208.67.222.222)"
- ],
- [
- "8.8.8.8",
- "Google Public DNS (8.8.8.8)"
- ]
- ],
- "subsection": null,
- "props": {
- "default": "8.8.8.8",
- "rmempty": false,
- "validate": "fn(730:48f7f360fbd2)"
- }
- },
- {
- "kind": "Value",
- "name": "china_dns_server",
- "title": "China DNS server",
- "description": "Resolves the domains on the China path, so it has to be a domestic service to get the correct local CDN answers. Keep the default; the upstream may block UDP/53, in which case a DoH address (https://dns.alidns.com/dns-query, https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT. A DoH/DoT address here also sends the bootstrap lookup back to the WAN resolver: only a bare IP can resolve the proxy DNS endpoint without the ISP.",
- "depends": [
- [
- "routing_mode",
- "bypass_mainland_china"
- ]
- ],
- "values": [
- [
- "wan",
- "WAN DNS (read from interface)"
- ],
- [
- "223.5.5.5",
- "Aliyun Public DNS (223.5.5.5)"
- ],
- [
- "210.2.4.8",
- "CNNIC Public DNS (210.2.4.8)"
- ],
- [
- "119.29.29.29",
- "Tencent Public DNS (119.29.29.29)"
- ],
- [
- "117.50.10.10",
- "ThreatBook Public DNS (117.50.10.10)"
- ]
- ],
- "subsection": null,
- "props": {
- "default": "223.5.5.5",
- "rmempty": false,
- "validate": "fn(624:299cd4e865be)"
- }
- },
- {
- "kind": "Flag",
- "name": "cn_ip_fallback",
- "title": "CN-IP DNS fallback (sing-box 1.14)",
- "description": "When the main DNS returns a mainland China IP, re-resolve via China DNS using evaluate/match_response.",
- "depends": [
- [
- "routing_mode",
- "bypass_mainland_china"
- ]
- ],
- "values": [],
- "subsection": null,
- "props": {
- "rmempty": false
- }
- },
{
"kind": "SectionValue",
"name": "_dns",
"description": "dns",
- "depends": [],
+ "depends": [
+ [
+ "routing_mode",
+ "custom"
+ ]
+ ],
"values": [],
"subsection": {
"id": "GridSection:_dns#5",
@@ -1859,12 +1733,7 @@
"name": "default_strategy",
"title": "Default DNS strategy",
"description": "The DNS strategy for resolving the domain name in the address.",
- "depends": [
- [
- "routing_mode",
- "custom"
- ]
- ],
+ "depends": [],
"values": [
[
"",
@@ -1895,17 +1764,12 @@
"name": "default_server",
"title": "Default DNS server",
"description": null,
- "depends": [
- [
- "routing_mode",
- "custom"
- ]
- ],
+ "depends": [],
"values": [],
"subsection": null,
"props": {
"default": "default-dns",
- "load": "fn(326:b9d3cd52289f)",
+ "load": "fn(326:345de0db50cf)",
"rmempty": false
}
},
@@ -1939,12 +1803,7 @@
"name": "client_subnet",
"title": "EDNS Client subnet",
"description": "Append a edns0-subnet OPT extra record with the specified IP prefix to every query by default.
If value is an IP address instead of prefix, /32 or /128 will be appended automatically.",
- "depends": [
- [
- "routing_mode",
- "custom"
- ]
- ],
+ "depends": [],
"values": [],
"subsection": null,
"props": {
@@ -2150,7 +2009,7 @@
"kind": "DynamicList",
"name": "headers",
"title": "Headers",
- "description": "Additional headers to be sent to the DNS server, one Name: Value per line.",
+ "description": "Additional headers to be sent to the DNS server.",
"depends": [
[
"type",
@@ -2205,7 +2064,7 @@
"values": [],
"subsection": null,
"props": {
- "load": "fn(384:2a0361acfbde)",
+ "load": "fn(384:9fa59da460cf)",
"modalonly": true,
"validate": "fn(322:e76c15d647fc)"
}
@@ -2259,7 +2118,7 @@
"props": {
"default": "direct-out",
"editable": true,
- "load": "fn(263:a19a1b2bf7ba)",
+ "load": "fn(263:6f52e51cea77)",
"rmempty": false
}
}
@@ -2383,8 +2242,7 @@
"values": [],
"subsection": null,
"props": {
- "modalonly": true,
- "validate": "fn(286:47dea50f33ea)"
+ "modalonly": true
}
},
{
@@ -2474,7 +2332,7 @@
"values": [],
"subsection": null,
"props": {
- "load": "fn(219:0275f2977497)",
+ "load": "fn(219:b7b6c816012f)",
"modalonly": true
}
},
@@ -2552,7 +2410,7 @@
"subsection": null,
"props": {
"editable": true,
- "load": "fn(326:b9d3cd52289f)",
+ "load": "fn(326:345de0db50cf)",
"rmempty": false
}
},
@@ -3022,8 +2880,7 @@
"values": [],
"subsection": null,
"props": {
- "modalonly": true,
- "validate": "fn(184:0290625d9d6f)"
+ "modalonly": true
}
},
{
@@ -3211,8 +3068,7 @@
"values": [],
"subsection": null,
"props": {
- "modalonly": true,
- "validate": "fn(184:0290625d9d6f)"
+ "modalonly": true
}
}
],
@@ -3290,13 +3146,9 @@
"kind": "ListValue",
"name": "format",
"title": "Format",
- "description": "Leave empty to infer it from a .json or .srs path/url; sing-box requires it for any other extension.",
+ "description": null,
"depends": [],
"values": [
- [
- "",
- "Automatic (by extension)"
- ],
[
"binary",
"Binary file"
@@ -3308,7 +3160,8 @@
],
"subsection": null,
"props": {
- "rmempty": true
+ "default": "binary",
+ "rmempty": false
}
},
{
@@ -3364,7 +3217,7 @@
"values": [],
"subsection": null,
"props": {
- "load": "fn(293:81de93c500ec)"
+ "load": "fn(293:8a1c8158e8ba)"
}
},
{
@@ -3425,6 +3278,177 @@
},
"props": {}
},
+ {
+ "kind": "Value",
+ "name": "dns_server",
+ "title": "Overseas DNS server",
+ "description": "Resolves every domain that is not on the China DNS path, through the selected proxy node. A domestic resolver answers these queries with polluted or NXDOMAIN results, which is what makes a foreign site fail to resolve while the proxy itself works - so only overseas services are offered here. Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.",
+ "depends": [
+ {
+ "routing_mode": "custom",
+ "!reverse": true
+ }
+ ],
+ "values": [
+ [
+ "1.1.1.1",
+ "CloudFlare Public DNS (1.1.1.1)"
+ ],
+ [
+ "208.67.222.222",
+ "Cisco Public DNS (208.67.222.222)"
+ ],
+ [
+ "8.8.8.8",
+ "Google Public DNS (8.8.8.8)"
+ ]
+ ],
+ "subsection": null,
+ "props": {
+ "default": "8.8.8.8",
+ "rmempty": false,
+ "validate": "fn(730:48f7f360fbd2)"
+ }
+ },
+ {
+ "kind": "Value",
+ "name": "china_dns_server",
+ "title": "China DNS server",
+ "description": "Resolves the domains on the China path, so it has to be a domestic service to get the correct local CDN answers. Keep the default; the upstream may block UDP/53, in which case a DoH address (https://dns.alidns.com/dns-query, https://doh.pub/dns-query) also works. Support UDP, TCP, DoH, DoQ, DoT.",
+ "depends": [
+ [
+ "routing_mode",
+ "bypass_mainland_china"
+ ]
+ ],
+ "values": [
+ [
+ "wan",
+ "WAN DNS (read from interface)"
+ ],
+ [
+ "223.5.5.5",
+ "Aliyun Public DNS (223.5.5.5)"
+ ],
+ [
+ "210.2.4.8",
+ "CNNIC Public DNS (210.2.4.8)"
+ ],
+ [
+ "119.29.29.29",
+ "Tencent Public DNS (119.29.29.29)"
+ ],
+ [
+ "117.50.10.10",
+ "ThreatBook Public DNS (117.50.10.10)"
+ ]
+ ],
+ "subsection": null,
+ "props": {
+ "default": "223.5.5.5",
+ "rmempty": false,
+ "validate": "fn(624:299cd4e865be)"
+ }
+ },
+ {
+ "kind": "Flag",
+ "name": "cn_ip_fallback",
+ "title": "CN-IP DNS fallback (sing-box 1.14)",
+ "description": "When the main DNS returns a mainland China IP, re-resolve via China DNS using evaluate/match_response.",
+ "depends": [
+ [
+ "routing_mode",
+ "bypass_mainland_china"
+ ]
+ ],
+ "values": [],
+ "subsection": null,
+ "props": {
+ "rmempty": false
+ }
+ },
+ {
+ "kind": "SectionValue",
+ "name": "_dns_cache",
+ "description": "dns",
+ "depends": [
+ {
+ "routing_mode": "custom",
+ "!reverse": true
+ }
+ ],
+ "values": [],
+ "subsection": {
+ "id": "GridSection:_dns_cache#9",
+ "kind": "GridSection",
+ "name": "_dns_cache",
+ "tabs": [],
+ "options": [
+ {
+ "kind": "Flag",
+ "name": "optimistic_cache",
+ "title": "Optimistic DNS cache",
+ "description": "Return expired cache immediately and refresh in background (sing-box 1.14).",
+ "depends": [
+ [
+ "disable_cache",
+ "0"
+ ],
+ [
+ "disable_cache_expire",
+ "0"
+ ]
+ ],
+ "values": [],
+ "subsection": null,
+ "props": {
+ "rmempty": false
+ }
+ },
+ {
+ "kind": "Value",
+ "name": "optimistic_timeout",
+ "title": "Optimistic cache timeout",
+ "description": "Max time an expired entry may be served. Examples: 3d, 1h.",
+ "depends": [],
+ "values": [],
+ "subsection": null,
+ "props": {}
+ },
+ {
+ "kind": "Value",
+ "name": "dns_timeout",
+ "title": "DNS query timeout",
+ "description": "Default timeout per DNS query in seconds (sing-box default: 10).",
+ "depends": [],
+ "values": [],
+ "subsection": null,
+ "props": {
+ "datatype": "uinteger"
+ }
+ },
+ {
+ "kind": "Flag",
+ "name": "cache_file_store_dns",
+ "title": "Store DNS cache",
+ "description": "Persist DNS cache across restarts (sing-box 1.14, replaces Store RDRC).",
+ "depends": [
+ [
+ "disable_cache",
+ "0"
+ ]
+ ],
+ "values": [],
+ "subsection": null,
+ "props": {
+ "rmempty": false
+ }
+ }
+ ],
+ "subsection": null
+ },
+ "props": {}
+ },
{
"kind": "SectionValue",
"name": "_control",
@@ -3432,7 +3456,7 @@
"depends": [],
"values": [],
"subsection": {
- "id": "GridSection:_control#9",
+ "id": "GridSection:_control#10",
"kind": "GridSection",
"name": "_control",
"tabs": [
@@ -3488,12 +3512,12 @@
"kind": "ListValue",
"name": "lan_proxy_mode",
"title": "Proxy filter mode",
- "description": "\"No filter\" proxies every LAN client, which is the default; the other two values select clients by the lists below.",
+ "description": null,
"depends": [],
"values": [
[
"disabled",
- "No filter (proxy every client)"
+ "Disable"
],
[
"listed_only",
diff --git a/luci-app-homeproxy-pro/tests/ucode/test_firewall_template.sh b/luci-app-homeproxy-pro/tests/ucode/test_firewall_template.sh
index 60e0dd994..e6568e9c3 100644
--- a/luci-app-homeproxy-pro/tests/ucode/test_firewall_template.sh
+++ b/luci-app-homeproxy-pro/tests/ucode/test_firewall_template.sh
@@ -96,28 +96,6 @@ if ! grep -q '\.dnsmasq-nftset' "$ROOT/root/etc/init.d/homeproxy-pro"; then
FAILED=1
fi
-# --- ipv6_support off refuses IPv6 forwarding ------------------------------
-# The DNS side answers AAAA with REFUSED, but only for clients that ask this
-# router: a cached address or a client with its own resolver still reaches the
-# WAN. The guard is therefore a forward-hook base chain of its own - fw4's
-# forward chain jumps into the zone chains, whose accept rules end the traversal
-# before anything appended at the end of it is reached - ordered ahead of fw4's
-# forward (priority mangle vs filter).
-#
-# Asserted at the source level, like the gfwlist gate below: the render uses
-# the device's own UCI, so the ipv6_support branch cannot be exercised in both
-# of its states from here.
-GUARD_COND="$(grep -c "if (ipv6_support !== '1'):" "$TEMPLATE_SRC")"
-GUARD_HOOK="$(grep -c 'type filter hook forward priority mangle' "$TEMPLATE_SRC")"
-GUARD_RULE="$(grep -c 'meta nfproto ipv6 counter reject' "$TEMPLATE_SRC")"
-
-if [ "$GUARD_COND" -ne 1 ] || [ "$GUARD_HOOK" -ne 1 ] || [ "$GUARD_RULE" -ne 1 ]; then
- echo "FAIL: the IPv6 forwarding guard is incomplete or ungated"
- echo " condition=$GUARD_COND hook=$GUARD_HOOK rule=$GUARD_RULE (each must be 1)"
- echo " a guard on priority filter would run after fw4's forward chain and never match"
- FAILED=1
-fi
-
# --- layer 2: the render -------------------------------------------------
# The render output and its stderr live beside the staged template, never at a
# fixed /tmp path. A caller that passes a work dir (tests/ucode/run.sh hands
@@ -203,14 +181,6 @@ if grep -nE "^#[^!].*homeproxy_[a-z0-9_]+ \{" "$OUT" > "/dev/null"; then
FAILED=1
fi
-# The template defaults ipv6_support to '0', so the guard chain has to appear in
-# the render both on a device without the switch set and in CI, where there is
-# no /etc/config/homeproxy-pro at all.
-if ! grep -q "^chain homeproxy_ipv6_guard {" "$OUT"; then
- echo "FAIL: the IPv6 forwarding guard chain is missing from the rendered template"
- FAILED=1
-fi
-
if [ "$FAILED" -eq 0 ]; then
echo "PASS: firewall_post.ut renders homeproxy-pro objects as standalone nft statements"
echo "PASS: the gfwlist gate follows the dnsmasq nftset capability"
diff --git a/luci-app-homeproxy-pro/tests/ucode/test_generators.sh b/luci-app-homeproxy-pro/tests/ucode/test_generators.sh
index 0e61320ba..87cf6b6a9 100755
--- a/luci-app-homeproxy-pro/tests/ucode/test_generators.sh
+++ b/luci-app-homeproxy-pro/tests/ucode/test_generators.sh
@@ -975,7 +975,7 @@ else
esac
fi
-# 3) P2 #4 / §2.2.1: the NAPTR (qtype 35) bypass suffixes must be
+# 3) P2 #4 / §2.2.1: the three NAPTR (qtype 35) bypass suffixes must be
# emitted as a single domain_suffix entry backed by the
# NAPTR_BYPASS_SUFFIXES constant. ucode's pretty-printer emits the
# query_type array and the domain_suffix array as multi-line:
@@ -983,6 +983,7 @@ fi
# 35
# ],
# "domain_suffix": [
+# "r.10086.cn",
# "10086.cn",
# "pub.3gppnetwork.org"
# ],
@@ -999,7 +1000,7 @@ else
# naptr_body should contain the three suffixes in order. If
# any is missing, the layout shifted and the test fails loud.
naptr_ok=1
- for sfx in '10086.cn' 'pub.3gppnetwork.org'; do
+ for sfx in 'r.10086.cn' '10086.cn' 'pub.3gppnetwork.org'; do
if ! printf '%s\n' "$naptr_body" | grep -q "\"$sfx\""; then
echo "FAIL: naptr-bypass-domains: NAPTR rule is missing suffix \"$sfx\""
echo " grep window:"
@@ -1008,7 +1009,7 @@ else
fi
done
if [ "$naptr_ok" = 1 ]; then
- echo "PASS: naptr-bypass-domains: qtype-35 rule domain_suffix carries every NAPTR_BYPASS_SUFFIXES entry"
+ echo "PASS: naptr-bypass-domains: qtype-35 rule domain_suffix carries the 3 NAPTR_BYPASS_SUFFIXES entries"
fi
fi
@@ -1083,220 +1084,4 @@ run_case_type_error local-ruleset-bad-path "outside the homeproxy-pro whitelist"
# covered by manual testing on r28. Re-add this case via a
# custom_extra_tags.uci fixture when convenient.
-
-# --- review 2026-09-30: fields sing-box refuses at load time ----------------
-#
-# Each of these reached sing-box as a configuration it rejects outright - an
-# unknown field, an empty action object, a mutually exclusive pair - and the
-# only symptom the user saw was "my setting did not take". The generator now
-# refuses them by name before writing anything, which is what
-# run_case_type_error observes.
-cat > "$WORK/dns-field-guard.uc" <<'EOF'
-'use strict';
-
-import { readfile } from 'fs';
-
-const config = json(readfile(ARGV[0]));
-const mode = ARGV[1];
-
-function has_aaaa() {
- for (let r in (config.dns?.rules || []))
- if (r.action === 'reject' && type(r.query_type) === 'array' && r.query_type[0] === 28)
- return true;
- return false;
-}
-
-switch (mode) {
-case 'headers':
- for (let s in (config.dns?.servers || [])) {
- if (s.tag !== 'cfg-ds_https-dns')
- continue;
- if (type(s.headers) !== 'object') {
- print('headers is not an object');
- exit(1);
- }
- if (length(s.headers['X-Test'] || []) !== 2) {
- print('X-Test is not a two-value list');
- exit(1);
- }
- if (s.headers['X-Test'][0] !== 'one' || s.headers['X-Test'][1] !== 'two') {
- print('X-Test values are wrong');
- exit(1);
- }
- if ((s.headers['Authorization'] || [])[0] !== 'Bearer t') {
- print('Authorization is wrong');
- exit(1);
- }
- print('OK');
- exit(0);
- }
- print('cfg-ds_https-dns is missing');
- exit(1);
-case 'aaaa-present':
- print(has_aaaa() ? 'OK' : 'the AAAA reject rule is missing');
- exit(has_aaaa() ? 0 : 1);
-case 'aaaa-absent':
- print(has_aaaa() ? 'an AAAA reject rule was emitted with ipv6_support on' : 'OK');
- exit(has_aaaa() ? 1 : 0);
-case 'evaluate-timeout':
- for (let r in (config.dns?.rules || []))
- if (r.action === 'evaluate') {
- print(r.timeout === '5s' ? 'OK' : 'the evaluate rule carries no 5s timeout: ' + r.timeout);
- exit(r.timeout === '5s' ? 0 : 1);
- }
- print('no evaluate DNS rule was generated');
- exit(1);
-case 'http-client-detour':
- for (let c in (config.http_clients || [])) {
- if (c.detour !== 'main-out') {
- print('an http_client detours through ' + c.detour);
- exit(1);
- }
- }
- print('OK');
- exit(0);
-case 'update-interval':
- for (let rs in (config.route?.rule_set || []))
- if (rs.tag === 'cfg-rs_remote-rule') {
- print(rs.update_interval === '3600s' ? 'OK' : 'update_interval is ' + rs.update_interval);
- exit(rs.update_interval === '3600s' ? 0 : 1);
- }
- print('cfg-rs_remote-rule is missing');
- exit(1);
-}
-print('unknown mode');
-exit(1);
-EOF
-
-assert_guard() {
- local name="$1" json="$2" mode="$3" want="$4"
- local got
-
- if [ ! -s "$json" ]; then
- echo "FAIL: $name: no configuration was generated"
- FAILED=1
- return
- fi
-
- got="$(ucode "$WORK/dns-field-guard.uc" "$json" "$mode" 2>&1)"
- if [ "$got" = "$want" ]; then
- echo "PASS: $name"
- else
- echo "FAIL: $name: $got"
- FAILED=1
- fi
-}
-
-# 1) DNS server headers: the UCI string list has to become
-# map[string][]string, not a JSON array.
-run_case dns-headers-object "$ROOT/tests/fixtures/generators/dns_headers.uci" \
- generate_client.uc sing-box-c.json
-assert_guard "dns-headers-object: the UCI list became a header object" \
- "$WORK/dns-headers-object/run/sing-box-c.json" headers OK
-
-# 2) The baseline both variations below are measured against: with the flags
-# off, the fixture has to generate and pass sing-box check. Without it a
-# refusal in 3)-5) could just as well come from the fixture itself.
-run_case dns-action-guards-baseline "$ROOT/tests/fixtures/generators/dns_action_guards.uci" \
- generate_client.uc sing-box-c.json
-
-# 3) race + speculative on one rule.
-run_case_type_error dns-race-speculative "enables both race and speculative" \
- "$ROOT/tests/fixtures/generators/dns_action_guards.uci" generate_client.uc sing-box-c.json \
- "s#option race '0'#option race '1'#; s#option speculative '0'#option speculative '1'#"
-
-# 4) race on an action that is not final (evaluate).
-run_case_type_error dns-race-final-action "race is only allowed on a final action" \
- "$ROOT/tests/fixtures/generators/dns_action_guards.uci" generate_client.uc sing-box-c.json \
- "s#option action 'route'#option action 'evaluate'#; s#option race '0'#option race '1'#"
-
-# 5) client_subnet + remove_client_subnet.
-run_case_type_error dns-client-subnet-conflict "sets both client_subnet and remove_client_subnet" \
- "$ROOT/tests/fixtures/generators/dns_action_guards.uci" generate_client.uc sing-box-c.json \
- "s#option remove_client_subnet '0'#option remove_client_subnet '1'#"
-
-# 6) route-options with no payload at all.
-run_case_type_error routing-route-options-empty "selects the route-options action but sets none of its fields" \
- "$ROOT/tests/fixtures/generators/routing_rule_route_options_empty.uci" generate_client.uc sing-box-c.json
-
-# 7) tls_fragment + tls_record_fragment.
-run_case_type_error routing-tls-fragment-conflict "enables both tls_fragment and tls_record_fragment" \
- "$ROOT/tests/fixtures/generators/routing_rule_tls_fragment.uci" generate_client.uc sing-box-c.json
-
-# 8) AAAA is refused when the router does not proxy IPv6, and left alone when
-# it does. firewall_post.ut emits no IPv6 rule at all with the switch off,
-# so a AAAA answer was the client's ticket straight out over the WAN.
-run_case ipv6-guard-off "$ROOT/tests/fixtures/generators/custom.uci" \
- generate_client.uc sing-box-c.json
-assert_guard "ipv6-guard-off: AAAA is refused while ipv6_support is off" \
- "$WORK/ipv6-guard-off/run/sing-box-c.json" aaaa-present OK
-
-run_case ipv6-guard-on "$ROOT/tests/fixtures/generators/client.uci" \
- generate_client.uc sing-box-c.json \
- "s#option ipv6_support '0'#option ipv6_support '1'#"
-assert_guard "ipv6-guard-on: no AAAA rule while ipv6_support is on" \
- "$WORK/ipv6-guard-on/run/sing-box-c.json" aaaa-absent OK
-
-# 9) evaluate carries the same timeout override as route: emitting it for
-# route only made the field silently ineffective on an evaluate rule.
-run_case dns-evaluate-timeout "$ROOT/tests/fixtures/generators/dns_action_guards.uci" \
- generate_client.uc sing-box-c.json
-assert_guard "dns-evaluate-timeout: the evaluate rule kept its query timeout" \
- "$WORK/dns-evaluate-timeout/run/sing-box-c.json" evaluate-timeout OK
-
-# 10) A bare-number update_interval is a duration to sing-box; without a unit
-# it reports "time: missing unit in duration" and refuses everything.
-run_case ruleset-update-interval "$ROOT/tests/fixtures/generators/ruleset_remote_update_interval.uci" \
- generate_client.uc sing-box-c.json
-assert_guard "ruleset-update-interval: '3600' became '3600s'" \
- "$WORK/ruleset-update-interval/run/sing-box-c.json" update-interval OK
-
-# 11) A rule pointing at a routing_node that was switched off used to emit a
-# tag nothing generates ("outbound not found: cfg-rn_off-out").
-run_case_type_error routing-disabled-node "is disabled" \
- "$ROOT/tests/fixtures/generators/routing_rule_disabled_node.uci" generate_client.uc sing-box-c.json
-
-# 12) initial_path outside the whitelist: the same gate as a local rule-set
-# path, and the same fail-loud treatment (it used to be dropped silently).
-run_case_type_error ruleset-bad-initial-path "initial_path" \
- "$ROOT/tests/fixtures/generators/ruleset_remote_bad_initial_path.uci" generate_client.uc sing-box-c.json
-
-# 13) A preset mode downloads its remote rule-sets through the main outbound,
-# not direct-out: a router that can only reach the rule-set host through
-# the proxy otherwise just logs a failed download.
-run_case ruleset-remote-preset "$ROOT/tests/fixtures/generators/ruleset_remote_preset.uci" \
- generate_client.uc sing-box-c.json
-assert_guard "ruleset-remote-preset: the remote rule-set downloads through main-out" \
- "$WORK/ruleset-remote-preset/run/sing-box-c.json" http-client-detour OK
-
-# 14) A missing china_ip4.json must not leave a `type: local` rule-set - and
-# the rule matching it - pointing at a path sing-box cannot open: that
-# fails the whole configuration, not just the rule. The mode keeps
-# working through geoip-cn. The staged bypass-mode case is reused with
-# the file removed and put back.
-CHINA_CASE="$WORK/client"
-if [ -f "$CHINA_CASE/resources/china_ip4.json" ]; then
- mv "$CHINA_CASE/resources/china_ip4.json" "$CHINA_CASE/resources/china_ip4.json.bak"
- rm -f "$CHINA_CASE/run/sing-box-c.json"
- if ( cd "$CHINA_CASE/scripts" && ucode -L "$CHINA_CASE/scripts" generate_client.uc 2>"$CHINA_CASE/missing.err" ); then
- if grep -q '"china-ip"' "$CHINA_CASE/run/sing-box-c.json"; then
- echo "FAIL: china-ip-missing: the configuration still references the missing rule-set"
- FAILED=1
- elif grep -q '"tag": "geoip-cn"' "$CHINA_CASE/run/sing-box-c.json"; then
- echo "PASS: china-ip-missing: the mainland split falls back to geoip-cn"
- else
- echo "FAIL: china-ip-missing: neither china-ip nor geoip-cn is declared"
- FAILED=1
- fi
- else
- echo "FAIL: china-ip-missing: generation failed"
- head -3 "$CHINA_CASE/missing.err"
- FAILED=1
- fi
- mv "$CHINA_CASE/resources/china_ip4.json.bak" "$CHINA_CASE/resources/china_ip4.json"
-else
- echo "FAIL: china-ip-missing: the client case did not stage china_ip4.json"
- FAILED=1
-fi
-
-exit ${FAILED:-0}
+exit ${FAILED:-0}
\ No newline at end of file
diff --git a/luci-app-homeproxy-pro/tests/ucode/test_rpc_methods.sh b/luci-app-homeproxy-pro/tests/ucode/test_rpc_methods.sh
index 737b7ada1..92dddc085 100755
--- a/luci-app-homeproxy-pro/tests/ucode/test_rpc_methods.sh
+++ b/luci-app-homeproxy-pro/tests/ucode/test_rpc_methods.sh
@@ -224,9 +224,9 @@ check('certificate_write tolerates an empty request', threw == null, threw);
* executed. Four of these were referenced by no test at all. */
const all_methods = [
'acllist_read', 'acllist_write', 'certificate_write', 'connection_check',
- 'gfw_set_counts', 'log_clean', 'node_parse', 'resources_get_version',
- 'resources_update', 'singbox_generator', 'singbox_get_features',
- 'update_subscriptions', 'update_subscriptions_status'
+ 'log_clean', 'node_parse', 'resources_get_version', 'resources_update',
+ 'singbox_generator', 'singbox_get_features', 'update_subscriptions',
+ 'update_subscriptions_status'
];
for (let m in all_methods) {
diff --git a/luci-app-wizard/luasrc/controller/wizard.lua b/luci-app-wizard/luasrc/controller/wizard.lua
index 04890f932..458419cfa 100644
--- a/luci-app-wizard/luasrc/controller/wizard.lua
+++ b/luci-app-wizard/luasrc/controller/wizard.lua
@@ -36,8 +36,12 @@ function landing_page()
if not page or page == "auto" then
if is_running("quickstart") then
target = {"admin", "quickstart"}
+ elseif is_running("routergo") then
+ target = {"admin", "routerdog"}
elseif check_wifi(uci) then
target = {"admin", "status", "dashboard"}
+ else
+ target = {"admin", "status", "overview"}
end
-- 2. 常规指定页面