ssrurl.htm 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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 "hysteria2":
  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. if (params.get("lazy") === "1") {
  105. document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].checked = true;
  106. document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].dispatchEvent(event);
  107. }
  108. if (params.get("protocol") && params.get("protocol") !== undefined) {
  109. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].checked = true; // 设置 flag_transport 为 true
  110. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].dispatchEvent(event); // 触发事件
  111. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport_protocol')[0].value = params.get("protocol") || "udp";
  112. }
  113. document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].value = decodeURIComponent(url.username);
  114. document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].dispatchEvent(event);
  115. document.getElementsByName('cbid.shadowsocksr.' + sid + '.uplink_capacity')[0].value = params.get("upmbps") || "5";
  116. document.getElementsByName('cbid.shadowsocksr.' + sid + '.downlink_capacity')[0].value = params.get("downmbps") || "20";
  117. if (params.get("obfs") && (params.get("obfs") !== undefined)) {
  118. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].checked = true; // 设置 flag_obfs 为 true
  119. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].dispatchEvent(event); // 触发事件
  120. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_type')[0].value = params.get("obfs") || "salamander";
  121. document.getElementsByName('cbid.shadowsocksr.' + sid + '.salamander')[0].value = params.get("obfs-password") || "cry_me_a_r1ver";
  122. }
  123. if (params.get("sni")) {
  124. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; // 设置 flag_obfs 为 true
  125. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); // 触发事件
  126. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni") || "";
  127. }
  128. if (params.get("insecure") === "1") {
  129. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true;
  130. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event);
  131. if (params.get("sni")) {
  132. document.getElementsByName('cbid.shadowsocksr.' + sid + '.pinsha256')[0].value = params.get("pinsha256") || "";
  133. }
  134. }
  135. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
  136. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  137. return false;
  138. case "ss":
  139. var url0, param = "";
  140. var sipIndex = ssu[1].indexOf("@");
  141. var ploc = ssu[1].indexOf("#");
  142. if (ploc > 0) {
  143. url0 = ssu[1].substr(0, ploc);
  144. param = ssu[1].substr(ploc + 1);
  145. } else {
  146. url0 = ssu[1];
  147. }
  148. if (sipIndex != -1) {
  149. // SIP002
  150. var userInfo = b64decsafe(url0.substr(0, sipIndex));
  151. // console.log("userInfo:", userInfo); // 打印解析后的 userInfo
  152. var temp = url0.substr(sipIndex + 1).split("/?");
  153. var serverInfo = temp[0].split(":");
  154. var server = serverInfo[0];
  155. var port = serverInfo[1].replace("/","");
  156. var method, password, enable_plugin, plugin, pluginOpts;
  157. // 解析 plugin 参数
  158. if (temp[1]) {
  159. var pluginInfo = decodeURIComponent(temp[1]);
  160. // 使用正则匹配 plugin 参数
  161. var pluginNameInfo = pluginInfo.match(/plugin=([^&]+)/);
  162. if (pluginNameInfo) {
  163. var pluginParams = pluginNameInfo[1].split(";");
  164. plugin = pluginParams.shift(); // 获取 plugin
  165. pluginOpts = pluginParams.length > 0 ? pluginParams.join(";") : "";
  166. }
  167. }
  168. // 解析 userInfo(解析加密方法和密码)
  169. var userInfoSplitIndex = userInfo.indexOf(":");
  170. if (userInfoSplitIndex !== -1) {
  171. method = userInfo.substr(0, userInfoSplitIndex); // 提取加密方法
  172. password = userInfo.substr(userInfoSplitIndex + 1); // 提取密码
  173. if (!method || method.trim() === "") {
  174. method = "none"; // 如果加密方法为空,设置为 "none"
  175. }
  176. }
  177. var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev";
  178. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  179. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  180. document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type;
  181. document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event);
  182. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;
  183. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;
  184. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password || "";
  185. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;
  186. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].dispatchEvent(event);
  187. if (plugin && plugin !== "none") {
  188. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = true; // 设置 enable_plugin 为 true
  189. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].dispatchEvent(event); // 触发事件
  190. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].value = plugin || "none";
  191. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].dispatchEvent(event);
  192. if (plugin !== undefined) {
  193. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin_opts')[0].value = pluginOpts || "";
  194. }
  195. } else {
  196. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = false;
  197. }
  198. if (param !== undefined) {
  199. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURI(param);
  200. }
  201. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  202. } else {
  203. var sstr = b64decsafe(url0);
  204. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  205. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  206. var team = sstr.split('@');
  207. var part1 = team[0].split(':');
  208. var part2 = team[1].split(':');
  209. var method = (part1[0] && part1[0].trim() !== "") ? part1[0].trim() : "none";
  210. var password = part1[1] || "";
  211. var server = part2[0];
  212. var port = part2[1];
  213. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;
  214. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;
  215. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password;
  216. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;
  217. if (param != undefined) {
  218. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURI(param);
  219. }
  220. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  221. }
  222. return false;
  223. case "ssr":
  224. var sstr = b64decsafe(ssu[1]);
  225. var ploc = sstr.indexOf("/?");
  226. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  227. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  228. var url0, param = "";
  229. if (ploc > 0) {
  230. url0 = sstr.substr(0, ploc);
  231. param = sstr.substr(ploc + 2);
  232. }
  233. var ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);
  234. if (!ssm || ssm.length < 7) return false;
  235. var pdict = {};
  236. if (param.length > 2) {
  237. var a = param.split('&');
  238. for (var i = 0; i < a.length; i++) {
  239. var b = a[i].split('=');
  240. pdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');
  241. }
  242. }
  243. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm[1];
  244. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm[2];
  245. document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0].value = ssm[3];
  246. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0].value = ssm[4];
  247. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0].value = ssm[5];
  248. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = b64decsafe(ssm[6]);
  249. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam');
  250. document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0].value = dictvalue(pdict, 'protoparam');
  251. var rem = pdict['remarks'];
  252. if (typeof (rem) != 'undefined' && rem != '' && rem.length > 0) document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = b64decutf8safe(rem);
  253. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  254. return false;
  255. case "trojan":
  256. try {
  257. var url = new URL("http://" + ssu[1]);
  258. var params = url.searchParams;
  259. } catch(e) {
  260. alert(e);
  261. return false;
  262. }
  263. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
  264. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
  265. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  266. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "trojan";
  267. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
  268. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
  269. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "80";
  270. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username);
  271. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
  272. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
  273. document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get("fp") || "";
  274. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni");
  275. if (params.get("allowInsecure") === "1") {
  276. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true
  277. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件
  278. }
  279. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
  280. params.get("type") == "http" ? "h2" :
  281. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  282. (params.get("type") || "raw"));
  283. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
  284. switch (params.get("type")) {
  285. case "ws":
  286. if (params.get("security") !== "tls") {
  287. setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  288. }
  289. setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  290. break;
  291. case "httpupgrade":
  292. if (params.get("security") !== "tls") {
  293. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  294. }
  295. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  296. break;
  297. case "splithttp":
  298. if (params.get("security") !== "tls") {
  299. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  300. }
  301. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  302. break;
  303. case "xhttp":
  304. if (params.get("security") !== "tls") {
  305. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  306. }
  307. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = params.get("mode") || "auto";
  308. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  309. if (params.get("extra") && params.get("extra").trim() !== "") {
  310. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
  311. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
  312. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = params.get("extra") || "";
  313. }
  314. break;
  315. case "kcp":
  316. document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = params.get("headerType") || "none";
  317. document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get("seed") || "";
  318. break;
  319. case "http":
  320. /* this is non-standard, bullshit */
  321. case "h2":
  322. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  323. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
  324. break;
  325. case "quic":
  326. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_guise')[0].value = params.get("headerType") || "none";
  327. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = params.get("quicSecurity") || "none";
  328. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = params.get("key") || "";
  329. break;
  330. case "grpc":
  331. document.getElementsByName('cbid.shadowsocksr.' + sid + '.serviceName')[0].value = params.get("serviceName") || "";
  332. document.getElementsByName('cbid.shadowsocksr.' + sid + '.grpc_mode')[0].value = params.get("mode") || "gun";
  333. break;
  334. case "raw":
  335. case "tcp":
  336. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = params.get("headerType") || "none";
  337. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
  338. if (params.get("headerType") === "http") {
  339. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  340. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
  341. }
  342. break;
  343. }
  344. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  345. return false;
  346. case "vmess":
  347. var sstr = b64DecodeUnicode(ssu[1]);
  348. var ploc = sstr.indexOf("/?");
  349. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
  350. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  351. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "vmess";
  352. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
  353. var url0, param = "";
  354. if (ploc > 0) {
  355. url0 = sstr.substr(0, ploc);
  356. param = sstr.substr(ploc + 2);
  357. }
  358. var ssm = JSON.parse(sstr);
  359. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = ssm.ps;
  360. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm.add;
  361. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm.port;
  362. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alter_id')[0].value = ssm.aid;
  363. document.getElementsByName('cbid.shadowsocksr.' + sid + '.vmess_id')[0].value = ssm.id;
  364. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
  365. (ssm.net === "raw" || ssm.net === "tcp") ? "raw" : ssm.net;
  366. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
  367. if (ssm.net === "raw" || ssm.net === "tcp") {
  368. if (ssm.type && ssm.type != "http") {
  369. ssm.type = "none";
  370. } else {
  371. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = ssm.host;
  372. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = ssm.path;
  373. }
  374. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = ssm.type;
  375. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
  376. }
  377. if (ssm.net == "ws") {
  378. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = ssm.host;
  379. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = ssm.path;
  380. }
  381. if (ssm.net == "httpupgrade") {
  382. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = ssm.host;
  383. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = ssm.path;
  384. }
  385. if (ssm.net == "splithttp") {
  386. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_host')[0].value = ssm.host;
  387. document.getElementsByName('cbid.shadowsocksr.' + sid + '.splithttp_path')[0].value = ssm.path;
  388. }
  389. if (ssm.net == "xhttp") {
  390. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = ssm.mode;
  391. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = ssm.host;
  392. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = ssm.path;
  393. if (params.get("extra") && params.get("extra").trim() !== "") {
  394. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
  395. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
  396. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = ssm.extra;
  397. }
  398. }
  399. if (ssm.net == "h2") {
  400. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = ssm.host;
  401. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = ssm.path;
  402. }
  403. if (ssm.net == "quic") {
  404. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = ssm.securty;
  405. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = ssm.key;
  406. }
  407. if (ssm.net == "kcp") {
  408. document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = ssm.type;
  409. }
  410. if (ssm.tls == "tls") {
  411. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
  412. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
  413. document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = ssm.fp;
  414. if (ssm.net == "xhttp") {
  415. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_alpn')[0].value = ssm.alpn;
  416. }
  417. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = ssm.sni || ssm.host;
  418. }
  419. if (ssm.mux !== undefined) {
  420. document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].checked = true;
  421. document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].dispatchEvent(event);
  422. }
  423. if (ssm.xmux !== undefined) {
  424. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].checked = true;
  425. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xmux')[0].dispatchEvent(event);
  426. }
  427. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  428. return false;
  429. case "vless":
  430. try {
  431. var url = new URL("http://" + ssu[1]);
  432. var params = url.searchParams;
  433. } catch(e) {
  434. alert(e);
  435. return false;
  436. }
  437. // Check if the elements exist before trying to modify them
  438. function setElementValue(name, value) {
  439. const element = document.getElementsByName(name)[0];
  440. if (element) {
  441. if (element.type === "checkbox" || element.type === "radio") {
  442. element.checked = value === true;
  443. } else {
  444. element.value = value;
  445. }
  446. }
  447. }
  448. function dispatchEventIfExists(name, event) {
  449. const element = document.getElementsByName(name)[0];
  450. if (element) {
  451. element.dispatchEvent(event);
  452. }
  453. }
  454. setElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : "");
  455. setElementValue('cbid.shadowsocksr.' + sid + '.type', "v2ray");
  456. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);
  457. setElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', "vless");
  458. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);
  459. setElementValue('cbid.shadowsocksr.' + sid + '.server', url.hostname);
  460. setElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || "80");
  461. setElementValue('cbid.shadowsocksr.' + sid + '.vmess_id', url.username);
  462. setElementValue('cbid.shadowsocksr.' + sid + '.transport',
  463. params.get("type") === "http" ? "h2" :
  464. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  465. (params.get("type") || "tcp"))
  466. );
  467. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);
  468. setElementValue('cbid.shadowsocksr.' + sid + '.vless_encryption', params.get("encryption") || "none");
  469. if ([ "tls", "xtls", "reality" ].includes(params.get("security"))) {
  470. setElementValue('cbid.shadowsocksr.' + sid + '.' + params.get("security"), true);
  471. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get("security"), event);
  472. if (params.get("security") === "reality") {
  473. setElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.get("pbk") ? decodeURIComponent(params.get("pbk")) : "");
  474. setElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.get("sid") || "");
  475. setElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.get("spx") ? decodeURIComponent(params.get("spx")) : "");
  476. }
  477. setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get("flow") || "none");
  478. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);
  479. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_alpn', params.get("alpn") || "");
  480. setElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get("fp") || "");
  481. setElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.get("sni") || "");
  482. }
  483. switch (params.get("type")) {
  484. case "ws":
  485. if (params.get("security") !== "tls") {
  486. setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  487. }
  488. setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  489. break;
  490. case "httpupgrade":
  491. if (params.get("security") !== "tls") {
  492. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  493. }
  494. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  495. break;
  496. case "splithttp":
  497. if (params.get("security") !== "tls") {
  498. setElementValue('cbid.shadowsocksr.' + sid + '.splithttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  499. }
  500. setElementValue('cbid.shadowsocksr.' + sid + '.splithttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  501. break;
  502. case "xhttp":
  503. if (params.get("security") !== "tls") {
  504. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  505. }
  506. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.get("mode") || "auto");
  507. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  508. if (params.get("extra") && params.get("extra").trim() !== "") {
  509. setElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true
  510. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件
  511. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.get("extra") || "");
  512. }
  513. break;
  514. case "kcp":
  515. setElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.get("headerType") || "none");
  516. setElementValue('cbid.shadowsocksr.' + sid + '.seed', params.get("seed") || "");
  517. break;
  518. case "http":
  519. /* this is non-standard, bullshit */
  520. case "h2":
  521. setElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  522. setElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  523. break;
  524. case "quic":
  525. setElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.get("headerType") || "none");
  526. setElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.get("quicSecurity") || "none");
  527. setElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.get("key") || "");
  528. break;
  529. case "grpc":
  530. setElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.get("serviceName") || "");
  531. setElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.get("mode") || "gun");
  532. break;
  533. case "tcp":
  534. case "raw":
  535. setElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.get("headerType") || "none");
  536. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);
  537. if (params.get("headerType") === "http") {
  538. setElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  539. setElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  540. }
  541. break;
  542. }
  543. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  544. return false;
  545. default:
  546. s.innerHTML = "<font style=\'color:red\'><%:Invalid format.%></font>";
  547. return false;
  548. }
  549. }
  550. //]]>
  551. </script>
  552. <input type="button" class="btn cbi-button cbi-button-apply" value="<%:Import%>" onclick="return import_ssr_url(this, '<%=self.option%>', '<%=self.value%>')" />
  553. <span id="<%=self.option%>-status"></span>
  554. <%+cbi/valuefooter%>