diff --git a/sub/sub.go b/sub/sub.go index db582e8d..4f8f5672 100644 --- a/sub/sub.go +++ b/sub/sub.go @@ -107,11 +107,16 @@ func (s *Server) initRouter() (*gin.Engine, error) { SubJsonRules = "" } + SubTitle, err := s.settingService.GetSubTitle() + if err != nil { + SubTitle = "" + } + g := engine.Group("/") s.sub = NewSUBController( g, LinksPath, JsonPath, Encrypt, ShowInfo, RemarkModel, SubUpdates, - SubJsonFragment, SubJsonNoises, SubJsonMux, SubJsonRules) + SubJsonFragment, SubJsonNoises, SubJsonMux, SubJsonRules, SubTitle) return engine, nil } diff --git a/sub/subController.go b/sub/subController.go index 9afbc8da..3ee46384 100644 --- a/sub/subController.go +++ b/sub/subController.go @@ -9,6 +9,7 @@ import ( ) type SUBController struct { + subTitle string subPath string subJsonPath string subEncrypt bool @@ -30,9 +31,11 @@ func NewSUBController( jsonNoise string, jsonMux string, jsonRules string, + subTitle string, ) *SUBController { sub := NewSubService(showInfo, rModel) a := &SUBController{ + subTitle: subTitle, subPath: subPath, subJsonPath: jsonPath, subEncrypt: encrypt, @@ -82,7 +85,7 @@ func (a *SUBController) subs(c *gin.Context) { // Add headers c.Writer.Header().Set("Subscription-Userinfo", header) c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval) - c.Writer.Header().Set("Profile-Title", subId) + c.Writer.Header().Set("Profile-Title", a.subTitle) if a.subEncrypt { c.String(200, base64.StdEncoding.EncodeToString([]byte(result))) @@ -116,7 +119,7 @@ func (a *SUBController) subJsons(c *gin.Context) { // Add headers c.Writer.Header().Set("Subscription-Userinfo", header) c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval) - c.Writer.Header().Set("Profile-Title", subId) + c.Writer.Header().Set("Profile-Title", a.subTitle) c.String(200, jsonSub) } diff --git a/web/assets/js/model/setting.js b/web/assets/js/model/setting.js index 4c15f420..6c8abe0d 100644 --- a/web/assets/js/model/setting.js +++ b/web/assets/js/model/setting.js @@ -26,6 +26,7 @@ class AllSetting { this.xrayTemplateConfig = ""; this.secretEnable = false; this.subEnable = false; + this.subTitle = ""; this.subListen = ""; this.subPort = 2096; this.subPath = "/sub/"; diff --git a/web/entity/entity.go b/web/entity/entity.go index 02d19701..872901b8 100644 --- a/web/entity/entity.go +++ b/web/entity/entity.go @@ -40,6 +40,7 @@ type AllSetting struct { TimeLocation string `json:"timeLocation" form:"timeLocation"` SecretEnable bool `json:"secretEnable" form:"secretEnable"` SubEnable bool `json:"subEnable" form:"subEnable"` + SubTitle string `json:"subTitle" form:"subTitle"` SubListen string `json:"subListen" form:"subListen"` SubPort int `json:"subPort" form:"subPort"` SubPath string `json:"subPath" form:"subPath"` diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html index fe5d7e3a..c8cf93d3 100644 --- a/web/html/xui/inbounds.html +++ b/web/html/xui/inbounds.html @@ -662,6 +662,7 @@ refreshInterval: Number(localStorage.getItem("refreshInterval")) || 5000, subSettings: { enable : false, + subTitle : '', subURI : '', subJsonURI : '', }, @@ -711,6 +712,7 @@ this.tgBotEnable = tgBotEnable; this.subSettings = { enable : subEnable, + subTitle : subTitle, subURI: subURI, subJsonURI: subJsonURI }; diff --git a/web/html/xui/settings.html b/web/html/xui/settings.html index 3bfb32a9..d13af57e 100644 --- a/web/html/xui/settings.html +++ b/web/html/xui/settings.html @@ -409,6 +409,13 @@ + + + + + diff --git a/web/service/setting.go b/web/service/setting.go index ed0f9dc3..5443760c 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -50,6 +50,7 @@ var defaultValueMap = map[string]string{ "tgLang": "en-US", "secretEnable": "false", "subEnable": "false", + "subTitle": "", "subListen": "", "subPort": "2096", "subPath": "/sub/", @@ -418,6 +419,10 @@ func (s *SettingService) GetSubEnable() (bool, error) { return s.getBool("subEnable") } +func (s *SettingService) GetSubTitle() (string, error) { + return s.getString("subTitle") +} + func (s *SettingService) GetSubListen() (string, error) { return s.getString("subListen") } @@ -562,6 +567,7 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) { "defaultKey": func() (any, error) { return s.GetKeyFile() }, "tgBotEnable": func() (any, error) { return s.GetTgbotEnabled() }, "subEnable": func() (any, error) { return s.GetSubEnable() }, + "subTitle": func() (any, error) { return s.GetSubTitle() }, "subURI": func() (any, error) { return s.GetSubURI() }, "subJsonURI": func() (any, error) { return s.GetSubJsonURI() }, "remarkModel": func() (any, error) { return s.GetRemarkModel() }, @@ -581,6 +587,7 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) { if result["subEnable"].(bool) && (result["subURI"].(string) == "" || result["subJsonURI"].(string) == "") { subURI := "" + subTitle, _ := s.GetSubTitle() subPort, _ := s.GetSubPort() subPath, _ := s.GetSubPath() subJsonPath, _ := s.GetSubJsonPath() @@ -607,6 +614,9 @@ func (s *SettingService) GetDefaultSettings(host string) (any, error) { if result["subURI"].(string) == "" { result["subURI"] = subURI + subPath } + if result["subTitle"].(string) == "" { + result["subTitle"] = subTitle + } if result["subJsonURI"].(string) == "" { result["subJsonURI"] = subURI + subJsonPath } diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index f06e2cad..f09a9e79 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -292,6 +292,8 @@ "subSettings" = "Subscription" "subEnable" = "Enable Subscription Service" "subEnableDesc" = "Enables the subscription service." +"subTitle" = "Subscription Title" + "subTitleDesc" = "Title shown in VPN client" "subListen" = "Listen IP" "subListenDesc" = "The IP address for the subscription service. (leave blank to listen on all IPs)" "subPort" = "Listen Port" diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index 86150ff8..80787e24 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -292,6 +292,8 @@ "subSettings" = "Подписка" "subEnable" = "Включить службу" "subEnableDesc" = "Функция подписки с отдельной конфигурацией" +"subTitle" = "Заголовок подписки" + "subTitleDesc" = "Название подписки, которое видит клиент в VPN клиенте" "subListen" = "Прослушивание IP" "subListenDesc" = "Оставьте пустым по умолчанию, чтобы отслеживать все IP-адреса" "subPort" = "Порт подписки"