ssrurl.htm 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  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. if (ssu[0] === "ss") {
  90. var queryStr = "";
  91. if (ssu[1].indexOf("?") > -1) {
  92. queryStr = ssu[1].split("?")[1]; // 提取 ? 后面的参数
  93. queryStr = queryStr.replace(/&([a-zA-Z]+);/g, '&'); // 转义 &amp; 为 &
  94. }
  95. var params = new URLSearchParams(queryStr);
  96. if (params.get("type")) {
  97. // 替换协议头
  98. ssrurl = ssrurl.replace(/^ss:\/\//i, "shadowsocks://");
  99. var ssu = ssrurl.split('://');
  100. }
  101. }
  102. var event = document.createEvent("HTMLEvents");
  103. event.initEvent("change", true, true);
  104. switch (ssu[0]) {
  105. case "hysteria2":
  106. case "hy2":
  107. try {
  108. var url = new URL("http://" + ssu[1]);
  109. var params = url.searchParams;
  110. } catch(e) {
  111. alert(e);
  112. return false;
  113. }
  114. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = (ssu[0] === "hy2") ? "hysteria2" : ssu[0];
  115. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  116. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
  117. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "443";
  118. if (params.get("lazy") === "1") {
  119. document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].checked = true;
  120. document.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].dispatchEvent(event);
  121. }
  122. if (params.get("mport")) {
  123. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_port_hopping')[0].checked = true; // 设置 flag_port_hopping 为 true
  124. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_port_hopping')[0].dispatchEvent(event); // 触发事件
  125. document.getElementsByName('cbid.shadowsocksr.' + sid + '.port_range')[0].value = params.get("mport") || "";
  126. }
  127. if (params.get("protocol")) {
  128. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].checked = true; // 设置 flag_transport 为 true
  129. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].dispatchEvent(event); // 触发事件
  130. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport_protocol')[0].value = params.get("protocol") || "udp";
  131. }
  132. document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].value = decodeURIComponent(url.username);
  133. document.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].dispatchEvent(event);
  134. document.getElementsByName('cbid.shadowsocksr.' + sid + '.uplink_capacity')[0].value =
  135. (params.get("upmbps") && params.get("upmbps").match(/\d+/)) ? params.get("upmbps").match(/\d+/)[0] : "";
  136. document.getElementsByName('cbid.shadowsocksr.' + sid + '.downlink_capacity')[0].value =
  137. (params.get("downmbps") && params.get("downmbps").match(/\d+/)) ? params.get("downmbps").match(/\d+/)[0] : "";
  138. if (params.get("obfs") && params.get("obfs") !== "none") {
  139. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].checked = true; // 设置 flag_obfs 为 true
  140. document.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].dispatchEvent(event); // 触发事件
  141. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_type')[0].value = params.get("obfs");
  142. document.getElementsByName('cbid.shadowsocksr.' + sid + '.salamander')[0].value = params.get("obfs-password") || params.get("obfs_password");
  143. }
  144. if (params.get("sni") || params.get("alpn")) {
  145. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; // 设置 flag_obfs 为 true
  146. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); // 触发事件
  147. if (params.get("sni")) {
  148. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni") || "";
  149. }
  150. if (params.get("alpn")) {
  151. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get("alpn") || "";
  152. }
  153. }
  154. if (params.get("insecure") === "1") {
  155. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true;
  156. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event);
  157. }
  158. if (params.get("pinSHA256")) {
  159. document.getElementsByName('cbid.shadowsocksr.' + sid + '.pinsha256')[0].value = params.get("pinSHA256") || "";
  160. }
  161. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
  162. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  163. return false;
  164. case "ss":
  165. var url0 = ((ssu[1] || "").replace(/&([a-zA-Z]+);/g, '&').replace(/\s*#\s*/, '#').trim());
  166. var param = "";
  167. // 先分离 #(alias)
  168. var hashIndex = url0.indexOf("#");
  169. if (hashIndex >= 0) {
  170. param = url0.substring(hashIndex + 1);
  171. url0 = url0.substring(0, hashIndex);
  172. }
  173. // 再分离 ? 或 /?(参数)
  174. var queryIndex = (url0 = url0.replace('/?', '?')).indexOf("?");
  175. var queryStr = "";
  176. if (queryIndex >= 0) {
  177. queryStr = url0.substring(queryIndex + 1);
  178. url0 = url0.substring(0, queryIndex);
  179. }
  180. var params = Object.fromEntries(new URLSearchParams(queryStr));
  181. // 判断是否 SIP002 格式(即含 @)
  182. if (url0.indexOf("@") !== -1) {
  183. // === SIP002 格式 ===
  184. var sipIndex = url0.indexOf("@");
  185. // 先 URL 解码 base64 再解码
  186. var userInfoB64 = decodeURIComponent(url0.substring(0, sipIndex));
  187. var userInfo = b64decsafe(userInfoB64);
  188. var userInfoSplitIndex = userInfo.indexOf(":");
  189. if(userInfoSplitIndex < 0) {
  190. // 格式错误
  191. s.innerHTML = "<font style='color:red'><%:Userinfo format error.%></font>";
  192. break;
  193. }
  194. var method = userInfo.substring(0, userInfoSplitIndex);
  195. var password = userInfo.substring(userInfoSplitIndex + 1);
  196. var serverPart = url0.substring(sipIndex + 1);
  197. var serverInfo = serverPart.split(":");
  198. var server = serverInfo[0];
  199. var port = serverInfo[1];
  200. var plugin = "", pluginOpts = "";
  201. if (params.plugin) {
  202. var pluginParams = decodeURIComponent(params.plugin).split(";");
  203. plugin = pluginParams.shift();
  204. pluginOpts = pluginParams.join(";");
  205. }
  206. } else {
  207. // === Base64 SS2022 / 普通格式 的整体编码格式 ===
  208. // 先 URL 解码整个字符串
  209. var decodedUrl0 = decodeURIComponent(url0);
  210. var sstr = b64decsafe(decodedUrl0);
  211. if (!sstr) {
  212. s.innerHTML = "<font style='color:red'><%:Base64 sstr failed.%></font>";
  213. break;
  214. }
  215. // 支持 SS2022 / 普通格式
  216. var regex2022 = /^([^:]+):([^:]+):([^@]+)@([^:]+):(\d+)$/;
  217. var regexNormal = /^([^:]+):([^@]+)@([^:]+):(\d+)$/;
  218. var m2022 = sstr.match(regex2022);
  219. var mNormal = sstr.match(regexNormal);
  220. if (m2022) {
  221. var method = m2022[1];
  222. var password = m2022[2] + ":" + m2022[3];
  223. var server = m2022[4];
  224. var port = m2022[5];
  225. } else if (mNormal) {
  226. var method = mNormal[1];
  227. var password = mNormal[2];
  228. var server = mNormal[3];
  229. var port = mNormal[4];
  230. } else {
  231. s.innerHTML = "<font style='color:red'><%:SS URL base64 sstr format not recognized.%></font>";
  232. break;
  233. }
  234. var plugin = "", pluginOpts = "";
  235. if (params["shadow-tls"]) {
  236. try {
  237. var decoded_tls = JSON.parse(atob(decodeURIComponent(params["shadow-tls"])));
  238. plugin = "shadow-tls";
  239. var versionFlag = "";
  240. if (decoded_tls.version && !isNaN(decoded_tls.version)) {
  241. versionFlag = "v" + decoded_tls.version + "=1;";
  242. }
  243. pluginOpts = versionFlag + "host=" + (decoded_tls.host || "") + ";passwd=" + (decoded_tls.password || "");
  244. } catch (e) {
  245. console.log("shadow-tls decode failed:", e);
  246. }
  247. }
  248. }
  249. // 判断密码是否经过url编码
  250. const isURLEncodedPassword = function(pwd) {
  251. if (!/%[0-9A-Fa-f]{2}/.test(pwd)) return false;
  252. try {
  253. const decoded = decodeURIComponent(pwd.replace(/\+/g, "%20"));
  254. const reencoded = encodeURIComponent(decoded);
  255. return reencoded === pwd;
  256. } catch (e) {
  257. return false;
  258. }
  259. }
  260. if (isURLEncodedPassword(password)) {
  261. password = decodeURIComponent(password); // 解码URL编码
  262. } else {
  263. password = password; // 保持原始值
  264. }
  265. // === 填充配置项 ===
  266. var has_ss_type = (ss_type === "ss-rust") ? "ss-rust" : "ss-libev";
  267. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  268. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  269. document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type;
  270. document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event);
  271. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;
  272. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;
  273. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password || "";
  274. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;
  275. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].dispatchEvent(event);
  276. if (plugin && plugin !== "none") {
  277. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = true; // 设置 enable_plugin 为 true
  278. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].dispatchEvent(event); // 触发事件
  279. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].value = plugin;
  280. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].dispatchEvent(event);
  281. if (plugin !== undefined) {
  282. document.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin_opts')[0].value = pluginOpts || "";
  283. }
  284. } else {
  285. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = false;
  286. }
  287. if (param != undefined) {
  288. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURIComponent(param);
  289. }
  290. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  291. return false;
  292. case "ssr":
  293. var sstr = b64decsafe((ssu[1] || "").replace(/#.*/, "").trim());
  294. var ploc = sstr.indexOf("/?");
  295. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];
  296. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  297. var url0, param = "";
  298. if (ploc > 0) {
  299. url0 = sstr.substr(0, ploc);
  300. param = sstr.substr(ploc + 2);
  301. }
  302. var ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);
  303. if (!ssm || ssm.length < 7) return false;
  304. var pdict = {};
  305. if (param.length > 2) {
  306. var a = param.split('&');
  307. for (var i = 0; i < a.length; i++) {
  308. var b = a[i].split('=');
  309. pdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');
  310. }
  311. }
  312. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm[1];
  313. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm[2];
  314. document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0].value = ssm[3];
  315. document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0].value = ssm[4];
  316. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0].value = ssm[5];
  317. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = b64decsafe(ssm[6]);
  318. document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam');
  319. document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0].value = dictvalue(pdict, 'protoparam');
  320. var rem = pdict['remarks'];
  321. if (typeof (rem) != 'undefined' && rem != '' && rem.length > 0) document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = b64decutf8safe(rem);
  322. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  323. return false;
  324. case "trojan":
  325. try {
  326. var url = new URL("http://" + ssu[1]);
  327. var params = url.searchParams;
  328. } catch(e) {
  329. alert(e);
  330. return false;
  331. }
  332. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : "";
  333. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
  334. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  335. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "trojan";
  336. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
  337. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;
  338. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || "80";
  339. document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username);
  340. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
  341. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
  342. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get("sni");
  343. if (params.get("allowInsecure") === "1") {
  344. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true
  345. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件
  346. }
  347. if (params.get("ech") && params.get("ech").trim() !== "") {
  348. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].checked = true; // 设置 enable_ech 为 true
  349. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].dispatchEvent(event); // 触发事件
  350. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = params.get("ech");
  351. }
  352. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
  353. params.get("type") == "http" ? "h2" :
  354. (["xhttp", "splithttp"].includes(params.get("type")) ? "xhttp" :
  355. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  356. (params.get("type") || "raw")));
  357. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
  358. if (params.get("security") === "tls") {
  359. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get("alpn") || "";
  360. document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get("fp") || "";
  361. }
  362. switch (params.get("type")) {
  363. case "ws":
  364. if (params.get("security") !== "tls") {
  365. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  366. }
  367. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  368. break;
  369. case "httpupgrade":
  370. if (params.get("security") !== "tls") {
  371. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  372. }
  373. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  374. break;
  375. case "xhttp":
  376. case "splithttp":
  377. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  378. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = params.get("mode") || "auto";
  379. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "/";
  380. if (params.get("extra") && params.get("extra").trim() !== "") {
  381. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
  382. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
  383. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = params.get("extra") || "";
  384. }
  385. break;
  386. case "kcp":
  387. document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = params.get("headerType") || "none";
  388. document.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get("seed") || "";
  389. break;
  390. case "http":
  391. /* this is non-standard, bullshit */
  392. case "h2":
  393. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  394. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
  395. break;
  396. case "quic":
  397. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_guise')[0].value = params.get("headerType") || "none";
  398. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = params.get("quicSecurity") || "none";
  399. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = params.get("key") || "";
  400. break;
  401. case "grpc":
  402. document.getElementsByName('cbid.shadowsocksr.' + sid + '.serviceName')[0].value = params.get("serviceName") || "";
  403. document.getElementsByName('cbid.shadowsocksr.' + sid + '.grpc_mode')[0].value = params.get("mode") || "gun";
  404. break;
  405. case "raw":
  406. case "tcp":
  407. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = params.get("headerType") || "none";
  408. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
  409. if (params.get("headerType") === "http") {
  410. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = params.get("host") ? decodeURIComponent(params.get("host")) : "";
  411. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = params.get("path") ? decodeURIComponent(params.get("path")) : "";
  412. }
  413. break;
  414. }
  415. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  416. return false;
  417. case "vmess":
  418. var sstr = b64DecodeUnicode((ssu[1] || "").replace(/#.*/, "").trim());
  419. var ploc = sstr.indexOf("/?");
  420. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = "v2ray";
  421. document.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);
  422. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = "vmess";
  423. document.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);
  424. var url0, param = "";
  425. if (ploc > 0) {
  426. url0 = sstr.substr(0, ploc);
  427. param = sstr.substr(ploc + 2);
  428. }
  429. var ssm = JSON.parse(sstr);
  430. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = ssm.ps;
  431. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm.add;
  432. document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm.port;
  433. document.getElementsByName('cbid.shadowsocksr.' + sid + '.alter_id')[0].value = ssm.aid;
  434. document.getElementsByName('cbid.shadowsocksr.' + sid + '.vmess_id')[0].value = ssm.id;
  435. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value =
  436. (["xhttp", "splithttp"].includes(ssm.net) ? "xhttp" :
  437. (["tcp", "raw"].includes(ssm.net) ? "raw" :
  438. (ssm.net || "raw")));
  439. document.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);
  440. if (ssm.net === "raw" || ssm.net === "tcp") {
  441. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = ssm.type;
  442. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);
  443. if (ssm.type === "http") {
  444. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = ssm.host;
  445. document.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = ssm.path;
  446. }
  447. }
  448. if (ssm.net == "ws") {
  449. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = ssm.host;
  450. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = ssm.path;
  451. }
  452. if (ssm.net == "httpupgrade") {
  453. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = ssm.host;
  454. document.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = ssm.path;
  455. }
  456. if (ssm.net == "xhttp" || ssm.net == "splithttp") {
  457. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = ssm.mode || "auto";
  458. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = ssm.host;
  459. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = ssm.path;
  460. if (ssm.extra !== "" && ssm.extra !== undefined) {
  461. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true
  462. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件
  463. document.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = ssm.extra;
  464. }
  465. }
  466. if (ssm.net == "h2") {
  467. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = ssm.host;
  468. document.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = ssm.path;
  469. }
  470. if (ssm.net == "quic") {
  471. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = ssm.securty;
  472. document.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = ssm.key;
  473. }
  474. if (ssm.net == "kcp") {
  475. document.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = ssm.type;
  476. }
  477. if (ssm.tls == "tls") {
  478. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;
  479. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);
  480. if (ssm.fp !== "" && ssm.fp !== undefined) {
  481. document.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = ssm.fp;
  482. }
  483. if (ssm.alpn !== "" && ssm.alpn !== undefined) {
  484. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = ssm.alpn;
  485. }
  486. if (ssm.host !== "" && ssm.host !== undefined) {
  487. document.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = ssm.sni || ssm.host;
  488. }
  489. if (ssm.ech !== "" && ssm.ech !== undefined) {
  490. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].checked = true; // 设置 enable_ech 为 true
  491. document.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].dispatchEvent(event); // 触发事件
  492. document.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = ssm.ech;
  493. }
  494. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked =
  495. !!(ssm.allowInsecure ?? ssm.allowlnsecure ?? ssm['skip-cert-verify']); // 设置 insecure 为 true
  496. document.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件
  497. }
  498. if (ssm.mux !== undefined) {
  499. document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].checked = true;
  500. document.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].dispatchEvent(event);
  501. }
  502. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  503. return false;
  504. case "vless":
  505. try {
  506. var url = new URL("http://" + ssu[1]);
  507. var params = url.searchParams;
  508. } catch(e) {
  509. alert(e);
  510. return false;
  511. }
  512. // Check if the elements exist before trying to modify them
  513. function setElementValue(name, value) {
  514. const element = document.getElementsByName(name)[0];
  515. if (element) {
  516. if (element.type === "checkbox" || element.type === "radio") {
  517. element.checked = value === true;
  518. } else {
  519. element.value = value;
  520. }
  521. }
  522. }
  523. function dispatchEventIfExists(name, event) {
  524. const element = document.getElementsByName(name)[0];
  525. if (element) {
  526. element.dispatchEvent(event);
  527. }
  528. }
  529. setElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : "");
  530. setElementValue('cbid.shadowsocksr.' + sid + '.type', "v2ray");
  531. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);
  532. setElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', "vless");
  533. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);
  534. setElementValue('cbid.shadowsocksr.' + sid + '.server', url.hostname);
  535. setElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || "80");
  536. setElementValue('cbid.shadowsocksr.' + sid + '.vmess_id', url.username);
  537. setElementValue('cbid.shadowsocksr.' + sid + '.transport',
  538. params.get("type") === "http" ? "h2" :
  539. (["xhttp", "splithttp"].includes(params.get("type")) ? "xhttp" :
  540. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  541. (params.get("type") || "raw")))
  542. );
  543. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);
  544. setElementValue('cbid.shadowsocksr.' + sid + '.vless_encryption', params.get("encryption") || "none");
  545. if ([ "tls", "xtls", "reality" ].includes(params.get("security"))) {
  546. setElementValue('cbid.shadowsocksr.' + sid + '.' + params.get("security"), true);
  547. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get("security"), event);
  548. if (params.get("security") === "tls") {
  549. if (params.get("ech") && params.get("ech").trim() !== "") {
  550. setElementValue('cbid.shadowsocksr.' + sid + '.enable_ech', true); // 设置 enable_ech 为 true
  551. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_ech', event); // 触发事件
  552. setElementValue('cbid.shadowsocksr.' + sid + '.ech_config', params.get("ech") || "");
  553. }
  554. if (params.get("allowInsecure") === "1") {
  555. setElementValue('cbid.shadowsocksr.' + sid + '.insecure', true); // 设置 insecure 为 true
  556. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.insecure', event); // 触发事件
  557. }
  558. }
  559. if (params.get("security") === "reality") {
  560. setElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.get("pbk") ? decodeURIComponent(params.get("pbk")) : "");
  561. setElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.get("sid") || "");
  562. setElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.get("spx") ? decodeURIComponent(params.get("spx")) : "");
  563. if (params.get("pqv") && params.get("pqv").trim() !== "") {
  564. setElementValue('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', true); // 设置 enable_mldsa65verify 为 true
  565. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', event); // 触发事件
  566. setElementValue('cbid.shadowsocksr.' + sid + '.reality_mldsa65verify', params.get("pqv") || "");
  567. }
  568. }
  569. setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get("flow") || "none");
  570. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);
  571. setElementValue('cbid.shadowsocksr.' + sid + '.tls_alpn', params.get("alpn") || "");
  572. setElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get("fp") || "");
  573. setElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.get("sni") || "");
  574. }
  575. switch (params.get("type")) {
  576. case "ws":
  577. if (params.get("security") !== "tls") {
  578. setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  579. }
  580. setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  581. break;
  582. case "httpupgrade":
  583. if (params.get("security") !== "tls") {
  584. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  585. }
  586. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  587. break;
  588. case "xhttp":
  589. case "splithttp":
  590. if (params.get("security") !== "tls") {
  591. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  592. }
  593. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.get("mode") || "auto");
  594. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  595. if (params.get("extra") && params.get("extra").trim() !== "") {
  596. setElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true
  597. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件
  598. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.get("extra") || "");
  599. }
  600. break;
  601. case "kcp":
  602. setElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.get("headerType") || "none");
  603. setElementValue('cbid.shadowsocksr.' + sid + '.seed', params.get("seed") || "");
  604. break;
  605. case "http":
  606. /* this is non-standard, bullshit */
  607. case "h2":
  608. setElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  609. setElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  610. break;
  611. case "quic":
  612. setElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.get("headerType") || "none");
  613. setElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.get("quicSecurity") || "none");
  614. setElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.get("key") || "");
  615. break;
  616. case "grpc":
  617. setElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.get("serviceName") || "");
  618. setElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.get("mode") || "gun");
  619. break;
  620. case "tcp":
  621. case "raw":
  622. setElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.get("headerType") || "none");
  623. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);
  624. if (params.get("headerType") === "http") {
  625. setElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  626. setElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  627. }
  628. break;
  629. }
  630. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  631. return false;
  632. case "shadowsocks":
  633. try {
  634. // 处理完整 ss:// 链接
  635. var urlinfo = ssu[1].replace(/&([a-zA-Z]+);/g, '&').replace(/\s*#\s*/, '#').trim();
  636. // 拆分 @,判断是否是 base64 userinfo 的格式
  637. var parts = urlinfo.split("@");
  638. if (parts.length > 1) {
  639. // @ 前是 base64(method:password),后面是 server:port?params
  640. var userinfo = b64decsafe(parts[0]);
  641. var sepIndex = userinfo.indexOf(":");
  642. if (sepIndex > -1) {
  643. method = userinfo.slice(0, sepIndex);
  644. password = userinfo.slice(sepIndex + 1);
  645. }
  646. }
  647. var url = new URL("http://" + urlinfo);
  648. var params = url.searchParams;
  649. } catch(e) {
  650. alert(e);
  651. return false;
  652. }
  653. // Check if the elements exist before trying to modify them
  654. function setElementValue(name, value) {
  655. const element = document.getElementsByName(name)[0];
  656. if (element) {
  657. if (typeof value === 'boolean') {
  658. element.checked = value;
  659. } else {
  660. element.value = value;
  661. }
  662. }
  663. }
  664. function dispatchEventIfExists(name, event) {
  665. const element = document.getElementsByName(name)[0];
  666. if (element) {
  667. element.dispatchEvent(event);
  668. }
  669. }
  670. setElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : "");
  671. setElementValue('cbid.shadowsocksr.' + sid + '.type', "v2ray");
  672. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);
  673. setElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', "shadowsocks");
  674. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);
  675. setElementValue('cbid.shadowsocksr.' + sid + '.server', url.hostname);
  676. setElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || "80");
  677. setElementValue('cbid.shadowsocksr.' + sid + '.password', password || url.username);
  678. setElementValue('cbid.shadowsocksr.' + sid + '.transport',
  679. params.get("type") === "http" ? "h2" :
  680. (["xhttp", "splithttp"].includes(params.get("type")) ? "xhttp" :
  681. (["tcp", "raw"].includes(params.get("type")) ? "raw" :
  682. (params.get("type") || "raw")))
  683. );
  684. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);
  685. setElementValue('cbid.shadowsocksr.' + sid + '.encrypt_method_ss', method || params.get("encryption") || "none");
  686. if ([ "tls", "xtls", "reality" ].includes(params.get("security"))) {
  687. setElementValue('cbid.shadowsocksr.' + sid + '.' + params.get("security"), true);
  688. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get("security"), event);
  689. if (params.get("security") === "tls") {
  690. if (params.get("ech") && params.get("ech").trim() !== "") {
  691. setElementValue('cbid.shadowsocksr.' + sid + '.enable_ech', true); // 设置 enable_ech 为 true
  692. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_ech', event); // 触发事件
  693. setElementValue('cbid.shadowsocksr.' + sid + '.ech_config', params.get("ech") || "");
  694. }
  695. if (params.get("allowInsecure") === "1") {
  696. setElementValue('cbid.shadowsocksr.' + sid + '.insecure', true); // 设置 insecure 为 true
  697. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.insecure', event); // 触发事件
  698. }
  699. }
  700. if (params.get("security") === "reality") {
  701. setElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.get("pbk") ? decodeURIComponent(params.get("pbk")) : "");
  702. setElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.get("sid") || "");
  703. setElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.get("spx") ? decodeURIComponent(params.get("spx")) : "");
  704. if (params.get("pqv") && params.get("pqv").trim() !== "") {
  705. setElementValue('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', true); // 设置 enable_mldsa65verify 为 true
  706. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', event); // 触发事件
  707. setElementValue('cbid.shadowsocksr.' + sid + '.reality_mldsa65verify', params.get("pqv") || "");
  708. }
  709. }
  710. setElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get("flow") || "none");
  711. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);
  712. setElementValue('cbid.shadowsocksr.' + sid + '.tls_alpn', params.get("alpn") || "");
  713. setElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get("fp") || "");
  714. setElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.get("sni") || "");
  715. }
  716. switch (params.get("type")) {
  717. case "ws":
  718. if (params.get("security") !== "tls") {
  719. setElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  720. }
  721. setElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  722. break;
  723. case "httpupgrade":
  724. if (params.get("security") !== "tls") {
  725. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  726. }
  727. setElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  728. break;
  729. case "xhttp":
  730. case "splithttp":
  731. if (params.get("security") !== "tls") {
  732. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  733. }
  734. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.get("mode") || "auto");
  735. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.get("path") ? decodeURIComponent(params.get("path")) : "/");
  736. if (params.get("extra") && params.get("extra").trim() !== "") {
  737. setElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true
  738. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件
  739. setElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.get("extra") || "");
  740. }
  741. break;
  742. case "kcp":
  743. setElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.get("headerType") || "none");
  744. setElementValue('cbid.shadowsocksr.' + sid + '.seed', params.get("seed") || "");
  745. break;
  746. case "http":
  747. /* this is non-standard, bullshit */
  748. case "h2":
  749. setElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  750. setElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  751. break;
  752. case "quic":
  753. setElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.get("headerType") || "none");
  754. setElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.get("quicSecurity") || "none");
  755. setElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.get("key") || "");
  756. break;
  757. case "grpc":
  758. setElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.get("serviceName") || "");
  759. setElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.get("mode") || "gun");
  760. break;
  761. case "tcp":
  762. case "raw":
  763. setElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.get("headerType") || "none");
  764. dispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);
  765. if (params.get("headerType") === "http") {
  766. setElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.get("host") ? decodeURIComponent(params.get("host")) : "");
  767. setElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.get("path") ? decodeURIComponent(params.get("path")) : "");
  768. }
  769. break;
  770. }
  771. s.innerHTML = "<font style=\'color:green\'><%:Import configuration information successfully.%></font>";
  772. return false;
  773. default:
  774. s.innerHTML = "<font style=\'color:red\'><%:Invalid format.%></font>";
  775. return false;
  776. }
  777. }
  778. //]]>
  779. </script>
  780. <input type="button" class="btn cbi-button cbi-button-apply" value="<%:Import%>" onclick="return import_ssr_url(this, '<%=self.option%>', '<%=self.value%>')" />
  781. <span id="<%=self.option%>-status"></span>
  782. <%+cbi/valuefooter%>