From 309969114088b6fddd254d15ce6ffa2c598ebb31 Mon Sep 17 00:00:00 2001
From: Riley Avron
Date: Thu, 28 Oct 2021 18:49:52 -0700
Subject: [PATCH 1/2] Add tests covering nested values
---
ini_test.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
diff --git a/ini_test.go b/ini_test.go
index e058a21..5a2eaac 100644
--- a/ini_test.go
+++ b/ini_test.go
@@ -1562,3 +1562,75 @@ Eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Habitant morbi
testData.Value3,
)
}
+
+func Test_NestedValuesSpanningSections(t *testing.T) {
+ t.Run("basic nested value", func(t *testing.T) {
+ f, err := LoadSources(LoadOptions{
+ AllowNestedValues: true,
+ }, []byte(`
+[section]
+key1 = value1
+key2 =
+ nested1 = nestedvalue1
+`))
+ require.NoError(t, err)
+ require.NotNil(t, f)
+
+ assert.Equal(t, "value1", f.Section("section").Key("key1").String())
+ assert.Equal(t, "", f.Section("section").Key("key2").String())
+ assert.Equal(t, []string{"nested1 = nestedvalue1"}, f.Section("section").Key("key2").NestedValues())
+ })
+
+ t.Run("no nested values", func(t *testing.T) {
+ f, err := LoadSources(LoadOptions{
+ AllowNestedValues: true,
+ }, []byte(`
+[section]
+key1 = value1
+key2 =
+`))
+ require.NoError(t, err)
+ require.NotNil(t, f)
+
+ assert.Equal(t, "value1", f.Section("section").Key("key1").String())
+ assert.Equal(t, "", f.Section("section").Key("key2").String())
+ })
+
+ t.Run("no nested values and following sections", func(t *testing.T) {
+ f, err := LoadSources(LoadOptions{
+ AllowNestedValues: true,
+ }, []byte(`
+[section]
+key1 = value1
+key2 =
+
+[section2]
+key3 = value3
+`))
+ require.NoError(t, err)
+ require.NotNil(t, f)
+
+ assert.Equal(t, "value1", f.Section("section").Key("key1").String())
+ assert.Equal(t, "", f.Section("section").Key("key2").String())
+ assert.Equal(t, "value3", f.Section("section2").Key("key3").String())
+ })
+
+ t.Run("no nested values and following sections with indentation", func(t *testing.T) {
+ f, err := LoadSources(LoadOptions{
+ AllowNestedValues: true,
+ }, []byte(`
+[section]
+key1 = value1
+key2 =
+
+[section2]
+ key3 = value3
+`))
+ require.NoError(t, err)
+ require.NotNil(t, f)
+
+ assert.Equal(t, "value1", f.Section("section").Key("key1").String())
+ assert.Equal(t, "", f.Section("section").Key("key2").String())
+ assert.Equal(t, "value3", f.Section("section2").Key("key3").String())
+ })
+}
From 4abc582daf3c30c3a96f7a9b3491dfd2e90163e8 Mon Sep 17 00:00:00 2001
From: Riley Avron
Date: Thu, 28 Oct 2021 18:51:42 -0700
Subject: [PATCH 2/2] Prevent nesting from spanning sections
---
parser.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/parser.go b/parser.go
index b8b5aa8..0a35440 100644
--- a/parser.go
+++ b/parser.go
@@ -461,6 +461,8 @@ func (f *File) parse(reader io.Reader) (err error) {
// Reset auto-counter and comments
p.comment.Reset()
p.count = 1
+ // Nested values can't span sections
+ isLastValueEmpty = false
inUnparseableSection = false
for i := range f.options.UnparseableSections {