diff options
| author | mhsanaei <ho3ein.sanaei@gmail.com> | 2024-08-11 01:47:44 +0300 |
|---|---|---|
| committer | mhsanaei <ho3ein.sanaei@gmail.com> | 2024-08-11 01:47:44 +0300 |
| commit | 93d52bc86c4725fdfbdb629e87bbb5d24abf7d37 (patch) | |
| tree | ffd23266cd3118484dcd012e675e0e2b110e542c /web | |
| parent | bda5c2c915977e0cbf9de867d918508ef688dd45 (diff) | |
new - vmess security (inbound client side - outbound)
Diffstat (limited to 'web')
| -rw-r--r-- | web/assets/js/model/outbound.js | 17 | ||||
| -rw-r--r-- | web/assets/js/model/xray.js | 73 | ||||
| -rw-r--r-- | web/html/xui/client_bulk_modal.html | 10 | ||||
| -rw-r--r-- | web/html/xui/client_modal.html | 2 | ||||
| -rw-r--r-- | web/html/xui/form/client.html | 5 | ||||
| -rw-r--r-- | web/html/xui/form/outbound.html | 5 | ||||
| -rw-r--r-- | web/html/xui/form/protocol/vmess.html | 2 | ||||
| -rw-r--r-- | web/html/xui/settings.html | 4 | ||||
| -rw-r--r-- | web/service/inbound.go | 3 |
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, |
