Add base for webhook (need refracto)
This commit is contained in:
parent
89938e5002
commit
c87fb882b4
3
.vscode/launch.json
vendored
3
.vscode/launch.json
vendored
@ -9,7 +9,8 @@
|
||||
"type": "go",
|
||||
"request": "launch",
|
||||
"mode": "debug",
|
||||
"program": "${workspaceFolder}/src/backend/main.go"
|
||||
"program": "${workspaceFolder}/src/backend/main.go",
|
||||
"console": "integratedTerminal"
|
||||
}
|
||||
]
|
||||
}
|
88
src/backend/controllers/webhook.go
Normal file
88
src/backend/controllers/webhook.go
Normal file
@ -0,0 +1,88 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/hmac"
|
||||
"io/ioutil"
|
||||
|
||||
hmacService "git.sebclem.fr/sebclem/renovate-manager/services/hmac"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type WebhookController struct{}
|
||||
|
||||
func (ctl WebhookController) HandleGiteaWebhook(c *gin.Context) {
|
||||
r := c.Request
|
||||
signature := r.Header.Get("X-Gitea-Signature")
|
||||
|
||||
body, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
c.AbortWithStatus(500)
|
||||
return
|
||||
}
|
||||
|
||||
expectedSignature := hmacService.CalculateHMAC("test", body)
|
||||
|
||||
if signature == "" || !hmac.Equal([]byte(signature), []byte(expectedSignature)) {
|
||||
logrus.Error("Signature missmatch, Abort !")
|
||||
c.AbortWithStatus(401)
|
||||
return
|
||||
}
|
||||
|
||||
// Reset the request body so it can be Bind to json
|
||||
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
|
||||
|
||||
switch r.Header.Get("X-Gitea-Event") {
|
||||
case "push":
|
||||
logrus.Info("Received PUSH webhook")
|
||||
case "create":
|
||||
logrus.Info("Received CREATE webhook")
|
||||
case "delete":
|
||||
logrus.Info("Received DELETE webhook")
|
||||
case "issues":
|
||||
logrus.Info("Received ISSUES webhook")
|
||||
case "issue_comment":
|
||||
logrus.Info("Received ISSUE_COMMENT webhook")
|
||||
case "pull_request":
|
||||
logrus.Info("Received PULL_REQUEST webhook")
|
||||
var data PullRequestWebhook
|
||||
if err := c.BindJSON(&data); err == nil {
|
||||
logrus.Info("All good")
|
||||
c.String(201, "")
|
||||
} else {
|
||||
logrus.Error("Fail to parse json")
|
||||
}
|
||||
default:
|
||||
logrus.Warn("Received UNKNOWN webhook")
|
||||
}
|
||||
// ctx.String(201, "")
|
||||
}
|
||||
|
||||
type PullRequestWebhook struct {
|
||||
Action string `json:"action"`
|
||||
Number int `json:"number"`
|
||||
PullRequest PullRequest `json:"pull_request"`
|
||||
Repository Repository `json:"repository"`
|
||||
Sender User `json:"sender"`
|
||||
}
|
||||
|
||||
type PullRequest struct {
|
||||
Id int `json:"id"`
|
||||
Url string `json:"url"`
|
||||
Number uint64 `json:"number"`
|
||||
User User `json:"user"`
|
||||
}
|
||||
|
||||
type User struct {
|
||||
Id int `json:"id"`
|
||||
Login string `json:"login"`
|
||||
Username string `json:"username"`
|
||||
}
|
||||
|
||||
type Repository struct {
|
||||
Id int `json:"id"`
|
||||
Owner User `json:"owner"`
|
||||
Name string `json:"name"`
|
||||
FullName string `json:"full_name"`
|
||||
}
|
11
src/backend/routes/webhook.go
Normal file
11
src/backend/routes/webhook.go
Normal file
@ -0,0 +1,11 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"git.sebclem.fr/sebclem/renovate-manager/controllers"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func LoadWebhook(g *gin.RouterGroup) {
|
||||
controller := new(controllers.WebhookController)
|
||||
g.POST("gitea", controller.HandleGiteaWebhook)
|
||||
}
|
@ -9,6 +9,7 @@ func InitRoutes(r *gin.Engine) *gin.Engine {
|
||||
v1 := r.Group("api/v1")
|
||||
{
|
||||
routes.LoadPing(v1)
|
||||
routes.LoadWebhook(v1.Group("webhook"))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
14
src/backend/services/hmac/hmac.go
Normal file
14
src/backend/services/hmac/hmac.go
Normal file
@ -0,0 +1,14 @@
|
||||
package hmac
|
||||
|
||||
import (
|
||||
"crypto/hmac"
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
func CalculateHMAC(secret string, message []byte) string {
|
||||
key := []byte(secret)
|
||||
h := hmac.New(sha256.New, key)
|
||||
h.Write(message)
|
||||
return hex.EncodeToString(h.Sum(nil))
|
||||
}
|
Loading…
Reference in New Issue
Block a user