Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2026-05-04 14:20:24 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2026-05-04 14:20:24 +0300
commite19061d513b8c4fb2207b4a553a96ea086089612 (patch)
tree8a05450f0f6d3e8a2a182976b1a38bf5cca824ea /web/html/settings.html
parent51e2fb6dbfb6f3f21b3f578c15c3dc0d47c4a66e (diff)
TLS: Remove ECH Force Query
Diffstat (limited to 'web/html/settings.html')
-rw-r--r--web/html/settings.html237
1 files changed, 173 insertions, 64 deletions
diff --git a/web/html/settings.html b/web/html/settings.html
index 769fbd37..3295e2a0 100644
--- a/web/html/settings.html
+++ b/web/html/settings.html
@@ -79,7 +79,8 @@
</template>
{{ template "settings/panel/subscription/general" . }}
</a-tab-pane>
- <a-tab-pane key="5" v-if="allSetting.subJsonEnable || allSetting.subClashEnable" :style="{ paddingTop: '20px' }">
+ <a-tab-pane key="5" v-if="allSetting.subJsonEnable || allSetting.subClashEnable"
+ :style="{ paddingTop: '20px' }">
<template #tab>
<a-icon type="code"></a-icon>
<span>{{ i18n "pages.settings.subSettings" }} (Formats)</span>
@@ -124,9 +125,19 @@
user: {},
lang: LanguageManager.getLanguage(),
inboundOptions: [],
- remarkModels: { i: 'Inbound', e: 'Email', o: 'Other' },
+ remarkModels: {
+ i: 'Inbound',
+ e: 'Email',
+ o: 'Other'
+ },
remarkSeparators: [' ', '-', '_', '@', ':', '~', '|', ',', '.', '/'],
- datepickerList: [{ name: 'Gregorian (Standard)', value: 'gregorian' }, { name: 'Jalalian (شمسی)', value: 'jalalian' }],
+ datepickerList: [{
+ name: 'Gregorian (Standard)',
+ value: 'gregorian'
+ }, {
+ name: 'Jalalian (شمسی)',
+ value: 'jalalian'
+ }],
remarkSample: '',
defaultFragment: {
packets: "tlshello",
@@ -134,17 +145,19 @@
interval: "10-20",
maxSplit: "300-400"
},
- defaultNoises: [
- { type: "rand", packet: "10-20", delay: "10-16", applyTo: "ip" }
- ],
+ defaultNoises: [{
+ type: "rand",
+ packet: "10-20",
+ delay: "10-16",
+ applyTo: "ip"
+ }],
defaultMux: {
enabled: true,
concurrency: 8,
xudpConcurrency: 16,
xudpProxyUDP443: "reject"
},
- defaultRules: [
- {
+ defaultRules: [{
type: "field",
outboundTag: "direct",
domain: [
@@ -160,26 +173,75 @@
]
},
],
- directIPsOptions: [
- { label: 'Private IP', value: 'geoip:private' },
- { label: '🇮🇷 Iran', value: 'geoip:ir' },
- { label: '🇨🇳 China', value: 'geoip:cn' },
- { label: '🇷🇺 Russia', value: 'geoip:ru' },
- { label: '🇻🇳 Vietnam', value: 'geoip:vn' },
- { label: '🇪🇸 Spain', value: 'geoip:es' },
- { label: '🇮🇩 Indonesia', value: 'geoip:id' },
- { label: '🇺🇦 Ukraine', value: 'geoip:ua' },
- { label: '🇹🇷 Türkiye', value: 'geoip:tr' },
- { label: '🇧🇷 Brazil', value: 'geoip:br' },
+ directIPsOptions: [{
+ label: 'Private IP',
+ value: 'geoip:private'
+ },
+ {
+ label: '🇮🇷 Iran',
+ value: 'geoip:ir'
+ },
+ {
+ label: '🇨🇳 China',
+ value: 'geoip:cn'
+ },
+ {
+ label: '🇷🇺 Russia',
+ value: 'geoip:ru'
+ },
+ {
+ label: '🇻🇳 Vietnam',
+ value: 'geoip:vn'
+ },
+ {
+ label: '🇪🇸 Spain',
+ value: 'geoip:es'
+ },
+ {
+ label: '🇮🇩 Indonesia',
+ value: 'geoip:id'
+ },
+ {
+ label: '🇺🇦 Ukraine',
+ value: 'geoip:ua'
+ },
+ {
+ label: '🇹🇷 Türkiye',
+ value: 'geoip:tr'
+ },
+ {
+ label: '🇧🇷 Brazil',
+ value: 'geoip:br'
+ },
],
- diretDomainsOptions: [
- { label: 'Private DNS', value: 'geosite:private' },
- { label: '🇮🇷 Iran', value: 'geosite:category-ir' },
- { label: '🇨🇳 China', value: 'geosite:cn' },
- { label: '🇷🇺 Russia', value: 'geosite:category-ru' },
- { label: 'Apple', value: 'geosite:apple' },
- { label: 'Meta', value: 'geosite:meta' },
- { label: 'Google', value: 'geosite:google' },
+ diretDomainsOptions: [{
+ label: 'Private DNS',
+ value: 'geosite:private'
+ },
+ {
+ label: '🇮🇷 Iran',
+ value: 'geosite:category-ir'
+ },
+ {
+ label: '🇨🇳 China',
+ value: 'geosite:cn'
+ },
+ {
+ label: '🇷🇺 Russia',
+ value: 'geosite:category-ru'
+ },
+ {
+ label: 'Apple',
+ value: 'geosite:apple'
+ },
+ {
+ label: 'Meta',
+ value: 'geosite:meta'
+ },
+ {
+ label: 'Google',
+ value: 'geosite:google'
+ },
],
get remarkModel() {
rm = this.allSetting.remarkModel;
@@ -317,7 +379,13 @@
this.loading(true);
await PromiseUtil.sleep(5000);
- const { webDomain, webPort, webBasePath, webCertFile, webKeyFile } = this.allSetting;
+ const {
+ webDomain,
+ webPort,
+ webBasePath,
+ webCertFile,
+ webKeyFile
+ } = this.allSetting;
const newProtocol = (webCertFile || webKeyFile) ? "https:" : "http:";
let base = webBasePath ? webBasePath.replace(/^\//, "") : "";
@@ -358,7 +426,8 @@
type: 'set',
confirm: (success) => {
if (success) {
- Vue.prototype.$message['success']('{{ i18n "pages.settings.security.twoFactorModalSetSuccess" }}')
+ Vue.prototype.$message['success'](
+ '{{ i18n "pages.settings.security.twoFactorModalSetSuccess" }}')
this.allSetting.twoFactorToken = newTwoFactorToken
}
@@ -374,7 +443,8 @@
type: 'confirm',
confirm: (success) => {
if (success) {
- Vue.prototype.$message['success']('{{ i18n "pages.settings.security.twoFactorModalDeleteSuccess" }}')
+ Vue.prototype.$message['success'](
+ '{{ i18n "pages.settings.security.twoFactorModalDeleteSuccess" }}')
this.allSetting.twoFactorEnable = false
this.allSetting.twoFactorToken = ""
@@ -384,7 +454,12 @@
}
},
addNoise() {
- const newNoise = { type: "rand", packet: "10-20", delay: "10-16", applyTo: "ip" };
+ const newNoise = {
+ type: "rand",
+ packet: "10-20",
+ delay: "10-16",
+ applyTo: "ip"
+ };
this.noisesArray = [...this.noisesArray, newNoise];
},
removeNoise(index) {
@@ -394,44 +469,60 @@
},
updateNoiseType(index, value) {
const updatedNoises = [...this.noisesArray];
- updatedNoises[index] = { ...updatedNoises[index], type: value };
+ updatedNoises[index] = {
+ ...updatedNoises[index],
+ type: value
+ };
this.noisesArray = updatedNoises;
},
updateNoisePacket(index, value) {
const updatedNoises = [...this.noisesArray];
- updatedNoises[index] = { ...updatedNoises[index], packet: value };
+ updatedNoises[index] = {
+ ...updatedNoises[index],
+ packet: value
+ };
this.noisesArray = updatedNoises;
},
updateNoiseDelay(index, value) {
const updatedNoises = [...this.noisesArray];
- updatedNoises[index] = { ...updatedNoises[index], delay: value };
+ updatedNoises[index] = {
+ ...updatedNoises[index],
+ delay: value
+ };
this.noisesArray = updatedNoises;
},
updateNoiseApplyTo(index, value) {
const updatedNoises = [...this.noisesArray];
- updatedNoises[index] = { ...updatedNoises[index], applyTo: value };
+ updatedNoises[index] = {
+ ...updatedNoises[index],
+ applyTo: value
+ };
this.noisesArray = updatedNoises;
},
},
computed: {
ldapInboundTagList: {
- get: function () {
+ get: function() {
const csv = this.allSetting.ldapInboundTags || "";
return csv.length ? csv.split(',').map(s => s.trim()).filter(Boolean) : [];
},
- set: function (list) {
+ set: function(list) {
this.allSetting.ldapInboundTags = Array.isArray(list) ? list.join(',') : '';
}
},
fragment: {
- get: function () { return this.allSetting?.subJsonFragment != ""; },
- set: function (v) {
+ get: function() {
+ return this.allSetting?.subJsonFragment != "";
+ },
+ set: function(v) {
this.allSetting.subJsonFragment = v ? JSON.stringify(this.defaultFragment) : "";
}
},
fragmentPackets: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).packets : ""; },
- set: function (v) {
+ get: function() {
+ return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).packets : "";
+ },
+ set: function(v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.packets = v;
@@ -440,8 +531,10 @@
}
},
fragmentLength: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).length : ""; },
- set: function (v) {
+ get: function() {
+ return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).length : "";
+ },
+ set: function(v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.length = v;
@@ -450,8 +543,10 @@
}
},
fragmentInterval: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).interval : ""; },
- set: function (v) {
+ get: function() {
+ return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).interval : "";
+ },
+ set: function(v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.interval = v;
@@ -460,8 +555,10 @@
}
},
fragmentMaxSplit: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).maxSplit : ""; },
- set: function (v) {
+ get: function() {
+ return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).maxSplit : "";
+ },
+ set: function(v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
newFragment.maxSplit = v;
@@ -492,50 +589,60 @@
}
},
enableMux: {
- get: function () { return this.allSetting?.subJsonMux != ""; },
- set: function (v) {
+ get: function() {
+ return this.allSetting?.subJsonMux != "";
+ },
+ set: function(v) {
this.allSetting.subJsonMux = v ? JSON.stringify(this.defaultMux) : "";
}
},
muxConcurrency: {
- get: function () { return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).concurrency : -1; },
- set: function (v) {
+ get: function() {
+ return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).concurrency : -1;
+ },
+ set: function(v) {
newMux = JSON.parse(this.allSetting.subJsonMux);
newMux.concurrency = v;
this.allSetting.subJsonMux = JSON.stringify(newMux);
}
},
muxXudpConcurrency: {
- get: function () { return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).xudpConcurrency : -1; },
- set: function (v) {
+ get: function() {
+ return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).xudpConcurrency : -1;
+ },
+ set: function(v) {
newMux = JSON.parse(this.allSetting.subJsonMux);
newMux.xudpConcurrency = v;
this.allSetting.subJsonMux = JSON.stringify(newMux);
}
},
muxXudpProxyUDP443: {
- get: function () { return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).xudpProxyUDP443 : "reject"; },
- set: function (v) {
+ get: function() {
+ return this.enableMux ? JSON.parse(this.allSetting.subJsonMux).xudpProxyUDP443 : "reject";
+ },
+ set: function(v) {
newMux = JSON.parse(this.allSetting.subJsonMux);
newMux.xudpProxyUDP443 = v;
this.allSetting.subJsonMux = JSON.stringify(newMux);
}
},
enableDirect: {
- get: function () { return this.allSetting?.subJsonRules != ""; },
- set: function (v) {
+ get: function() {
+ return this.allSetting?.subJsonRules != "";
+ },
+ set: function(v) {
this.allSetting.subJsonRules = v ? JSON.stringify(this.defaultRules) : "";
}
},
directIPs: {
- get: function () {
+ get: function() {
if (!this.enableDirect) return [];
const rules = JSON.parse(this.allSetting.subJsonRules);
if (!Array.isArray(rules)) return [];
const ipRule = rules.find(r => r.ip);
return ipRule?.ip ?? [];
},
- set: function (v) {
+ set: function(v) {
let rules = JSON.parse(this.allSetting.subJsonRules);
if (!Array.isArray(rules)) return;
@@ -554,14 +661,14 @@
}
},
directDomains: {
- get: function () {
+ get: function() {
if (!this.enableDirect) return [];
const rules = JSON.parse(this.allSetting.subJsonRules);
if (!Array.isArray(rules)) return [];
const domainRule = rules.find(r => r.domain);
return domainRule?.domain ?? [];
},
- set: function (v) {
+ set: function(v) {
let rules = JSON.parse(this.allSetting.subJsonRules);
if (!Array.isArray(rules)) return;
if (v.length == 0) {
@@ -576,7 +683,7 @@
}
},
confAlerts: {
- get: function () {
+ get: function() {
if (!this.allSetting) return [];
var alerts = []
if (window.location.protocol !== "https:") alerts.push('{{ i18n "secAlertSSL" }}');
@@ -584,11 +691,13 @@
panelPath = window.location.pathname.split('/').length < 4
if (panelPath && this.allSetting.webBasePath == '/') alerts.push('{{ i18n "secAlertPanelURI" }}');
if (this.allSetting.subEnable) {
- subPath = this.allSetting.subURI.length > 0 ? new URL(this.allSetting.subURI).pathname : this.allSetting.subPath;
+ subPath = this.allSetting.subURI.length > 0 ? new URL(this.allSetting.subURI).pathname : this
+ .allSetting.subPath;
if (subPath == '/sub/') alerts.push('{{ i18n "secAlertSubURI" }}');
}
if (this.allSetting.subJsonEnable) {
- subJsonPath = this.allSetting.subJsonURI.length > 0 ? new URL(this.allSetting.subJsonURI).pathname : this.allSetting.subJsonPath;
+ subJsonPath = this.allSetting.subJsonURI.length > 0 ? new URL(this.allSetting.subJsonURI).pathname :
+ this.allSetting.subJsonPath;
if (subJsonPath == '/json/') alerts.push('{{ i18n "secAlertSubJsonURI" }}');
}
return alerts