From fcc6787a64febac24f5acd96dcd7e00552501771 Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Tue, 2 Jun 2026 22:26:22 +0200 Subject: [PATCH] fix(settings): fall back to defaults for empty/NULL setting values A setting row whose value column is empty or NULL (seen on some migrated databases) was parsed directly, so getInt/getBool and the GetAllSetting reflection path crashed with 'strconv.Atoi: parsing "": invalid syntax'. This made the Inbounds page (/defaultSettings -> GetPageSize) and the Settings page fail to load. Treat an empty stored value the same as a missing row and fall back to the built-in default at the int/bool parse sites. String getters are unchanged, so legitimately-empty string settings stay empty. Closes #4830 --- web/service/setting.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/web/service/setting.go b/web/service/setting.go index 43eef1b5..3662d206 100644 --- a/web/service/setting.go +++ b/web/service/setting.go @@ -166,7 +166,7 @@ func (s *SettingService) GetAllSetting() (*entity.AllSetting, error) { fieldV := v.FieldByName(field.Name) switch t := fieldV.Interface().(type) { case int: - n, err := strconv.ParseInt(value, 10, 64) + n, err := strconv.ParseInt(effectiveSettingValue(key, value), 10, 64) if err != nil { return err } @@ -174,7 +174,7 @@ func (s *SettingService) GetAllSetting() (*entity.AllSetting, error) { case string: fieldV.SetString(value) case bool: - fieldV.SetBool(value == "true") + fieldV.SetBool(effectiveSettingValue(key, value) == "true") default: return common.NewErrorf("unknown field %v type %v", key, t) } @@ -286,12 +286,21 @@ func (s *SettingService) setString(key string, value string) error { return s.saveSetting(key, value) } +func effectiveSettingValue(key, stored string) string { + if stored == "" { + if def, ok := defaultValueMap[key]; ok { + return def + } + } + return stored +} + func (s *SettingService) getBool(key string) (bool, error) { str, err := s.getString(key) if err != nil { return false, err } - return strconv.ParseBool(str) + return strconv.ParseBool(effectiveSettingValue(key, str)) } func (s *SettingService) setBool(key string, value bool) error { @@ -303,7 +312,7 @@ func (s *SettingService) getInt(key string) (int, error) { if err != nil { return 0, err } - return strconv.Atoi(str) + return strconv.Atoi(effectiveSettingValue(key, str)) } func (s *SettingService) setInt(key string, value int) error {