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:
-rw-r--r--sub/subJsonService.go43
-rw-r--r--web/html/settings.html57
2 files changed, 46 insertions, 54 deletions
diff --git a/sub/subJsonService.go b/sub/subJsonService.go
index 7ce93e22..acb8e05f 100644
--- a/sub/subJsonService.go
+++ b/sub/subJsonService.go
@@ -22,8 +22,7 @@ var defaultJson string
type SubJsonService struct {
configJson map[string]any
defaultOutbounds []json_util.RawMessage
- fragment string
- noises string
+ fragmentOrNoises bool
mux string
inboundService service.InboundService
@@ -42,6 +41,31 @@ func NewSubJsonService(fragment string, noises string, mux string, rules string,
}
}
+ fragmentOrNoises := false
+ if fragment != "" || noises != "" {
+ fragmentOrNoises = true
+ defaultOutboundsSettings := map[string]interface{}{
+ "domainStrategy": "UseIP",
+ "redirect": "",
+ }
+
+ if fragment != "" {
+ defaultOutboundsSettings["fragment"] = json_util.RawMessage(fragment)
+ }
+
+ if noises != "" {
+ defaultOutboundsSettings["noises"] = json_util.RawMessage(noises)
+ }
+
+ defaultDirectOutbound := map[string]interface{}{
+ "protocol": "freedom",
+ "settings": defaultOutboundsSettings,
+ "tag": "direct_out",
+ }
+ jsonBytes, _ := json.MarshalIndent(defaultDirectOutbound, "", " ")
+ defaultOutbounds = append(defaultOutbounds, jsonBytes)
+ }
+
if rules != "" {
var newRules []any
routing, _ := configJson["routing"].(map[string]any)
@@ -52,19 +76,10 @@ func NewSubJsonService(fragment string, noises string, mux string, rules string,
configJson["routing"] = routing
}
- if fragment != "" {
- defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(fragment))
- }
-
- if noises != "" {
- defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(noises))
- }
-
return &SubJsonService{
configJson: configJson,
defaultOutbounds: defaultOutbounds,
- fragment: fragment,
- noises: noises,
+ fragmentOrNoises: fragmentOrNoises,
mux: mux,
SubService: subService,
}
@@ -224,8 +239,8 @@ func (s *SubJsonService) streamData(stream string) map[string]any {
}
delete(streamSettings, "sockopt")
- if s.fragment != "" {
- streamSettings["sockopt"] = json_util.RawMessage(`{"dialerProxy": "fragment", "tcpKeepAliveIdle": 100, "tcpMptcp": true, "penetrate": true}`)
+ if s.fragmentOrNoises {
+ streamSettings["sockopt"] = json_util.RawMessage(`{"dialerProxy": "direct_out", "tcpKeepAliveIdle": 100}`)
}
// remove proxy protocol
diff --git a/web/html/settings.html b/web/html/settings.html
index 441e62de..769fbd37 100644
--- a/web/html/settings.html
+++ b/web/html/settings.html
@@ -129,35 +129,14 @@
datepickerList: [{ name: 'Gregorian (Standard)', value: 'gregorian' }, { name: 'Jalalian (شمسی)', value: 'jalalian' }],
remarkSample: '',
defaultFragment: {
- tag: "fragment",
- protocol: "freedom",
- settings: {
- domainStrategy: "AsIs",
- fragment: {
- packets: "tlshello",
- length: "100-200",
- interval: "10-20",
- maxSplit: "300-400"
- }
- },
- streamSettings: {
- sockopt: {
- tcpKeepAliveIdle: 100,
- tcpMptcp: true,
- penetrate: true
- }
- }
- },
- defaultNoises: {
- tag: "noises",
- protocol: "freedom",
- settings: {
- domainStrategy: "AsIs",
- noises: [
- { type: "rand", packet: "10-20", delay: "10-16", applyTo: "ip" },
- ],
- },
+ packets: "tlshello",
+ length: "100-200",
+ interval: "10-20",
+ maxSplit: "300-400"
},
+ defaultNoises: [
+ { type: "rand", packet: "10-20", delay: "10-16", applyTo: "ip" }
+ ],
defaultMux: {
enabled: true,
concurrency: 8,
@@ -451,41 +430,41 @@
}
},
fragmentPackets: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.packets : ""; },
+ get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).packets : ""; },
set: function (v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
- newFragment.settings.fragment.packets = v;
+ newFragment.packets = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment);
}
}
},
fragmentLength: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.length : ""; },
+ get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).length : ""; },
set: function (v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
- newFragment.settings.fragment.length = v;
+ newFragment.length = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment);
}
}
},
fragmentInterval: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.interval : ""; },
+ get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).interval : ""; },
set: function (v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
- newFragment.settings.fragment.interval = v;
+ newFragment.interval = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment);
}
}
},
fragmentMaxSplit: {
- get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).settings.fragment.maxSplit : ""; },
+ get: function () { return this.fragment ? JSON.parse(this.allSetting.subJsonFragment).maxSplit : ""; },
set: function (v) {
if (v != "") {
newFragment = JSON.parse(this.allSetting.subJsonFragment);
- newFragment.settings.fragment.maxSplit = v;
+ newFragment.maxSplit = v;
this.allSetting.subJsonFragment = JSON.stringify(newFragment);
}
}
@@ -504,13 +483,11 @@
},
noisesArray: {
get() {
- return this.noises ? JSON.parse(this.allSetting.subJsonNoises).settings.noises : [];
+ return this.noises ? JSON.parse(this.allSetting.subJsonNoises) : [];
},
set(value) {
if (this.noises) {
- const newNoises = JSON.parse(this.allSetting.subJsonNoises);
- newNoises.settings.noises = value;
- this.allSetting.subJsonNoises = JSON.stringify(newNoises);
+ this.allSetting.subJsonNoises = JSON.stringify(value);
}
}
},