From 2bf6315f5011e113dc85445c7b152ed05da7d2fb Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Sun, 28 Sep 2025 18:13:26 +0200 Subject: [PATCH] +Github webhooks --- app/kgpz.go | 14 +++++--------- controllers/akteur_controller.go | 2 ++ controllers/kategorie_controller.go | 2 ++ controllers/webhooks.go | 21 ++++++++++++--------- providers/config.go | 6 ++++++ 5 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/kgpz.go b/app/kgpz.go index 8d3f690..71b5ada 100644 --- a/app/kgpz.go +++ b/app/kgpz.go @@ -188,15 +188,7 @@ func (k *KGPZ) Routes(srv *fiber.App) error { srv.Get(CITATION_URL, controllers.Get(CITATION_URL)) if k.Config.WebHookSecret != "" && k.Config.WebHookEndpoint != "" { - handler, rc := controllers.PostWebhook(k.Config.WebHookSecret) - srv.Post(k.Config.WebHookEndpoint, handler) - go func() { - for signal := range rc { - if signal { - k.Pull() - } - } - }() + srv.Post(k.Config.WebHookEndpoint, controllers.PostWebhook(k)) } return nil @@ -594,6 +586,10 @@ func (k *KGPZ) IsDebug() bool { return k.Config.Debug } +func (k *KGPZ) GetWebHookSecret() string { + return k.Config.WebHookSecret +} + func (k *KGPZ) Pull() { if k.Repo == nil { return diff --git a/controllers/akteur_controller.go b/controllers/akteur_controller.go index ec901fa..bc62aff 100644 --- a/controllers/akteur_controller.go +++ b/controllers/akteur_controller.go @@ -38,9 +38,11 @@ func GetAgents(kgpz *xmlmodels.Library) fiber.Handler { // Build available letters list (same logic as AgentsView) av := make(map[string]bool) + kgpz.Agents.Lock() for _, agent := range kgpz.Agents.Array { av[strings.ToUpper(agent.ID[:1])] = true } + kgpz.Agents.Unlock() availableLetters := make([]string, 0, len(av)) for letter := range av { availableLetters = append(availableLetters, letter) diff --git a/controllers/kategorie_controller.go b/controllers/kategorie_controller.go index a770369..317bf35 100644 --- a/controllers/kategorie_controller.go +++ b/controllers/kategorie_controller.go @@ -69,6 +69,7 @@ func GetCategory(kgpz *xmlmodels.Library) fiber.Handler { func findFirstYearForCategory(categoryID string, kgpz *xmlmodels.Library) int { categoryYears := make([]int, 0) + kgpz.Pieces.Lock() for _, piece := range kgpz.Pieces.Array { matchesCategory := false @@ -100,6 +101,7 @@ func findFirstYearForCategory(categoryID string, kgpz *xmlmodels.Library) int { } } } + kgpz.Pieces.Unlock() if len(categoryYears) == 0 { return 0 // No pieces found for this category diff --git a/controllers/webhooks.go b/controllers/webhooks.go index 46550c4..77758fe 100644 --- a/controllers/webhooks.go +++ b/controllers/webhooks.go @@ -11,11 +11,10 @@ import ( const SIGNATURE_PREFIX = "sha256=" -func PostWebhook(secret string) (fiber.Handler, chan bool) { - devchan := make(chan bool) +func PostWebhook(kgpz WebhookInterface) func(c *fiber.Ctx) error { return func(c *fiber.Ctx) error { body := c.Body() - if !verifySignature256([]byte(secret), body, c.Get("X-Hub-Signature-256")) { + if !verifySignature256([]byte(kgpz.GetWebHookSecret()), body, c.Get("X-Hub-Signature-256")) { return c.SendStatus(fiber.StatusUnauthorized) } @@ -23,13 +22,17 @@ func PostWebhook(secret string) (fiber.Handler, chan bool) { return c.SendStatus(fiber.StatusBadRequest) } - go func() { - devchan <- true - }() + // Respond with 200 immediately, then process asynchronously + go kgpz.Pull() - c.SendStatus(fiber.StatusOK) - return nil - }, devchan + return c.SendStatus(fiber.StatusOK) + } +} + +// KGPZInterface defines the interface needed by the webhook +type WebhookInterface interface { + GetWebHookSecret() string + Pull() } func sign256(secret, body []byte) []byte { diff --git a/providers/config.go b/providers/config.go index 33213ba..02c4540 100644 --- a/providers/config.go +++ b/providers/config.go @@ -72,6 +72,12 @@ func (c *ConfigProvider) Validate() error { if strings.TrimSpace(c.Config.BaseDIR) == "" { return fmt.Errorf("Base directory path not set") } + + // Validate webhook configuration: if endpoint is set, secret must also be set + if strings.TrimSpace(c.Config.WebHookEndpoint) != "" && strings.TrimSpace(c.Config.WebHookSecret) == "" { + return fmt.Errorf("WebHookSecret must be configured when WebHookEndpoint is set") + } + return nil }