ssrurl.htm 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. <%+cbi/valueheader%>
  2. <%
  3. local map = self.map
  4. local ss_type = map:get("@server_subscribe[0]", "ss_type")
  5. -%>
  6. <script type="text/javascript">
  7. //<![CDATA[
  8. let ss_type = "<%=ss_type%>"
  9. function padright(str, cnt, pad) {
  10. return str + Array(cnt + 1).join(pad);
  11. }
  12. function b64EncodeUnicode(str) {
  13. return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {
  14. return String.fromCharCode('0x' + p1);
  15. }));
  16. }
  17. function b64encutf8safe(str) {
  18. return b64EncodeUnicode(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, '');
  19. }
  20. function b64DecodeUnicode(str) {
  21. return decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {
  22. return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
  23. }).join(''));
  24. }
  25. function b64decutf8safe(str) {
  26. var l;
  27. str = str.replace(/-/g, "+").replace(/_/g, "/");
  28. l = str.length;
  29. l = (4 - l % 4) % 4;
  30. if (l) str = padright(str, l, "=");
  31. return b64DecodeUnicode(str);
  32. }
  33. function b64encsafe(str) {
  34. return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, '')
  35. }
  36. function b64decsafe(str) {
  37. var l;
  38. str = str.replace(/-/g, "+").replace(/_/g, "/");
  39. l = str.length;
  40. l = (4 - l % 4) % 4;
  41. if (l) str = padright(str, l, "=");
  42. return atob(str);
  43. }
  44. function dictvalue(d, key) {
  45. var v = d[key];
  46. if (typeof (v) == 'undefined' || v == '') return '';
  47. return b64decsafe(v);
  48. }
  49. function export_ssr_url(btn, urlname, sid) {
  50. var s = document.getElementById(urlname + '-status');
  51. if (!s) return false;
  52. var v_server = document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0];
  53. var v_port = document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0];
  54. var v_protocol = document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0];
  55. var v_method = document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0];
  56. var v_obfs = document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0];
  57. var v_password = document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0];
  58. var v_obfs_param = document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0];
  59. var v_protocol_param = document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0];
  60. var v_alias = document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0];
  61. 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);
  62. var textarea = document.createElement("textarea");
  63. textarea.textContent = "ssr://" + b64encsafe(ssr_str);
  64. textarea.style.position = "fixed";
  65. document.body.appendChild(textarea);
  66. textarea.select();
  67. try {
  68. document.execCommand("copy"); // Security exception may be thrown by some browsers.
  69. s.innerHTML = "<font style=\'color:green\'><%:Copy SSR to clipboard successfully.%></font>";
  70. } catch (ex) {
  71. s.innerHTML = "<font style=\'color:red\'><%:Unable to copy SSR to clipboard.%></font>";
  72. } finally {
  73. document.body.removeChild(textarea);
  74. }
  75. return false;
  76. }
  77. function import_ssr_url(btn, urlname, sid) {
  78. var s = document.getElementById(urlname + '-status');
  79. if (!s) return false;
  80. var ssrurl = prompt("<%:Paste sharing link here%>", "");
  81. if (ssrurl == null || ssrurl == "") {
  82. s.innerHTML = "<font style=\'color:red\'><%:User cancelled.%></font>";
  83. return false;
  84. }
  85. s.innerHTML = "";
  86. //var ssu = ssrurl.match(/ssr:\/\/([A-Za-z0-9_-]+)/i);
  87. var ssu = ssrurl.split('://');
  88. //console.log(ssu.length);
  89. var event = document.createEvent("HTMLEvents");
  90. event.initEvent("change", true, true);
  91. switch (ssu[0]) {
  92. case "hysteria":
  93. try {
  94. var url = new URL("http://" + ssu[1]);
  95. var params = url.searchParams;
  96. } catch(e) {
  97. alert(e);
  98. return false;
  99. }
  100. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  101. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  102. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
  103. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "80";
  104. document.getElementsByName('cbid.shadowsocksr.' + sid + '.hysteria_protocol')[0].value = params.get("protocol") || "udp";
  105. document.getElementsByName('cbid.shadowsocksr.' + sid + '.auth_type')[0].value = params.get("auth") ? "2" : "0";
  106. document.getElementsByName('cbid.shadowsocksr.' + sid + '.auth_type')[0].dispatchEvent(event);
  107. document.getElementsByName('cbid.shadowsocksr.' + sid + '.auth_payload')[0].value = params.get("auth") || "";
  108. document.getElementsByName('cbid.shadowsocksr.' + sid + '.uplink_capacity')[0].value = params.get("upmbps") || "";
  109. document.getElementsByName('cbid.shadowsocksr.' + sid + '.downlink_capacity')[0].value = params.get("downmbps") || "";
  110. document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get("obfsParam") || "";
  111. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("peer") || "";
  112. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_tls_alpn')[0].value = params.get("alpn") || "";
  113. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = params.get("insecure") ? true : false;
  114. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
  115. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  116. return false;
  117. case "ss":
  118. var url0, param = "";
  119. var sipIndex = ssu[1].indexOf("@");
  120. var ploc = ssu[1].indexOf("#");
  121. if (ploc > 0) {
  122. url0 = ssu[1].substr(0, ploc);
  123. param = ssu[1].substr(ploc + 1);
  124. } else {
  125. url0 = ssu[1];
  126. }
  127. if (sipIndex != -1) {
  128. // SIP002
  129. var userInfo = b64decsafe(url0.substr(0, sipIndex));
  130. // console.log("userInfo:", userInfo); // 打印解析后的 userInfo
  131. var temp = url0.substr(sipIndex + 1).split("/?");
  132. var serverInfo = temp[0].split(":");
  133. var server = serverInfo[0];
  134. var port = serverInfo[1].replace("/","");
  135. var method, password, enable_plugin, plugin, pluginOpts;
  136. // 解析 plugin 参数
  137. if (temp[1]) {
  138. var pluginInfo = decodeURIComponent(temp[1]);
  139. // 使用正则匹配 plugin 参数
  140. var pluginNameInfo = pluginInfo.match(/plugin=([^&]+)/);
  141. if (pluginNameInfo) {
  142. var pluginParams = pluginNameInfo[1].split(";");
  143. plugin = pluginParams.shift(); // 获取 plugin
  144. pluginOpts = pluginParams.length > 0 ? pluginParams.join(";") : "";
  145. }
  146. }
  147. // 解析 userInfo(解析加密方法和密码)
  148. var userInfoSplitIndex = userInfo.indexOf(":");
  149. if (userInfoSplitIndex !== -1) {
  150. method = userInfo.substr(0, userInfoSplitIndex); // 提取加密方法
  151. password = userInfo.substr(userInfoSplitIndex + 1); // 提取密码
  152. if (!method || method.trim() === "") {
  153. method = "none"; // 如果加密方法为空,设置为 "none"
  154. }
  155. }
  156. var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev";
  157. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  158. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  159. document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type;
  160. document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event);
  161. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;
  162. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;
  163. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password || "";
  164. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;
  165. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].dispatchEvent(event);
  166. if (plugin && plugin !== "none") {
  167. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = true; // 设置 enable_plugin 为 true
  168. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].dispatchEvent(event); // 触发事件
  169. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].value = plugin || "none";
  170. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].dispatchEvent(event);
  171. if (plugin !== undefined) {
  172. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin_opts')[0].value = pluginOpts || "";
  173. }
  174. } else {
  175. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = false;
  176. }
  177. if (param !== undefined) {
  178. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURI(param);
  179. }
  180. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  181. } else {
  182. var sstr = b64decsafe(url0);
  183. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  184. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  185. var team = sstr.split('@');
  186. var part1 = team[0].split(':');
  187. var part2 = team[1].split(':');
  188. var method = (part1[0] && part1[0].trim() !== "") ? part1[0].trim() : "none";
  189. var password = part1[1] || "";
  190. var server = part2[0];
  191. var port = part2[1];
  192. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;
  193. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;
  194. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password;
  195. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;
  196. if (param != undefined) {
  197. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURI(param);
  198. }
  199. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  200. }
  201. return false;
  202. case "ssr":
  203. var sstr = b64decsafe(ssu[1]);
  204. var ploc = sstr.indexOf("/?");
  205. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  206. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  207. var url0, param = "";
  208. if (ploc > 0) {
  209. url0 = sstr.substr(0, ploc);
  210. param = sstr.substr(ploc + 2);
  211. }
  212. var ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);
  213. if (!ssm || ssm.length < 7) return false;
  214. var pdict = {};
  215. if (param.length > 2) {
  216. var a = param.split('&');
  217. for (var i = 0; i < a.length; i++) {
  218. var b = a[i].split('=');
  219. pdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');
  220. }
  221. }
  222. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm[1];
  223. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm[2];
  224. document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0].value = ssm[3];
  225. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0].value = ssm[4];
  226. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0].value = ssm[5];
  227. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = b64decsafe(ssm[6]);
  228. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam');
  229. document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0].value = dictvalue(pdict, 'protoparam');
  230. var rem = pdict['remarks'];
  231. if (typeof (rem) != 'undefined' && rem != '' && rem.length > 0) document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = b64decutf8safe(rem);
  232. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  233. return false;
  234. case "trojan":
  235. try {
  236. var url = new URL("http://" + ssu[1]);
  237. var params = url.searchParams;
  238. } catch(e) {
  239. alert(e);
  240. return false;
  241. }
  242. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
  243. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
  244. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  245. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "trojan";
  246. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
  247. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
  248. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "80";
  249. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username);
  250. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
  251. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
  252. document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get("fp") || "";
  253. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni");
  254. if (params.get("allowInsecure") === "1") {
  255. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true
  256. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件
  257. }
  258. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
  259. params.get("type") == "http" ? "h2" :
  260. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  261. (params.get("type") || "raw"));
  262. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
  263. switch (params.get("type")) {
  264. case "ws":
  265. if (params.get("security") !== "tls") {
  266. setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  267. }
  268. setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  269. break;
  270. case "httpupgrade":
  271. if (params.get("security") !== "tls") {
  272. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  273. }
  274. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  275. break;
  276. case "splithttp":
  277. if (params.get("security") !== "tls") {
  278. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  279. }
  280. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  281. break;
  282. case "xhttp":
  283. if (params.get("security") !== "tls") {
  284. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  285. }
  286. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = params.get("mode") || "auto";
  287. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  288. if (params.get("extra") && params.get("extra").trim() !== "") {
  289. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
  290. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
  291. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = params.get("extra") || "";
  292. }
  293. break;
  294. case "kcp":
  295. document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = params.get("headerType") || "none";
  296. document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get("seed") || "";
  297. break;
  298. case "http":
  299. /* this is non-standard, bullshit */
  300. case "h2":
  301. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  302. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
  303. break;
  304. case "quic":
  305. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_guise')[0].value = params.get("headerType") || "none";
  306. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = params.get("quicSecurity") || "none";
  307. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = params.get("key") || "";
  308. break;
  309. case "grpc":
  310. document.getElementsByName('cbid.shadowsocksr.' + sid + '.serviceName')[0].value = params.get("serviceName") || "";
  311. document.getElementsByName('cbid.shadowsocksr.' + sid + '.grpc_mode')[0].value = params.get("mode") || "gun";
  312. break;
  313. case "raw":
  314. case "tcp":
  315. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = params.get("headerType") || "none";
  316. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
  317. if (params.get("headerType") === "http") {
  318. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  319. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
  320. }
  321. break;
  322. }
  323. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  324. return false;
  325. case "vmess":
  326. var sstr = b64DecodeUnicode(ssu[1]);
  327. var ploc = sstr.indexOf("/?");
  328. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
  329. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  330. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "vmess";
  331. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
  332. var url0, param = "";
  333. if (ploc > 0) {
  334. url0 = sstr.substr(0, ploc);
  335. param = sstr.substr(ploc + 2);
  336. }
  337. var ssm = JSON.parse(sstr);
  338. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = ssm.ps;
  339. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm.add;
  340. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm.port;
  341. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alter_id')[0].value = ssm.aid;
  342. document.getElementsByName('cbid.shadowsocksr.' + sid + '.vmess_id')[0].value = ssm.id;
  343. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
  344. (ssm.net === "raw" || ssm.net === "tcp") ? "raw" : ssm.net;
  345. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
  346. if (ssm.net === "raw" || ssm.net === "tcp") {
  347. if (ssm.type && ssm.type != "http") {
  348. ssm.type = "none";
  349. } else {
  350. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = ssm.host;
  351. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = ssm.path;
  352. }
  353. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = ssm.type;
  354. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
  355. }
  356. if (ssm.net == "ws") {
  357. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = ssm.host;
  358. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = ssm.path;
  359. }
  360. if (ssm.net == "httpupgrade") {
  361. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = ssm.host;
  362. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = ssm.path;
  363. }
  364. if (ssm.net == "splithttp") {
  365. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = ssm.host;
  366. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = ssm.path;
  367. }
  368. if (ssm.net == "xhttp") {
  369. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = ssm.mode;
  370. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = ssm.host;
  371. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = ssm.path;
  372. if (params.get("extra") && params.get("extra").trim() !== "") {
  373. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
  374. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
  375. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = ssm.extra;
  376. }
  377. }
  378. if (ssm.net == "h2") {
  379. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = ssm.host;
  380. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = ssm.path;
  381. }
  382. if (ssm.net == "quic") {
  383. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = ssm.securty;
  384. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = ssm.key;
  385. }
  386. if (ssm.net == "kcp") {
  387. document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = ssm.type;
  388. }
  389. if (ssm.tls == "tls") {
  390. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
  391. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
  392. document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = ssm.fp;
  393. if (ssm.net == "xhttp") {
  394. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_alpn')[0].value = ssm.alpn;
  395. }
  396. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = ssm.sni || ssm.host;
  397. }
  398. if (ssm.mux !== undefined) {
  399. document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].checked = true;
  400. document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].dispatchEvent(event);
  401. }
  402. if (ssm.xmux !== undefined) {
  403. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].checked = true;
  404. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].dispatchEvent(event);
  405. }
  406. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  407. return false;
  408. case "vless":
  409. try {
  410. var url = new URL("http://" + ssu[1]);
  411. var params = url.searchParams;
  412. } catch(e) {
  413. alert(e);
  414. return false;
  415. }
  416. // Check if the elements exist before trying to modify them
  417. function setElementValue(name, value) {
  418. const element = document.getElementsByName(name)[0];
  419. if (element) {
  420. if (element.type === "checkbox" || element.type === "radio") {
  421. element.checked = value === true;
  422. } else {
  423. element.value = value;
  424. }
  425. }
  426. }
  427. function dispatchEventIfExists(name, event) {
  428. const element = document.getElementsByName(name)[0];
  429. if (element) {
  430. element.dispatchEvent(event);
  431. }
  432. }
  433. setElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : "");
  434. setElementValue('cbid.shadowsocksr.' + sid + '.type', "v2ray");
  435. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);
  436. setElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', "vless");
  437. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);
  438. setElementValue('cbid.shadowsocksr.' + sid + '.server', url.hostname);
  439. setElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || "80");
  440. setElementValue('cbid.shadowsocksr.' + sid + '.vmess_id', url.username);
  441. setElementValue('cbid.shadowsocksr.' + sid + '.transport',
  442. params.get("type") === "http" ? "h2" :
  443. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  444. (params.get("type") || "tcp"))
  445. );
  446. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);
  447. setElementValue('cbid.shadowsocksr.' + sid + '.vless_encryption', params.get("encryption") || "none");
  448. if ([ "tls", "xtls", "reality" ].includes(params.get("security"))) {
  449. setElementValue('cbid.shadowsocksr.' + sid + '.' + params.get("security"), true);
  450. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get("security"), event);
  451. if (params.get("security") === "reality") {
  452. setElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.get("pbk") ? decodeURIComponent(params.get("pbk")) : "");
  453. setElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.get("sid") || "");
  454. setElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.get("spx") ? decodeURIComponent(params.get("spx")) : "");
  455. }
  456. setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get("flow") || "none");
  457. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);
  458. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_alpn', params.get("alpn") || "");
  459. setElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get("fp") || "");
  460. setElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.get("sni") || "");
  461. }
  462. switch (params.get("type")) {
  463. case "ws":
  464. if (params.get("security") !== "tls") {
  465. setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  466. }
  467. setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  468. break;
  469. case "httpupgrade":
  470. if (params.get("security") !== "tls") {
  471. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  472. }
  473. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  474. break;
  475. case "splithttp":
  476. if (params.get("security") !== "tls") {
  477. setElementValue('cbid.shadowsocksr.' + sid + '.splithttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  478. }
  479. setElementValue('cbid.shadowsocksr.' + sid + '.splithttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  480. break;
  481. case "xhttp":
  482. if (params.get("security") !== "tls") {
  483. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  484. }
  485. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.get("mode") || "auto");
  486. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  487. if (params.get("extra") && params.get("extra").trim() !== "") {
  488. setElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true
  489. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件
  490. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.get("extra") || "");
  491. }
  492. break;
  493. case "kcp":
  494. setElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.get("headerType") || "none");
  495. setElementValue('cbid.shadowsocksr.' + sid + '.seed', params.get("seed") || "");
  496. break;
  497. case "http":
  498. /* this is non-standard, bullshit */
  499. case "h2":
  500. setElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  501. setElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  502. break;
  503. case "quic":
  504. setElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.get("headerType") || "none");
  505. setElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.get("quicSecurity") || "none");
  506. setElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.get("key") || "");
  507. break;
  508. case "grpc":
  509. setElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.get("serviceName") || "");
  510. setElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.get("mode") || "gun");
  511. break;
  512. case "tcp":
  513. case "raw":
  514. setElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.get("headerType") || "none");
  515. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);
  516. if (params.get("headerType") === "http") {
  517. setElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  518. setElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  519. }
  520. break;
  521. }
  522. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  523. return false;
  524. default:
  525. s.innerHTML = "<font style=\'color:red\'><%:Invalid format.%></font>";
  526. return false;
  527. }
  528. }
  529. //]]>
  530. </script>
  531. <input type="button" class="btn cbi-button cbi-button-apply" value="<%:Import%>" onclick="return import_ssr_url(this, '<%=self.option%>', '<%=self.value%>')" />
  532. <span id="<%=self.option%>-status"></span>
  533. <%+cbi/valuefooter%>