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",
|
"type": "go",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"mode": "debug",
|
"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")
|
v1 := r.Group("api/v1")
|
||||||
{
|
{
|
||||||
routes.LoadPing(v1)
|
routes.LoadPing(v1)
|
||||||
|
routes.LoadWebhook(v1.Group("webhook"))
|
||||||
}
|
}
|
||||||
return r
|
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