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
diff options
context:
space:
mode:
authormhsanaei <ho3ein.sanaei@gmail.com>2024-08-11 01:47:44 +0300
committermhsanaei <ho3ein.sanaei@gmail.com>2024-08-11 01:47:44 +0300
commit93d52bc86c4725fdfbdb629e87bbb5d24abf7d37 (patch)
treeffd23266cd3118484dcd012e675e0e2b110e542c /web
parentbda5c2c915977e0cbf9de867d918508ef688dd45 (diff)
new - vmess security (inbound client side - outbound)
Diffstat (limited to 'web')
-rw-r--r--web/assets/js/model/outbound.js17
-rw-r--r--web/assets/js/model/xray.js73
-rw-r--r--web/html/xui/client_bulk_modal.html10
-rw-r--r--web/html/xui/client_modal.html2
-rw-r--r--web/html/xui/form/client.html5
-rw-r--r--web/html/xui/form/outbound.html5
-rw-r--r--web/html/xui/form/protocol/vmess.html2
-rw-r--r--web/html/xui/settings.html4
-rw-r--r--web/service/inbound.go3
9 files changed, 97 insertions, 24 deletions
diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js
index 1ca6cee4..f1909552 100644
--- a/web/assets/js/model/outbound.js
+++ b/web/assets/js/model/outbound.js
@@ -69,6 +69,14 @@ const WireguardDomainStrategy = [
"ForceIPv6v4"
];
+const USERS_SECURITY = {
+ AES_128_GCM: "aes-128-gcm",
+ CHACHA20_POLY1305: "chacha20-poly1305",
+ AUTO: "auto",
+ NONE: "none",
+ ZERO: "zero",
+};
+
Object.freeze(Protocols);
Object.freeze(SSMethods);
Object.freeze(TLS_FLOW_CONTROL);
@@ -76,6 +84,7 @@ Object.freeze(UTLS_FINGERPRINT);
Object.freeze(ALPN_OPTION);
Object.freeze(OutboundDomainStrategies);
Object.freeze(WireguardDomainStrategy);
+Object.freeze(USERS_SECURITY);
class CommonClass {
@@ -721,7 +730,7 @@ class Outbound extends CommonClass {
const port = json.port * 1;
- return new Outbound(json.ps, Protocols.VMess, new Outbound.VmessSettings(json.add, port, json.id), stream);
+ return new Outbound(json.ps, Protocols.VMess, new Outbound.VmessSettings(json.add, port, json.id, json.scy), stream);
}
static fromParamLink(link) {
@@ -923,11 +932,12 @@ Outbound.DNSSettings = class extends CommonClass {
}
};
Outbound.VmessSettings = class extends CommonClass {
- constructor(address, port, id) {
+ constructor(address, port, id, security) {
super();
this.address = address;
this.port = port;
this.id = id;
+ this.security = security;
}
static fromJson(json = {}) {
@@ -936,6 +946,7 @@ Outbound.VmessSettings = class extends CommonClass {
json.vnext[0].address,
json.vnext[0].port,
json.vnext[0].users[0].id,
+ json.vnext[0].users[0].security,
);
}
@@ -944,7 +955,7 @@ Outbound.VmessSettings = class extends CommonClass {
vnext: [{
address: this.address,
port: this.port,
- users: [{ id: this.id }],
+ users: [{ id: this.id, security: this.security }],
}],
};
}
diff --git a/web/assets/js/model/xray.js b/web/assets/js/model/xray.js
index d239160b..0e4e2e72 100644
--- a/web/assets/js/model/xray.js
+++ b/web/assets/js/model/xray.js
@@ -110,6 +110,14 @@ const TCP_CONGESTION_OPTION = {
RENO: "reno",
};
+const USERS_SECURITY = {
+ AES_128_GCM: "aes-128-gcm",
+ CHACHA20_POLY1305: "chacha20-poly1305",
+ AUTO: "auto",
+ NONE: "none",
+ ZERO: "zero",
+};
+
Object.freeze(Protocols);
Object.freeze(SSMethods);
Object.freeze(XTLS_FLOW_CONTROL);
@@ -122,6 +130,7 @@ Object.freeze(SNIFFING_OPTION);
Object.freeze(USAGE_OPTION);
Object.freeze(DOMAIN_STRATEGY_OPTION);
Object.freeze(TCP_CONGESTION_OPTION);
+Object.freeze(USERS_SECURITY);
class XrayCommonClass {
@@ -1446,20 +1455,21 @@ class Inbound extends XrayCommonClass {
this.sniffing = new Sniffing();
}
- genVmessLink(address = '', port = this.port, forceTls, remark = '', clientId) {
+ genVmessLink(address = '', port = this.port, forceTls, remark = '', clientId, security) {
if (this.protocol !== Protocols.VMESS) {
return '';
}
- const security = forceTls == 'same' ? this.stream.security : forceTls;
+ const tls = forceTls == 'same' ? this.stream.security : forceTls;
let obj = {
v: '2',
ps: remark,
add: address,
port: port,
id: clientId,
+ scy: security,
net: this.stream.network,
type: 'none',
- tls: security,
+ tls: tls,
};
const network = this.stream.network;
if (network === 'tcp') {
@@ -1870,7 +1880,7 @@ class Inbound extends XrayCommonClass {
genLink(address = '', port = this.port, forceTls = 'same', remark = '', client) {
switch (this.protocol) {
case Protocols.VMESS:
- return this.genVmessLink(address, port, forceTls, remark, client.id);
+ return this.genVmessLink(address, port, forceTls, remark, client.id, client.security);
case Protocols.VLESS:
return this.genVLESSLink(address, port, forceTls, remark, client.id, client.flow);
case Protocols.SHADOWSOCKS:
@@ -2007,24 +2017,24 @@ Inbound.Settings = class extends XrayCommonClass {
Inbound.VmessSettings = class extends Inbound.Settings {
constructor(protocol,
- vmesses = [new Inbound.VmessSettings.Vmess()]) {
+ vmesses = [new Inbound.VmessSettings.VMESS()]) {
super(protocol);
this.vmesses = vmesses;
}
indexOfVmessById(id) {
- return this.vmesses.findIndex(vmess => vmess.id === id);
+ return this.vmesses.findIndex(VMESS => VMESS.id === id);
}
- addVmess(vmess) {
- if (this.indexOfVmessById(vmess.id) >= 0) {
+ addVmess(VMESS) {
+ if (this.indexOfVmessById(VMESS.id) >= 0) {
return false;
}
- this.vmesses.push(vmess);
+ this.vmesses.push(VMESS);
}
- delVmess(vmess) {
- const i = this.indexOfVmessById(vmess.id);
+ delVmess(VMESS) {
+ const i = this.indexOfVmessById(VMESS.id);
if (i >= 0) {
this.vmesses.splice(i, 1);
}
@@ -2033,7 +2043,7 @@ Inbound.VmessSettings = class extends Inbound.Settings {
static fromJson(json = {}) {
return new Inbound.VmessSettings(
Protocols.VMESS,
- json.clients.map(client => Inbound.VmessSettings.Vmess.fromJson(client)),
+ json.clients.map(client => Inbound.VmessSettings.VMESS.fromJson(client)),
);
}
@@ -2043,10 +2053,23 @@ Inbound.VmessSettings = class extends Inbound.Settings {
};
}
};
-Inbound.VmessSettings.Vmess = class extends XrayCommonClass {
- constructor(id = RandomUtil.randomUUID(), email = RandomUtil.randomLowerAndNum(8), limitIp = 0, totalGB = 0, expiryTime = 0, enable = true, tgId = '', subId = RandomUtil.randomLowerAndNum(16), reset = 0) {
+
+Inbound.VmessSettings.VMESS = class extends XrayCommonClass {
+ constructor(
+ id = RandomUtil.randomUUID(),
+ security = USERS_SECURITY.AUTO,
+ email = RandomUtil.randomLowerAndNum(8),
+ limitIp = 0,
+ totalGB = 0,
+ expiryTime = 0,
+ enable = true,
+ tgId = '',
+ subId = RandomUtil.randomLowerAndNum(16),
+ reset = 0
+ ) {
super();
this.id = id;
+ this.security = security;
this.email = email;
this.limitIp = limitIp;
this.totalGB = totalGB;
@@ -2058,8 +2081,9 @@ Inbound.VmessSettings.Vmess = class extends XrayCommonClass {
}
static fromJson(json = {}) {
- return new Inbound.VmessSettings.Vmess(
+ return new Inbound.VmessSettings.VMESS(
json.id,
+ json.security,
json.email,
json.limitIp,
json.totalGB,
@@ -2098,10 +2122,12 @@ Inbound.VmessSettings.Vmess = class extends XrayCommonClass {
};
Inbound.VLESSSettings = class extends Inbound.Settings {
- constructor(protocol,
+ constructor(
+ protocol,
vlesses = [new Inbound.VLESSSettings.VLESS()],
decryption = 'none',
- fallbacks = []) {
+ fallbacks = []
+ ) {
super(protocol);
this.vlesses = vlesses;
this.decryption = decryption;
@@ -2135,7 +2161,18 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
};
Inbound.VLESSSettings.VLESS = class extends XrayCommonClass {
- constructor(id = RandomUtil.randomUUID(), flow = '', email = RandomUtil.randomLowerAndNum(8), limitIp = 0, totalGB = 0, expiryTime = 0, enable = true, tgId = '', subId = RandomUtil.randomLowerAndNum(16), reset = 0) {
+ constructor(
+ id = RandomUtil.randomUUID(),
+ flow = '',
+ email = RandomUtil.randomLowerAndNum(8),
+ limitIp = 0,
+ totalGB = 0,
+ expiryTime = 0,
+ enable = true,
+ tgId = '',
+ subId = RandomUtil.randomLowerAndNum(16),
+ reset = 0
+ ) {
super();
this.id = id;
this.flow = flow;
diff --git a/web/html/xui/client_bulk_modal.html b/web/html/xui/client_bulk_modal.html
index 5e6d1a1f..3cdc5ff6 100644
--- a/web/html/xui/client_bulk_modal.html
+++ b/web/html/xui/client_bulk_modal.html
@@ -28,6 +28,11 @@
<a-form-item label='{{ i18n "pages.client.clientCount" }}' v-if="clientsBulkModal.emailMethod < 2">
<a-input-number v-model="clientsBulkModal.quantity" :min="1" :max="100"></a-input-number>
</a-form-item>
+ <a-form-item v-if="inbound.protocol === Protocols.VMESS" label='Security'>
+ <a-select v-model="clientsBulkModal.security" :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key ]]</a-select-option>
+ </a-select>
+ </a-form-item>
<a-form-item label='Flow' v-if="clientsBulkModal.inbound.canEnableTlsFlow()">
<a-select v-model="clientsBulkModal.flow" :dropdown-class-name="themeSwitcher.currentTheme">
<a-select-option value="" selected>{{ i18n "none" }}</a-select-option>
@@ -146,6 +151,7 @@
emailPostfix: "",
subId: "",
tgId: '',
+ security: "auto",
flow: "",
delayedStart: false,
reset: 0,
@@ -168,6 +174,7 @@
newClient.email += useNum ? prefix + i.toString() + postfix : prefix + postfix;
if (clientsBulkModal.subId.length > 0) newClient.subId = clientsBulkModal.subId;
newClient.tgId = clientsBulkModal.tgId;
+ newClient.security = clientsBulkModal.security;
newClient.limitIp = clientsBulkModal.limitIp;
newClient._totalGB = clientsBulkModal.totalGB;
newClient._expiryTime = clientsBulkModal.expiryTime;
@@ -203,6 +210,7 @@
this.emailPostfix = "";
this.subId = "";
this.tgId = '';
+ this.security = "auto";
this.flow = "";
this.dbInbound = new DBInbound(dbInbound);
this.inbound = dbInbound.toInbound();
@@ -211,7 +219,7 @@
},
newClient(protocol) {
switch (protocol) {
- case Protocols.VMESS: return new Inbound.VmessSettings.Vmess();
+ case Protocols.VMESS: return new Inbound.VmessSettings.VMESS();
case Protocols.VLESS: return new Inbound.VLESSSettings.VLESS();
case Protocols.TROJAN: return new Inbound.TrojanSettings.Trojan();
case Protocols.SHADOWSOCKS: return new Inbound.ShadowsocksSettings.Shadowsocks(clientsBulkModal.inbound.settings.shadowsockses[0].method);
diff --git a/web/html/xui/client_modal.html b/web/html/xui/client_modal.html
index 83fa71a3..aa62e02a 100644
--- a/web/html/xui/client_modal.html
+++ b/web/html/xui/client_modal.html
@@ -61,7 +61,7 @@
},
addClient(protocol, clients) {
switch (protocol) {
- case Protocols.VMESS: return clients.push(new Inbound.VmessSettings.Vmess());
+ 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());
case Protocols.SHADOWSOCKS: return clients.push(new Inbound.ShadowsocksSettings.Shadowsocks(clients[0].method));
diff --git a/web/html/xui/form/client.html b/web/html/xui/form/client.html
index 845f9408..aa558824 100644
--- a/web/html/xui/form/client.html
+++ b/web/html/xui/form/client.html
@@ -39,6 +39,11 @@
</template>
<a-input v-model.trim="client.id"></a-input>
</a-form-item>
+ <a-form-item v-if="inbound.protocol === Protocols.VMESS" label='Security'>
+ <a-select v-model="client.security" :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key ]]</a-select-option>
+ </a-select>
+ </a-form-item>
<a-form-item v-if="client.email && app.subSettings.enable">
<template slot="label">
<a-tooltip>
diff --git a/web/html/xui/form/outbound.html b/web/html/xui/form/outbound.html
index 90b9e60b..61af06e0 100644
--- a/web/html/xui/form/outbound.html
+++ b/web/html/xui/form/outbound.html
@@ -160,6 +160,11 @@
<a-form-item label='ID'>
<a-input v-model.trim="outbound.settings.id"></a-input>
</a-form-item>
+ <a-form-item label='Security'>
+ <a-select v-model="outbound.settings.security" :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key ]]</a-select-option>
+ </a-select>
+ </a-form-item>
<!-- vless settings -->
<template v-if="outbound.canEnableTlsFlow()">
diff --git a/web/html/xui/form/protocol/vmess.html b/web/html/xui/form/protocol/vmess.html
index 4e9fe749..07d767e4 100644
--- a/web/html/xui/form/protocol/vmess.html
+++ b/web/html/xui/form/protocol/vmess.html
@@ -10,10 +10,12 @@
<tr class="client-table-header">
<th>{{ i18n "pages.inbounds.email" }}</th>
<th>ID</th>
+ <th>Security</th>
</tr>
<tr v-for="(client, index) in inbound.settings.vmesses" :class="index % 2 == 1 ? 'client-table-odd-row' : ''">
<td>[[ client.email ]]</td>
<td>[[ client.id ]]</td>
+ <td>[[ client.security ]]</td>
</tr>
</table>
</a-collapse-panel>
diff --git a/web/html/xui/settings.html b/web/html/xui/settings.html
index 2c5c62a0..f2379078 100644
--- a/web/html/xui/settings.html
+++ b/web/html/xui/settings.html
@@ -523,7 +523,9 @@
if (msg.success) {
this.loading(true);
await PromiseUtil.sleep(5000);
- let { webCertFile, webKeyFile, webDomain: host, webPort: port, webBasePath: base } = this.allSetting;
+ var { webCertFile, webKeyFile, webDomain: host, webPort: port, webBasePath: base } = this.allSetting;
+ if (host == this.oldAllSetting.webDomain) host = null;
+ if (port == this.oldAllSetting.webPort) port = null;
const isTLS = webCertFile !== "" || webKeyFile !== "";
const url = buildURL({ host, port, isTLS, base, path: "panel/settings" });
window.location.replace(url);
diff --git a/web/service/inbound.go b/web/service/inbound.go
index 25a43f47..baf7616f 100644
--- a/web/service/inbound.go
+++ b/web/service/inbound.go
@@ -490,6 +490,7 @@ func (s *InboundService) AddInboundClient(data *model.Inbound) (bool, error) {
err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]interface{}{
"email": client.Email,
"id": client.ID,
+ "security": client.Security,
"flow": client.Flow,
"password": client.Password,
"cipher": cipher,
@@ -711,6 +712,7 @@ func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId strin
err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]interface{}{
"email": clients[0].Email,
"id": clients[0].ID,
+ "security": clients[0].Security,
"flow": clients[0].Flow,
"password": clients[0].Password,
"cipher": cipher,
@@ -1559,6 +1561,7 @@ func (s *InboundService) ResetClientTraffic(id int, clientEmail string) (bool, e
err1 := s.xrayApi.AddUser(string(inbound.Protocol), inbound.Tag, map[string]interface{}{
"email": client.Email,
"id": client.ID,
+ "security": client.Security,
"flow": client.Flow,
"password": client.Password,
"cipher": cipher,