From a8791f64eeef366196010fda2caf200a1d1d2891 Mon Sep 17 00:00:00 2001 From: kenzok8 Date: Sat, 20 Sep 2025 04:22:54 +0800 Subject: [PATCH] update 2025-09-20 04:22:54 --- luci-app-passwall2/Makefile | 11 +- .../{ => view/passwall2}/qrcode.min.js | 0 .../model/cbi/passwall2/client/type/ray.lua | 158 ++++++++--------- .../cbi/passwall2/client/type/sing-box.lua | 22 ++- .../model/cbi/passwall2/server/type/ray.lua | 30 +--- luci-app-passwall2/luasrc/passwall2/api.lua | 2 +- .../luasrc/passwall2/util_xray.lua | 46 ++--- .../luasrc/view/passwall2/global/backup.htm | 84 ++++----- .../passwall2/node_list/link_add_node.htm | 41 ++--- .../passwall2/node_list/link_share_man.htm | 40 ++--- luci-app-passwall2/po/zh-cn/passwall2.po | 3 - .../root/usr/share/passwall2/app.sh | 5 +- .../root/usr/share/passwall2/subscribe.lua | 19 +- .../luasrc/view/shadowsocksr/ssrurl.htm | 166 +++++++++++++++++- luci-app-ssr-plus/po/templates/ssr-plus.pot | 29 ++- luci-app-ssr-plus/po/zh_Hans/ssr-plus.po | 29 ++- .../root/usr/share/shadowsocksr/subscribe.lua | 144 +++++++++++++++ natflow/Makefile | 4 +- 18 files changed, 556 insertions(+), 277 deletions(-) rename luci-app-passwall2/htdocs/luci-static/resources/{ => view/passwall2}/qrcode.min.js (100%) diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile index bdf1f3689..ef30315bf 100644 --- a/luci-app-passwall2/Makefile +++ b/luci-app-passwall2/Makefile @@ -5,7 +5,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=luci-app-passwall2 -PKG_VERSION:=25.9.4 +PKG_VERSION:=25.9.20 PKG_RELEASE:=1 PKG_CONFIG_DEPENDS:= \ @@ -83,7 +83,7 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria config PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy bool "Include NaiveProxy" - depends on !(arc||(arm&&TARGET_gemini)||armeb||mips||mips64||powerpc) + depends on !(arc||armeb||loongarch64||mips||mips64||powerpc||TARGET_gemini) select PACKAGE_naiveproxy default n @@ -100,13 +100,13 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client bool "Include Shadowsocks Rust Client" - depends on aarch64||arm||i386||mips||mipsel||x86_64 + depends on !i386 select PACKAGE_shadowsocks-rust-sslocal - default y if aarch64 + default y if aarch64||x86_64 config PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server bool "Include Shadowsocks Rust Server" - depends on aarch64||arm||i386||mips||mipsel||x86_64 + depends on !i386 select PACKAGE_shadowsocks-rust-ssserver default n @@ -150,7 +150,6 @@ define Package/$(PKG_NAME)/conffiles /etc/config/passwall2 /etc/config/passwall2_server /usr/share/passwall2/domains_excluded -/www/luci-static/resources/qrcode.min.js endef include $(TOPDIR)/feeds/luci/luci.mk diff --git a/luci-app-passwall2/htdocs/luci-static/resources/qrcode.min.js b/luci-app-passwall2/htdocs/luci-static/resources/view/passwall2/qrcode.min.js similarity index 100% rename from luci-app-passwall2/htdocs/luci-static/resources/qrcode.min.js rename to luci-app-passwall2/htdocs/luci-static/resources/view/passwall2/qrcode.min.js diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua index 9881ef15a..b4c811fd6 100644 --- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua +++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua @@ -43,7 +43,9 @@ o:value("socks", translate("Socks")) o:value("shadowsocks", translate("Shadowsocks")) o:value("trojan", translate("Trojan")) o:value("wireguard", translate("WireGuard")) -o:value("_balancing", translate("Balancing")) +if api.compare_versions(xray_version, ">=", "1.8.12") then + o:value("_balancing", translate("Balancing")) +end o:value("_shunt", translate("Shunt")) o:value("_iface", translate("Custom Interface")) @@ -99,80 +101,86 @@ m.uci:foreach(appname, "socks", function(s) end) -- 负载均衡列表 -local o = s:option(DynamicList, _n("balancing_node"), translate("Load balancing node list"), translate("Load balancing node list, document")) +o = s:option(DynamicList, _n("balancing_node"), translate("Load balancing node list"), translate("Load balancing node list, document")) o:depends({ [_n("protocol")] = "_balancing" }) -for k, v in pairs(nodes_table) do o:value(v.id, v.remark) end +local valid_ids = {} +for k, v in pairs(nodes_table) do + o:value(v.id, v.remark) + valid_ids[v.id] = true +end +-- 去重并禁止自定义非法输入 +function o.custom_write(self, section, value) + local result = {} + if type(value) == "table" then + local seen = {} + for _, v in ipairs(value) do + if v and not seen[v] and valid_ids[v] then + table.insert(result, v) + seen[v] = true + end + end + else + result = { value } + end + api.uci:set_list(appname, section, "balancing_node", result) +end -local o = s:option(ListValue, _n("balancingStrategy"), translate("Balancing Strategy")) +o = s:option(ListValue, _n("balancingStrategy"), translate("Balancing Strategy")) o:depends({ [_n("protocol")] = "_balancing" }) o:value("random") o:value("roundRobin") o:value("leastPing") o:value("leastLoad") -o.default = "leastLoad" +o.default = "random" -- Fallback Node -if api.compare_versions(xray_version, ">=", "1.8.10") then - local o = s:option(ListValue, _n("fallback_node"), translate("Fallback Node")) - if api.compare_versions(xray_version, ">=", "1.8.12") then - o:depends({ [_n("protocol")] = "_balancing" }) - else - o:depends({ [_n("balancingStrategy")] = "leastPing" }) - end - local function check_fallback_chain(fb) - for k, v in pairs(fallback_table) do - if v.fallback == fb then - fallback_table[k] = nil - check_fallback_chain(v.id) - end +o = s:option(ListValue, _n("fallback_node"), translate("Fallback Node")) +o:value("", translate("Close(Not use)")) +o:depends({ [_n("protocol")] = "_balancing" }) +local function check_fallback_chain(fb) + for k, v in pairs(fallback_table) do + if v.fallback == fb then + fallback_table[k] = nil + check_fallback_chain(v.id) end end - -- 检查fallback链,去掉会形成闭环的balancer节点 - if is_balancer then - check_fallback_chain(arg[1]) - end - for k, v in pairs(fallback_table) do o:value(v.id, v.remark) end - for k, v in pairs(nodes_table) do o:value(v.id, v.remark) end end +-- 检查fallback链,去掉会形成闭环的balancer节点 +if is_balancer then + check_fallback_chain(arg[1]) +end +for k, v in pairs(fallback_table) do o:value(v.id, v.remark) end +for k, v in pairs(nodes_table) do o:value(v.id, v.remark) end -- 探测地址 -local ucpu = s:option(Flag, _n("useCustomProbeUrl"), translate("Use Custom Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) -ucpu:depends({ [_n("balancingStrategy")] = "leastPing" }) -ucpu:depends({ [_n("balancingStrategy")] = "leastLoad" }) +o = s:option(Flag, _n("useCustomProbeUrl"), translate("Use Custom Probe URL"), translate("By default the built-in probe URL will be used, enable this option to use a custom probe URL.")) +o:depends({ [_n("protocol")] = "_balancing" }) -local pu = s:option(Value, _n("probeUrl"), translate("Probe URL")) -pu:depends({ [_n("useCustomProbeUrl")] = true }) -pu:value("https://cp.cloudflare.com/", "Cloudflare") -pu:value("https://www.gstatic.com/generate_204", "Gstatic") -pu:value("https://www.google.com/generate_204", "Google") -pu:value("https://www.youtube.com/generate_204", "YouTube") -pu:value("https://connect.rom.miui.com/generate_204", "MIUI (CN)") -pu:value("https://connectivitycheck.platform.hicloud.com/generate_204", "HiCloud (CN)") -pu.default = "https://www.google.com/generate_204" -pu.description = translate("The URL used to detect the connection status.") +o = s:option(Value, _n("probeUrl"), translate("Probe URL")) +o:depends({ [_n("useCustomProbeUrl")] = true }) +o:value("https://cp.cloudflare.com/", "Cloudflare") +o:value("https://www.gstatic.com/generate_204", "Gstatic") +o:value("https://www.google.com/generate_204", "Google") +o:value("https://www.youtube.com/generate_204", "YouTube") +o:value("https://connect.rom.miui.com/generate_204", "MIUI (CN)") +o:value("https://connectivitycheck.platform.hicloud.com/generate_204", "HiCloud (CN)") +o.default = "https://www.google.com/generate_204" +o.description = translate("The URL used to detect the connection status.") -- 探测间隔 -local pi = s:option(Value, _n("probeInterval"), translate("Probe Interval")) -pi:depends({ [_n("balancingStrategy")] = "leastPing" }) -pi:depends({ [_n("balancingStrategy")] = "leastLoad" }) -pi.default = "1m" -pi.placeholder = "1m" -pi.description = translate("The interval between initiating probes.") .. "
" .. +o = s:option(Value, _n("probeInterval"), translate("Probe Interval")) +o:depends({ [_n("protocol")] = "_balancing" }) +o.default = "1m" +o.placeholder = "1m" +o.description = translate("The interval between initiating probes.") .. "
" .. translate("The time format is numbers + units, such as '10s', '2h45m', and the supported time units are s, m, h, which correspond to seconds, minutes, and hours, respectively.") .. "
" .. translate("When the unit is not filled in, it defaults to seconds.") -if api.compare_versions(xray_version, ">=", "1.8.12") then - ucpu:depends({ [_n("protocol")] = "_balancing" }) - pi:depends({ [_n("protocol")] = "_balancing" }) -else - ucpu:depends({ [_n("balancingStrategy")] = "leastPing" }) - pi:depends({ [_n("balancingStrategy")] = "leastPing" }) -end - o = s:option(Value, _n("expected"), translate("Preferred Node Count")) o:depends({ [_n("balancingStrategy")] = "leastLoad" }) o.datatype = "uinteger" o.default = "2" +o.placeholder = "2" o.description = translate("The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.") @@ -311,7 +319,7 @@ o:depends({ [_n("protocol")] = "vmess" }) o = s:option(Value, _n("encryption"), translate("Encrypt Method") .. " (encryption)") o.default = "none" -o:value("none") +o.placeholder = "none" o:depends({ [_n("protocol")] = "vless" }) o = s:option(ListValue, _n("ss_method"), translate("Encrypt Method")) @@ -353,7 +361,6 @@ o = s:option(Flag, _n("reality"), translate("REALITY")) o.default = 0 o:depends({ [_n("tls")] = true, [_n("transport")] = "raw" }) o:depends({ [_n("tls")] = true, [_n("transport")] = "ws" }) -o:depends({ [_n("tls")] = true, [_n("transport")] = "quic" }) o:depends({ [_n("tls")] = true, [_n("transport")] = "grpc" }) o:depends({ [_n("tls")] = true, [_n("transport")] = "httpupgrade" }) o:depends({ [_n("tls")] = true, [_n("transport")] = "xhttp" }) @@ -367,7 +374,7 @@ o:value("h3,h2") o:value("http/1.1") o:value("h2,http/1.1") o:value("h3,h2,http/1.1") -o:depends({ [_n("tls")] = true }) +o:depends({ [_n("tls")] = true, [_n("reality")] = false }) -- o = s:option(Value, _n("minversion"), translate("minversion")) -- o.default = "1.3" @@ -448,11 +455,9 @@ o = s:option(ListValue, _n("transport"), translate("Transport")) o:value("raw", "RAW (TCP)") o:value("mkcp", "mKCP") o:value("ws", "WebSocket") -o:value("ds", "DomainSocket") -o:value("quic", "QUIC") o:value("grpc", "gRPC") o:value("httpupgrade", "HttpUpgrade") -o:value("xhttp", "XHTTP (SplitHTTP)") +o:value("xhttp", "XHTTP") o:depends({ [_n("protocol")] = "vmess" }) o:depends({ [_n("protocol")] = "vless" }) o:depends({ [_n("protocol")] = "socks" }) @@ -552,24 +557,6 @@ o = s:option(Value, _n("ws_heartbeatPeriod"), translate("HeartbeatPeriod(second) o.datatype = "integer" o:depends({ [_n("transport")] = "ws" }) --- [[ DomainSocket部分 ]]-- -o = s:option(Value, _n("ds_path"), "Path", translate("A legal file path. This file must not exist before running.")) -o:depends({ [_n("transport")] = "ds" }) - --- [[ QUIC部分 ]]-- -o = s:option(ListValue, _n("quic_security"), translate("Encrypt Method")) -o:value("none") -o:value("aes-128-gcm") -o:value("chacha20-poly1305") -o:depends({ [_n("transport")] = "quic" }) - -o = s:option(Value, _n("quic_key"), translate("Encrypt Method") .. translate("Key")) -o:depends({ [_n("transport")] = "quic" }) - -o = s:option(ListValue, _n("quic_guise"), translate("Camouflage Type")) -for a, t in ipairs(header_type_list) do o:value(t) end -o:depends({ [_n("transport")] = "quic" }) - -- [[ gRPC部分 ]]-- o = s:option(Value, _n("grpc_serviceName"), "ServiceName") o:depends({ [_n("transport")] = "grpc" }) @@ -637,6 +624,7 @@ o.custom_write = function(self, section, value) local address = (data.extra and data.extra.downloadSettings and data.extra.downloadSettings.address) or (data.downloadSettings and data.downloadSettings.address) if address and address ~= "" then + address = address:gsub("^%[", ""):gsub("%]$", "") m:set(section, "download_address", address) else m:del(section, "download_address") @@ -660,34 +648,27 @@ end -- [[ Mux.Cool ]]-- o = s:option(Flag, _n("mux"), "Mux", translate("Enable Mux.Cool")) o:depends({ [_n("protocol")] = "vmess" }) -o:depends({ [_n("protocol")] = "vless", [_n("flow")] = "" }) +o:depends({ [_n("protocol")] = "vless", [_n("transport")] = "raw" }) +o:depends({ [_n("protocol")] = "vless", [_n("transport")] = "ws" }) +o:depends({ [_n("protocol")] = "vless", [_n("transport")] = "grpc" }) +o:depends({ [_n("protocol")] = "vless", [_n("transport")] = "httpupgrade" }) o:depends({ [_n("protocol")] = "http" }) o:depends({ [_n("protocol")] = "socks" }) o:depends({ [_n("protocol")] = "shadowsocks" }) o:depends({ [_n("protocol")] = "trojan" }) o = s:option(Value, _n("mux_concurrency"), translate("Mux concurrency")) -o.default = 8 +o.default = -1 o:depends({ [_n("mux")] = true }) --- [[ XUDP Mux ]]-- -o = s:option(Flag, _n("xmux"), "XUDP Mux") -o.default = 1 -o:depends({ [_n("protocol")] = "vless", [_n("flow")] = "xtls-rprx-vision" }) -o:depends({ [_n("protocol")] = "vless", [_n("flow")] = "xtls-rprx-vision-udp443" }) -o:depends({ [_n("protocol")] = "shadowsocks" }) - o = s:option(Value, _n("xudp_concurrency"), translate("XUDP Mux concurrency")) o.default = 8 -o:depends({ [_n("xmux")] = true }) +o:depends({ [_n("mux")] = true }) --[[tcpMptcp]] o = s:option(Flag, _n("tcpMptcp"), "tcpMptcp", translate("Enable Multipath TCP, need to be enabled in both server and client configuration.")) o.default = 0 -o = s:option(Flag, _n("tcpNoDelay"), "tcpNoDelay") -o.default = 0 - o = s:option(ListValue, _n("chain_proxy"), translate("Chain Proxy")) o:value("", translate("Close(Not use)")) o:value("1", translate("Preproxy Node")) @@ -714,7 +695,6 @@ end for i, v in ipairs(s.fields[_n("protocol")].keylist) do if not v:find("_") then s.fields[_n("tcpMptcp")]:depends({ [_n("protocol")] = v }) - s.fields[_n("tcpNoDelay")]:depends({ [_n("protocol")] = v }) s.fields[_n("chain_proxy")]:depends({ [_n("protocol")] = v }) end end diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua index baa73a0ef..c8dc18c7b 100644 --- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua +++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua @@ -113,7 +113,27 @@ end) --[[ URLTest ]] o = s:option(DynamicList, _n("urltest_node"), translate("URLTest node list"), translate("List of nodes to test, document")) o:depends({ [_n("protocol")] = "_urltest" }) -for k, v in pairs(nodes_table) do o:value(v.id, v.remark) end +local valid_ids = {} +for k, v in pairs(nodes_table) do + o:value(v.id, v.remark) + valid_ids[v.id] = true +end +-- 去重并禁止自定义非法输入 +function o.custom_write(self, section, value) + local result = {} + if type(value) == "table" then + local seen = {} + for _, v in ipairs(value) do + if v and not seen[v] and valid_ids[v] then + table.insert(result, v) + seen[v] = true + end + end + else + result = { value } + end + api.uci:set_list(appname, section, "urltest_node", result) +end o = s:option(Value, _n("urltest_url"), translate("Probe URL")) o:depends({ [_n("protocol")] = "_urltest" }) diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua index 4c4ace565..028bf3920 100644 --- a/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua +++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua @@ -181,13 +181,13 @@ end o = s:option(ListValue, _n("alpn"), translate("alpn")) o.default = "h2,http/1.1" -o:value("h3,h2,http/1.1") -o:value("h3,h2") -o:value("h2,http/1.1") o:value("h3") o:value("h2") +o:value("h3,h2") o:value("http/1.1") -o:depends({ [_n("tls")] = true }) +o:value("h2,http/1.1") +o:value("h3,h2,http/1.1") +o:depends({ [_n("tls")] = true, [_n("reality")] = false }) o = s:option(Flag, _n("use_mldsa65Seed"), translate("ML-DSA-65")) o.default = "0" @@ -255,8 +255,6 @@ o = s:option(ListValue, _n("transport"), translate("Transport")) o:value("raw", "RAW") o:value("mkcp", "mKCP") o:value("ws", "WebSocket") -o:value("ds", "DomainSocket") -o:value("quic", "QUIC") o:value("grpc", "gRPC") o:value("httpupgrade", "HttpUpgrade") o:value("xhttp", "XHTTP") @@ -281,7 +279,7 @@ o = s:option(Value, _n("httpupgrade_path"), translate("HttpUpgrade Path")) o.placeholder = "/" o:depends({ [_n("transport")] = "httpupgrade" }) --- [[ SplitHTTP部分 ]]-- +-- [[ XHTTP部分 ]]-- o = s:option(Value, _n("xhttp_host"), translate("XHTTP Host")) o:depends({ [_n("transport")] = "xhttp" }) @@ -360,24 +358,6 @@ o:depends({ [_n("transport")] = "mkcp" }) o = s:option(Value, _n("mkcp_seed"), translate("KCP Seed")) o:depends({ [_n("transport")] = "mkcp" }) --- [[ DomainSocket部分 ]]-- -o = s:option(Value, _n("ds_path"), "Path", translate("A legal file path. This file must not exist before running.")) -o:depends({ [_n("transport")] = "ds" }) - --- [[ QUIC部分 ]]-- -o = s:option(ListValue, _n("quic_security"), translate("Encrypt Method")) -o:value("none") -o:value("aes-128-gcm") -o:value("chacha20-poly1305") -o:depends({ [_n("transport")] = "quic" }) - -o = s:option(Value, _n("quic_key"), translate("Encrypt Key")) -o:depends({ [_n("transport")] = "quic" }) - -o = s:option(ListValue, _n("quic_guise"), translate("Camouflage Type")) -for a, t in ipairs(header_type_list) do o:value(t) end -o:depends({ [_n("transport")] = "quic" }) - -- [[ gRPC部分 ]]-- o = s:option(Value, _n("grpc_serviceName"), "ServiceName") o:depends({ [_n("transport")] = "grpc" }) diff --git a/luci-app-passwall2/luasrc/passwall2/api.lua b/luci-app-passwall2/luasrc/passwall2/api.lua index e73d030e7..033dfe92d 100644 --- a/luci-app-passwall2/luasrc/passwall2/api.lua +++ b/luci-app-passwall2/luasrc/passwall2/api.lua @@ -1005,7 +1005,7 @@ function to_download(app_name, url, size) end local _curl_args = clone(curl_args) - table.insert(_curl_args, "-m 60") + table.insert(_curl_args, "--speed-limit 51200 --speed-time 15 --max-time 300") local return_code, result = curl_logic(url, tmp_file, _curl_args) result = return_code == 0 diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua index 420e40d63..6bc1ae18d 100644 --- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua +++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua @@ -95,14 +95,11 @@ function gen_outbound(flag, node, tag, proxy_table) node.port = new_port node.stream_security = "none" else - if node.flow == "xtls-rprx-vision" then - else - if proxy_tag then - node.proxySettings = { - tag = proxy_tag, - transportLayer = true - } - end + if proxy_tag then + node.proxySettings = { + tag = proxy_tag, + transportLayer = true + } end end @@ -138,16 +135,15 @@ function gen_outbound(flag, node, tag, proxy_table) proxySettings = node.proxySettings or nil, protocol = node.protocol, mux = { - enabled = (node.mux == "1" or node.xmux == "1") and true or false, - concurrency = (node.mux == "1" and ((node.mux_concurrency) and tonumber(node.mux_concurrency) or 8)) or ((node.xmux == "1") and -1) or nil, - xudpConcurrency = (node.xmux == "1" and ((node.xudp_concurrency) and tonumber(node.xudp_concurrency) or 8)) or nil + enabled = (node.mux == "1") and true or false, + concurrency = (node.mux == "1" and ((node.mux_concurrency) and tonumber(node.mux_concurrency) or -1)) or nil, + xudpConcurrency = (node.mux == "1" and ((node.xudp_concurrency) and tonumber(node.xudp_concurrency) or 8)) or nil } or nil, -- 底层传输配置 streamSettings = (node.streamSettings or node.protocol == "vmess" or node.protocol == "vless" or node.protocol == "socks" or node.protocol == "shadowsocks" or node.protocol == "trojan") and { sockopt = { mark = 255, tcpMptcp = (node.tcpMptcp == "1") and true or nil, - tcpNoDelay = (node.tcpNoDelay == "1") and true or nil, dialerProxy = (fragment or noise) and "dialerproxy" or nil }, network = node.transport, @@ -199,13 +195,6 @@ function gen_outbound(flag, node, tag, proxy_table) earlyDataHeaderName = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil, heartbeatPeriod = tonumber(node.ws_heartbeatPeriod) or nil } or nil, - dsSettings = (node.transport == "ds") and - {path = node.ds_path} or nil, - quicSettings = (node.transport == "quic") and { - security = node.quic_security, - key = node.quic_key, - header = {type = node.quic_guise} - } or nil, grpcSettings = (node.transport == "grpc") and { serviceName = node.grpc_serviceName, multiMode = (node.grpc_mode == "multi") and true or nil, @@ -218,10 +207,10 @@ function gen_outbound(flag, node, tag, proxy_table) path = node.httpupgrade_path or "/", host = node.httpupgrade_host } or nil, - xhttpSettings = (node.transport == "xhttp" or node.transport == "splithttp") and { + xhttpSettings = (node.transport == "xhttp") and { mode = node.xhttp_mode or "auto", - path = node.xhttp_path or node.splithttp_path or "/", - host = node.xhttp_host or node.splithttp_host, + path = node.xhttp_path or "/", + host = node.xhttp_host, -- 如果包含 "extra" 节,取 "extra" 内的内容,否则直接赋值给 extra extra = node.xhttp_extra and (function() local success, parsed = pcall(jsonc.parse, node.xhttp_extra) @@ -496,14 +485,6 @@ function gen_config_server(node) host = node.ws_host or nil, path = node.ws_path } or nil, - dsSettings = (node.transport == "ds") and { - path = node.ds_path - } or nil, - quicSettings = (node.transport == "quic") and { - security = node.quic_security, - key = node.quic_key, - header = {type = node.quic_guise} - } or nil, grpcSettings = (node.transport == "grpc") and { serviceName = node.grpc_serviceName } or nil, @@ -928,7 +909,7 @@ function gen_config(var) table.insert(outbounds, copied_outbound) return copied_outbound.tag, nil else - if use_proxy and (_node.type ~= "Xray" or _node.flow == "xtls-rprx-vision") then + if use_proxy and _node.type ~= "Xray" then new_port = get_new_port() table.insert(inbounds, { tag = "proxy_" .. rule_name, @@ -1574,8 +1555,7 @@ function gen_config(var) }, streamSettings = { sockopt = { - mark = 255, - tcpNoDelay = true + mark = 255 } } }) diff --git a/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm b/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm index c96acda2c..c10c6ce81 100644 --- a/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm +++ b/luci-app-passwall2/luasrc/view/passwall2/global/backup.htm @@ -37,55 +37,57 @@ local api = require "luci.passwall2.api"