diff --git a/internal/hook/hook.go b/internal/hook/hook.go index 0510095..899f633 100644 --- a/internal/hook/hook.go +++ b/internal/hook/hook.go @@ -774,7 +774,13 @@ func (h *Hooks) LoadFromFile(path string, asTemplate bool) error { file = buf.Bytes() } - return yaml.Unmarshal(file, h) + toJSON, err := yaml.YAMLToJSON(file) + if err != nil { + return err + } + jsonDecoder := json.NewDecoder(bytes.NewBuffer(toJSON)) + jsonDecoder.DisallowUnknownFields() + return jsonDecoder.Decode(h) } // Append appends hooks unless the new hooks contain a hook with an ID that already exists diff --git a/internal/hook/hook_test.go b/internal/hook/hook_test.go index e9f29e4..4b8115d 100644 --- a/internal/hook/hook_test.go +++ b/internal/hook/hook_test.go @@ -424,6 +424,7 @@ var hooksLoadFromFileTests = []struct { {"", false, true}, // failures {"missing.json", false, false}, + {"testdata/unrecognized.yaml", false, false}, } func TestHooksLoadFromFile(t *testing.T) { @@ -433,6 +434,7 @@ func TestHooksLoadFromFile(t *testing.T) { for _, tt := range hooksLoadFromFileTests { h := &Hooks{} err := h.LoadFromFile(tt.path, tt.asTemplate) + t.Log(err) if (err == nil) != tt.ok { t.Errorf(err.Error()) } diff --git a/internal/hook/testdata/unrecognized.yaml b/internal/hook/testdata/unrecognized.yaml new file mode 100644 index 0000000..d889b9a --- /dev/null +++ b/internal/hook/testdata/unrecognized.yaml @@ -0,0 +1,28 @@ +- id: webhook + unrecognized-execute-command: /home/adnan/redeploy-go-webhook.sh + command-working-directory: /home/adnan/go + response-message: I got the payload! + response-headers: + - name: Access-Control-Allow-Origin + value: '*' + pass-arguments-to-command: + - source: payload + name: head_commit.id + - source: payload + name: pusher.name + - source: payload + name: pusher.email + trigger-rule: + and: + - match: + type: payload-hmac-sha1 + secret: mysecret + parameter: + source: header + name: X-Hub-Signature + - match: + type: value + value: refs/heads/master + parameter: + source: payload + name: ref diff --git a/webhook.go b/webhook.go index 9ea45aa..d9cef0c 100644 --- a/webhook.go +++ b/webhook.go @@ -194,19 +194,19 @@ func main() { err := newHooks.LoadFromFile(hooksFilePath, *asTemplate) if err != nil { - log.Printf("couldn't load hooks from file! %+v\n", err) - } else { - log.Printf("found %d hook(s) in file\n", len(newHooks)) - - for _, hook := range newHooks { - if matchLoadedHook(hook.ID) != nil { - log.Fatalf("error: hook with the id %s has already been loaded!\nplease check your hooks file for duplicate hooks ids!\n", hook.ID) - } - log.Printf("\tloaded: %s\n", hook.ID) - } - - loadedHooksFromFiles[hooksFilePath] = newHooks + log.Fatalf("couldn't load hooks from file! %+v\n", err) } + + log.Printf("found %d hook(s) in file\n", len(newHooks)) + + for _, hook := range newHooks { + if matchLoadedHook(hook.ID) != nil { + log.Fatalf("error: hook with the id %s has already been loaded!\nplease check your hooks file for duplicate hooks ids!\n", hook.ID) + } + log.Printf("\tloaded: %s\n", hook.ID) + } + + loadedHooksFromFiles[hooksFilePath] = newHooks } newHooksFiles := hooksFiles[:0]