Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ local m, s, o

local sid = arg[1]
local uuid = luci.sys.exec("cat /proc/sys/kernel/random/uuid")
local xray_version = nil

-- 确保正确判断程序是否存在
local function is_finded(e)
Expand All @@ -22,6 +23,14 @@ local function is_installed(e)
return luci.model.ipkg.installed(e)
end

-- 获取 Xray 版本号
if is_finded("xray") then
local version = luci.sys.exec("xray version 2>&1")
if version and version ~= "" then
xray_version = version:match("Xray%s+([%d%.]+)")
end
end

-- 默认的保存并应用行为
local function apply_redirect(m)
local tmp_uci_file = "/etc/config/" .. "shadowsocksr" .. "_redirect"
Expand Down Expand Up @@ -1266,17 +1275,43 @@ o:depends("tuic_dual_stack", true)
-- [[ allowInsecure ]]--
o = s:option(Flag, "insecure", translate("allowInsecure"))
o.rmempty = false
o:depends("tls", true)
o:depends("type", "hysteria2")
o:depends("type", "trojan")
o:depends("type", "tuic")
o:depends({type = "v2ray", v2ray_protocol = "vless", reality = true})
o.description = translate("If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.")
-- Xray 的26.1.31 以下版本使用
if xray_version and xray_version ~= "" then
-- 提取所有数字部分,允许版本号有1到3个部分,不足部分补0
local major, minor, patch =
xray_version:match("(%d+)%.?(%d*)%.?(%d*)")
-- 将字符串转换为数字,空字符串转为0
major = tonumber(major) or 0
minor = tonumber(minor) or 0
patch = tonumber(patch) or 0
-- 如果版本低于 26.1.31
if (major * 10000 + minor * 100 + patch) < 260131 then
o:depends("tls", true)
o:depends({ type = "v2ray", v2ray_protocol = "vless", reality = true })
end
end

-- [[ Hysteria2 TLS pinSHA256 ]] --
o = s:option(Value, "pinsha256", translate("Certificate fingerprint"))
o:depends("type", "hysteria2")
o.rmempty = true

-- [[ Xray TLS pinSHA256 ]] --
o = s:option(Value, "chain_fingerprint", translate("TLS Chain Fingerprint (SHA256)"), translate("Once set, connects only when the server’s chain fingerprint matches."))
o.rmempty = true
o:depends({type = "v2ray", tls = true})
o:depends({type = "v2ray", reality = true})

-- [[ Xray TLS verify leaf certificate name ]] --
o = s:option(Value, "verify_name", translate("TLS Certificate Name (CertName)"), translate("TLS is used to verify the leaf certificate name."))
o.rmempty = true
o:depends({type = "v2ray", tls = true})
o:depends({type = "v2ray", reality = true})

-- [[ Mux.Cool ]] --
o = s:option(Flag, "mux", translate("Mux"), translate("Enable Mux.Cool"))
o.rmempty = false
Expand Down
40 changes: 35 additions & 5 deletions luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@

document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport_protocol')[0].value = params.get("protocol") || "udp";
}

if (params.get("pinSHA256")) {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.pinsha256')[0].value = params.get("pinSHA256") || "";
}
Expand All @@ -131,6 +130,13 @@
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = (ssu[0] === "hy2") ? "hysteria2" : ssu[0];
document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);

if (params.get("pcs")) {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.chain_fingerprint')[0].value = params.get("pcs") || "";
}
if (params.get("vcn")) {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.verify_name')[0].value = params.get("vcn") || "";
}
}
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "443";
Expand Down Expand Up @@ -167,10 +173,10 @@
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get("alpn") || "";
}
}
if (params.get("insecure") === "1") {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true;
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event);
}
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked =
!!(params.get("insecure") ?? params.get("allowInsecure")); // 设置 insecure true
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件

document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";

s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
Expand Down Expand Up @@ -398,6 +404,12 @@
setElementValue('cbid.shadowsocksr.' + sid + '.reality_mldsa65verify', params.pqv || "");
}
}
if (params.pcs && params.pcs.trim() !== "") {
setElementValue('cbid.shadowsocksr.' + sid + '.chain_fingerprint', params.pcs);
}
if (params.vcn && params.vcn.trim() !== "") {
setElementValue('cbid.shadowsocksr.' + sid + '.verify_name', params.vcn);
}
setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.flow || "none");
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);

Expand Down Expand Up @@ -557,6 +569,12 @@
if (params.get("security") === "tls") {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get("alpn") || "";
document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get("fp") || "";
if (params.get("pcs") && params.get("pcs").trim() !== "") {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.chain_fingerprint')[0].value = params.get("pcs");
}
if (params.get("vcn") && params.get("vcn").trim() !== "") {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.verify_name')[0].value = params.get("vcn");
}
}
switch (params.get("type")) {
case "ws":
Expand Down Expand Up @@ -692,6 +710,12 @@
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].dispatchEvent(event); // 触发事件
document.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = ssm.ech;
}
if (params.pcs && params.pcs.trim() !== "") {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.chain_fingerprint')[0].value = ssm.pcs;
}
if (params.vcn && params.vcn.trim() !== "") {
document.getElementsByName('cbid.shadowsocksr.' + sid + '.verify_name')[0].value = ssm.vcn;
}
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked =
!!(ssm.allowInsecure ?? ssm.allowlnsecure ?? ssm['skip-cert-verify']); // 设置 insecure 为 true
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件
Expand Down Expand Up @@ -776,6 +800,12 @@
setElementValue('cbid.shadowsocksr.' + sid + '.reality_mldsa65verify', params.get("pqv") || "");
}
}
if (params.get("pcs") && params.get("pcs").trim() !== "") {
setElementValue('cbid.shadowsocksr.' + sid + '.chain_fingerprint', params.get("pcs"));
}
if (params.get("vcn") && params.get("vcn").trim() !== "") {
setElementValue('cbid.shadowsocksr.' + sid + '.verify_name', params.get("vcn"));
}

setElementValue('cbid.shadowsocksr.' + sid + '.tls_alpn', params.get("alpn") || "");
setElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get("fp") || "");
Expand Down
Loading