package gitlab import ( "fmt" "net/http" libHTTP "dev.sum7.eu/genofire/golang-lib/http" "github.com/bdlm/log" xmpp "github.com/mattn/go-xmpp" "dev.sum7.eu/genofire/hook2xmpp/runtime" ) var eventHeader = map[string]string{ "X-GitHub-Event": "X-Hub-Signature", "X-Gogs-Event": "X-Gogs-Delivery", "X-Gitlab-Event": "X-Gitlab-Token", } const hookType = "gitlab" func init() { runtime.HookRegister[hookType] = func(client *xmpp.Client, hooks []runtime.Hook) func(w http.ResponseWriter, r *http.Request) { log.WithField("type", hookType).Info("loaded") return func(w http.ResponseWriter, r *http.Request) { event := r.Header.Get("X-Gitlab-Event") secret := r.Header.Get("X-Gitlab-Token") logger := log.WithFields(map[string]interface{}{ "event": event, "type": hookType, }) gitLabEvent := Event(event) if gitLabEvent == "" || secret == "" { logger.Warnf("no secret or event found") http.Error(w, fmt.Sprintf("no secret or event found"), http.StatusNotFound) return } var msg string var err error switch gitLabEvent { case PushEvents: var pl PushEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case TagEvents: var pl TagEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case ConfidentialIssuesEvents: var pl ConfidentialIssueEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case IssuesEvents: var pl IssueEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case CommentEvents: var pl CommentEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case MergeRequestEvents: var pl MergeRequestEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case WikiPageEvents: var pl WikiPageEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case PipelineEvents: var pl PipelineEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() case BuildEvents: var pl BuildEventPayload err = libHTTP.Read(r, &pl) msg = pl.String() default: err = nil msg = fmt.Sprintf("unknown gitlab event '%s' received", gitLabEvent) } logger = logger.WithField("msg", msg) if err != nil { logger.Warnf("unable decode message: %s", err) return } ok := false for _, hook := range hooks { if secret != hook.Secret { continue } logger.Infof("run hook") runtime.Notify(client, hook, msg) ok = true } if !ok { logger.Warnf("no hook found") http.Error(w, fmt.Sprintf("no configuration for %s for message: %s", hookType, msg), http.StatusNotFound) } } } }