634 lines
32 KiB
HTML
634 lines
32 KiB
HTML
<%+cbi/valueheader%>
|
||
<%
|
||
local map = self.map
|
||
local ss_type = map:get("@server_subscribe[0]", "ss_type")
|
||
-%>
|
||
<script type="text/javascript">
|
||
//<![CDATA[
|
||
let ss_type = "<%=ss_type%>"
|
||
|
||
function padright(str, cnt, pad) {
|
||
return str + Array(cnt + 1).join(pad);
|
||
}
|
||
|
||
function b64EncodeUnicode(str) {
|
||
return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
|
||
return String.fromCharCode('0x' + p1);
|
||
}));
|
||
}
|
||
|
||
function b64encutf8safe(str) {
|
||
return b64EncodeUnicode(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, '');
|
||
}
|
||
|
||
function b64DecodeUnicode(str) {
|
||
return decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {
|
||
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
|
||
}).join(''));
|
||
}
|
||
|
||
function b64decutf8safe(str) {
|
||
var l;
|
||
str = str.replace(/-/g, "+").replace(/_/g, "/");
|
||
l = str.length;
|
||
l = (4 - l % 4) % 4;
|
||
if (l) str = padright(str, l, "=");
|
||
return b64DecodeUnicode(str);
|
||
}
|
||
|
||
function b64encsafe(str) {
|
||
return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, '')
|
||
}
|
||
|
||
function b64decsafe(str) {
|
||
var l;
|
||
str = str.replace(/-/g, "+").replace(/_/g, "/");
|
||
l = str.length;
|
||
l = (4 - l % 4) % 4;
|
||
if (l) str = padright(str, l, "=");
|
||
return atob(str);
|
||
}
|
||
|
||
function dictvalue(d, key) {
|
||
var v = d[key];
|
||
if (typeof (v) == 'undefined' || v == '') return '';
|
||
return b64decsafe(v);
|
||
}
|
||
|
||
function export_ssr_url(btn, urlname, sid) {
|
||
var s = document.getElementById(urlname + '-status');
|
||
if (!s) return false;
|
||
var v_server = document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0];
|
||
var v_port = document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0];
|
||
var v_protocol = document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0];
|
||
var v_method = document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0];
|
||
var v_obfs = document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0];
|
||
var v_password = document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0];
|
||
var v_obfs_param = document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0];
|
||
var v_protocol_param = document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0];
|
||
var v_alias = document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0];
|
||
var ssr_str = v_server.value + ":" + v_port.value + ":" + v_protocol.value + ":" + v_method.value + ":" + v_obfs.value + ":" + b64encsafe(v_password.value) + "/?obfsparam=" + b64encsafe(v_obfs_param.value) + "&protoparam=" + b64encsafe(v_protocol_param.value) + "&remarks=" + b64encutf8safe(v_alias.value);
|
||
var textarea = document.createElement("textarea");
|
||
textarea.textContent = "ssr://" + b64encsafe(ssr_str);
|
||
textarea.style.position = "fixed";
|
||
document.body.appendChild(textarea);
|
||
textarea.select();
|
||
try {
|
||
document.execCommand("copy"); // Security exception may be thrown by some browsers.
|
||
s.innerHTML = "<font color='green'><%:Copy SSR to clipboard successfully.%></font>";
|
||
} catch (ex) {
|
||
s.innerHTML = "<font color='red'><%:Unable to copy SSR to clipboard.%></font>";
|
||
} finally {
|
||
document.body.removeChild(textarea);
|
||
}
|
||
return false;
|
||
}
|
||
|
||
function import_ssr_url(btn, urlname, sid) {
|
||
var s = document.getElementById(urlname + '-status');
|
||
if (!s) return false;
|
||
var ssrurl = prompt("<%:Paste sharing link here%>", "");
|
||
if (ssrurl == null || ssrurl == "") {
|
||
s.innerHTML = "<font color='red'><%:User cancelled.%></font>";
|
||
return false;
|
||
}
|
||
s.innerHTML = "";
|
||
//var ssu = ssrurl.match(/ssr:\/\/([A-Za-z0-9_-]+)/i);
|
||
var ssu = ssrurl.split('://');
|
||
//console.log(ssu.length);
|
||
var event = document.createEvent("HTMLEvents");
|
||
event.initEvent("change", true, true);
|
||
switch (ssu[0]) {
|
||
case "hysteria2":
|
||
case "hy2":
|
||
try {
|
||
var url = new URL("http://" + ssu[1]);
|
||
var params = url.searchParams;
|
||
} catch(e) {
|
||
alert(e);
|
||
return false;
|
||
}
|
||
|
||
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";
|
||
if (params.get("lazy") === "1") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].checked = true;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].dispatchEvent(event);
|
||
}
|
||
if (params.get("mport")) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_port_hopping')[0].checked = true; // 设置 flag_port_hopping 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_port_hopping')[0].dispatchEvent(event); // 触发事件
|
||
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.port_range')[0].value = params.get("mport") || "";
|
||
}
|
||
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); // 触发事件
|
||
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport_protocol')[0].value = params.get("protocol") || "udp";
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].value = decodeURIComponent(url.username);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.uplink_capacity')[0].value =
|
||
(params.get("upmbps") && params.get("upmbps").match(/\d+/)) ? params.get("upmbps").match(/\d+/)[0] : "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.downlink_capacity')[0].value =
|
||
(params.get("downmbps") && params.get("downmbps").match(/\d+/)) ? params.get("downmbps").match(/\d+/)[0] : "";
|
||
if (params.get("obfs") && params.get("obfs") !== "none") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].checked = true; // 设置 flag_obfs 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].dispatchEvent(event); // 触发事件
|
||
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_type')[0].value = params.get("obfs");
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.salamander')[0].value = params.get("obfs-password") || params.get("obfs_password");
|
||
}
|
||
if (params.get("sni")) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; // 设置 flag_obfs 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); // 触发事件
|
||
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni") || "";
|
||
}
|
||
if (params.get("insecure") === "1") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event);
|
||
if (params.get("sni")) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.pinsha256')[0].value = params.get("pinsha256") || "";
|
||
}
|
||
}
|
||
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>";
|
||
return false;
|
||
case "ss":
|
||
var url0 = ssu[1] || "";
|
||
var param = "";
|
||
|
||
// 先分离 #(alias)
|
||
var hashIndex = url0.indexOf("#");
|
||
if (hashIndex >= 0) {
|
||
param = url0.substring(hashIndex + 1);
|
||
url0 = url0.substring(0, hashIndex);
|
||
}
|
||
|
||
// 再分离 ? 或 /?(参数)
|
||
var queryIndex = (url0 = url0.replace('/?', '?')).indexOf("?");
|
||
var queryStr = "";
|
||
if (queryIndex >= 0) {
|
||
queryStr = url0.substring(queryIndex + 1);
|
||
url0 = url0.substring(0, queryIndex);
|
||
}
|
||
|
||
var params = Object.fromEntries(new URLSearchParams(queryStr));
|
||
|
||
// 判断是否 SIP002 格式(即含 @)
|
||
if (url0.indexOf("@") !== -1) {
|
||
// === SIP002 格式 ===
|
||
var sipIndex = url0.indexOf("@");
|
||
var userInfoB64 = url0.substring(0, sipIndex);
|
||
var userInfo = b64decsafe(userInfoB64);
|
||
var userInfoSplitIndex = userInfo.indexOf(":");
|
||
var method = userInfo.substring(0, userInfoSplitIndex);
|
||
var password = userInfo.substring(userInfoSplitIndex + 1);
|
||
|
||
var serverPart = url0.substring(url0.indexOf("@") + 1);
|
||
var serverInfo = serverPart.split(":");
|
||
var server = serverInfo[0];
|
||
var port = serverInfo[1];
|
||
|
||
var plugin = "", pluginOpts = "";
|
||
if (params.plugin) {
|
||
var pluginParams = decodeURIComponent(params.plugin).split(";");
|
||
plugin = pluginParams.shift();
|
||
pluginOpts = pluginParams.join(";");
|
||
}
|
||
} else {
|
||
// === Base64 SS2022 / 普通格式 的整体编码格式 ===
|
||
var sstr = b64decsafe(url0);
|
||
if (!sstr) {
|
||
s.innerHTML = "<font style='color:red'>Base64 sstr failed</font>";
|
||
break;
|
||
}
|
||
|
||
// 支持 SS2022 / 普通格式
|
||
var regex2022 = /^([^:]+):([^:]+):([^@]+)@([^:]+):(\d+)$/;
|
||
var regexNormal = /^([^:]+):([^@]+)@([^:]+):(\d+)$/;
|
||
|
||
var m2022 = sstr.match(regex2022);
|
||
var mNormal = sstr.match(regexNormal);
|
||
|
||
if (m2022) {
|
||
var method = m2022[1];
|
||
var password = m2022[2] + ":" + m2022[3];
|
||
var server = m2022[4];
|
||
var port = m2022[5];
|
||
} else if (mNormal) {
|
||
var method = mNormal[1];
|
||
var password = mNormal[2];
|
||
var server = mNormal[3];
|
||
var port = mNormal[4];
|
||
} else {
|
||
s.innerHTML = "<font style='color:red'>SS URL base64 sstr format not recognized</font>";
|
||
break;
|
||
}
|
||
|
||
var plugin = "", pluginOpts = "";
|
||
if (params["shadow-tls"]) {
|
||
try {
|
||
var decoded_tls = JSON.parse(atob(decodeURIComponent(params["shadow-tls"])));
|
||
plugin = "shadow-tls";
|
||
var versionFlag = "";
|
||
if (decoded_tls.version && !isNaN(decoded_tls.version)) {
|
||
versionFlag = "v" + decoded_tls.version + "=1;";
|
||
}
|
||
pluginOpts = versionFlag + "host=" + (decoded_tls.host || "") + ";passwd=" + (decoded_tls.password || "");
|
||
} catch (e) {
|
||
console.log("shadow-tls decode failed:", e);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 判断密码是否经过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";
|
||
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password || "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].dispatchEvent(event);
|
||
|
||
if (plugin && plugin !== "none") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = true; // 设置 enable_plugin 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].dispatchEvent(event); // 触发事件
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].value = plugin;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].dispatchEvent(event);
|
||
if (plugin !== undefined) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin_opts')[0].value = pluginOpts || "";
|
||
}
|
||
} else {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = false;
|
||
}
|
||
|
||
if (param != undefined) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURIComponent(param);
|
||
}
|
||
s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
|
||
return false;
|
||
case "ssr":
|
||
var sstr = b64decsafe(ssu[1]);
|
||
var ploc = sstr.indexOf("/?");
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
|
||
var url0, param = "";
|
||
if (ploc > 0) {
|
||
url0 = sstr.substr(0, ploc);
|
||
param = sstr.substr(ploc + 2);
|
||
}
|
||
var ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);
|
||
if (!ssm || ssm.length < 7) return false;
|
||
var pdict = {};
|
||
if (param.length > 2) {
|
||
var a = param.split('&');
|
||
for (var i = 0; i < a.length; i++) {
|
||
var b = a[i].split('=');
|
||
pdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');
|
||
}
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm[1];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm[2];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0].value = ssm[3];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0].value = ssm[4];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0].value = ssm[5];
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = b64decsafe(ssm[6]);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam');
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0].value = dictvalue(pdict, 'protoparam');
|
||
var rem = pdict['remarks'];
|
||
if (typeof (rem) != 'undefined' && rem != '' && rem.length > 0) document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = b64decutf8safe(rem);
|
||
s.innerHTML = "<font color='green'><%:Import configuration information successfully.%></font>";
|
||
return false;
|
||
case "trojan":
|
||
try {
|
||
var url = new URL("http://" + ssu[1]);
|
||
var params = url.searchParams;
|
||
} catch(e) {
|
||
alert(e);
|
||
return false;
|
||
}
|
||
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "trojan";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[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";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get("fp") || "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni");
|
||
if (params.get("allowInsecure") === "1") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
|
||
params.get("type") == "http" ? "h2" :
|
||
(["tcp", "raw"].includes(params.get("type")) ? "raw" :
|
||
(params.get("type") || "raw"));
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
|
||
switch (params.get("type")) {
|
||
case "ws":
|
||
if (params.get("security") !== "tls") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
|
||
break;
|
||
case "httpupgrade":
|
||
if (params.get("security") !== "tls") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
|
||
break;
|
||
case "splithttp":
|
||
if (params.get("security") !== "tls") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
|
||
break;
|
||
case "xhttp":
|
||
if (params.get("security") !== "tls") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = params.get("mode") || "auto";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
|
||
if (params.get("extra") && params.get("extra").trim() !== "") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = params.get("extra") || "";
|
||
}
|
||
break;
|
||
case "kcp":
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = params.get("headerType") || "none";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get("seed") || "";
|
||
break;
|
||
case "http":
|
||
/* this is non-standard, bullshit */
|
||
case "h2":
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
|
||
break;
|
||
case "quic":
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_guise')[0].value = params.get("headerType") || "none";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = params.get("quicSecurity") || "none";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = params.get("key") || "";
|
||
break;
|
||
case "grpc":
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.serviceName')[0].value = params.get("serviceName") || "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.grpc_mode')[0].value = params.get("mode") || "gun";
|
||
break;
|
||
case "raw":
|
||
case "tcp":
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = params.get("headerType") || "none";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
|
||
if (params.get("headerType") === "http") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
|
||
}
|
||
break;
|
||
}
|
||
|
||
s.innerHTML = "<font color='green'><%:Import configuration information successfully.%></font>";
|
||
return false;
|
||
case "vmess":
|
||
var sstr = b64DecodeUnicode(ssu[1]);
|
||
var ploc = sstr.indexOf("/?");
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "vmess";
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
|
||
var url0, param = "";
|
||
if (ploc > 0) {
|
||
url0 = sstr.substr(0, ploc);
|
||
param = sstr.substr(ploc + 2);
|
||
}
|
||
var ssm = JSON.parse(sstr);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = ssm.ps;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm.add;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm.port;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.alter_id')[0].value = ssm.aid;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.vmess_id')[0].value = ssm.id;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
|
||
(ssm.net === "raw" || ssm.net === "tcp") ? "raw" : ssm.net;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
|
||
if (ssm.net === "raw" || ssm.net === "tcp") {
|
||
if (ssm.type && ssm.type != "http") {
|
||
ssm.type = "none";
|
||
} else {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = ssm.host;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = ssm.path;
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = ssm.type;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
|
||
}
|
||
if (ssm.net == "ws") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = ssm.host;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = ssm.path;
|
||
}
|
||
if (ssm.net == "httpupgrade") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = ssm.host;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = ssm.path;
|
||
}
|
||
if (ssm.net == "splithttp") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = ssm.host;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = ssm.path;
|
||
}
|
||
if (ssm.net == "xhttp") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = ssm.mode;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = ssm.host;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = ssm.path;
|
||
if (params.get("extra") && params.get("extra").trim() !== "") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = ssm.extra;
|
||
}
|
||
}
|
||
if (ssm.net == "h2") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = ssm.host;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = ssm.path;
|
||
}
|
||
if (ssm.net == "quic") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = ssm.securty;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = ssm.key;
|
||
}
|
||
if (ssm.net == "kcp") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = ssm.type;
|
||
}
|
||
if (ssm.tls == "tls") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = ssm.fp;
|
||
if (ssm.net == "xhttp") {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_alpn')[0].value = ssm.alpn;
|
||
}
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = ssm.sni || ssm.host;
|
||
}
|
||
if (ssm.mux !== undefined) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].checked = true;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].dispatchEvent(event);
|
||
}
|
||
if (ssm.xmux !== undefined) {
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].checked = true;
|
||
document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].dispatchEvent(event);
|
||
}
|
||
s.innerHTML = "<font color='green'><%:Import configuration information successfully.%></font>";
|
||
return false;
|
||
case "vless":
|
||
try {
|
||
var url = new URL("http://" + ssu[1]);
|
||
var params = url.searchParams;
|
||
} catch(e) {
|
||
alert(e);
|
||
return false;
|
||
}
|
||
// Check if the elements exist before trying to modify them
|
||
function setElementValue(name, value) {
|
||
const element = document.getElementsByName(name)[0];
|
||
if (element) {
|
||
if (element.type === "checkbox" || element.type === "radio") {
|
||
element.checked = value === true;
|
||
} else {
|
||
element.value = value;
|
||
}
|
||
}
|
||
}
|
||
function dispatchEventIfExists(name, event) {
|
||
const element = document.getElementsByName(name)[0];
|
||
if (element) {
|
||
element.dispatchEvent(event);
|
||
}
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.type', "v2ray");
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', "vless");
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.server', url.hostname);
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || "80");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.vmess_id', url.username);
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.transport',
|
||
params.get("type") === "http" ? "h2" :
|
||
(["tcp", "raw"].includes(params.get("type")) ? "raw" :
|
||
(params.get("type") || "tcp"))
|
||
);
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.vless_encryption', params.get("encryption") || "none");
|
||
if ([ "tls", "xtls", "reality" ].includes(params.get("security"))) {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.' + params.get("security"), true);
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get("security"), event);
|
||
|
||
if (params.get("security") === "reality") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.get("pbk") ? decodeURIComponent(params.get("pbk")) : "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.get("sid") || "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.get("spx") ? decodeURIComponent(params.get("spx")) : "");
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get("flow") || "none");
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);
|
||
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_alpn', params.get("alpn") || "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get("fp") || "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.get("sni") || "");
|
||
}
|
||
switch (params.get("type")) {
|
||
case "ws":
|
||
if (params.get("security") !== "tls") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
|
||
break;
|
||
case "httpupgrade":
|
||
if (params.get("security") !== "tls") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
|
||
break;
|
||
case "splithttp":
|
||
if (params.get("security") !== "tls") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.splithttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.splithttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
|
||
break;
|
||
case "xhttp":
|
||
if (params.get("security") !== "tls") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
}
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.get("mode") || "auto");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
|
||
if (params.get("extra") && params.get("extra").trim() !== "") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.get("extra") || "");
|
||
}
|
||
break;
|
||
case "kcp":
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.get("headerType") || "none");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.seed', params.get("seed") || "");
|
||
break;
|
||
case "http":
|
||
/* this is non-standard, bullshit */
|
||
case "h2":
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
|
||
break;
|
||
case "quic":
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.get("headerType") || "none");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.get("quicSecurity") || "none");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.get("key") || "");
|
||
break;
|
||
case "grpc":
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.get("serviceName") || "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.get("mode") || "gun");
|
||
break;
|
||
case "tcp":
|
||
case "raw":
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.get("headerType") || "none");
|
||
dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);
|
||
if (params.get("headerType") === "http") {
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
|
||
setElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
|
||
}
|
||
break;
|
||
}
|
||
s.innerHTML = "<font color='green'><%:Import configuration information successfully.%></font>";
|
||
return false;
|
||
default:
|
||
s.innerHTML = "<font color='red'><%:Invalid format.%></font>";
|
||
return false;
|
||
}
|
||
}
|
||
//]]>
|
||
</script>
|
||
<input type="button" class="btn cbi-button cbi-button-apply" value="<%:Import%>" onclick="return import_ssr_url(this, '<%=self.option%>', '<%=self.value%>')" />
|
||
<span id="<%=self.option%>-status"></span>
|
||
<%+cbi/valuefooter%>
|
||
|