diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-04-18 21:04:06 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-04-18 21:04:06 +0300 |
| commit | 3e0faecaaebd8394a1a9d18ec11b5a60f210b654 (patch) | |
| tree | 70226a9e7a73155d05410bda80a38673f8db2a83 /web/html/xui | |
| parent | dc7dbae14a37492ac3a7e3822b3e0b250e248173 (diff) | |
improve reality setting
split xtls from tls - remove iran warp - remove old setting reality from franzkafka (it was a messy code) -and other improvement
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'web/html/xui')
| -rw-r--r-- | web/html/xui/client_bulk_modal.html | 46 | ||||
| -rw-r--r-- | web/html/xui/client_modal.html | 9 | ||||
| -rw-r--r-- | web/html/xui/form/client.html | 6 | ||||
| -rw-r--r-- | web/html/xui/form/protocol/trojan.html | 4 | ||||
| -rw-r--r-- | web/html/xui/form/protocol/vless.html | 4 | ||||
| -rw-r--r-- | web/html/xui/form/protocol/vmess.html | 2 | ||||
| -rw-r--r-- | web/html/xui/form/tls_settings.html | 92 | ||||
| -rw-r--r-- | web/html/xui/inbound_info_modal.html | 6 | ||||
| -rw-r--r-- | web/html/xui/inbound_modal.html | 55 | ||||
| -rw-r--r-- | web/html/xui/inbounds.html | 34 | ||||
| -rw-r--r-- | web/html/xui/setting.html | 18 |
11 files changed, 180 insertions, 96 deletions
diff --git a/web/html/xui/client_bulk_modal.html b/web/html/xui/client_bulk_modal.html index 4e282ccd..46bc6657 100644 --- a/web/html/xui/client_bulk_modal.html +++ b/web/html/xui/client_bulk_modal.html @@ -33,6 +33,30 @@ <span slot="label">{{ i18n "pages.client.clientCount" }}</span> <a-input-number v-model="clientsBulkModal.quantity" :min="1" :max="100"></a-input-number> </a-form-item> + <a-form-item> + <span slot="label"> + <span>{{ i18n "pages.inbounds.IPLimit" }}</span> + <a-tooltip> + <template slot="title"> + <span>{{ i18n "pages.inbounds.IPLimitDesc" }}</span> + </template> + <a-icon type="question-circle" theme="filled"></a-icon> + </a-tooltip> + </span> + <a-input type="number" v-model.number="clientsBulkModal.limitIp" min="0" style="width: 70px;" ></a-input> + </a-form-item> + <a-form-item v-if="clientsBulkModal.inbound.xtls" label="Flow"> + <a-select v-model="clientsBulkModal.flow" style="width: 150px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"> + <a-select-option value="">{{ i18n "none" }}</a-select-option> + <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option> + </a-select> + </a-form-item> + <a-form-item v-if="clientsBulkModal.inbound.canEnableTlsFlow()" label="Flow" layout="inline"> + <a-select v-model="clientsBulkModal.flow" style="width: 150px"> + <a-select-option value="" selected>{{ i18n "none" }}</a-select-option> + <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option> + </a-select> + </a-form-item> <a-form-item label="Subscription"> <a-input v-model.trim="clientsBulkModal.subId"></a-input> </a-form-item> @@ -51,10 +75,10 @@ </span> <a-input-number v-model="clientsBulkModal.totalGB" :min="0"></a-input-number> </a-form-item> - <a-form-item label="{{ i18n "pages.client.delayedStart" }}"> + <a-form-item label='{{ i18n "pages.client.delayedStart" }}'> <a-switch v-model="clientsBulkModal.delayedStart" @click="clientsBulkModal.expiryTime=0"></a-switch> </a-form-item> - <a-form-item label="{{ i18n "pages.client.expireDays" }}" v-if="clientsBulkModal.delayedStart"> + <a-form-item label='{{ i18n "pages.client.expireDays" }}' v-if="clientsBulkModal.delayedStart"> <a-input type="number" v-model.number="delayedExpireDays" :min="0"></a-input> </a-form-item> <a-form-item v-else> @@ -83,9 +107,9 @@ confirm: null, dbInbound: new DBInbound(), inbound: new Inbound(), - clients: [], quantity: 1, totalGB: 0, + limitIp: 0, expiryTime: '', emailMethod: 0, firstNum: 1, @@ -94,8 +118,10 @@ emailPostfix: "", subId: "", tgId: "", + flow: "", delayedStart: false, ok() { + clients = []; method=clientsBulkModal.emailMethod; if(method>1){ start=clientsBulkModal.firstNum; @@ -113,11 +139,18 @@ newClient.email += useNum ? prefix + i.toString() + postfix : prefix + postfix; newClient.subId = clientsBulkModal.subId; newClient.tgId = clientsBulkModal.tgId; + newClient.limitIp = clientsBulkModal.limitIp; newClient._totalGB = clientsBulkModal.totalGB; newClient._expiryTime = clientsBulkModal.expiryTime; - clientsBulkModal.clients.push(newClient); + if(clientsBulkModal.inbound.canEnableTlsFlow()){ + newClient.flow = clientsBulkModal.flow; + } + if(clientsBulkModal.inbound.xtls){ + newClient.flow = clientsBulkModal.flow; + } + clients.push(newClient); } - ObjectUtil.execute(clientsBulkModal.confirm, clientsBulkModal.inbound, clientsBulkModal.dbInbound); + ObjectUtil.execute(clientsBulkModal.confirm, clients, clientsBulkModal.dbInbound.id); }, show({ title='', okText='{{ i18n "sure" }}', dbInbound=null, confirm=(inbound, dbInbound)=>{} }) { this.visible = true; @@ -128,15 +161,16 @@ this.totalGB = 0; this.expiryTime = 0; this.emailMethod= 0; + this.limitIp= 0; this.firstNum= 1; this.lastNum= 1; this.emailPrefix= ""; this.emailPostfix= ""; this.subId= ""; this.tgId= ""; + this.flow= ""; this.dbInbound = new DBInbound(dbInbound); this.inbound = dbInbound.toInbound(); - this.clients = this.getClients(this.inbound.protocol, this.inbound.settings); this.delayedStart = false; }, getClients(protocol, clientSettings) { diff --git a/web/html/xui/client_modal.html b/web/html/xui/client_modal.html index d1078f23..d90e6156 100644 --- a/web/html/xui/client_modal.html +++ b/web/html/xui/client_modal.html @@ -12,6 +12,7 @@ confirmLoading: false, title: '', okText: '', + isEdit: false, dbInbound: new DBInbound(), inbound: new Inbound(), clients: [], @@ -21,9 +22,13 @@ isExpired: false, delayedStart: false, ok() { - ObjectUtil.execute(clientModal.confirm, clientModal.inbound, clientModal.dbInbound, clientModal.index); + if(clientModal.isEdit){ + ObjectUtil.execute(clientModal.confirm, clientModalApp.client, clientModal.dbInbound.id, clientModal.index); + } else { + ObjectUtil.execute(clientModal.confirm, clientModalApp.client, clientModal.dbInbound.id); + } }, - show({ title='', okText='{{ i18n "sure" }}', index=null, dbInbound=null, confirm=(index, dbInbound)=>{}, isEdit=false }) { + show({ title='', okText='{{ i18n "sure" }}', index=null, dbInbound=null, confirm=()=>{}, isEdit=false }) { this.visible = true; this.title = title; this.okText = okText; diff --git a/web/html/xui/form/client.html b/web/html/xui/form/client.html index 1de05ac9..2d8c5d2b 100644 --- a/web/html/xui/form/client.html +++ b/web/html/xui/form/client.html @@ -68,7 +68,7 @@ </a-textarea> </a-form> </a-form-item> - <a-form-item v-if="inbound.XTLS" label="Flow"> + <a-form-item v-if="inbound.xtls" label="Flow"> <a-select v-model="client.flow" style="width: 150px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"> <a-select-option value="">{{ i18n "none" }}</a-select-option> <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option> @@ -100,10 +100,10 @@ </a-tag> </template> </a-form-item> - <a-form-item label="{{ i18n "pages.client.delayedStart" }}"> + <a-form-item label='{{ i18n "pages.client.delayedStart" }}'> <a-switch v-model="clientModal.delayedStart" @click="client._expiryTime=0"></a-switch> </a-form-item> - <a-form-item label="{{ i18n "pages.client.expireDays" }}" v-if="clientModal.delayedStart"> + <a-form-item label='{{ i18n "pages.client.expireDays" }}' v-if="clientModal.delayedStart"> <a-input type="number" v-model.number="delayedExpireDays" :min="0"></a-input> </a-form-item> <a-form-item v-else> diff --git a/web/html/xui/form/protocol/trojan.html b/web/html/xui/form/protocol/trojan.html index 91fd7afd..9f5c120a 100644 --- a/web/html/xui/form/protocol/trojan.html +++ b/web/html/xui/form/protocol/trojan.html @@ -1,7 +1,7 @@ {{define "form/trojan"}} <a-form layout="inline"> <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.trojans.slice(0,1)" v-if="!isEdit"> - <a-collapse-panel header="{{ i18n "pages.inbounds.client" }}"> + <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'> <a-form layout="inline"> <a-form-item> <span slot="label"> @@ -31,7 +31,7 @@ </span> <a-input type="number" v-model.number="client.limitIp" min="0" style="width: 70px;" ></a-input> </a-form-item> - <a-form-item v-if="inbound.XTLS" label="Flow"> + <a-form-item v-if="inbound.xtls" label="Flow"> <a-select v-model="client.flow" style="width: 150px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"> <a-select-option value="">{{ i18n "none" }}</a-select-option> <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option> diff --git a/web/html/xui/form/protocol/vless.html b/web/html/xui/form/protocol/vless.html index 029f2c9e..68c719dd 100644 --- a/web/html/xui/form/protocol/vless.html +++ b/web/html/xui/form/protocol/vless.html @@ -1,7 +1,7 @@ {{define "form/vless"}} <a-form layout="inline"> <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.vlesses.slice(0,1)" v-if="!isEdit"> - <a-collapse-panel header="{{ i18n "pages.inbounds.client" }}"> + <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'> <a-form layout="inline"> <a-form-item> <span slot="label"> @@ -31,7 +31,7 @@ </span> <a-input type="number" v-model.number="client.limitIp" min="0" style="width: 70px;" ></a-input> </a-form-item> - <a-form-item v-if="inbound.XTLS" label="Flow"> + <a-form-item v-if="inbound.xtls" label="Flow"> <a-select v-model="inbound.settings.vlesses[index].flow" style="width: 150px" :dropdown-class-name="siderDrawer.isDarkTheme ? 'ant-card-dark' : ''"> <a-select-option value="" selected>{{ i18n "none" }}</a-select-option> <a-select-option v-for="key in XTLS_FLOW_CONTROL" :value="key">[[ key ]]</a-select-option> diff --git a/web/html/xui/form/protocol/vmess.html b/web/html/xui/form/protocol/vmess.html index ad2b3960..d19e5cb7 100644 --- a/web/html/xui/form/protocol/vmess.html +++ b/web/html/xui/form/protocol/vmess.html @@ -1,7 +1,7 @@ {{define "form/vmess"}} <a-form layout="inline"> <a-collapse activeKey="0" v-for="(client, index) in inbound.settings.vmesses.slice(0,1)" v-if="!isEdit"> - <a-collapse-panel header="{{ i18n "pages.inbounds.client" }}"> + <a-collapse-panel header='{{ i18n "pages.inbounds.client" }}'> <a-form layout="inline"> <a-form-item> <span slot="label"> diff --git a/web/html/xui/form/tls_settings.html b/web/html/xui/form/tls_settings.html index f954b76b..dcef3990 100644 --- a/web/html/xui/form/tls_settings.html +++ b/web/html/xui/form/tls_settings.html @@ -17,7 +17,7 @@ </span> <a-switch v-model="inbound.reality"></a-switch> </a-form-item> - <a-form-item v-if="inbound.canEnableXTLS()"> + <a-form-item v-if="inbound.canEnableXtls()"> <span slot="label"> XTLS <a-tooltip> @@ -27,14 +27,14 @@ <a-icon type="question-circle" theme="filled"></a-icon> </a-tooltip> </span> - <a-switch v-model="inbound.XTLS"></a-switch> + <a-switch v-model="inbound.xtls"></a-switch> </a-form-item> </a-form> <!-- tls settings --> -<a-form v-if="inbound.tls || inbound.XTLS" layout="inline"> - <a-form-item label="SNI" placeholder="Server Name Indication" v-if="inbound.tls"> - <a-input v-model.trim="inbound.stream.tls.settings[0].serverName"></a-input> +<a-form v-if="inbound.tls" layout="inline"> + <a-form-item label='{{ i18n "domainName" }}'> + <a-input v-model.trim="inbound.stream.tls.server" style="width: 250px"></a-input> </a-form-item> <a-form-item label="CipherSuites"> <a-select v-model="inbound.stream.tls.cipherSuites" style="width: 300px"> @@ -52,22 +52,22 @@ <a-select-option v-for="key in TLS_VERSION_OPTION" :value="key">[[ key ]]</a-select-option> </a-select> </a-form-item> - <a-form-item label="uTLS" v-if="inbound.tls" > - <a-select v-model="inbound.stream.tls.settings[0].fingerprint" style="width: 135px"> + <a-form-item label="SNI" placeholder="Server Name Indication"> + <a-input v-model.trim="inbound.stream.tls.settings.serverName" style="width: 250px"></a-input> + </a-form-item> + <a-form-item label="uTLS"> + <a-select v-model="inbound.stream.tls.settings.fingerprint" style="width: 170px"> <a-select-option value=''>None</a-select-option> <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key">[[ key ]]</a-select-option> </a-select> </a-form-item> - <a-form-item label='{{ i18n "domainName" }}'> - <a-input v-model.trim="inbound.stream.tls.server"></a-input> - </a-form-item> <a-form-item label="Alpn"> <a-checkbox-group v-model="inbound.stream.tls.alpn" style="width:200px"> <a-checkbox v-for="key in ALPN_OPTION" :value="key">[[ key ]]</a-checkbox> </a-checkbox-group> </a-form-item> <a-form-item label="Allow insecure"> - <a-switch v-model="inbound.stream.tls.settings[0].allowInsecure"></a-switch> + <a-switch v-model="inbound.stream.tls.settings.allowInsecure"></a-switch> </a-form-item> <a-form-item label='{{ i18n "certificate" }}'> <a-radio-group v-model="inbound.stream.tls.certs[0].useFile" button-style="solid"> @@ -93,33 +93,79 @@ </a-form-item> </template> </a-form> + +<!-- xtls settings --> +<a-form v-if="inbound.xtls" layout="inline"> + <a-form-item label='{{ i18n "domainName" }}'> + <a-input v-model.trim="inbound.stream.xtls.server"></a-input> + </a-form-item> + <a-form-item label="Alpn"> + <a-checkbox-group v-model="inbound.stream.xtls.alpn" style="width:200px"> + <a-checkbox v-for="key in ALPN_OPTION" :value="key">[[ key ]]</a-checkbox> + </a-checkbox-group> + </a-form-item> + <a-form-item label="Allow insecure"> + <a-switch v-model="inbound.stream.xtls.settings.allowInsecure"></a-switch> + </a-form-item> + <a-form-item label='{{ i18n "certificate" }}'> + <a-radio-group v-model="inbound.stream.xtls.certs[0].useFile" button-style="solid"> + <a-radio-button :value="true">{{ i18n "pages.inbounds.certificatePath" }}</a-radio-button> + <a-radio-button :value="false">{{ i18n "pages.inbounds.certificateContent" }}</a-radio-button> + </a-radio-group> + </a-form-item> + <template v-if="inbound.stream.xtls.certs[0].useFile"> + <a-form-item label='{{ i18n "pages.inbounds.publicKeyPath" }}'> + <a-input v-model.trim="inbound.stream.xtls.certs[0].certFile" style="width:300px;"></a-input> + </a-form-item> + <a-form-item label='{{ i18n "pages.inbounds.keyPath" }}'> + <a-input v-model.trim="inbound.stream.xtls.certs[0].keyFile" style="width:300px;"></a-input> + </a-form-item> + <a-button @click="setDefaultCertData">{{ i18n "pages.inbounds.setDefaultCert" }}</a-button> + </template> + <template v-else> + <a-form-item label='{{ i18n "pages.inbounds.publicKeyContent" }}'> + <a-input type="textarea" :rows="3" style="width:300px;" v-model="inbound.stream.xtls.certs[0].cert"></a-input> + </a-form-item> + <a-form-item label='{{ i18n "pages.inbounds.keyContent" }}'> + <a-input type="textarea" :rows="3" style="width:300px;" v-model="inbound.stream.xtls.certs[0].key"></a-input> + </a-form-item> + </template> +</a-form> + +<!-- reality settings --> <a-form v-else-if="inbound.reality" layout="inline"> - <a-form-item label="show"> + <a-form-item label="Show"> <a-switch v-model="inbound.stream.reality.show"> </a-switch> </a-form-item> - <a-form-item label="xver"> + <a-form-item label="xVer"> <a-input type="number" v-model.number="inbound.stream.reality.xver" :min="0" style="width: 60px"></a-input> </a-form-item> <a-form-item label="uTLS" > - <a-select v-model="inbound.stream.reality.fingerprint" style="width: 135px"> + <a-select v-model="inbound.stream.reality.settings.fingerprint" style="width: 135px"> <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key">[[ key ]]</a-select-option> </a-select> </a-form-item> + <a-form-item label='{{ i18n "domainName" }}'> + <a-input v-model.trim="inbound.stream.reality.settings.serverName" style="width: 250px"></a-input> + </a-form-item> <a-form-item label="dest"> - <a-input v-model.trim="inbound.stream.reality.dest" style="width: 360px"></a-input> + <a-input v-model.trim="inbound.stream.reality.dest" style="width: 300px"></a-input> + </a-form-item> + <a-form-item label="Server Names"> + <a-input v-model.trim="inbound.stream.reality.serverNames" style="width: 300px"></a-input> </a-form-item> - <a-form-item label="serverNames"> - <a-input v-model.trim="inbound.stream.reality.serverNames" style="width: 360px"></a-input> + <a-form-item label="ShortIds"> + <a-input v-model.trim="inbound.stream.reality.shortIds"></a-input> </a-form-item> - <a-form-item label="privateKey"> - <a-input v-model.trim="inbound.stream.reality.privateKey" style="width: 360px"></a-input> + <a-form-item label="Private Key"> + <a-input v-model.trim="inbound.stream.reality.privateKey" style="width: 300px"></a-input> </a-form-item> - <a-form-item label="publicKey"> - <a-input v-model.trim="inbound.stream.reality.publicKey" style="width: 360px"></a-input> + <a-form-item label="Public Key"> + <a-input v-model.trim="inbound.stream.reality.settings.publicKey" style="width: 300px"></a-input> </a-form-item> - <a-form-item label="shortIds"> - <a-input v-model.trim="inbound.stream.reality.shortIds"></a-input> + <a-form-item > + <a-button type="primary" icon="import" @click="getNewX25519Cert">Get New Key</a-button> </a-form-item> </a-form> {{end}}
\ No newline at end of file diff --git a/web/html/xui/inbound_info_modal.html b/web/html/xui/inbound_info_modal.html index 049d529e..4e8c7dae 100644 --- a/web/html/xui/inbound_info_modal.html +++ b/web/html/xui/inbound_info_modal.html @@ -49,10 +49,14 @@ tls: <a-tag color="green">{{ i18n "enabled" }}</a-tag><br /> tls {{ i18n "domainName" }}: <a-tag :color="inbound.serverName ? 'green' : 'orange'">[[ inbound.serverName ? inbound.serverName : '' ]]</a-tag> </td> - <td v-else-if="inbound.XTLS"> + <td v-else-if="inbound.xtls"> xtls: <a-tag color="green">{{ i18n "enabled" }}</a-tag><br /> xtls {{ i18n "domainName" }}: <a-tag :color="inbound.serverName ? 'green' : 'orange'">[[ inbound.serverName ? inbound.serverName : '' ]]</a-tag> </td> + <td v-else-if="inbound.reality"> + reality: <a-tag color="green">{{ i18n "enabled" }}</a-tag><br /> + reality {{ i18n "domainName" }}: <a-tag :color="inbound.serverName ? 'green' : 'orange'">[[ inbound.serverName ? inbound.serverName : '' ]]</a-tag> + </td> <td v-else>tls: <a-tag color="red">{{ i18n "disabled" }}</a-tag> </td> </tr> diff --git a/web/html/xui/inbound_modal.html b/web/html/xui/inbound_modal.html index 6b140abc..98cb188f 100644 --- a/web/html/xui/inbound_modal.html +++ b/web/html/xui/inbound_modal.html @@ -43,6 +43,14 @@ loading(loading) { inModal.confirmLoading = loading; }, + getClients(protocol, clientSettings) { + switch(protocol){ + case Protocols.VMESS: return clientSettings.vmesses; + case Protocols.VLESS: return clientSettings.vlesses; + case Protocols.TROJAN: return clientSettings.trojans; + default: return null; + } + }, }; const protocols = { @@ -62,6 +70,7 @@ inModal: inModal, Protocols: protocols, SSMethods: SSMethods, + delayedStart: false, get inbound() { return inModal.inbound; }, @@ -70,36 +79,40 @@ }, get isEdit() { return inModal.isEdit; - } - }, - methods: { - streamNetworkChange(oldValue) { - if (oldValue === 'kcp') { - this.inModal.inbound.tls = false; - } }, - addClient(protocol, clients) { - switch (protocol) { - case Protocols.VMESS: return clients.push(new Inbound.VmessSettings.Vmess()); - case Protocols.VLESS: return clients.push(new Inbound.VLESSSettings.VLESS()); - case Protocols.TROJAN: return clients.push(new Inbound.TrojanSettings.Trojan()); - default: return null; - } + get client() { + return inModal.getClients(this.inbound.protocol, this.inbound.settings)[0]; }, - removeClient(index, clients) { - clients.splice(index, 1); + get delayedExpireDays() { + return this.client && this.client.expiryTime < 0 ? this.client.expiryTime / -86400000 : 0; }, - isExpiry(index) { - return this.inbound.isExpiry(index) + set delayedExpireDays(days){ + this.client.expiryTime = -86400000 * days; }, - isClientEnable(email) { - clientStats = this.dbInbound.clientStats ? this.dbInbound.clientStats.find(stats => stats.email === email) : null - return clientStats ? clientStats['enable'] : true + }, + methods: { + streamNetworkChange() { + if (!inModal.inbound.canSetTls()) { + this.inModal.inbound.stream.security = 'none'; + } + if (!inModal.inbound.canEnableReality()) { + this.inModal.inbound.reality = false; + } }, setDefaultCertData(){ inModal.inbound.stream.tls.certs[0].certFile = app.defaultCert; inModal.inbound.stream.tls.certs[0].keyFile = app.defaultKey; }, + async getNewX25519Cert(){ + inModal.loading(true); + const msg = await HttpUtil.post('/server/getNewX25519Cert'); + inModal.loading(false); + if (!msg.success) { + return; + } + inModal.inbound.stream.reality.privateKey = msg.obj.privateKey; + inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey; + }, getNewEmail(client) { var chars = 'abcdefghijklmnopqrstuvwxyz1234567890'; var string = ''; diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html index b962efcb..15782b1d 100644 --- a/web/html/xui/inbounds.html +++ b/web/html/xui/inbounds.html @@ -133,26 +133,26 @@ <template v-if="dbInbound.isVMess || dbInbound.isVLess || dbInbound.isTrojan || dbInbound.isSS"> <a-tag style="margin:0;" color="green">[[ dbInbound.toInbound().stream.network ]]</a-tag> <a-tag style="margin:0;" v-if="dbInbound.toInbound().stream.isTls" color="cyan">TLS</a-tag> - <a-tag style="margin:0;" v-if="dbInbound.toInbound().stream.isXTLS" color="cyan">XTLS</a-tag> + <a-tag style="margin:0;" v-if="dbInbound.toInbound().stream.isXtls" color="cyan">XTLS</a-tag> <a-tag style="margin:0;" v-if="dbInbound.toInbound().stream.isReality" color="cyan">Reality</a-tag> </template> </template> <template slot="clients" slot-scope="text, dbInbound"> <template v-if="clientCount[dbInbound.id]"> <a-tag style="margin:0;" color="green">[[ clientCount[dbInbound.id].clients ]]</a-tag> - <a-popover title="{{ i18n "disabled" }}" :overlay-class-name="siderDrawer.isDarkTheme ? 'ant-dark' : ''"> + <a-popover title='{{ i18n "disabled" }}' :overlay-class-name="siderDrawer.isDarkTheme ? 'ant-dark' : ''"> <template slot="content"> <p v-for="clientEmail in clientCount[dbInbound.id].deactive">[[ clientEmail ]]</p> </template> <a-tag style="margin:0; padding: 0 2px;" v-if="clientCount[dbInbound.id].deactive.length">[[ clientCount[dbInbound.id].deactive.length ]]</a-tag> </a-popover> - <a-popover title="{{ i18n "depleted" }}" :overlay-class-name="siderDrawer.isDarkTheme ? 'ant-dark' : ''"> + <a-popover title='{{ i18n "depleted" }}' :overlay-class-name="siderDrawer.isDarkTheme ? 'ant-dark' : ''"> <template slot="content"> <p v-for="clientEmail in clientCount[dbInbound.id].depleted">[[ clientEmail ]]</p> </template> <a-tag style="margin:0; padding: 0 2px;" color="red" v-if="clientCount[dbInbound.id].depleted.length">[[ clientCount[dbInbound.id].depleted.length ]]</a-tag> </a-popover> - <a-popover title="{{ i18n "depletingSoon" }}" :overlay-class-name="siderDrawer.isDarkTheme ? 'ant-dark' : ''"> + <a-popover title='{{ i18n "depletingSoon" }}' :overlay-class-name="siderDrawer.isDarkTheme ? 'ant-dark' : ''"> <template slot="content"> <p v-for="clientEmail in clientCount[dbInbound.id].expiring">[[ clientEmail ]]</p> </template> @@ -531,9 +531,9 @@ title: '{{ i18n "pages.client.add"}}', okText: '{{ i18n "pages.client.submitAdd"}}', dbInbound: dbInbound, - confirm: async (inbound, dbInbound, index) => { + confirm: async (clients, dbInboundId) => { clientModal.loading(); - await this.addClient(inbound, dbInbound); + await this.addClient(clients, dbInboundId); clientModal.close(); }, isEdit: false @@ -545,9 +545,9 @@ title: '{{ i18n "pages.client.bulk"}} ' + dbInbound.remark, okText: '{{ i18n "pages.client.bulk"}}', dbInbound: dbInbound, - confirm: async (inbound, dbInbound) => { + confirm: async (clients, dbInboundId) => { clientsBulkModal.loading(); - await this.addClient(inbound, dbInbound); + await this.addClient(clients, dbInboundId); clientsBulkModal.close(); }, }); @@ -561,9 +561,9 @@ okText: '{{ i18n "pages.client.submitEdit"}}', dbInbound: dbInbound, index: index, - confirm: async (inbound, dbInbound, index) => { + confirm: async (client, dbInboundId, index) => { clientModal.loading(); - await this.updateClient(inbound, dbInbound, index); + await this.updateClient(client, dbInboundId, index); clientModal.close(); }, isEdit: true @@ -573,17 +573,17 @@ firstKey = Object.keys(client)[0]; return clients.findIndex(c => c[firstKey] === client[firstKey]); }, - async addClient(inbound, dbInbound) { + async addClient(clients, dbInboundId) { const data = { - id: dbInbound.id, - settings: inbound.settings.toString(), + id: dbInboundId, + settings: '{"clients": [' + clients.toString() +']}', }; - await this.submit('/xui/inbound/addClient/', data); + await this.submit(`/xui/inbound/addClient`, data); }, - async updateClient(inbound, dbInbound, index) { + async updateClient(client, dbInboundId, index) { const data = { - id: dbInbound.id, - settings: inbound.settings.toString(), + id: dbInboundId, + settings: '{"clients": [' + client.toString() +']}', }; await this.submit(`/xui/inbound/updateClient/${index}`, data); }, diff --git a/web/html/xui/setting.html b/web/html/xui/setting.html index e10737e0..7ce0e160 100644 --- a/web/html/xui/setting.html +++ b/web/html/xui/setting.html @@ -125,7 +125,6 @@ <setting-list-item type="switch" title='{{ i18n "pages.setting.xrayConfigOpenAIWARP"}}' desc='{{ i18n "pages.setting.xrayConfigOpenAIWARPDesc"}}' v-model="OpenAIWARPSettings"></setting-list-item> <setting-list-item type="switch" title='{{ i18n "pages.setting.xrayConfigNetflixWARP"}}' desc='{{ i18n "pages.setting.xrayConfigNetflixWARPDesc"}}' v-model="NetflixWARPSettings"></setting-list-item> <setting-list-item type="switch" title='{{ i18n "pages.setting.xrayConfigSpotifyWARP"}}' desc='{{ i18n "pages.setting.xrayConfigSpotifyWARPDesc"}}' v-model="SpotifyWARPSettings"></setting-list-item> - <setting-list-item type="switch" title='{{ i18n "pages.setting.xrayConfigIRWARP"}}' desc='{{ i18n "pages.setting.xrayConfigIRWARPDesc"}}' v-model="IRWARPSettings"></setting-list-item> </a-collapse-panel> </a-collapse> @@ -672,23 +671,6 @@ }); }, }, - IRWARPSettings: { - get: function () { - return this.templateRuleGetter({ - outboundTag: "WARP", - property: "domain", - data: this.settingsData.domains.ir - }); - }, - set: function (newValue) { - this.templateRuleSetter({ - newValue, - outboundTag: "WARP", - property: "domain", - data: this.settingsData.domains.ir - }); - }, - }, } }); |
