Bug fixes

1. 当 VMess 的 alterId 为 0 时,AEAD 会自动开启。
2. 更新了 Clash 的 VMess Websocket 参数写法,旧版本的写法(如 ws-path, ws-headers 等)已不被支持。
This commit is contained in:
Peng-YM 2022-03-25 22:54:42 +08:00
parent 991bedd663
commit 0a96cb9df1
2 changed files with 39 additions and 29 deletions

View File

@ -873,8 +873,7 @@ function service() {
return "Loon"; return "Loon";
} else if (UA.indexOf("Stash") !== -1) { } else if (UA.indexOf("Stash") !== -1) {
return "Clash"; return "Clash";
} } else {
else {
return null; return null;
} }
} }
@ -1305,14 +1304,14 @@ var ProxyUtils = (function () {
// handle ws headers // handle ws headers
if (params.obfs === "ws" || params.obfs === "wss") { if (params.obfs === "ws" || params.obfs === "wss") {
proxy.network = "ws"; proxy.network = "ws";
proxy["ws-path"] = (params["obfs-path"] || '"/"').match( proxy["ws-opts"].path = (params["obfs-path"] || '"/"').match(
/^"(.*)"$/ /^"(.*)"$/
)[1]; )[1];
let obfs_host = params["obfs-header"]; let obfs_host = params["obfs-header"];
if (obfs_host && obfs_host.indexOf("Host") !== -1) { if (obfs_host && obfs_host.indexOf("Host") !== -1) {
obfs_host = obfs_host.match(/Host:\s*([a-zA-Z0-9-.]*)/)[1]; obfs_host = obfs_host.match(/Host:\s*([a-zA-Z0-9-.]*)/)[1];
} }
proxy["ws-headers"] = { proxy["ws-opts"].headers = {
Host: obfs_host || proxy.server, // if no host provided, use the same as server Host: obfs_host || proxy.server, // if no host provided, use the same as server
}; };
} }
@ -1345,10 +1344,10 @@ var ProxyUtils = (function () {
// handle obfs // handle obfs
if (params.net === "ws") { if (params.net === "ws") {
proxy.network = "ws"; proxy.network = "ws";
proxy["ws-path"] = params.path; proxy["ws-opts"] = {
proxy["ws-headers"] = { path: params.path,
Host: params.host || params.add, headers: {Host: params.host || params.add}
}; }
if (proxy.tls && params.host) { if (proxy.tls && params.host) {
proxy.sni = params.host; proxy.sni = params.host;
} }
@ -1538,9 +1537,11 @@ var ProxyUtils = (function () {
// handle ws headers // handle ws headers
if (params.obfs === "ws" || params.obfs === "wss") { if (params.obfs === "ws" || params.obfs === "wss") {
proxy.network = "ws"; proxy.network = "ws";
proxy["ws-path"] = params["obfs-uri"]; proxy["ws-opts"] = {
proxy["ws-headers"] = { path: params["obfs-uri"],
Host: params["obfs-host"] || params.server, // if no host provided, use the same as server headers: {
Host: params["obfs-host"] || params.server, // if no host provided, use the same as server
}
}; };
} }
return proxy; return proxy;
@ -1725,9 +1726,11 @@ var ProxyUtils = (function () {
break; break;
case "ws": case "ws":
proxy.network = params.transport; proxy.network = params.transport;
proxy["ws-path"] = params.path; proxy["ws-opts"] = {
proxy["ws-headers"] = { path: params.path,
Host: params.host, headers: {
Host: params.host,
}
}; };
} }
if (proxy.tls) { if (proxy.tls) {
@ -1869,10 +1872,13 @@ var ProxyUtils = (function () {
// use websocket // use websocket
if (JSON.parse(params.ws || "false")) { if (JSON.parse(params.ws || "false")) {
proxy.network = "ws"; proxy.network = "ws";
proxy["ws-path"] = params["ws-path"]; proxy["ws-opts"] = {
path: params["ws-path"]
};
const res = params["ws-headers"].match(/(,|^|\s)*HOST:\s*(.*?)(,|$)/); const res = params["ws-headers"].match(/(,|^|\s)*HOST:\s*(.*?)(,|$)/);
const host = res ? res[2] : proxy.server; const host = res ? res[2] : proxy.server;
proxy["ws-headers"] = { proxy["ws-opts"].headers = {
Host: host || params.server, Host: host || params.server,
}; };
} }
@ -2477,15 +2483,15 @@ var ProxyUtils = (function () {
if (proxy.tls) { if (proxy.tls) {
// ws-tls // ws-tls
obfs_opts = `,obfs=wss${proxy.sni ? ",obfs-host=" + proxy.sni : "" obfs_opts = `,obfs=wss${proxy.sni ? ",obfs-host=" + proxy.sni : ""
}${proxy["ws-path"] ? ",obfs-uri=" + proxy["ws-path"] : "" }${proxy["ws-opts"].path ? ",obfs-uri=" + proxy["ws-opts"].path : ""
},tls-verification=${proxy["skip-cert-verify"] ? "false" : "true" },tls-verification=${proxy["skip-cert-verify"] ? "false" : "true"
}`; }`;
} else { } else {
// ws // ws
obfs_opts = `,obfs=ws${proxy["ws-headers"].Host obfs_opts = `,obfs=ws${proxy["ws-opts"].headers.Host
? ",obfs-host=" + proxy["ws-headers"].Host ? ",obfs-host=" + proxy["ws-opts"].headers.Host
: "" : ""
}${proxy["ws-path"] ? ",obfs-uri=" + proxy["ws-path"] : ""}`; }${proxy["ws-opts"].path ? ",obfs-uri=" + proxy["ws-opts"].path : ""}`;
} }
} else { } else {
// tcp // tcp
@ -2498,6 +2504,7 @@ var ProxyUtils = (function () {
let result = `vmess=${proxy.server}:${proxy.port},method=${proxy.cipher === "auto" ? "none" : proxy.cipher let result = `vmess=${proxy.server}:${proxy.port},method=${proxy.cipher === "auto" ? "none" : proxy.cipher
},password=${proxy.uuid}${obfs_opts}${proxy.tfo ? ",fast-open=true" : ",fast-open=false" },password=${proxy.uuid}${obfs_opts}${proxy.tfo ? ",fast-open=true" : ",fast-open=false"
}${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"}`; }${proxy.udp ? ",udp-relay=true" : ",udp-relay=false"}`;
if (proxy.alterId === 0) proxy['vmess-aead'] = true;
if (typeof proxy['vmess-aead'] !== "undefined") { if (typeof proxy['vmess-aead'] !== "undefined") {
result += `,aead=${proxy['vmess-aead']}`; result += `,aead=${proxy['vmess-aead']}`;
} }
@ -2529,7 +2536,7 @@ var ProxyUtils = (function () {
function Loon_Producer() { function Loon_Producer() {
const targetPlatform = "Loon"; const targetPlatform = "Loon";
const produce = (proxy) => { const produce = (proxy) => {
let obfs_opts, tls_opts, udp_opts, tfo_opts; let obfs_opts = "", tls_opts = "", udp_opts = "", tfo_opts = "";
if (typeof proxy.udp !== "undefined") { if (typeof proxy.udp !== "undefined") {
udp_opts = proxy.udp ? ",udp=true" : ",udp=false"; udp_opts = proxy.udp ? ",udp=true" : ",udp=false";
} }
@ -2559,8 +2566,8 @@ var ProxyUtils = (function () {
case "vmess": case "vmess":
obfs_opts = ""; obfs_opts = "";
if (proxy.network === "ws") { if (proxy.network === "ws") {
const host = proxy["ws-headers"].Host || proxy.server; const host = proxy["ws-opts"].headers.Host || proxy.server;
obfs_opts = `,transport:ws,host:${host},path:${proxy["ws-path"] || "/" obfs_opts = `,transport:ws,host:${host},path:${proxy["ws-opts"].path || "/"
}`; }`;
} else { } else {
obfs_opts = `,transport:tcp`; obfs_opts = `,transport:tcp`;
@ -2571,6 +2578,7 @@ var ProxyUtils = (function () {
} }
let result = `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher === "auto" ? "none" : proxy.cipher let result = `${proxy.name}=vmess,${proxy.server},${proxy.port},${proxy.cipher === "auto" ? "none" : proxy.cipher
},"${proxy.uuid}",over-tls:${proxy.tls || "false"}${obfs_opts}`; },"${proxy.uuid}",over-tls:${proxy.tls || "false"}${obfs_opts}`;
if (proxy.alterId === 0) proxy['vmess-aead'] = true;
if (typeof proxy['vmess-aead'] !== "undefined") { if (typeof proxy['vmess-aead'] !== "undefined") {
result += `,vmess-aead=${proxy['vmess-aead']}`; result += `,vmess-aead=${proxy['vmess-aead']}`;
} }
@ -2625,12 +2633,14 @@ var ProxyUtils = (function () {
result = `${proxy.name}=vmess,${proxy.server},${proxy.port result = `${proxy.name}=vmess,${proxy.server},${proxy.port
},username=${proxy.uuid},tls=${proxy.tls || "false"},tfo=${proxy.tfo || "false" },username=${proxy.uuid},tls=${proxy.tls || "false"},tfo=${proxy.tfo || "false"
}`; }`;
if (proxy.alterId === 0) proxy['vmess-aead'] = true;
if (typeof proxy['vmess-aead'] !== "undefined") { if (typeof proxy['vmess-aead'] !== "undefined") {
result += `,vmess-aead=${proxy['vmess-aead']}`; result += `,vmess-aead=${proxy['vmess-aead']}`;
} }
if (proxy.network === "ws") { if (proxy.network === "ws") {
const path = proxy["ws-path"] || "/"; const path = proxy["ws-opts"].path || "/";
const wsHeaders = Object.entries(proxy["ws-headers"]).map( const wsHeaders = Object.entries(proxy["ws-opts"].headers).map(
([key, value]) => (`${key}:"${value}"`)) ([key, value]) => (`${key}:"${value}"`))
.join('|'); .join('|');
result += `,ws=true${path ? ",ws-path=" + path : ""}${wsHeaders ? ",ws-headers=" + wsHeaders : ""}`; result += `,ws=true${path ? ",ws-path=" + path : ""}${wsHeaders ? ",ws-headers=" + wsHeaders : ""}`;
@ -2746,8 +2756,8 @@ var ProxyUtils = (function () {
}; };
// obfs // obfs
if (proxy.network === "ws") { if (proxy.network === "ws") {
result.path = proxy["ws-path"] || "/"; result.path = proxy["ws-opts"].path || "/";
result.host = proxy["ws-headers"].Host || proxy.server; result.host = proxy["ws-opts"].headers.Host || proxy.server;
} }
result = "vmess://" + Base64.safeEncode(JSON.stringify(result)); result = "vmess://" + Base64.safeEncode(JSON.stringify(result));
break; break;

File diff suppressed because one or more lines are too long