|
6 | 6 | package models
|
7 | 7 |
|
8 | 8 | import (
|
| 9 | + "crypto/hmac" |
| 10 | + "crypto/sha256" |
9 | 11 | "crypto/tls"
|
| 12 | + "encoding/hex" |
10 | 13 | "encoding/json"
|
11 | 14 | "fmt"
|
12 | 15 | "io/ioutil"
|
@@ -101,6 +104,7 @@ type Webhook struct {
|
101 | 104 | RepoID int64 `xorm:"INDEX"`
|
102 | 105 | OrgID int64 `xorm:"INDEX"`
|
103 | 106 | URL string `xorm:"url TEXT"`
|
| 107 | + Signature string `xorm:"TEXT"` |
104 | 108 | ContentType HookContentType
|
105 | 109 | Secret string `xorm:"TEXT"`
|
106 | 110 | Events string `xorm:"TEXT"`
|
@@ -529,6 +533,7 @@ type HookTask struct {
|
529 | 533 | UUID string
|
530 | 534 | Type HookTaskType
|
531 | 535 | URL string `xorm:"TEXT"`
|
| 536 | + Signature string `xorm:"TEXT"` |
532 | 537 | api.Payloader `xorm:"-"`
|
533 | 538 | PayloadContent string `xorm:"TEXT"`
|
534 | 539 | ContentType HookContentType
|
@@ -657,11 +662,23 @@ func prepareWebhook(e Engine, w *Webhook, repo *Repository, event HookEventType,
|
657 | 662 | payloader = p
|
658 | 663 | }
|
659 | 664 |
|
| 665 | + var signature string |
| 666 | + if len(w.Secret) > 0 { |
| 667 | + data, err := payloader.JSONPayload() |
| 668 | + if err != nil { |
| 669 | + log.Error(2, "prepareWebhooks.JSONPayload: %v", err) |
| 670 | + } |
| 671 | + sig := hmac.New(sha256.New, []byte(w.Secret)) |
| 672 | + sig.Write(data) |
| 673 | + signature = hex.EncodeToString(sig.Sum(nil)) |
| 674 | + } |
| 675 | + |
660 | 676 | if err = createHookTask(e, &HookTask{
|
661 | 677 | RepoID: repo.ID,
|
662 | 678 | HookID: w.ID,
|
663 | 679 | Type: w.HookTaskType,
|
664 | 680 | URL: w.URL,
|
| 681 | + Signature: signature, |
665 | 682 | Payloader: payloader,
|
666 | 683 | ContentType: w.ContentType,
|
667 | 684 | EventType: event,
|
@@ -712,8 +729,10 @@ func (t *HookTask) deliver() {
|
712 | 729 | req := httplib.Post(t.URL).SetTimeout(timeout, timeout).
|
713 | 730 | Header("X-Gitea-Delivery", t.UUID).
|
714 | 731 | Header("X-Gitea-Event", string(t.EventType)).
|
| 732 | + Header("X-Gitea-Signature", t.Signature). |
715 | 733 | Header("X-Gogs-Delivery", t.UUID).
|
716 | 734 | Header("X-Gogs-Event", string(t.EventType)).
|
| 735 | + Header("X-Gogs-Signature", t.Signature). |
717 | 736 | HeaderWithSensitiveCase("X-GitHub-Delivery", t.UUID).
|
718 | 737 | HeaderWithSensitiveCase("X-GitHub-Event", string(t.EventType)).
|
719 | 738 | SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify})
|
|
0 commit comments