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
path: root/web/html
diff options
context:
space:
mode:
Diffstat (limited to 'web/html')
-rw-r--r--web/html/common/qrcode_modal.html26
-rw-r--r--web/html/xui/client_modal.html13
-rw-r--r--web/html/xui/form/inbound.html1
-rw-r--r--web/html/xui/form/stream/external_proxy.html32
-rw-r--r--web/html/xui/form/tls_settings.html30
-rw-r--r--web/html/xui/inbound_info_modal.html25
-rw-r--r--web/html/xui/inbound_modal.html28
-rw-r--r--web/html/xui/inbounds.html46
8 files changed, 73 insertions, 128 deletions
diff --git a/web/html/common/qrcode_modal.html b/web/html/common/qrcode_modal.html
index 85ada3d4..0df369ff 100644
--- a/web/html/common/qrcode_modal.html
+++ b/web/html/common/qrcode_modal.html
@@ -22,39 +22,25 @@
const qrModal = {
title: '',
- clientIndex: 0,
- inbound: new Inbound(),
dbInbound: new DBInbound(),
client: null,
qrcodes: [],
clipboard: null,
visible: false,
subId: '',
- show: function (title = '', dbInbound = new DBInbound(), clientIndex = 0) {
+ show: function (title = '', dbInbound, client) {
this.title = title;
- this.clientIndex = clientIndex;
this.dbInbound = dbInbound;
this.inbound = dbInbound.toInbound();
- settings = JSON.parse(this.inbound.settings);
- this.client = settings.clients[clientIndex];
- remark = [this.dbInbound.remark, ( this.client ? this.client.email : '')].filter(Boolean).join('-');
- address = this.dbInbound.address;
+ this.client = client;
this.subId = '';
this.qrcodes = [];
- if (this.inbound.tls && !ObjectUtil.isArrEmpty(this.inbound.stream.tls.settings.domains)) {
- this.inbound.stream.tls.settings.domains.forEach((domain) => {
- remarkText = [remark, domain.remark].filter(Boolean).join('-');
- this.qrcodes.push({
- remark: remarkText,
- link: this.inbound.genLink(domain.domain, remarkText, clientIndex)
- });
- });
- } else {
+ this.inbound.genAllLinks(this.dbInbound.remark, client).forEach(l => {
this.qrcodes.push({
- remark: remark,
- link: this.inbound.genLink(address, remark, clientIndex)
+ remark: l.remark,
+ link: l.link
});
- }
+ });
this.visible = true;
},
close: function () {
diff --git a/web/html/xui/client_modal.html b/web/html/xui/client_modal.html
index 265a2cac..1bc48a6a 100644
--- a/web/html/xui/client_modal.html
+++ b/web/html/xui/client_modal.html
@@ -38,7 +38,7 @@
this.isEdit = isEdit;
this.dbInbound = new DBInbound(dbInbound);
this.inbound = dbInbound.toInbound();
- this.clients = this.getClients(this.inbound.protocol, this.inbound.settings);
+ this.clients = this.inbound.clients;
this.index = index === null ? this.clients.length : index;
this.delayedStart = false;
if (isEdit) {
@@ -51,16 +51,7 @@
}
this.clientStats = this.dbInbound.clientStats.find(row => row.email === this.clients[this.index].email);
this.confirm = confirm;
- },
- getClients(protocol, clientSettings) {
- switch (protocol) {
- case Protocols.VMESS: return clientSettings.vmesses;
- case Protocols.VLESS: return clientSettings.vlesses;
- case Protocols.TROJAN: return clientSettings.trojans;
- case Protocols.SHADOWSOCKS: return clientSettings.shadowsockses;
- default: return null;
- }
- },
+ },
getClientId(protocol, client) {
switch (protocol) {
case Protocols.TROJAN: return client.password;
diff --git a/web/html/xui/form/inbound.html b/web/html/xui/form/inbound.html
index 40a96d1e..b46ce951 100644
--- a/web/html/xui/form/inbound.html
+++ b/web/html/xui/form/inbound.html
@@ -96,6 +96,7 @@
<!-- stream settings -->
<template v-if="inbound.canEnableStream()">
{{template "form/streamSettings"}}
+ {{template "form/externalProxy" }}
</template>
<!-- tls settings -->
diff --git a/web/html/xui/form/stream/external_proxy.html b/web/html/xui/form/stream/external_proxy.html
new file mode 100644
index 00000000..bb80070c
--- /dev/null
+++ b/web/html/xui/form/stream/external_proxy.html
@@ -0,0 +1,32 @@
+{{define "form/externalProxy"}}
+<a-form layout="inline">
+ <a-divider style="margin:0;"></a-divider>
+ <a-form-item label="External Proxy">
+ <a-switch v-model="externalProxy"></a-switch>
+ <a-button v-if="externalProxy" type="primary" style="margin-left: 10px" size="small" @click="inbound.stream.externalProxy.push({forceTls: 'same', dest: '', port: 443, remark: ''})">+</a-button>
+ </a-form-item>
+ <table width="100%" class="ant-table-tbody" v-if="externalProxy" style="margin-bottom:5px">
+ <tr style="line-height: 40px;">
+ <td width="100%">
+ <a-input-group style="margin: 0 5px;" compact v-for="(row, index) in inbound.stream.externalProxy">
+ <template>
+ <a-tooltip title="Force TLS">
+ <a-select v-model="row.forceTls" style="width:20%; margin: 0px" :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option value="same">{{ i18n "pages.inbounds.same" }}</a-select-option>
+ <a-select-option value="none">{{ i18n "none" }}</a-select-option>
+ <a-select-option value="tls">TLS</a-select-option>
+ </a-select>
+ </a-tooltip>
+ </template>
+ <a-input style="width: 35%" v-model.trim="row.dest" placeholder='{{ i18n "host" }}'></a-input>
+ <a-tooltip title='{{ i18n "pages.inbounds.port" }}'>
+ <a-input-number style="width: 15%;" v-model.number="row.port" min="1" max="65531"></a-input-number>
+ </a-tooltip>
+ <a-input style="width: 20%" v-model.trim="row.remark" placeholder='{{ i18n "remark" }}'></a-input>
+ <a-button style="width: 10%; margin: 0px" @click="inbound.stream.externalProxy.splice(index, 1)">-</a-button>
+ </a-input-group>
+ </td>
+ </tr>
+ </table>
+</a-form>
+{{end}}
diff --git a/web/html/xui/form/tls_settings.html b/web/html/xui/form/tls_settings.html
index eb201862..a77bec40 100644
--- a/web/html/xui/form/tls_settings.html
+++ b/web/html/xui/form/tls_settings.html
@@ -24,26 +24,6 @@
<!-- tls settings -->
<a-form v-if="inbound.tls" layout="inline">
- <a-form-item label='Multi Domain'>
- <a-switch v-model="multiDomain"></a-switch>
- </a-form-item>
- <a-form-item v-if="multiDomain">
- <a-row>
- <span>Domains:</span>
- <a-button v-if="multiDomain" type="primary" size="small" @click="inbound.stream.tls.settings.domains.push({remark: '', domain: ''})" style="margin-left: 10px">+</a-button>
- </a-row>
- <a-input-group v-for="(row, index) in inbound.stream.tls.settings.domains">
- <a-input style="width: 40%" v-model.trim="row.remark" addon-before='{{ i18n "remark" }}'></a-input>
- <a-input style="width: 60%" v-model.trim="row.domain" addon-before='{{ i18n "host" }}'>
- <template slot="addonAfter">
- <a-button type="primary" size="small" style="margin-left: 10px" @click="inbound.stream.tls.settings.domains.splice(index, 1)">-</a-button>
- </template>
- </a-input>
- </a-input-group>
- </a-form-item>
- <a-form-item v-else 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" :dropdown-class-name="themeSwitcher.currentTheme">
<a-select-option value="">auto</a-select-option>
@@ -61,7 +41,7 @@
</a-input-group>
</a-form-item>
<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-input v-model.trim="inbound.stream.tls.server" style="width: 250px"></a-input>
</a-form-item>
<a-form-item label="uTLS">
<a-select v-model="inbound.stream.tls.settings.fingerprint"
@@ -122,11 +102,8 @@
<!-- xtls settings -->
<a-form v-else-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="SNI" placeholder="Server Name Indication">
- <a-input v-model.trim="inbound.stream.xtls.settings.serverName" style="width: 250px"></a-input>
+ <a-input v-model.trim="inbound.stream.xtls.server" style="width: 250px"></a-input>
</a-form-item>
<a-form-item label="Alpn">
<a-checkbox-group v-model="inbound.stream.xtls.alpn" style="width:200px">
@@ -180,9 +157,6 @@
<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: 300px"></a-input>
</a-form-item>
diff --git a/web/html/xui/inbound_info_modal.html b/web/html/xui/inbound_info_modal.html
index 554d10a3..1390bbcd 100644
--- a/web/html/xui/inbound_info_modal.html
+++ b/web/html/xui/inbound_info_modal.html
@@ -265,27 +265,10 @@
this.index = index;
this.inbound = dbInbound.toInbound();
this.dbInbound = new DBInbound(dbInbound);
- this.settings = JSON.parse(this.inbound.settings);
- this.clientSettings = this.settings.clients ? Object.values(this.settings.clients)[index] : null;
- this.isExpired = this.inbound.isExpiry(index);
- this.clientStats = this.settings.clients ? this.dbInbound.clientStats.find(row => row.email === this.clientSettings.email) : [];
- remark = [this.dbInbound.remark, ( this.clientSettings ? this.clientSettings.email : '')].filter(Boolean).join('-');
- address = this.dbInbound.address;
- this.links = [];
- if (this.inbound.tls && !ObjectUtil.isArrEmpty(this.inbound.stream.tls.settings.domains)) {
- this.inbound.stream.tls.settings.domains.forEach((domain) => {
- remarkText = [remark, domain.remark].filter(Boolean).join('-');
- this.links.push({
- remark: remarkText,
- link: this.inbound.genLink(domain.domain, remarkText, index)
- });
- });
- } else {
- this.links.push({
- remark: remark,
- link: this.inbound.genLink(address, remark, index)
- });
- }
+ this.clientSettings = this.inbound.clients ? this.inbound.clients[index] : null;
+ this.isExpired = this.inbound.clients ? this.inbound.isExpiry(index): this.dbInbound.isExpiry;
+ this.clientStats = this.inbound.clients ? this.dbInbound.clientStats.find(row => row.email === this.clientSettings.email) : [];
+ this.links = this.inbound.genAllLinks(this.dbInbound.remark, this.clientSettings);
if (this.clientSettings) {
if (this.clientSettings.subId) {
this.subLink = this.genSubLink(this.clientSettings.subId);
diff --git a/web/html/xui/inbound_modal.html b/web/html/xui/inbound_modal.html
index df42225c..4ef8f2d6 100644
--- a/web/html/xui/inbound_modal.html
+++ b/web/html/xui/inbound_modal.html
@@ -43,15 +43,6 @@
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;
- case Protocols.SHADOWSOCKS: return clientSettings.shadowsockses;
- default: return null;
- }
- },
};
new Vue({
@@ -70,7 +61,7 @@
return inModal.isEdit;
},
get client() {
- return inModal.getClients(this.inbound.protocol, this.inbound.settings)[0];
+ return inModal.inbound.clients[0];
},
get delayedExpireDays() {
return this.client && this.client.expiryTime < 0 ? this.client.expiryTime / -86400000 : 0;
@@ -78,16 +69,19 @@
set delayedExpireDays(days) {
this.client.expiryTime = -86400000 * days;
},
- get multiDomain() {
- return this.inbound.stream.tls.settings.domains.length > 0;
+ get externalProxy() {
+ return this.inbound.stream.externalProxy.length > 0;
},
- set multiDomain(value) {
+ set externalProxy(value) {
if (value) {
- inModal.inbound.stream.tls.server = "";
- inModal.inbound.stream.tls.settings.domains = [{ remark: "", domain: window.location.hostname }];
+ inModal.inbound.stream.externalProxy = [{
+ forceTls: "same",
+ dest: window.location.hostname,
+ port: inModal.inbound.port,
+ remark: ""
+ }];
} else {
- inModal.inbound.stream.tls.server = "";
- inModal.inbound.stream.tls.settings.domains = [];
+ inModal.inbound.stream.externalProxy = [];
}
}
},
diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html
index e73e5f5d..13808ac9 100644
--- a/web/html/xui/inbounds.html
+++ b/web/html/xui/inbounds.html
@@ -618,7 +618,7 @@
},
getClientCounts(dbInbound, inbound) {
let clientCount = 0, active = [], deactive = [], depleted = [], expiring = [], online = [];
- clients = this.getClients(dbInbound.protocol, inbound.settings);
+ clients = inbound.clients;
clientStats = dbInbound.clientStats
now = new Date().getTime()
if (clients) {
@@ -968,15 +968,6 @@
this.submit(`/panel/inbound/${dbInboundId}/delClient/${clientId}`);
}
},
- getClients(protocol, clientSettings) {
- switch (protocol) {
- case Protocols.VMESS: return clientSettings.vmesses;
- case Protocols.VLESS: return clientSettings.vlesses;
- case Protocols.TROJAN: return clientSettings.trojans;
- case Protocols.SHADOWSOCKS: return clientSettings.shadowsockses;
- default: return null;
- }
- },
getClientId(protocol, client) {
switch (protocol) {
case Protocols.TROJAN: return client.password;
@@ -996,8 +987,9 @@
newDbInbound.listen = rootInbound.listen;
newDbInbound.port = rootInbound.port;
newInbound = newDbInbound.toInbound();
- newInbound.stream.security = 'tls';
+ newInbound.stream.security = rootInbound.stream.security;
newInbound.stream.tls = rootInbound.stream.tls;
+ newInbound.stream.externalProxy = rootInbound.stream.externalProxy;
newDbInbound.streamSettings = newInbound.stream.toString();
}
}
@@ -1005,17 +997,17 @@
},
showQrcode(dbInboundId, client) {
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
- inbound = dbInbound.toInbound();
- clients = this.getClients(dbInbound.protocol, inbound.settings);
- index = this.findIndexOfClient(dbInbound.protocol, clients, client);
newDbInbound = this.checkFallback(dbInbound);
- qrModal.show('{{ i18n "qrCode"}}', newDbInbound, index);
+ qrModal.show('{{ i18n "qrCode"}}', newDbInbound, client);
},
showInfo(dbInboundId, client) {
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
- inbound = dbInbound.toInbound();
- clients = this.getClients(dbInbound.protocol, inbound.settings);
- index = this.findIndexOfClient(dbInbound.protocol, clients, client);
+ index=0;
+ if (dbInbound.isMultiUser()){
+ inbound = dbInbound.toInbound();
+ clients = inbound.clients;
+ index = this.findIndexOfClient(dbInbound.protocol, clients, client);
+ }
newDbInbound = this.checkFallback(dbInbound);
infoModal.show(newDbInbound, index);
},
@@ -1027,7 +1019,7 @@
this.loading()
dbInbound = this.dbInbounds.find(row => row.id === dbInboundId);
inbound = dbInbound.toInbound();
- clients = this.getClients(dbInbound.protocol, inbound.settings);
+ clients = inbound.clients;
index = this.findIndexOfClient(dbInbound.protocol, clients, client);
clients[index].enable = !clients[index].enable;
clientId = this.getClientId(dbInbound.protocol, clients[index]);
@@ -1041,15 +1033,7 @@
}
},
getInboundClients(dbInbound) {
- if (dbInbound.protocol == Protocols.VLESS) {
- return dbInbound.toInbound().settings.vlesses;
- } else if (dbInbound.protocol == Protocols.VMESS) {
- return dbInbound.toInbound().settings.vmesses;
- } else if (dbInbound.protocol == Protocols.TROJAN) {
- return dbInbound.toInbound().settings.trojans;
- } else if (dbInbound.protocol == Protocols.SHADOWSOCKS) {
- return dbInbound.toInbound().settings.shadowsockses;
- }
+ return dbInbound.toInbound().clients;
},
resetClientTraffic(client, dbInboundId, confirmation = true) {
if (confirmation){
@@ -1179,11 +1163,11 @@
txtModal.show('{{ i18n "pages.inbounds.export"}}', newDbInbound.genInboundLinks, newDbInbound.remark);
},
exportAllLinks() {
- let copyText = '';
+ let copyText = [];
for (const dbInbound of this.dbInbounds) {
- copyText += dbInbound.genInboundLinks;
+ copyText.push(dbInbound.genInboundLinks);
}
- txtModal.show('{{ i18n "pages.inbounds.export"}}', copyText, 'All-Inbounds');
+ txtModal.show('{{ i18n "pages.inbounds.export"}}', copyText.join('\r\n'), 'All-Inbounds');
},
async startDataRefreshLoop() {
while (this.isRefreshEnabled) {