From 63de821ff402d54fa8b35a5d8fead0d1f59ee937 Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Mon, 20 Nov 2023 20:04:09 +0300 Subject: [PATCH] config: forbid unknown YAML configuration fields Close #3128 and fix one of the privnet configurations along the way. Signed-off-by: Anna Shaleva --- config/protocol.privnet.docker.one.yml | 3 ++- pkg/config/config.go | 6 ++++-- pkg/config/config_test.go | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/config/protocol.privnet.docker.one.yml b/config/protocol.privnet.docker.one.yml index f4e35a7db..e0d0f9a35 100644 --- a/config/protocol.privnet.docker.one.yml +++ b/config/protocol.privnet.docker.one.yml @@ -80,7 +80,8 @@ ApplicationConfiguration: - ":20001" Pprof: Enabled: false - Port: 20011 + Addresses: + - ":20011" Consensus: Enabled: true UnlockWallet: diff --git a/pkg/config/config.go b/pkg/config/config.go index 4e8fe06bd..d30a30e61 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -1,6 +1,7 @@ package config import ( + "bytes" "fmt" "os" "time" @@ -82,8 +83,9 @@ func LoadFile(configPath string) (Config, error) { }, }, } - - err = yaml.Unmarshal(configData, &config) + decoder := yaml.NewDecoder(bytes.NewReader(configData)) + decoder.KnownFields(true) + err = decoder.Decode(&config) if err != nil { return Config{}, fmt.Errorf("failed to unmarshal config YAML: %w", err) } diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 16a59b317..7fca30067 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -1,8 +1,11 @@ package config import ( + "os" + "path/filepath" "testing" + "github.com/nspcc-dev/neo-go/pkg/config/netmode" "github.com/stretchr/testify/require" ) @@ -12,3 +15,20 @@ func TestUnexpectedNativeUpdateHistoryContract(t *testing.T) { _, err := LoadFile(testConfigPath) require.Error(t, err) } + +func TestUnknownConfigFields(t *testing.T) { + tmp := t.TempDir() + cfg := filepath.Join(tmp, "protocol.testnet.yml") + require.NoError(t, os.WriteFile(cfg, []byte(`UnknownConfigurationField: 123`), os.ModePerm)) + + t.Run("LoadFile", func(t *testing.T) { + _, err := LoadFile(cfg) + require.Error(t, err) + require.Contains(t, err.Error(), "field UnknownConfigurationField not found in type config.Config") + }) + t.Run("Load", func(t *testing.T) { + _, err := Load(tmp, netmode.TestNet) + require.Error(t, err) + require.Contains(t, err.Error(), "field UnknownConfigurationField not found in type config.Config") + }) +}