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-05-06 19:51:14 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2023-05-06 19:51:14 +0300
commitf22dd6b53d736556377080a305c40be2db3c8cce (patch)
treecaae9937645094ccf2513ac46a2bfa5ca446df3b /web/assets
parent735df6bd4ed18d656355067826a6f5e50495c63e (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.js162
-rw-r--r--web/assets/js/util/utils.js6
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 {