diff options
Diffstat (limited to 'models/webhook.go')
-rw-r--r-- | models/webhook.go | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/models/webhook.go b/models/webhook.go index 1dcfb8b8..feabf03b 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -5,7 +5,10 @@ package models import ( + "crypto/hmac" + "crypto/sha256" "crypto/tls" + "encoding/hex" "encoding/json" "fmt" "io/ioutil" @@ -358,6 +361,7 @@ type HookTask struct { UUID string Type HookTaskType URL string `xorm:"TEXT"` + Signature string `xorm:"TEXT"` api.Payloader `xorm:"-"` PayloadContent string `xorm:"TEXT"` ContentType HookContentType @@ -481,15 +485,26 @@ func prepareWebhooks(repo *Repository, event HookEventType, p api.Payloader, web return fmt.Errorf("GetDiscordPayload: %v", err) } default: - p.SetSecret(w.Secret) payloader = p } + var signature string + if len(w.Secret) > 0 { + data, err := payloader.JSONPayload() + if err != nil { + log.Error(2, "prepareWebhooks.JSONPayload: %v", err) + } + sig := hmac.New(sha256.New, []byte(w.Secret)) + sig.Write(data) + signature = hex.EncodeToString(sig.Sum(nil)) + } + if err = CreateHookTask(&HookTask{ RepoID: repo.ID, HookID: w.ID, Type: w.HookTaskType, URL: w.URL, + Signature: signature, Payloader: payloader, ContentType: w.ContentType, EventType: event, @@ -535,6 +550,7 @@ func (t *HookTask) deliver() { timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second req := httplib.Post(t.URL).SetTimeout(timeout, timeout). Header("X-Gogs-Delivery", t.UUID). + Header("X-Gogs-Signature", t.Signature). Header("X-Gogs-Event", string(t.EventType)). SetTLSClientConfig(&tls.Config{InsecureSkipVerify: setting.Webhook.SkipTLSVerify}) |