diff --git a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua index ee288c80654..c858b951572 100644 --- a/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua +++ b/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua @@ -937,7 +937,7 @@ if is_finded("xray") then -- [[ uTLS ]]-- o = s:option(ListValue, "fingerprint", translate("Finger Print")) - o.default = "chrome" + o.default = "" o:value("chrome", translate("chrome")) o:value("firefox", translate("firefox")) o:value("safari", translate("safari")) @@ -1016,7 +1016,7 @@ o:depends("mux", true) -- [[ MPTCP ]]-- -o = s:option(Flag, "mptcp", translate("MPTCP")) +o = s:option(Flag, "mptcp", translate("MPTCP"), translate("Enabling MPTCP Requires Server Support.")) o.rmempty = false o.default = false o:depends({type = "v2ray", v2ray_protocol = "vless"}) diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm index f3d9f15ae72..6c11562bc93 100644 --- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm +++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm @@ -217,8 +217,9 @@ case "trojan": try { var url = new URL("http://" + ssu[1]); + var params = url.searchParams; } catch(e) { - alert(e) + alert(e); return false; } @@ -232,7 +233,65 @@ document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username); document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); - document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = url.searchParams.get("sni"); + document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get("fp") || ""; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni"); + if (params.get("allowInsecure") === "1") { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true + document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件 + } + document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value = + params.get("type") == "http" ? "h2" : + (["tcp", "raw"].includes(params.get("type")) ? "raw" : + (params.get("type") || "tcp")); + document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event); + switch (params.get("type")) { + case "ws": + if (params.get("security") !== "tls") { + setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : ""); + } + setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/"); + break; + case "httpupgrade": + if (params.get("security") !== "tls") { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : ""; + } + document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/"; + break; + case "splithttp": + if (params.get("security") !== "tls") { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : ""; + } + document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/"; + break; + case "kcp": + document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = params.get("headerType") || "none"; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get("seed") || ""; + break; + case "http": + /* this is non-standard, bullshit */ + case "h2": + document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : ""; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : ""; + break; + case "quic": + document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_guise')[0].value = params.get("headerType") || "none"; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = params.get("quicSecurity") || "none"; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = params.get("key") || ""; + break; + case "grpc": + document.getElementsByName('cbid.shadowsocksr.' + sid + '.serviceName')[0].value = params.get("serviceName") || ""; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.grpc_mode')[0].value = params.get("mode") || "gun"; + break; + case "raw": + case "tcp": + document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = params.get("headerType") || "none"; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event); + if (params.get("headerType") === "http") { + document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : ""; + document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : ""; + } + break; + } s.innerHTML = "<%:Import configuration information successfully.%>"; return false; @@ -306,7 +365,7 @@ var url = new URL("http://" + ssu[1]); var params = url.searchParams; } catch(e) { - alert(e) + alert(e); return false; } // Check if the elements exist before trying to modify them @@ -336,7 +395,7 @@ setElementValue('cbid.shadowsocksr.' + sid + '.vmess_id', url.username); setElementValue('cbid.shadowsocksr.' + sid + '.transport', params.get("type") === "http" ? "h2" : - (["tcp", "raw"].includes(params.get("type")) ? "raw" : + (["tcp", "raw"].includes(params.get("type")) ? "raw" : (params.get("type") || "tcp")) ); dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event); @@ -415,4 +474,4 @@ -<%+cbi/valuefooter%> +<%+cbi/valuefooter%> \ No newline at end of file diff --git a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po index 69dae195853..72d63bec510 100644 --- a/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po +++ b/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po @@ -91,6 +91,8 @@ msgstr "TLS 主机名" msgid "allowInsecure" msgstr "允许不安全连接" +msgid "Enabling MPTCP Requires Server Support." +msgstr "启用 MPTCP 需服务端支持。" msgid "concurrency" msgstr "TCP 最大并发连接数" diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua index d80aac1525b..1a35c92ad6c 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua @@ -283,8 +283,9 @@ end initial_windows_size = tonumber(server.initial_windows_size) or nil } or nil, sockopt = { - tcpMptcp = (server.mptcp == "1") and true or false, -- MPTCP - tcpNoDelay = (server.mptcp == "1") and true or false, -- MPTCP + mark = 250, + tcpMptcp = (server.mptcp == "1") and true or nil, -- MPTCP + tcpNoDelay = (server.mptcp == "1") and true or nil, -- MPTCP tcpcongestion = server.custom_tcpcongestion, -- 连接服务器节点的 TCP 拥塞控制算法 dialerProxy = (xray_fragment.fragment == "1" or xray_fragment.noise == "1") and "dialerproxy" or nil } @@ -321,8 +322,10 @@ if xray_fragment.fragment ~= "0" or (xray_fragment.noise ~= "0" and xray_noise.e }, streamSettings = { sockopt = { - tcpMptcp = (server.mptcp == "1") and true or false, -- MPTCP - tcpNoDelay = (server.mptcp == "1") and true or false -- MPTCP + mark = 250, + tcpMptcp = (server.mptcp == "1") and true or nil, -- MPTCP + tcpNoDelay = (server.mptcp == "1") and true or nil, -- MPTCP + tcpcongestion = server.custom_tcpcongestion -- 连接服务器节点的 TCP 拥塞控制算法 } } }) diff --git a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua index 0404be540b9..777923a18b6 100755 --- a/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua +++ b/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua @@ -319,6 +319,7 @@ local function processData(szType, content) result.server = nil end elseif szType == "trojan" then + local params = {} local idx_sp = 0 local alias = "" if content:find("#") then @@ -327,20 +328,27 @@ local function processData(szType, content) end local info = content:sub(1, idx_sp - 1) local hostInfo = split(info, "@") - local host = split(hostInfo[2], ":") local userinfo = hostInfo[1] local password = userinfo + + -- 分离服务器地址和端口 + local host = split(hostInfo[2], ":") + local server = host[1] + local port = host[2] + result.alias = UrlDecode(alias) result.type = v2_tj result.v2ray_protocol = "trojan" - result.server = host[1] + result.server = server + result.password = password + -- 按照官方的建议 默认验证ssl证书 result.insecure = "0" result.tls = "1" - if host[2]:find("?") then - local query = split(host[2], "?") + + if port:find("?") then + local query = split(port, "?") result.server_port = query[1] - local params = {} for _, v in pairs(split(query[2], '&')) do local t = split(v, '=') params[t[1]] = t[2] @@ -349,10 +357,62 @@ local function processData(szType, content) -- 未指定peer(sni)默认使用remote addr result.tls_host = params.sni end + + if params.allowInsecure then + -- 处理 insecure 参数 + result.insecure = params.allowInsecure + end else - result.server_port = host[2] + result.server_port = port + end + + if v2_tj ~= "trojan" then + if params.fp then + -- 处理 fingerprint 参数 + result.fingerprint = params.fp + end + -- 处理传输协议 + result.transport = params.type or "tcp" -- 默认传输协议为 tcp + if result.transport == "tcp" then + result.transport = "raw" + end + if result.transport == "ws" then + result.ws_host = (result.tls ~= "1") and (params.host and UrlDecode(params.host)) or nil + result.ws_path = params.path and UrlDecode(params.path) or "/" + elseif result.transport == "httpupgrade" then + result.httpupgrade_host = (result.tls ~= "1") and (params.host and UrlDecode(params.host)) or nil + result.httpupgrade_path = params.path and UrlDecode(params.path) or "/" + elseif result.transport == "splithttp" then + result.splithttp_host = (result.tls ~= "1") and (params.host and UrlDecode(params.host)) or nil + result.splithttp_path = params.path and UrlDecode(params.path) or "/" + elseif result.transport == "http" or result.transport == "h2" then + result.transport = "h2" + result.h2_host = params.host and UrlDecode(params.host) or nil + result.h2_path = params.path and UrlDecode(params.path) or nil + elseif result.transport == "kcp" then + result.kcp_guise = params.headerType or "none" + result.seed = params.seed + result.mtu = 1350 + result.tti = 50 + result.uplink_capacity = 5 + result.downlink_capacity = 20 + result.read_buffer_size = 2 + result.write_buffer_size = 2 + elseif result.transport == "quic" then + result.quic_guise = params.headerType or "none" + result.quic_security = params.quicSecurity or "none" + result.quic_key = params.key + elseif result.transport == "grpc" then + result.serviceName = params.serviceName + result.grpc_mode = params.mode or "gun" + elseif result.transport == "tcp" or result.transport == "raw" then + result.tcp_guise = params.headerType and params.headerType ~= "" and params.headerType or "none" + if result.tcp_guise == "http" then + result.tcp_host = params.host and UrlDecode(params.host) or nil + result.tcp_path = params.path and UrlDecode(params.path) or nil + end + end end - result.password = password elseif szType == "vless" then local url = URL.parse("http://" .. content) local params = url.query diff --git a/naiveproxy/Makefile b/naiveproxy/Makefile index 2ac9f6a499a..53e712feda7 100644 --- a/naiveproxy/Makefile +++ b/naiveproxy/Makefile @@ -5,12 +5,14 @@ include $(TOPDIR)/rules.mk PKG_NAME:=naiveproxy -PKG_VERSION:=129.0.6668.81-2 +PKG_REAL_VERSION:=131.0.6778.86-1 +PKG_VERSION:=$(subst -,.,$(PKG_REAL_VERSION)) PKG_RELEASE:=1 -PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz -PKG_SOURCE_URL:=https://codeload.github.com/klzgrad/naiveproxy/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=c66ac95b0a685fb84f931a267873979cd59708e8966fb9764c53fe2deb24227e +PKG_SOURCE:=$(PKG_NAME)-$(PKG_REAL_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/klzgrad/naiveproxy/tar.gz/v$(PKG_REAL_VERSION)? +PKG_HASH:=9f912ce03c7f1023e7774291c2bdd0a0c998832e49ed0d998bffa7714317e9f4 +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_REAL_VERSION) PKG_LICENSE:=BSD 3-Clause PKG_LICENSE_FILES:=LICENSE @@ -55,22 +57,22 @@ ifneq ($(CONFIG_CCACHE),) export naive_ccache_flags=cc_wrapper="$(CCACHE)" endif -CLANG_VER:=20-init-1009-g7088a5ed-10 +CLANG_VER:=20-init-6794-g3dbd929e-1 CLANG_FILE:=clang-llvmorg-$(CLANG_VER).tar.xz define Download/CLANG URL:=https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64 URL_FILE:=$(CLANG_FILE) FILE:=$(CLANG_FILE) - HASH:=32ac9d9864a6bd99242f1a97778b3a074ac1151ce3eca369903f2ef5337c787a + HASH:=ce5dea9d2f304d0f3ab07200cd2608711578f7254bf6e685bea8381c248b7686 endef -PGO_VER:=1723053597-b7a6f793b48020befd6a1e60819840a456c519b3-98f747673cbba839fedf299e6c76ac032fad32f0 -PGO_FILE:=chrome-linux-main-$(PGO_VER).profdata +PGO_VER:=6778-1731431875-75e60acd68a20cf9cc2c5d6dfbb65ee7b4e60752-a75a9b0cd4f8d4a3bb5d3446daa63b14105e852e +PGO_FILE:=chrome-linux-$(PGO_VER).profdata define Download/PGO_PROF URL:=https://storage.googleapis.com/chromium-optimization-profiles/pgo_profiles URL_FILE:=$(PGO_FILE) FILE:=$(PGO_FILE) - HASH:=f4df544116e10c5495148ee9afedbb07f4ee2659e461dbf0f69755b8d338ceec + HASH:=93ae3d2a51eb03b8314523cde26d2324998e29e60452b242bca33afdc604bc12 endef define Build/Prepare