mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-31 17:55:13 +08:00
🗽 Sync 2026-09-18 20:49:54
This commit is contained in:
1 parent
31e2e4316b
commit
bdfd06d2c8
61 files changed
+19500
-59
No files matched your search
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-passwall
|
||||
PKG_VERSION:=26.9.16
|
||||
PKG_RELEASE:=279
|
||||
PKG_RELEASE:=280
|
||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||
|
||||
PKG_CONFIG_DEPENDS:= \
|
||||
|
||||
@@ -691,12 +691,40 @@ local current_node = map:get(section)
|
||||
params += opt.query("congestion_control", dom_prefix + "naive_congestion_control");
|
||||
}
|
||||
|
||||
params += "#" + encodeURI(v_alias.value);
|
||||
if (params[0] == "&") {
|
||||
params = params.substring(1);
|
||||
}
|
||||
url += params;
|
||||
} else if (v_type === "sing-box" && opt.get(dom_prefix + "protocol").value === "snell") {
|
||||
protocol = "snell";
|
||||
var v_userkey = opt.get(dom_prefix + "password");
|
||||
var v_psk = opt.get(dom_prefix + "snell_psk");
|
||||
var v_port = opt.get(dom_prefix + "port");
|
||||
url = encodeURIComponent(v_psk.value) +
|
||||
"@" + _address +
|
||||
":" + v_port.value + "?";
|
||||
|
||||
var params = "psk=" + encodeURIComponent(v_psk.value);
|
||||
if (v_userkey.value !== "") {
|
||||
params += "&userkey=" + encodeURIComponent(v_userkey.value);
|
||||
}
|
||||
params += opt.query("version", dom_prefix + "snell_version");
|
||||
if (opt.get(dom_prefix + "snell_version").value === '4') {
|
||||
params += opt.query("obfs", dom_prefix + "snell_obfs_mode");
|
||||
params += opt.query("obfs-host", dom_prefix + "snell_obfs_host");
|
||||
} else {
|
||||
params += opt.query("mode", dom_prefix + "snell_mode");
|
||||
}
|
||||
params += opt.query("reuse", dom_prefix + "snell_reuse");
|
||||
|
||||
params += "#" + encodeURI(v_alias.value);
|
||||
if (params[0] == "&") {
|
||||
params = params.substring(1);
|
||||
}
|
||||
url += params;
|
||||
}
|
||||
|
||||
if (url) {
|
||||
url = protocol.toLowerCase() + "://" + url;
|
||||
return url;
|
||||
@@ -1705,6 +1733,37 @@ local current_node = map:get(section)
|
||||
opt.set('remarks', decodeURIComponent(hash.substr(1)));
|
||||
}
|
||||
}
|
||||
if (link_type === "snell") {
|
||||
if (has_singbox) {
|
||||
dom_prefix = "singbox_";
|
||||
opt.set('type', "sing-box");
|
||||
}
|
||||
opt.set(dom_prefix + 'protocol', "snell");
|
||||
var m = parseNodeUrl(link);
|
||||
opt.set(dom_prefix + 'address', unbracketIP(m.hostname));
|
||||
opt.set(dom_prefix + 'port', m.port || "443");
|
||||
var queryParam = {};
|
||||
if (m.search.length > 1) {
|
||||
var query = m.search.replace('/?', '?').split('?')
|
||||
var queryParams = query[1];
|
||||
var queryArray = queryParams.split('&');
|
||||
var params;
|
||||
for (i = 0; i < queryArray.length; i++) {
|
||||
params = queryArray[i].split('=');
|
||||
queryParam[decodeURIComponent(params[0]).toLowerCase()] = decodeURIComponent(params[1] || '');
|
||||
}
|
||||
}
|
||||
opt.set(dom_prefix + 'password', queryParam.userkey || '');
|
||||
opt.set(dom_prefix + 'snell_psk', queryParam.psk || m.passwd || '');
|
||||
opt.set(dom_prefix + 'snell_version', queryParam.version || '4');
|
||||
opt.set(dom_prefix + 'snell_reuse', queryParam.reuse === '1');
|
||||
opt.set(dom_prefix + 'snell_obfs_mode', queryParam.obfs || 'none');
|
||||
opt.set(dom_prefix + 'snell_obfs_host', queryParam['obfs-host'] || queryParam.obfs_host || '');
|
||||
opt.set(dom_prefix + 'snell_mode', queryParam.mode || 'default');
|
||||
if (m.hash) {
|
||||
opt.set('remarks', decodeURIComponent(m.hash.substr(1)));
|
||||
}
|
||||
}
|
||||
|
||||
if (switch_type) {
|
||||
sessionStorage.setItem("fromUrl", JSON.stringify({
|
||||
|
||||
@@ -1494,7 +1494,7 @@ msgid "Private Key"
|
||||
msgstr "私钥"
|
||||
|
||||
msgid "Pre shared key"
|
||||
msgstr "额外的对称加密密钥"
|
||||
msgstr "预共享密钥"
|
||||
|
||||
msgid "Allowed IPs"
|
||||
msgstr "允许的 IP"
|
||||
|
||||
@@ -513,6 +513,42 @@ local function encode_ssr(node)
|
||||
return 0, "ssr://" .. base64(link)
|
||||
end
|
||||
|
||||
-- snell
|
||||
local function encode_snell(node)
|
||||
local err_msg
|
||||
local obfs = node["obfs-opts"]
|
||||
if obfs and obfs.mode ~= "http" and obfs.mode ~= "none" then
|
||||
err_msg = obfs.mode
|
||||
end
|
||||
if err_msg then
|
||||
err_msg = "订阅转换 → 丢弃 Snell 节点:" .. (node.name or "") .. ",因 Sing-Box 不支持 Snell + " .. err_msg
|
||||
return 1, err_msg
|
||||
end
|
||||
local version = node.version and tonumber(node.version) or 4
|
||||
version = (version == 5) and 4 or version
|
||||
if version < 4 then
|
||||
err_msg = "订阅转换 → 丢弃 Snell 节点:" .. (node.name or "") .. ",因 Sing-Box 不支持 Snell 版本小于 4"
|
||||
return 1, err_msg
|
||||
end
|
||||
|
||||
local link = "snell://" .. host_format(node.server) .. ":" .. node.port
|
||||
local p = {}
|
||||
|
||||
if node.psk then table.insert(p, "psk=" .. urlencode(node.psk)) end
|
||||
table.insert(p, "version=" .. version)
|
||||
if obfs.mode == "http" then
|
||||
table.insert(p, "obfs=http")
|
||||
if obfs.host then table.insert(p, "obfs-host=" .. urlencode(obfs.host)) end
|
||||
end
|
||||
table.insert(p, "reuse=" .. (node.reuse and "1" or "0"))
|
||||
|
||||
if #p > 0 then
|
||||
link = link .. "?" .. table.concat(p, "&")
|
||||
end
|
||||
|
||||
return 0, link .. "#" .. urlencode(node.name or "")
|
||||
end
|
||||
|
||||
local function encode_node(node)
|
||||
if (not node.type) or (not node.name) then return nil end
|
||||
|
||||
@@ -529,6 +565,7 @@ local function encode_node(node)
|
||||
elseif t == "tuic" then return encode_tuic(node)
|
||||
elseif t == "anytls" then return encode_anytls(node)
|
||||
elseif t == "ssr" then return encode_ssr(node)
|
||||
elseif t == "snell" then return encode_snell(node)
|
||||
else api.log("订阅转换 → 丢弃不支持的节点:" .. node.name .. ",节点类型:" .. t)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1628,6 +1628,62 @@ local function processData(szType, content, add_mode, group, sub_cfg)
|
||||
result.naive_quic = "1"
|
||||
result.naive_congestion_control = params.congestion_control or "bbr"
|
||||
end
|
||||
elseif szType == "snell" then
|
||||
if has_singbox then
|
||||
result.type = 'sing-box'
|
||||
result.protocol = "snell"
|
||||
else
|
||||
log("跳过 Snell 节点,因未安装 Snell 核心程序 Sing-box 1.14。")
|
||||
return nil
|
||||
end
|
||||
|
||||
local alias = ""
|
||||
if content:find("#") then
|
||||
local idx_sp = content:find("#")
|
||||
alias = content:sub(idx_sp + 1, -1)
|
||||
content = content:sub(0, idx_sp - 1)
|
||||
end
|
||||
result.remarks = UrlDecode(alias)
|
||||
local Info = content
|
||||
if content:find("@") then
|
||||
local info = split(content, "@")
|
||||
result.snell_psk = UrlDecode(info[1])
|
||||
Info = info[2]
|
||||
end
|
||||
Info = (Info or ""):gsub("/%?", "?")
|
||||
local query = split(Info, "%?")
|
||||
local host_port = query[1]
|
||||
local params = {}
|
||||
for _, v in pairs(split(query[2], '&')) do
|
||||
local s = v:find("=", 1, true)
|
||||
if s and s > 1 then
|
||||
params[UrlDecode(v:sub(1, s - 1)):lower()] = UrlDecode(v:sub(s + 1))
|
||||
end
|
||||
end
|
||||
-- [2001:4860:4860::8888]:443
|
||||
-- 8.8.8.8:443
|
||||
result.port = "443"
|
||||
if host_port:find(":") then
|
||||
local sp = split(host_port, ":")
|
||||
result.port = sp[#sp]
|
||||
if api.is_ipv6addrport(host_port) then
|
||||
result.address = api.get_ipv6_only(host_port)
|
||||
else
|
||||
result.address = sp[1]
|
||||
end
|
||||
else
|
||||
result.address = host_port
|
||||
end
|
||||
result.snell_psk = params.psk or result.snell_psk
|
||||
result.password = params.userkey
|
||||
result.snell_version = params.version or "4"
|
||||
if result.snell_version == "4" then
|
||||
result.snell_obfs_mode = params.obfs or "none"
|
||||
result.snell_obfs_host = params['obfs-host'] or params.obfs_host
|
||||
else
|
||||
result.snell_mode = params.mode or "default"
|
||||
end
|
||||
result.snell_reuse = (params.reuse == "1") and "1" or "0"
|
||||
else
|
||||
log("暂时不支持 " .. szType .. " 类型的节点订阅,跳过此节点。")
|
||||
return nil
|
||||
|
||||
Reference in new issue
Block a user