Browse Source

Merge pull request #1699 from zxlhhyccc/custom

luci-app-ssr-plus: Optimize subscribe code and add `hy2://` format subscribe and configuration import.
zxl hhyccc 6 months ago
parent
commit
f92f56614c

+ 4 - 3
luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm

@@ -100,6 +100,7 @@ function import_ssr_url(btn, urlname, sid) {
 		event.initEvent("change", true, true);
 		switch (ssu[0]) {
 		case "hysteria2":
+		case "hy2":
 			try {
 				var url = new URL("http://" + ssu[1]);
 				var params = url.searchParams;
@@ -108,7 +109,7 @@ function import_ssr_url(btn, urlname, sid) {
 				return false;
 			}
 
-			document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
+			document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = (ssu[0] === "hy2") ? "hysteria2" : ssu[0];
 			document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
 			document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
 			document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "80";
@@ -116,7 +117,7 @@ function import_ssr_url(btn, urlname, sid) {
 				document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].checked = true;
 				document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].dispatchEvent(event);
 			}
-			if (params.get("protocol") && params.get("protocol") !== undefined) {
+			if (params.get("protocol")) {
 				document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].checked = true; // 设置 flag_transport 为 true
 				document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].dispatchEvent(event); // 触发事件
 
@@ -126,7 +127,7 @@ function import_ssr_url(btn, urlname, sid) {
 			document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].dispatchEvent(event);
 			document.getElementsByName('cbid.shadowsocksr.' + sid + '.uplink_capacity')[0].value = params.get("upmbps") || "5";
 			document.getElementsByName('cbid.shadowsocksr.' + sid + '.downlink_capacity')[0].value = params.get("downmbps") || "20";
-			if (params.get("obfs") && (params.get("obfs") !== undefined)) {
+			if (params.get("obfs")) {
 				document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].checked = true; // 设置 flag_obfs 为 true
 				document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].dispatchEvent(event); // 触发事件
 

+ 39 - 12
luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua

@@ -180,7 +180,7 @@ local function processData(szType, content)
 	if not isCompleteJSON(content) then
 		return nil
 	end
-	if szType == "hysteria2" then
+	if szType == "hysteria2" or szType == "hy2" then
 		local url = URL.parse("http://" .. content)
 		local params = url.query
 
@@ -213,7 +213,7 @@ local function processData(szType, content)
 		if params.insecure then
 			result.insecure = "1"
 			if params.sni then
-				result.pinsha256 = params.pinsha256
+				result.pinsha256 = params.pinSHA256
 			end
 		end
 	elseif szType == 'ssr' then
@@ -443,37 +443,61 @@ local function processData(szType, content)
 		local params = {}
 		local idx_sp = 0
 		local alias = ""
+
+		-- 提取别名(如果存在)
 		if content:find("#") then
 			idx_sp = content:find("#")
 			alias = content:sub(idx_sp + 1, -1)
 		end
-		local info = content:sub(1, idx_sp - 1)
+		local info = content:sub(1, idx_sp > 0 and idx_sp - 1 or #content)
 		local hostInfo = split(info, "@")
+
+		-- 基础验证
+		if #hostInfo < 2 then
+			--log("Trojan节点格式错误: 缺少@符号")
+			return nil
+		end
+
 		local userinfo = hostInfo[1]
-		local password = userinfo
+		local hostPort = hostInfo[2]
 		
 		-- 分离服务器地址和端口
-		local host = split(hostInfo[2], ":")
-		local server = host[1]
-		local port = host[2]
+		local hostParts = split(hostPort, ":")
+
+		local server = hostParts[1]
+		local port = hostParts[2]
+
+		-- 验证服务器地址和端口
+		if #hostParts < 2 then
+			--log("Trojan节点格式错误: 缺少端口号")
+			return nil
+		end
 
 		result.alias = UrlDecode(alias)
 		result.type = v2_tj
 		result.v2ray_protocol = "trojan"
 		result.server = server
-		result.password = password
+		result.password = userinfo
 
+		-- 默认设置
 		-- 按照官方的建议 默认验证ssl证书
 		result.insecure = "0"
 		result.tls = "1"
 
+		-- 解析查询参数(如果存在)
 		if port:find("?") then
-			local query = split(port, "?")
-			result.server_port = query[1]
-			for _, v in pairs(split(query[2], '&')) do
+			local queryParts = split(port, "?")
+			result.server_port = queryParts[1]
+
+			-- 解析查询参数
+			for _, v in pairs(split(queryParts[2], '&')) do
 				local t = split(v, '=')
-				params[t[1]] = t[2]
+				if #t >= 2 then
+					params[t[1]] = t[2]
+				end
 			end
+
+			-- 处理参数
 			if params.alpn then
 				-- 处理 alpn 参数
 				result.xhttp_alpn = params.alpn
@@ -651,6 +675,9 @@ local function processData(szType, content)
 end
 -- wget
 local function wget(url)
+	-- 清理URL中的隐藏字符
+	url = url:gsub("%s+$", ""):gsub("^%s+", ""):gsub("%z", "")
+
 	local stdout = luci.sys.exec('wget-ssl --timeout=20 --tries=3 -q --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" --no-check-certificate -O- "' .. url .. '"')
 	return trim(stdout)
 end