Browse Source

Merge pull request #1747 from zxlhhyccc/custom

luci-app-ssr-plus: Add `ss` new format `URL encode` subscribe.
zxl hhyccc 3 months ago
parent
commit
cc7e72bd8e

+ 19 - 2
luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm

@@ -170,8 +170,8 @@ function import_ssr_url(btn, urlname, sid) {
 				url0 = url0.substring(0, hashIndex);
 				url0 = url0.substring(0, hashIndex);
 			}
 			}
 
 
-			// 再分离 ?(参数)
-			var queryIndex = url0.indexOf("?");
+			// 再分离 ? 或 /?(参数)
+			var queryIndex = (url0 = url0.replace('/?', '?')).indexOf("?");
 			var queryStr = "";
 			var queryStr = "";
 			if (queryIndex >= 0) {
 			if (queryIndex >= 0) {
 				queryStr = url0.substring(queryIndex + 1);
 				queryStr = url0.substring(queryIndex + 1);
@@ -247,6 +247,23 @@ function import_ssr_url(btn, urlname, sid) {
 				}
 				}
 			}
 			}
 
 
+			// 判断密码是否经过url编码
+			const isURLEncodedPassword = function(pwd) {
+				if (!/%[0-9A-Fa-f]{2}/.test(pwd)) return false;
+				try {
+					const decoded = decodeURIComponent(pwd.replace(/\+/g, "%20"));
+					const reencoded = encodeURIComponent(decoded);
+					return reencoded === pwd;
+				} catch (e) {
+					return false;
+				}
+			}
+			if (isURLEncodedPassword(password)) {
+				password = decodeURIComponent(password); // 解码URL编码
+			} else {
+				password = password; // 保持原始值
+			}
+
 			// === 填充配置项 ===
 			// === 填充配置项 ===
 			var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev";
 			var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev";
 
 

+ 15 - 1
luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua

@@ -352,7 +352,7 @@ local function processData(szType, content)
 		if idx_sp > 0 then
 		if idx_sp > 0 then
 			alias = UrlDecode(content:sub(idx_sp + 1))
 			alias = UrlDecode(content:sub(idx_sp + 1))
 		end
 		end
-		local info = content:sub(1, idx_sp > 0 and idx_sp - 1 or #content)
+		local info = content:sub(1, idx_sp > 0 and idx_sp - 1 or #content):gsub("/%?", "?")
 
 
 		-- 拆 base64 主体和 ? 参数部分
 		-- 拆 base64 主体和 ? 参数部分
 		local uri_main, query_str = info:match("^([^?]+)%??(.*)$")
 		local uri_main, query_str = info:match("^([^?]+)%??(.*)$")
@@ -407,6 +407,20 @@ local function processData(szType, content)
 		method = userinfo:sub(1, split_pos - 1)
 		method = userinfo:sub(1, split_pos - 1)
 		password = userinfo:sub(split_pos + 1)
 		password = userinfo:sub(split_pos + 1)
 
 
+		-- 判断密码是否经过url编码
+		local function isURLEncodedPassword(pwd)
+			if not pwd:find("%%[0-9A-Fa-f][0-9A-Fa-f]") then
+				return false
+			end
+				local ok, decoded = pcall(UrlDecode, pwd)
+				return ok and urlEncode(decoded) == pwd
+		end
+
+		local decoded = UrlDecode(password)
+			if isURLEncodedPassword(password) and decoded then
+				password = decoded
+		end
+
 		-- 解析服务器地址和端口(兼容 IPv6)
 		-- 解析服务器地址和端口(兼容 IPv6)
 		if host_port:find("^%[.*%]:%d+$") then
 		if host_port:find("^%[.*%]:%d+$") then
 			server, port = host_port:match("^%[(.*)%]:(%d+)$")
 			server, port = host_port:match("^%[(.*)%]:(%d+)$")