From e0c6ab2d44d17b72a7ea6f8b4c829c42baeaae3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Boulanouar?= Date: Mon, 29 May 2017 09:17:15 +0200 Subject: [PATCH] Add Gitea Webhook (#1755) * Replace Gogs by Gitea * Fix missing changes * Create Gitea webhook and put Gogs webhook apart. --- models/webhook.go | 9 ++- models/webhook_test.go | 5 +- modules/auth/repo_form.go | 14 ++++ modules/setting/setting.go | 3 +- public/img/gogs.ico | Bin 0 -> 29157 bytes routers/repo/webhook.go | 93 +++++++++++++++++++++++- routers/routes/routes.go | 12 ++- templates/org/settings/hook_new.tmpl | 5 +- templates/repo/settings/hook_gitea.tmpl | 28 +++++++ templates/repo/settings/hook_list.tmpl | 5 +- templates/repo/settings/hook_new.tmpl | 5 +- 11 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 public/img/gogs.ico create mode 100644 templates/repo/settings/hook_gitea.tmpl diff --git a/models/webhook.go b/models/webhook.go index 3fb1e57e78..5cb2e13a6d 100644 --- a/models/webhook.go +++ b/models/webhook.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -312,9 +313,11 @@ type HookTaskType int const ( GOGS HookTaskType = iota + 1 SLACK + GITEA ) var hookTaskTypes = map[string]HookTaskType{ + "gitea": GITEA, "gogs": GOGS, "slack": SLACK, } @@ -327,6 +330,8 @@ func ToHookTaskType(name string) HookTaskType { // Name returns the name of an hook task type func (t HookTaskType) Name() string { switch t { + case GITEA: + return "gitea" case GOGS: return "gogs" case SLACK: @@ -503,7 +508,7 @@ func PrepareWebhooks(repo *Repository, event HookEventType, p api.Payloader) err } } - // Use separate objects so modifications won't be made on payload on non-Gogs type hooks. + // Use separate objects so modifications won't be made on payload on non-Gogs/Gitea type hooks. switch w.HookTaskType { case SLACK: payloader, err = GetSlackPayload(p, event, w.Meta) @@ -536,6 +541,8 @@ func (t *HookTask) deliver() { timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second req := httplib.Post(t.URL).SetTimeout(timeout, timeout). + Header("X-Gitea-Delivery", t.UUID). + Header("X-Gitea-Event", string(t.EventType)). Header("X-Gogs-Delivery", t.UUID). Header("X-Gogs-Event", string(t.EventType)). Header("X-GitHub-Delivery", t.UUID). diff --git a/models/webhook_test.go b/models/webhook_test.go index 3f377eae7a..a637a16999 100644 --- a/models/webhook_test.go +++ b/models/webhook_test.go @@ -191,16 +191,19 @@ func TestDeleteWebhookByOrgID(t *testing.T) { func TestToHookTaskType(t *testing.T) { assert.Equal(t, GOGS, ToHookTaskType("gogs")) assert.Equal(t, SLACK, ToHookTaskType("slack")) + assert.Equal(t, GITEA, ToHookTaskType("gitea")) } func TestHookTaskType_Name(t *testing.T) { assert.Equal(t, "gogs", GOGS.Name()) assert.Equal(t, "slack", SLACK.Name()) + assert.Equal(t, "gitea", GITEA.Name()) } func TestIsValidHookTaskType(t *testing.T) { assert.True(t, IsValidHookTaskType("gogs")) assert.True(t, IsValidHookTaskType("slack")) + assert.True(t, IsValidHookTaskType("gitea")) assert.False(t, IsValidHookTaskType("invalid")) } @@ -221,7 +224,7 @@ func TestCreateHookTask(t *testing.T) { hookTask := &HookTask{ RepoID: 3, HookID: 3, - Type: GOGS, + Type: GITEA, URL: "http://www.example.com/unit_test", Payloader: &api.PushPayload{}, } diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index c56e76c871..58dcf468ef 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -154,6 +155,19 @@ func (f *NewWebhookForm) Validate(ctx *macaron.Context, errs binding.Errors) bin return validate(errs, ctx.Data, f, ctx.Locale) } +// NewGogshookForm form for creating gogs hook +type NewGogshookForm struct { + PayloadURL string `binding:"Required;ValidUrl"` + ContentType int `binding:"Required"` + Secret string + WebhookForm +} + +// Validate validates the fields +func (f *NewGogshookForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors { + return validate(errs, ctx.Data, f, ctx.Locale) +} + // NewSlackHookForm form for creating slack hook type NewSlackHookForm struct { PayloadURL string `binding:"Required;ValidUrl"` diff --git a/modules/setting/setting.go b/modules/setting/setting.go index c3a829715b..a948527a2c 100644 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -1,4 +1,5 @@ // Copyright 2014 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -1325,7 +1326,7 @@ func newWebhookService() { Webhook.QueueLength = sec.Key("QUEUE_LENGTH").MustInt(1000) Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5) Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool() - Webhook.Types = []string{"gogs", "slack"} + Webhook.Types = []string{"gitea", "gogs", "slack"} Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) } diff --git a/public/img/gogs.ico b/public/img/gogs.ico new file mode 100644 index 0000000000000000000000000000000000000000..34385535534c7520f4b1194e9a5def4094874374 GIT binary patch literal 29157 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 O1B0ilpUXO@geCyvf&O^_ literal 0 HcmV?d00001 diff --git a/routers/repo/webhook.go b/routers/repo/webhook.go index 754cf169b8..5489d71857 100644 --- a/routers/repo/webhook.go +++ b/routers/repo/webhook.go @@ -1,4 +1,5 @@ // Copyright 2015 The Gogs Authors. All rights reserved. +// Copyright 2017 The Gitea Authors. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. @@ -120,6 +121,53 @@ func ParseHookEvent(form auth.WebhookForm) *models.HookEvent { // WebHooksNewPost response for creating webhook func WebHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") + ctx.Data["PageIsSettingsHooks"] = true + ctx.Data["PageIsSettingsHooksNew"] = true + ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}} + ctx.Data["HookType"] = "gitea" + + orCtx, err := getOrgRepoCtx(ctx) + if err != nil { + ctx.Handle(500, "getOrgRepoCtx", err) + return + } + ctx.Data["BaseLink"] = orCtx.Link + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + contentType := models.ContentTypeJSON + if models.HookContentType(form.ContentType) == models.ContentTypeForm { + contentType = models.ContentTypeForm + } + + w := &models.Webhook{ + RepoID: orCtx.RepoID, + URL: form.PayloadURL, + ContentType: contentType, + Secret: form.Secret, + HookEvent: ParseHookEvent(form.WebhookForm), + IsActive: form.Active, + HookTaskType: models.GITEA, + OrgID: orCtx.OrgID, + } + if err := w.UpdateEvent(); err != nil { + ctx.Handle(500, "UpdateEvent", err) + return + } else if err := models.CreateWebhook(w); err != nil { + ctx.Handle(500, "CreateWebhook", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.add_hook_success")) + ctx.Redirect(orCtx.Link + "/settings/hooks") +} + +// GogsHooksNewPost response for creating webhook +func GogsHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) { ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") ctx.Data["PageIsSettingsHooks"] = true ctx.Data["PageIsSettingsHooksNew"] = true @@ -150,7 +198,7 @@ func WebHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) { Secret: form.Secret, HookEvent: ParseHookEvent(form.WebhookForm), IsActive: form.Active, - HookTaskType: models.GOGS, + HookTaskType: models.GITEA, OrgID: orCtx.OrgID, } if err := w.UpdateEvent(); err != nil { @@ -245,8 +293,10 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *models.Webhook) { case models.SLACK: ctx.Data["SlackHook"] = w.GetSlackHook() ctx.Data["HookType"] = "slack" - default: + case models.GOGS: ctx.Data["HookType"] = "gogs" + default: + ctx.Data["HookType"] = "gitea" } ctx.Data["History"], err = w.History(1) @@ -310,6 +360,45 @@ func WebHooksEditPost(ctx *context.Context, form auth.NewWebhookForm) { ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID)) } +// GogsHooksEditPost response for editing gogs hook +func GogsHooksEditPost(ctx *context.Context, form auth.NewWebhookForm) { + ctx.Data["Title"] = ctx.Tr("repo.settings.update_webhook") + ctx.Data["PageIsSettingsHooks"] = true + ctx.Data["PageIsSettingsHooksEdit"] = true + + orCtx, w := checkWebhook(ctx) + if ctx.Written() { + return + } + ctx.Data["Webhook"] = w + + if ctx.HasError() { + ctx.HTML(200, orCtx.NewTemplate) + return + } + + contentType := models.ContentTypeJSON + if models.HookContentType(form.ContentType) == models.ContentTypeForm { + contentType = models.ContentTypeForm + } + + w.URL = form.PayloadURL + w.ContentType = contentType + w.Secret = form.Secret + w.HookEvent = ParseHookEvent(form.WebhookForm) + w.IsActive = form.Active + if err := w.UpdateEvent(); err != nil { + ctx.Handle(500, "UpdateEvent", err) + return + } else if err := models.UpdateWebhook(w); err != nil { + ctx.Handle(500, "GogsHooksEditPost", err) + return + } + + ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) + ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID)) +} + // SlackHooksEditPost response for editing slack hook func SlackHooksEditPost(ctx *context.Context, form auth.NewSlackHookForm) { ctx.Data["Title"] = ctx.Tr("repo.settings") diff --git a/routers/routes/routes.go b/routers/routes/routes.go index f1c55e1705..0781aef89d 100644 --- a/routers/routes/routes.go +++ b/routers/routes/routes.go @@ -379,10 +379,12 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("", org.Webhooks) m.Post("/delete", org.DeleteWebhook) m.Get("/:type/new", repo.WebhooksNew) - m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + m.Post("/gitea/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + m.Post("/gogs/new", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) m.Get("/:id", repo.WebHooksEdit) - m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksEditPost) m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) }) @@ -423,11 +425,13 @@ func RegisterRoutes(m *macaron.Macaron) { m.Get("", repo.Webhooks) m.Post("/delete", repo.DeleteWebhook) m.Get("/:type/new", repo.WebhooksNew) - m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + m.Post("/gitea/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost) + m.Post("/gogs/new", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost) m.Get("/:id", repo.WebHooksEdit) m.Post("/:id/test", repo.TestWebhook) - m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + m.Post("/gitea/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost) + m.Post("/gogs/:id", bindIgnErr(auth.NewGogshookForm{}), repo.GogsHooksNewPost) m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) m.Group("/git", func() { diff --git a/templates/org/settings/hook_new.tmpl b/templates/org/settings/hook_new.tmpl index 2324788d33..ee3fd2c506 100644 --- a/templates/org/settings/hook_new.tmpl +++ b/templates/org/settings/hook_new.tmpl @@ -9,14 +9,17 @@

{{if .PageIsSettingsHooksNew}}{{.i18n.Tr "repo.settings.add_webhook"}}{{else}}{{.i18n.Tr "repo.settings.update_webhook"}}{{end}}
- {{if eq .HookType "gogs"}} + {{if eq .HookType "gitea"}} + {{else if eq .HookType "gogs"}} + {{else if eq .HookType "slack"}} {{end}}

+ {{template "repo/settings/hook_gitea" .}} {{template "repo/settings/hook_gogs" .}} {{template "repo/settings/hook_slack" .}}
diff --git a/templates/repo/settings/hook_gitea.tmpl b/templates/repo/settings/hook_gitea.tmpl new file mode 100644 index 0000000000..4ac6d718c9 --- /dev/null +++ b/templates/repo/settings/hook_gitea.tmpl @@ -0,0 +1,28 @@ +{{if eq .HookType "gitea"}} +

{{.i18n.Tr "repo.settings.add_webhook_desc" "https://docs.gitea.io/features/webhook.html" | Str2html}}

+
+ {{.CsrfTokenHtml}} +
+ + +
+
+ + +
+ +
+ + +
+ {{template "repo/settings/hook_settings" .}} +
+{{end}} diff --git a/templates/repo/settings/hook_list.tmpl b/templates/repo/settings/hook_list.tmpl index 0b9c4d5057..aba948b952 100644 --- a/templates/repo/settings/hook_list.tmpl +++ b/templates/repo/settings/hook_list.tmpl @@ -5,9 +5,12 @@