]> source.dussan.org Git - gitea.git/commitdiff
Fix: system webhooks API bug (#28531)
authorvincent <38434877+pulltheflower@users.noreply.github.com>
Sun, 31 Dec 2023 04:31:50 +0000 (12:31 +0800)
committerGitHub <noreply@github.com>
Sun, 31 Dec 2023 04:31:50 +0000 (04:31 +0000)
- Fix the bug about admin/hooks API that `GET /admin/hooks` can only
fetch system_hooks, `POST /admin/hooks` can only create default_hooks.

routers/api/v1/utils/hook.go

index 1207be25accb6ad428f6f9fc13b1ec3b2753a451..28b21ab8db657d83e1b3b7e21eadc6af160e7f60 100644 (file)
@@ -6,6 +6,7 @@ package utils
 import (
        "fmt"
        "net/http"
+       "strconv"
        "strings"
 
        "code.gitea.io/gitea/models/db"
@@ -157,6 +158,7 @@ func pullHook(events []string, event string) bool {
 // addHook add the hook specified by `form`, `ownerID` and `repoID`. If there is
 // an error, write to `ctx` accordingly. Return (webhook, ok)
 func addHook(ctx *context.APIContext, form *api.CreateHookOption, ownerID, repoID int64) (*webhook.Webhook, bool) {
+       var isSystemWebhook bool
        if !checkCreateHookOption(ctx, form) {
                return nil, false
        }
@@ -164,13 +166,22 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, ownerID, repoI
        if len(form.Events) == 0 {
                form.Events = []string{"push"}
        }
+       if form.Config["is_system_webhook"] != "" {
+               sw, err := strconv.ParseBool(form.Config["is_system_webhook"])
+               if err != nil {
+                       ctx.Error(http.StatusUnprocessableEntity, "", "Invalid is_system_webhook value")
+                       return nil, false
+               }
+               isSystemWebhook = sw
+       }
        w := &webhook.Webhook{
-               OwnerID:     ownerID,
-               RepoID:      repoID,
-               URL:         form.Config["url"],
-               ContentType: webhook.ToHookContentType(form.Config["content_type"]),
-               Secret:      form.Config["secret"],
-               HTTPMethod:  "POST",
+               OwnerID:         ownerID,
+               RepoID:          repoID,
+               URL:             form.Config["url"],
+               ContentType:     webhook.ToHookContentType(form.Config["content_type"]),
+               Secret:          form.Config["secret"],
+               HTTPMethod:      "POST",
+               IsSystemWebhook: isSystemWebhook,
                HookEvent: &webhook_module.HookEvent{
                        ChooseEvents: true,
                        HookEvents: webhook_module.HookEvents{