mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-04-19 21:42:24 +00:00
New - Noise
freedom
This commit is contained in:
parent
cb3da25bc8
commit
fa43248e30
20 changed files with 150 additions and 18 deletions
4
go.mod
4
go.mod
|
@ -40,7 +40,7 @@ require (
|
||||||
github.com/go-playground/validator/v10 v10.22.0 // indirect
|
github.com/go-playground/validator/v10 v10.22.0 // indirect
|
||||||
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
|
||||||
github.com/google/btree v1.1.3 // indirect
|
github.com/google/btree v1.1.3 // indirect
|
||||||
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
|
github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 // indirect
|
||||||
github.com/gorilla/context v1.1.2 // indirect
|
github.com/gorilla/context v1.1.2 // indirect
|
||||||
github.com/gorilla/securecookie v1.1.2 // indirect
|
github.com/gorilla/securecookie v1.1.2 // indirect
|
||||||
github.com/gorilla/sessions v1.4.0 // indirect
|
github.com/gorilla/sessions v1.4.0 // indirect
|
||||||
|
@ -57,7 +57,7 @@ require (
|
||||||
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
github.com/mattn/go-sqlite3 v1.14.22 // indirect
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/onsi/ginkgo/v2 v2.20.1 // indirect
|
github.com/onsi/ginkgo/v2 v2.20.2 // indirect
|
||||||
github.com/pires/go-proxyproto v0.7.0 // indirect
|
github.com/pires/go-proxyproto v0.7.0 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
|
||||||
github.com/quic-go/qpack v0.4.0 // indirect
|
github.com/quic-go/qpack v0.4.0 // indirect
|
||||||
|
|
8
go.sum
8
go.sum
|
@ -98,8 +98,8 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
|
github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA=
|
||||||
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||||
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
|
||||||
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
|
@ -164,8 +164,8 @@ github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJE
|
||||||
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM=
|
github.com/nicksnyder/go-i18n/v2 v2.4.0 h1:3IcvPOAvnCKwNm0TB0dLDTuawWEj+ax/RERNC+diLMM=
|
||||||
github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4=
|
github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7gMc814+6wVyEI4=
|
||||||
github.com/onsi/ginkgo/v2 v2.20.1 h1:YlVIbqct+ZmnEph770q9Q7NVAz4wwIiVNahee6JyUzo=
|
github.com/onsi/ginkgo/v2 v2.20.2 h1:7NVCeyIWROIAheY21RLS+3j2bb52W0W82tkberYytp4=
|
||||||
github.com/onsi/ginkgo/v2 v2.20.1/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI=
|
github.com/onsi/ginkgo/v2 v2.20.2/go.mod h1:K9gyxPIlb+aIvnZ8bd9Ak+YP18w3APlR+5coaZoE2ag=
|
||||||
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
|
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
|
||||||
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
|
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
|
||||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=
|
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88=
|
||||||
|
|
|
@ -92,6 +92,11 @@ func (s *Server) initRouter() (*gin.Engine, error) {
|
||||||
SubJsonFragment = ""
|
SubJsonFragment = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SubJsonNoise, err := s.settingService.GetSubJsonNoise()
|
||||||
|
if err != nil {
|
||||||
|
SubJsonNoise = ""
|
||||||
|
}
|
||||||
|
|
||||||
SubJsonMux, err := s.settingService.GetSubJsonMux()
|
SubJsonMux, err := s.settingService.GetSubJsonMux()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
SubJsonMux = ""
|
SubJsonMux = ""
|
||||||
|
@ -106,7 +111,7 @@ func (s *Server) initRouter() (*gin.Engine, error) {
|
||||||
|
|
||||||
s.sub = NewSUBController(
|
s.sub = NewSUBController(
|
||||||
g, LinksPath, JsonPath, Encrypt, ShowInfo, RemarkModel, SubUpdates,
|
g, LinksPath, JsonPath, Encrypt, ShowInfo, RemarkModel, SubUpdates,
|
||||||
SubJsonFragment, SubJsonMux, SubJsonRules)
|
SubJsonFragment, SubJsonNoise, SubJsonMux, SubJsonRules)
|
||||||
|
|
||||||
return engine, nil
|
return engine, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ func NewSUBController(
|
||||||
rModel string,
|
rModel string,
|
||||||
update string,
|
update string,
|
||||||
jsonFragment string,
|
jsonFragment string,
|
||||||
|
jsonNoise string,
|
||||||
jsonMux string,
|
jsonMux string,
|
||||||
jsonRules string,
|
jsonRules string,
|
||||||
) *SUBController {
|
) *SUBController {
|
||||||
|
@ -38,7 +39,7 @@ func NewSUBController(
|
||||||
updateInterval: update,
|
updateInterval: update,
|
||||||
|
|
||||||
subService: sub,
|
subService: sub,
|
||||||
subJsonService: NewSubJsonService(jsonFragment, jsonMux, jsonRules, sub),
|
subJsonService: NewSubJsonService(jsonFragment, jsonNoise, jsonMux, jsonRules, sub),
|
||||||
}
|
}
|
||||||
a.initRouter(g)
|
a.initRouter(g)
|
||||||
return a
|
return a
|
||||||
|
|
|
@ -21,13 +21,14 @@ type SubJsonService struct {
|
||||||
configJson map[string]interface{}
|
configJson map[string]interface{}
|
||||||
defaultOutbounds []json_util.RawMessage
|
defaultOutbounds []json_util.RawMessage
|
||||||
fragment string
|
fragment string
|
||||||
|
noise string
|
||||||
mux string
|
mux string
|
||||||
|
|
||||||
inboundService service.InboundService
|
inboundService service.InboundService
|
||||||
SubService *SubService
|
SubService *SubService
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSubJsonService(fragment string, mux string, rules string, subService *SubService) *SubJsonService {
|
func NewSubJsonService(fragment string, noise string, mux string, rules string, subService *SubService) *SubJsonService {
|
||||||
var configJson map[string]interface{}
|
var configJson map[string]interface{}
|
||||||
var defaultOutbounds []json_util.RawMessage
|
var defaultOutbounds []json_util.RawMessage
|
||||||
json.Unmarshal([]byte(defaultJson), &configJson)
|
json.Unmarshal([]byte(defaultJson), &configJson)
|
||||||
|
@ -52,10 +53,15 @@ func NewSubJsonService(fragment string, mux string, rules string, subService *Su
|
||||||
defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(fragment))
|
defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(fragment))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if noise != "" {
|
||||||
|
defaultOutbounds = append(defaultOutbounds, json_util.RawMessage(noise))
|
||||||
|
}
|
||||||
|
|
||||||
return &SubJsonService{
|
return &SubJsonService{
|
||||||
configJson: configJson,
|
configJson: configJson,
|
||||||
defaultOutbounds: defaultOutbounds,
|
defaultOutbounds: defaultOutbounds,
|
||||||
fragment: fragment,
|
fragment: fragment,
|
||||||
|
noise: noise,
|
||||||
mux: mux,
|
mux: mux,
|
||||||
SubService: subService,
|
SubService: subService,
|
||||||
}
|
}
|
||||||
|
|
|
@ -861,23 +861,34 @@ Outbound.Settings = class extends CommonClass {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Outbound.FreedomSettings = class extends CommonClass {
|
Outbound.FreedomSettings = class extends CommonClass {
|
||||||
constructor(domainStrategy = '', fragment = {}) {
|
constructor(
|
||||||
|
domainStrategy = '',
|
||||||
|
timeout = '',
|
||||||
|
fragment = {},
|
||||||
|
noise = {}
|
||||||
|
) {
|
||||||
super();
|
super();
|
||||||
this.domainStrategy = domainStrategy;
|
this.domainStrategy = domainStrategy;
|
||||||
|
this.timeout = timeout;
|
||||||
this.fragment = fragment;
|
this.fragment = fragment;
|
||||||
|
this.noise = noise;
|
||||||
}
|
}
|
||||||
|
|
||||||
static fromJson(json = {}) {
|
static fromJson(json = {}) {
|
||||||
return new Outbound.FreedomSettings(
|
return new Outbound.FreedomSettings(
|
||||||
json.domainStrategy,
|
json.domainStrategy,
|
||||||
|
json.timeout,
|
||||||
json.fragment ? Outbound.FreedomSettings.Fragment.fromJson(json.fragment) : undefined,
|
json.fragment ? Outbound.FreedomSettings.Fragment.fromJson(json.fragment) : undefined,
|
||||||
|
json.noise ? Outbound.FreedomSettings.Noise.fromJson(json.noise) : undefined,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
toJson() {
|
toJson() {
|
||||||
return {
|
return {
|
||||||
domainStrategy: ObjectUtil.isEmpty(this.domainStrategy) ? undefined : this.domainStrategy,
|
domainStrategy: ObjectUtil.isEmpty(this.domainStrategy) ? undefined : this.domainStrategy,
|
||||||
|
timeout: this.timeout,
|
||||||
fragment: Object.keys(this.fragment).length === 0 ? undefined : this.fragment,
|
fragment: Object.keys(this.fragment).length === 0 ? undefined : this.fragment,
|
||||||
|
noise: Object.keys(this.noise).length === 0 ? undefined : this.noise,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -897,6 +908,21 @@ Outbound.FreedomSettings.Fragment = class extends CommonClass {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Outbound.FreedomSettings.Noise = class extends CommonClass {
|
||||||
|
constructor(packets = '', delay = '') {
|
||||||
|
super();
|
||||||
|
this.packets = packets;
|
||||||
|
this.delay = delay;
|
||||||
|
}
|
||||||
|
|
||||||
|
static fromJson(json = {}) {
|
||||||
|
return new Outbound.FreedomSettings.Noise(
|
||||||
|
json.packets,
|
||||||
|
json.delay,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Outbound.BlackholeSettings = class extends CommonClass {
|
Outbound.BlackholeSettings = class extends CommonClass {
|
||||||
constructor(type) {
|
constructor(type) {
|
||||||
super();
|
super();
|
||||||
|
|
|
@ -38,6 +38,7 @@ class AllSetting {
|
||||||
this.subURI = "";
|
this.subURI = "";
|
||||||
this.subJsonURI = "";
|
this.subJsonURI = "";
|
||||||
this.subJsonFragment = "";
|
this.subJsonFragment = "";
|
||||||
|
this.subJsonNoise = "";
|
||||||
this.subJsonMux = "";
|
this.subJsonMux = "";
|
||||||
this.subJsonRules = "";
|
this.subJsonRules = "";
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,7 @@ type AllSetting struct {
|
||||||
SubJsonPath string `json:"subJsonPath" form:"subJsonPath"`
|
SubJsonPath string `json:"subJsonPath" form:"subJsonPath"`
|
||||||
SubJsonURI string `json:"subJsonURI" form:"subJsonURI"`
|
SubJsonURI string `json:"subJsonURI" form:"subJsonURI"`
|
||||||
SubJsonFragment string `json:"subJsonFragment" form:"subJsonFragment"`
|
SubJsonFragment string `json:"subJsonFragment" form:"subJsonFragment"`
|
||||||
|
SubJsonNoise string `json:"subJsonNoise" form:"subJsonNoise"`
|
||||||
SubJsonMux string `json:"subJsonMux" form:"subJsonMux"`
|
SubJsonMux string `json:"subJsonMux" form:"subJsonMux"`
|
||||||
SubJsonRules string `json:"subJsonRules" form:"subJsonRules"`
|
SubJsonRules string `json:"subJsonRules" form:"subJsonRules"`
|
||||||
Datepicker string `json:"datepicker" form:"datepicker"`
|
Datepicker string `json:"datepicker" form:"datepicker"`
|
||||||
|
|
|
@ -22,6 +22,9 @@
|
||||||
<a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[ s ]]</a-select-option>
|
<a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[ s ]]</a-select-option>
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
<a-form-item label='Timeout'>
|
||||||
|
<a-input-number v-model.number="outbound.settings.timeout" min="0" ></a-input-number>
|
||||||
|
</a-form-item>
|
||||||
<a-form-item label='Fragment'>
|
<a-form-item label='Fragment'>
|
||||||
<a-switch :checked="Object.keys(outbound.settings.fragment).length >0" @change="checked => outbound.settings.fragment = checked ? new Outbound.FreedomSettings.Fragment() : {}"></a-switch>
|
<a-switch :checked="Object.keys(outbound.settings.fragment).length >0" @change="checked => outbound.settings.fragment = checked ? new Outbound.FreedomSettings.Fragment() : {}"></a-switch>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
@ -38,6 +41,17 @@
|
||||||
<a-input v-model.trim="outbound.settings.fragment.interval"></a-input>
|
<a-input v-model.trim="outbound.settings.fragment.interval"></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
<a-form-item label='Noise'>
|
||||||
|
<a-switch :checked="Object.keys(outbound.settings.noise).length >0" @change="checked => outbound.settings.noise = checked ? new Outbound.FreedomSettings.Noise() : {}"></a-switch>
|
||||||
|
</a-form-item>
|
||||||
|
<template v-if="Object.keys(outbound.settings.noise).length >0">
|
||||||
|
<a-form-item label='Packets'>
|
||||||
|
<a-input v-model.trim="outbound.settings.noise.packets"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label='Delay'>
|
||||||
|
<a-input v-model.trim="outbound.settings.noise.delay"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</template>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<!-- blackhole settings -->
|
<!-- blackhole settings -->
|
||||||
|
@ -95,10 +109,10 @@
|
||||||
</a-select>
|
</a-select>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='MTU'>
|
<a-form-item label='MTU'>
|
||||||
<a-input-number v-model.number="outbound.settings.mtu"></a-input-number>
|
<a-input-number v-model.number="outbound.settings.mtu" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Workers'>
|
<a-form-item label='Workers'>
|
||||||
<a-input-number min="0" v-model.number="outbound.settings.workers"></a-input-number>
|
<a-input-number v-model.number="outbound.settings.workers" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Kernel Mode'>
|
<a-form-item label='Kernel Mode'>
|
||||||
<a-switch v-model="outbound.settings.kernelMode"></a-switch>
|
<a-switch v-model="outbound.settings.kernelMode"></a-switch>
|
||||||
|
@ -257,25 +271,25 @@
|
||||||
<a-input v-model="outbound.stream.kcp.seed"></a-input>
|
<a-input v-model="outbound.stream.kcp.seed"></a-input>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='MTU'>
|
<a-form-item label='MTU'>
|
||||||
<a-input-number v-model.number="outbound.stream.kcp.mtu"></a-input-number>
|
<a-input-number v-model.number="outbound.stream.kcp.mtu" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='TTI (ms)'>
|
<a-form-item label='TTI (ms)'>
|
||||||
<a-input-number v-model.number="outbound.stream.kcp.tti"></a-input-number>
|
<a-input-number v-model.number="outbound.stream.kcp.tti" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Uplink (MB/s)'>
|
<a-form-item label='Uplink (MB/s)'>
|
||||||
<a-input-number v-model.number="outbound.stream.kcp.upCap"></a-input-number>
|
<a-input-number v-model.number="outbound.stream.kcp.upCap" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Downlink (MB/s)'>
|
<a-form-item label='Downlink (MB/s)'>
|
||||||
<a-input-number v-model.number="outbound.stream.kcp.downCap"></a-input-number>
|
<a-input-number v-model.number="outbound.stream.kcp.downCap" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Congestion'>
|
<a-form-item label='Congestion'>
|
||||||
<a-switch v-model="outbound.stream.kcp.congestion"></a-switch>
|
<a-switch v-model="outbound.stream.kcp.congestion"></a-switch>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Read Buffer (MB)'>
|
<a-form-item label='Read Buffer (MB)'>
|
||||||
<a-input-number v-model.number="outbound.stream.kcp.readBuffer"></a-input-number>
|
<a-input-number v-model.number="outbound.stream.kcp.readBuffer" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label='Write Buffer (MB)'>
|
<a-form-item label='Write Buffer (MB)'>
|
||||||
<a-input-number v-model.number="outbound.stream.kcp.writeBuffer"></a-input-number>
|
<a-input-number v-model.number="outbound.stream.kcp.writeBuffer" min="0"></a-input-number>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
|
@ -313,6 +313,24 @@
|
||||||
</a-collapse-panel>
|
</a-collapse-panel>
|
||||||
</a-collapse>
|
</a-collapse>
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
|
<a-list-item style="padding: 20px">
|
||||||
|
<a-row>
|
||||||
|
<a-col :lg="24" :xl="12">
|
||||||
|
<a-list-item-meta title='Noise'>
|
||||||
|
<template slot="description">{{ i18n "pages.settings.noiseDesc"}}</template>
|
||||||
|
</a-list-item-meta>
|
||||||
|
</a-col>
|
||||||
|
<a-col :lg="24" :xl="12">
|
||||||
|
<a-switch v-model="noise"></a-switch>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-collapse v-if="noise" style="margin-top: 14px;">
|
||||||
|
<a-collapse-panel header='{{ i18n "pages.settings.noiseSett"}}' v-if="noise">
|
||||||
|
<setting-list-item style="padding: 10px 20px" type="text" title='Packets' v-model="noisePackets" placeholder="rand:5-10"></setting-list-item>
|
||||||
|
<setting-list-item style="padding: 10px 20px" type="text" title='Delay' v-model="noiseDelay" placeholder="5-10"></setting-list-item>
|
||||||
|
</a-collapse-panel>
|
||||||
|
</a-collapse>
|
||||||
|
</a-list-item>
|
||||||
<a-list-item style="padding: 20px">
|
<a-list-item style="padding: 20px">
|
||||||
<a-row>
|
<a-row>
|
||||||
<a-col :lg="24" :xl="12">
|
<a-col :lg="24" :xl="12">
|
||||||
|
@ -412,6 +430,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
defaultNoise: {
|
||||||
|
tag: "noise",
|
||||||
|
protocol: "freedom",
|
||||||
|
settings: {
|
||||||
|
domainStrategy: "AsIs",
|
||||||
|
noise: {
|
||||||
|
packets: "rand:5-10",
|
||||||
|
delay: "5-10",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
defaultMux: {
|
defaultMux: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
concurrency: 8,
|
concurrency: 8,
|
||||||
|
@ -611,6 +640,32 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
noise: {
|
||||||
|
get: function () { return this.allSetting?.subJsonNoise != ""; },
|
||||||
|
set: function (v) {
|
||||||
|
this.allSetting.subJsonNoise = v ? JSON.stringify(this.defaultNoise) : "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
noisePackets: {
|
||||||
|
get: function () { return this.noise ? JSON.parse(this.allSetting.subJsonNoise).settings.noise.packets : ""; },
|
||||||
|
set: function (v) {
|
||||||
|
if (v != "") {
|
||||||
|
newNoise = JSON.parse(this.allSetting.subJsonNoise);
|
||||||
|
newNoise.settings.noise.packets = v;
|
||||||
|
this.allSetting.subJsonNoise = JSON.stringify(newNoise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
noiseDelay: {
|
||||||
|
get: function () { return this.noise ? JSON.parse(this.allSetting.subJsonNoise).settings.noise.delay : ""; },
|
||||||
|
set: function (v) {
|
||||||
|
if (v != "") {
|
||||||
|
newNoise = JSON.parse(this.allSetting.subJsonNoise);
|
||||||
|
newNoise.settings.noise.delay = v;
|
||||||
|
this.allSetting.subJsonNoise = JSON.stringify(newNoise);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
enableMux: {
|
enableMux: {
|
||||||
get: function () { return this.allSetting?.subJsonMux != ""; },
|
get: function () { return this.allSetting?.subJsonMux != ""; },
|
||||||
set: function (v) {
|
set: function (v) {
|
||||||
|
|
|
@ -62,6 +62,7 @@ var defaultValueMap = map[string]string{
|
||||||
"subJsonPath": "/json/",
|
"subJsonPath": "/json/",
|
||||||
"subJsonURI": "",
|
"subJsonURI": "",
|
||||||
"subJsonFragment": "",
|
"subJsonFragment": "",
|
||||||
|
"subJsonNoise": "",
|
||||||
"subJsonMux": "",
|
"subJsonMux": "",
|
||||||
"subJsonRules": "",
|
"subJsonRules": "",
|
||||||
"datepicker": "gregorian",
|
"datepicker": "gregorian",
|
||||||
|
@ -458,6 +459,10 @@ func (s *SettingService) GetSubJsonFragment() (string, error) {
|
||||||
return s.getString("subJsonFragment")
|
return s.getString("subJsonFragment")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *SettingService) GetSubJsonNoise() (string, error) {
|
||||||
|
return s.getString("subJsonNoise")
|
||||||
|
}
|
||||||
|
|
||||||
func (s *SettingService) GetSubJsonMux() (string, error) {
|
func (s *SettingService) GetSubJsonMux() (string, error) {
|
||||||
return s.getString("subJsonMux")
|
return s.getString("subJsonMux")
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Fragmentation"
|
"fragment" = "Fragmentation"
|
||||||
"fragmentDesc" = "Enable fragmentation for TLS hello packet."
|
"fragmentDesc" = "Enable fragmentation for TLS hello packet."
|
||||||
"fragmentSett" = "Fragmentation Settings"
|
"fragmentSett" = "Fragmentation Settings"
|
||||||
|
"noiseDesc" = "Enable Noise."
|
||||||
|
"noiseSett" = "Noise Settings"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Transmit multiple independent data streams within an established data stream."
|
"muxDesc" = "Transmit multiple independent data streams within an established data stream."
|
||||||
"muxSett" = "Mux Settings"
|
"muxSett" = "Mux Settings"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Fragmentación"
|
"fragment" = "Fragmentación"
|
||||||
"fragmentDesc" = "Habilitar la fragmentación para el paquete de saludo de TLS"
|
"fragmentDesc" = "Habilitar la fragmentación para el paquete de saludo de TLS"
|
||||||
"fragmentSett" = "Configuración de Fragmentación"
|
"fragmentSett" = "Configuración de Fragmentación"
|
||||||
|
"noiseDesc" = "Activar Noise."
|
||||||
|
"noiseSett" = "Configuración de Noise"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Transmite múltiples flujos de datos independientes dentro de un flujo de datos establecido."
|
"muxDesc" = "Transmite múltiples flujos de datos independientes dentro de un flujo de datos establecido."
|
||||||
"muxSett" = "Configuración Mux"
|
"muxSett" = "Configuración Mux"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "فرگمنت"
|
"fragment" = "فرگمنت"
|
||||||
"fragmentDesc" = "فعال کردن فرگمنت برای بستهی نخست تیالاس"
|
"fragmentDesc" = "فعال کردن فرگمنت برای بستهی نخست تیالاس"
|
||||||
"fragmentSett" = "تنظیمات فرگمنت"
|
"fragmentSett" = "تنظیمات فرگمنت"
|
||||||
|
"noiseDesc" = "فعال کردن Noise."
|
||||||
|
"noiseSett" = "تنظیمات Noise"
|
||||||
"mux" = "ماکس"
|
"mux" = "ماکس"
|
||||||
"muxDesc" = "چندین جریان داده مستقل را در یک جریان داده ثابت منتقل می کند"
|
"muxDesc" = "چندین جریان داده مستقل را در یک جریان داده ثابت منتقل می کند"
|
||||||
"muxSett" = "تنظیمات ماکس"
|
"muxSett" = "تنظیمات ماکس"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Fragmentasi"
|
"fragment" = "Fragmentasi"
|
||||||
"fragmentDesc" = "Aktifkan fragmentasi untuk paket hello TLS"
|
"fragmentDesc" = "Aktifkan fragmentasi untuk paket hello TLS"
|
||||||
"fragmentSett" = "Pengaturan Fragmentasi"
|
"fragmentSett" = "Pengaturan Fragmentasi"
|
||||||
|
"noiseDesc" = "Aktifkan Noise."
|
||||||
|
"noiseSett" = "Pengaturan Noise"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Mengirimkan beberapa aliran data independen dalam aliran data yang sudah ada."
|
"muxDesc" = "Mengirimkan beberapa aliran data independen dalam aliran data yang sudah ada."
|
||||||
"muxSett" = "Pengaturan Mux"
|
"muxSett" = "Pengaturan Mux"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Фрагментация"
|
"fragment" = "Фрагментация"
|
||||||
"fragmentDesc" = "Включить фрагментацию для пакета приветствия TLS"
|
"fragmentDesc" = "Включить фрагментацию для пакета приветствия TLS"
|
||||||
"fragmentSett" = "Настройки фрагментации"
|
"fragmentSett" = "Настройки фрагментации"
|
||||||
|
"noiseDesc" = "Включить Noise."
|
||||||
|
"noiseSett" = "Настройки Noise"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Передача нескольких независимых потоков данных в рамках установленного потока данных."
|
"muxDesc" = "Передача нескольких независимых потоков данных в рамках установленного потока данных."
|
||||||
"muxSett" = "Mux Настройки"
|
"muxSett" = "Mux Настройки"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Parçalama"
|
"fragment" = "Parçalama"
|
||||||
"fragmentDesc" = "TLS merhaba paketinin parçalanmasını etkinleştir."
|
"fragmentDesc" = "TLS merhaba paketinin parçalanmasını etkinleştir."
|
||||||
"fragmentSett" = "Parçalama Ayarları"
|
"fragmentSett" = "Parçalama Ayarları"
|
||||||
|
"noiseDesc" = "Noise'i Etkinleştir."
|
||||||
|
"noiseSett" = "Noise Ayarları"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Kurulmuş bir veri akışında birden çok bağımsız veri akışını iletir."
|
"muxDesc" = "Kurulmuş bir veri akışında birden çok bağımsız veri akışını iletir."
|
||||||
"muxSett" = "Mux Ayarları"
|
"muxSett" = "Mux Ayarları"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Фрагментація"
|
"fragment" = "Фрагментація"
|
||||||
"fragmentDesc" = "Увімкнути фрагментацію для пакету привітання TLS"
|
"fragmentDesc" = "Увімкнути фрагментацію для пакету привітання TLS"
|
||||||
"fragmentSett" = "Параметри фрагментації"
|
"fragmentSett" = "Параметри фрагментації"
|
||||||
|
"noiseDesc" = "Увімкнути Noise."
|
||||||
|
"noiseSett" = "Налаштування Noise"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Передавати кілька незалежних потоків даних у межах встановленого потоку даних."
|
"muxDesc" = "Передавати кілька незалежних потоків даних у межах встановленого потоку даних."
|
||||||
"muxSett" = "Налаштування Mux"
|
"muxSett" = "Налаштування Mux"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "Sự phân mảnh"
|
"fragment" = "Sự phân mảnh"
|
||||||
"fragmentDesc" = "Kích hoạt phân mảnh cho gói TLS hello"
|
"fragmentDesc" = "Kích hoạt phân mảnh cho gói TLS hello"
|
||||||
"fragmentSett" = "Cài đặt phân mảnh"
|
"fragmentSett" = "Cài đặt phân mảnh"
|
||||||
|
"noiseDesc" = "Bật Noise."
|
||||||
|
"noiseSett" = "Cài đặt Noise"
|
||||||
"mux" = "Mux"
|
"mux" = "Mux"
|
||||||
"muxDesc" = "Truyền nhiều luồng dữ liệu độc lập trong luồng dữ liệu đã thiết lập."
|
"muxDesc" = "Truyền nhiều luồng dữ liệu độc lập trong luồng dữ liệu đã thiết lập."
|
||||||
"muxSett" = "Mux Cài đặt"
|
"muxSett" = "Mux Cài đặt"
|
||||||
|
|
|
@ -312,6 +312,8 @@
|
||||||
"fragment" = "分片"
|
"fragment" = "分片"
|
||||||
"fragmentDesc" = "启用 TLS hello 数据包分片"
|
"fragmentDesc" = "启用 TLS hello 数据包分片"
|
||||||
"fragmentSett" = "设置"
|
"fragmentSett" = "设置"
|
||||||
|
"noiseDesc" = "启用 Noise."
|
||||||
|
"noiseSett" = "Noise 设置"
|
||||||
"mux" = "多路复用器"
|
"mux" = "多路复用器"
|
||||||
"muxDesc" = "在已建立的数据流内传输多个独立的数据流"
|
"muxDesc" = "在已建立的数据流内传输多个独立的数据流"
|
||||||
"muxSett" = "复用器设置"
|
"muxSett" = "复用器设置"
|
||||||
|
|
Loading…
Reference in a new issue