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"