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>2023-04-18 21:04:06 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2023-04-18 21:04:06 +0300
commit3e0faecaaebd8394a1a9d18ec11b5a60f210b654 (patch)
tree70226a9e7a73155d05410bda80a38673f8db2a83 /web/html/xui
parentdc7dbae14a37492ac3a7e3822b3e0b250e248173 (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.html46
-rw-r--r--web/html/xui/client_modal.html9
-rw-r--r--web/html/xui/form/client.html6
-rw-r--r--web/html/xui/form/protocol/trojan.html4
-rw-r--r--web/html/xui/form/protocol/vless.html4
-rw-r--r--web/html/xui/form/protocol/vmess.html2
-rw-r--r--web/html/xui/form/tls_settings.html92
-rw-r--r--web/html/xui/inbound_info_modal.html6
-rw-r--r--web/html/xui/inbound_modal.html55
-rw-r--r--web/html/xui/inbounds.html34
-rw-r--r--web/html/xui/setting.html18
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
- });
- },
- },
}
});