diff --git a/web/html/xui/form/client.html b/web/html/xui/form/client.html
index 63cb8aef..d147fbf7 100644
--- a/web/html/xui/form/client.html
+++ b/web/html/xui/form/client.html
@@ -63,7 +63,7 @@
-
+
@@ -75,7 +75,7 @@
-
+
diff --git a/web/html/xui/inbounds.html b/web/html/xui/inbounds.html
index aeab3db3..a58372ef 100644
--- a/web/html/xui/inbounds.html
+++ b/web/html/xui/inbounds.html
@@ -571,6 +571,7 @@
datepicker: 'gregorian',
tgBotEnable: false,
showAlert: false,
+ ipLimitEnable: false,
pageSize: 0,
isMobile: window.innerWidth <= 768,
},
@@ -618,6 +619,7 @@
this.pageSize = pageSize;
this.remarkModel = remarkModel;
this.datepicker = datepicker;
+ this.ipLimitEnable = ipLimitEnable;
}
},
setInbounds(dbInbounds) {
diff --git a/web/service/setting.go b/web/service/setting.go
index 10147dfc..4a293dc0 100644
--- a/web/service/setting.go
+++ b/web/service/setting.go
@@ -459,6 +459,25 @@ func (s *SettingService) SetWarp(data string) error {
return s.setString("warp", data)
}
+func (s *SettingService) GetIpLimitEnable() (bool, error) {
+ templateConfig, err := s.GetXrayConfigTemplate()
+ if err != nil {
+ return false, err
+ }
+
+ var xrayConfig map[string]interface{}
+ err = json.Unmarshal([]byte(templateConfig), &xrayConfig)
+ if err != nil {
+ return false, err
+ }
+ if logConfig, ok := xrayConfig["log"].(map[string]interface{}); ok {
+ if accessLogPath, ok := logConfig["access"].(string); ok {
+ return accessLogPath == "./access.log", nil
+ }
+ }
+ return false, nil
+}
+
func (s *SettingService) UpdateAllSetting(allSetting *entity.AllSetting) error {
if err := allSetting.CheckValid(); err != nil {
return err
@@ -492,17 +511,18 @@ func (s *SettingService) GetDefaultXrayConfig() (interface{}, error) {
func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) {
type settingFunc func() (interface{}, error)
settings := map[string]settingFunc{
- "expireDiff": func() (interface{}, error) { return s.GetExpireDiff() },
- "trafficDiff": func() (interface{}, error) { return s.GetTrafficDiff() },
- "pageSize": func() (interface{}, error) { return s.GetPageSize() },
- "defaultCert": func() (interface{}, error) { return s.GetCertFile() },
- "defaultKey": func() (interface{}, error) { return s.GetKeyFile() },
- "tgBotEnable": func() (interface{}, error) { return s.GetTgbotenabled() },
- "subEnable": func() (interface{}, error) { return s.GetSubEnable() },
- "subURI": func() (interface{}, error) { return s.GetSubURI() },
- "subJsonURI": func() (interface{}, error) { return s.GetSubJsonURI() },
- "remarkModel": func() (interface{}, error) { return s.GetRemarkModel() },
- "datepicker": func() (interface{}, error) { return s.GetDatepicker() },
+ "expireDiff": func() (interface{}, error) { return s.GetExpireDiff() },
+ "trafficDiff": func() (interface{}, error) { return s.GetTrafficDiff() },
+ "pageSize": func() (interface{}, error) { return s.GetPageSize() },
+ "defaultCert": func() (interface{}, error) { return s.GetCertFile() },
+ "defaultKey": func() (interface{}, error) { return s.GetKeyFile() },
+ "tgBotEnable": func() (interface{}, error) { return s.GetTgbotenabled() },
+ "subEnable": func() (interface{}, error) { return s.GetSubEnable() },
+ "subURI": func() (interface{}, error) { return s.GetSubURI() },
+ "subJsonURI": func() (interface{}, error) { return s.GetSubJsonURI() },
+ "remarkModel": func() (interface{}, error) { return s.GetRemarkModel() },
+ "datepicker": func() (interface{}, error) { return s.GetDatepicker() },
+ "ipLimitEnable": func() (interface{}, error) { return s.GetIpLimitEnable() },
}
result := make(map[string]interface{})