Skip to content

Commit b684f51

Browse files
Webhook add X-Gitea-Hook-Installation-Target-Type Header (#33752)
This is a X-GitHub Header port * repository for repository webhooks (matches GitHub) * organization for organization webhooks (matches GitHub) * user for user webhooks (Gitea specific) * system for system webhooks (Gitea specific) * default for default hooks needs testing (Gitea specific) - `X-Gitea-Hook-Installation-Target-Type` - `X-GitHub-Hook-Installation-Target-Type`
1 parent 698ae7a commit b684f51

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

services/webhook/deliver.go

+21-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"sync"
1919
"time"
2020

21+
user_model "code.gitea.io/gitea/models/user"
2122
webhook_model "code.gitea.io/gitea/models/webhook"
2223
"code.gitea.io/gitea/modules/graceful"
2324
"code.gitea.io/gitea/modules/hostmatcher"
@@ -92,10 +93,10 @@ func newDefaultRequest(ctx context.Context, w *webhook_model.Webhook, t *webhook
9293
}
9394

9495
body = []byte(t.PayloadContent)
95-
return req, body, addDefaultHeaders(req, []byte(w.Secret), t, body)
96+
return req, body, addDefaultHeaders(req, []byte(w.Secret), w, t, body)
9697
}
9798

98-
func addDefaultHeaders(req *http.Request, secret []byte, t *webhook_model.HookTask, payloadContent []byte) error {
99+
func addDefaultHeaders(req *http.Request, secret []byte, w *webhook_model.Webhook, t *webhook_model.HookTask, payloadContent []byte) error {
99100
var signatureSHA1 string
100101
var signatureSHA256 string
101102
if len(secret) > 0 {
@@ -112,10 +113,27 @@ func addDefaultHeaders(req *http.Request, secret []byte, t *webhook_model.HookTa
112113

113114
event := t.EventType.Event()
114115
eventType := string(t.EventType)
116+
targetType := "default"
117+
if w.IsSystemWebhook {
118+
targetType = "system"
119+
} else if w.RepoID != 0 {
120+
targetType = "repository"
121+
} else if w.OwnerID != 0 {
122+
owner, err := user_model.GetUserByID(req.Context(), w.OwnerID)
123+
if owner != nil && err == nil {
124+
if owner.IsOrganization() {
125+
targetType = "organization"
126+
} else {
127+
targetType = "user"
128+
}
129+
}
130+
}
131+
115132
req.Header.Add("X-Gitea-Delivery", t.UUID)
116133
req.Header.Add("X-Gitea-Event", event)
117134
req.Header.Add("X-Gitea-Event-Type", eventType)
118135
req.Header.Add("X-Gitea-Signature", signatureSHA256)
136+
req.Header.Add("X-Gitea-Hook-Installation-Target-Type", targetType)
119137
req.Header.Add("X-Gogs-Delivery", t.UUID)
120138
req.Header.Add("X-Gogs-Event", event)
121139
req.Header.Add("X-Gogs-Event-Type", eventType)
@@ -125,6 +143,7 @@ func addDefaultHeaders(req *http.Request, secret []byte, t *webhook_model.HookTa
125143
req.Header["X-GitHub-Delivery"] = []string{t.UUID}
126144
req.Header["X-GitHub-Event"] = []string{event}
127145
req.Header["X-GitHub-Event-Type"] = []string{eventType}
146+
req.Header["X-GitHub-Hook-Installation-Target-Type"] = []string{targetType}
128147
return nil
129148
}
130149

services/webhook/matrix.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func newMatrixRequest(_ context.Context, w *webhook_model.Webhook, t *webhook_mo
5656
}
5757
req.Header.Set("Content-Type", "application/json")
5858

59-
return req, body, addDefaultHeaders(req, []byte(w.Secret), t, body) // likely useless, but has always been sent historially
59+
return req, body, addDefaultHeaders(req, []byte(w.Secret), w, t, body) // likely useless, but has always been sent historially
6060
}
6161

6262
const matrixPayloadSizeLimit = 1024 * 64

services/webhook/payloader.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func newJSONRequest[T any](pc payloadConvertor[T], w *webhook_model.Webhook, t *
107107
req.Header.Set("Content-Type", "application/json")
108108

109109
if withDefaultHeaders {
110-
return req, body, addDefaultHeaders(req, []byte(w.Secret), t, body)
110+
return req, body, addDefaultHeaders(req, []byte(w.Secret), w, t, body)
111111
}
112112
return req, body, nil
113113
}

tests/integration/repo_webhook_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,9 @@ func Test_WebhookStatus(t *testing.T) {
530530
var triggeredEvent string
531531
provider := newMockWebhookProvider(func(r *http.Request) {
532532
assert.Contains(t, r.Header["X-Github-Event-Type"], "status", "X-GitHub-Event-Type should contain status")
533+
assert.Contains(t, r.Header["X-Github-Hook-Installation-Target-Type"], "repository", "X-GitHub-Hook-Installation-Target-Type should contain repository")
533534
assert.Contains(t, r.Header["X-Gitea-Event-Type"], "status", "X-Gitea-Event-Type should contain status")
535+
assert.Contains(t, r.Header["X-Gitea-Hook-Installation-Target-Type"], "repository", "X-Gitea-Hook-Installation-Target-Type should contain repository")
534536
assert.Contains(t, r.Header["X-Gogs-Event-Type"], "status", "X-Gogs-Event-Type should contain status")
535537
content, _ := io.ReadAll(r.Body)
536538
var payload api.CommitStatusPayload

0 commit comments

Comments
 (0)