From 957a64d91a5f181fcc902496596bf214227b6d06 Mon Sep 17 00:00:00 2001 From: Giteabot Date: Mon, 11 Sep 2023 02:52:25 +0800 Subject: [PATCH] Fix INI parsing for value with trailing slash (#26995) (#27001) Backport #26995 by @wxiaoguang Fix #26977 (a temp fix) Co-authored-by: wxiaoguang (cherry picked from commit da7d7e60d800a9b13ed1341ef99bf3db062ed942) --- modules/setting/config_provider.go | 12 ++++++++++-- modules/setting/config_provider_test.go | 10 ++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/modules/setting/config_provider.go b/modules/setting/config_provider.go index def3df09f4..56ba38302d 100644 --- a/modules/setting/config_provider.go +++ b/modules/setting/config_provider.go @@ -175,9 +175,16 @@ func (s *iniConfigSection) ChildSections() (sections []ConfigSection) { return sections } +func configProviderLoadOptions() ini.LoadOptions { + return ini.LoadOptions{ + KeyValueDelimiterOnWrite: " = ", + IgnoreContinuation: true, + } +} + // NewConfigProviderFromData this function is mainly for testing purpose func NewConfigProviderFromData(configContent string) (ConfigProvider, error) { - cfg, err := ini.Load(strings.NewReader(configContent)) + cfg, err := ini.LoadSources(configProviderLoadOptions(), strings.NewReader(configContent)) if err != nil { return nil, err } @@ -191,7 +198,7 @@ func NewConfigProviderFromData(configContent string) (ConfigProvider, error) { // NewConfigProviderFromFile load configuration from file. // NOTE: do not print any log except error. func NewConfigProviderFromFile(file string, extraConfigs ...string) (ConfigProvider, error) { - cfg := ini.Empty(ini.LoadOptions{KeyValueDelimiterOnWrite: " = "}) + cfg := ini.Empty(configProviderLoadOptions()) loadedFromEmpty := true if file != "" { @@ -344,6 +351,7 @@ func NewConfigProviderForLocale(source any, others ...any) (ConfigProvider, erro iniFile, err := ini.LoadSources(ini.LoadOptions{ IgnoreInlineComment: true, UnescapeValueCommentSymbols: true, + IgnoreContinuation: true, }, source, others...) if err != nil { return nil, fmt.Errorf("unable to load locale ini: %w", err) diff --git a/modules/setting/config_provider_test.go b/modules/setting/config_provider_test.go index 7e7c6be2bb..a666d124c7 100644 --- a/modules/setting/config_provider_test.go +++ b/modules/setting/config_provider_test.go @@ -30,6 +30,16 @@ key = 123 secSub := cfg.Section("foo.bar.xxx") assert.Equal(t, "123", secSub.Key("key").String()) }) + t.Run("TrailingSlash", func(t *testing.T) { + cfg, _ := NewConfigProviderFromData(` +[foo] +key = E:\ +xxx = yyy +`) + sec := cfg.Section("foo") + assert.Equal(t, "E:\\", sec.Key("key").String()) + assert.Equal(t, "yyy", sec.Key("xxx").String()) + }) } func TestConfigProviderHelper(t *testing.T) {