diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-05-06 19:51:14 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2023-05-06 19:51:14 +0300 |
| commit | f22dd6b53d736556377080a305c40be2db3c8cce (patch) | |
| tree | caae9937645094ccf2513ac46a2bfa5ca446df3b /web/assets | |
| parent | 735df6bd4ed18d656355067826a6f5e50495c63e (diff) | |
[feature] multi-user shadowsocks @alireza0
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'web/assets')
| -rw-r--r-- | web/assets/js/model/xray.js | 162 | ||||
| -rw-r--r-- | web/assets/js/util/utils.js | 6 |
2 files changed, 94 insertions, 74 deletions
diff --git a/web/assets/js/model/xray.js b/web/assets/js/model/xray.js index c8b02641..22573a23 100644 --- a/web/assets/js/model/xray.js +++ b/web/assets/js/model/xray.js @@ -1012,66 +1012,6 @@ class Inbound extends XrayCommonClass { return this.network === "http"; } - // VMess & VLess - get uuid() { - switch (this.protocol) { - case Protocols.VMESS: - return this.settings.vmesses[0].id; - case Protocols.VLESS: - return this.settings.vlesses[0].id; - default: - return ""; - } - } - - // VLess & Trojan - get flow() { - switch (this.protocol) { - case Protocols.VLESS: - return this.settings.vlesses[0].flow; - case Protocols.TROJAN: - return this.settings.trojans[0].flow; - default: - return ""; - } - } - - // VMess - get alterId() { - switch (this.protocol) { - case Protocols.VMESS: - return this.settings.vmesses[0].alterId; - default: - return ""; - } - } - - // Socks & HTTP - get username() { - switch (this.protocol) { - case Protocols.SOCKS: - case Protocols.HTTP: - return this.settings.accounts[0].user; - default: - return ""; - } - } - - // Trojan & Shadowsocks & Socks & HTTP - get password() { - switch (this.protocol) { - case Protocols.TROJAN: - return this.settings.trojans[0].password; - case Protocols.SHADOWSOCKS: - return this.settings.password; - case Protocols.SOCKS: - case Protocols.HTTP: - return this.settings.accounts[0].pass; - default: - return ""; - } - } - // Shadowsocks get method() { switch (this.protocol) { @@ -1146,9 +1086,13 @@ class Inbound extends XrayCommonClass { return this.settings.vlesses[index].expiryTime < new Date().getTime(); return false case Protocols.TROJAN: - if(this.settings.trojans[index].expiryTime > 0) - return this.settings.trojans[index].expiryTime < new Date().getTime(); - return false + if(this.settings.trojans[index].expiryTime > 0) + return this.settings.trojans[index].expiryTime < new Date().getTime(); + return false + case Protocols.SHADOWSOCKS: + if(this.settings.shadowsockses[index].expiryTime > 0) + return this.settings.shadowsockses[index].expiryTime < new Date().getTime(); + return false default: return false; } @@ -1159,7 +1103,6 @@ class Inbound extends XrayCommonClass { case Protocols.VMESS: case Protocols.VLESS: case Protocols.TROJAN: - case Protocols.SHADOWSOCKS: break; default: return false; @@ -1228,7 +1171,6 @@ class Inbound extends XrayCommonClass { case Protocols.VMESS: case Protocols.VLESS: case Protocols.TROJAN: - case Protocols.SHADOWSOCKS: return true; default: return false; @@ -1443,13 +1385,11 @@ class Inbound extends XrayCommonClass { return url.toString(); } - genSSLink(address='', remark='') { + genSSLink(address='', remark='', clientIndex = 0) { let settings = this.settings; - const server = this.stream.tls.server; - if (!ObjectUtil.isEmpty(server)) { - address = server; - } - return 'ss://' + safeBase64(settings.method + ':' + settings.password) + `@${address}:${this.port}#${encodeURIComponent(remark)}`; + const port = this.port; + + return 'ss://' + safeBase64(settings.method + ':' + settings.password + ':' +settings.shadowsockses[clientIndex].password) + '@' + address + ':' + this.port + '#' + encodeURIComponent(remark); } genTrojanLink(address = '', remark = '', clientIndex = 0) { @@ -1569,7 +1509,11 @@ class Inbound extends XrayCommonClass { remark += '-' + this.settings.vlesses[clientIndex].email } return this.genVLESSLink(address, remark, clientIndex); - case Protocols.SHADOWSOCKS: return this.genSSLink(address, remark); + case Protocols.SHADOWSOCKS: + if (this.settings.shadowsockses[clientIndex].email != ""){ + remark = this.settings.shadowsockses[clientIndex].email + } + return this.genSSLink(address, remark, clientIndex); case Protocols.TROJAN: if (this.settings.trojans[clientIndex].email != ""){ remark += '-' + this.settings.trojans[clientIndex].email @@ -2033,13 +1977,15 @@ Inbound.TrojanSettings.Fallback = class extends XrayCommonClass { Inbound.ShadowsocksSettings = class extends Inbound.Settings { constructor(protocol, method=SSMethods.BLAKE3_AES_256_GCM, - password=RandomUtil.randomSeq(44), - network='tcp,udp' + password=RandomUtil.randomShadowsocksPassword(), + network='tcp,udp', + shadowsockses=[new Inbound.ShadowsocksSettings.Shadowsocks()] ) { super(protocol); this.method = method; this.password = password; this.network = network; + this.shadowsockses = shadowsockses; } static fromJson(json={}) { @@ -2048,6 +1994,7 @@ Inbound.ShadowsocksSettings = class extends Inbound.Settings { json.method, json.password, json.network, + json.clients.map(client => Inbound.ShadowsocksSettings.Shadowsocks.fromJson(client)), ); } @@ -2056,10 +2003,77 @@ Inbound.ShadowsocksSettings = class extends Inbound.Settings { method: this.method, password: this.password, network: this.network, + clients: Inbound.ShadowsocksSettings.toJsonArray(this.shadowsockses) }; } }; +Inbound.ShadowsocksSettings.Shadowsocks = class extends XrayCommonClass { + constructor(password=RandomUtil.randomShadowsocksPassword(), email=RandomUtil.randomText(),limitIp=0, totalGB=0, expiryTime=0, enable=true, tgId='', subId='') { + super(); + this.password = password; + this.email = email; + this.limitIp = limitIp; + this.totalGB = totalGB; + this.expiryTime = expiryTime; + this.enable = enable; + this.tgId = tgId; + this.subId = subId; + } + + toJson() { + return { + password: this.password, + email: this.email, + limitIp: this.limitIp, + totalGB: this.totalGB, + expiryTime: this.expiryTime, + enable: this.enable, + tgId: this.tgId, + subId: this.subId, + }; + } + + static fromJson(json = {}) { + return new Inbound.ShadowsocksSettings.Shadowsocks( + json.password, + json.email, + json.limitIp, + json.totalGB, + json.expiryTime, + json.enable, + json.tgId, + json.subId, + ); + } + + get _expiryTime() { + if (this.expiryTime === 0 || this.expiryTime === "") { + return null; + } + if (this.expiryTime < 0){ + return this.expiryTime / -86400000; + } + return moment(this.expiryTime); + } + + set _expiryTime(t) { + if (t == null || t === "") { + this.expiryTime = 0; + } else { + this.expiryTime = t.valueOf(); + } + } + get _totalGB() { + return toFixed(this.totalGB / ONE_GB, 2); + } + + set _totalGB(gb) { + this.totalGB = toFixed(gb * ONE_GB, 0); + } + +}; + Inbound.DokodemoSettings = class extends Inbound.Settings { constructor(protocol, address, port, network='tcp,udp', followRedirect=false) { super(protocol); diff --git a/web/assets/js/util/utils.js b/web/assets/js/util/utils.js index 451f63e9..9c441537 100644 --- a/web/assets/js/util/utils.js +++ b/web/assets/js/util/utils.js @@ -165,6 +165,12 @@ class RandomUtil { str += this.randomShortIdSeq(8) return str; } + + static randomShadowsocksPassword(){ + let array = new Uint8Array(32); + window.crypto.getRandomValues(array); + return btoa(String.fromCharCode.apply(null, array)); + } } class ObjectUtil { |
