2015-12-05 21:24:13 +03:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2017-05-29 10:17:15 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2015-12-05 21:24:13 +03:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
import (
"encoding/json"
"errors"
"fmt"
"strings"
2016-11-10 19:24:48 +03:00
"code.gitea.io/git"
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
2017-08-28 08:06:45 +03:00
api "code.gitea.io/sdk/gitea"
"github.com/Unknwon/com"
2015-12-05 21:24:13 +03:00
)
const (
2018-05-16 17:01:55 +03:00
tplHooks base . TplName = "repo/settings/webhook/base"
tplHookNew base . TplName = "repo/settings/webhook/new"
2018-05-23 10:23:23 +03:00
tplOrgHookNew base . TplName = "org/settings/hook_new"
2015-12-05 21:24:13 +03:00
)
2016-11-24 10:04:31 +03:00
// Webhooks render web hooks list page
2016-03-11 19:56:52 +03:00
func Webhooks ( ctx * context . Context ) {
2015-12-05 21:24:13 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.hooks" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "BaseLink" ] = ctx . Repo . RepoLink
2018-01-03 18:50:09 +03:00
ctx . Data [ "Description" ] = ctx . Tr ( "repo.settings.hooks_desc" , "https://docs.gitea.io/en-us/webhooks/" )
2015-12-05 21:24:13 +03:00
ws , err := models . GetWebhooksByRepoID ( ctx . Repo . Repository . ID )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GetWebhooksByRepoID" , err )
2015-12-05 21:24:13 +03:00
return
}
ctx . Data [ "Webhooks" ] = ws
2016-11-07 23:58:22 +03:00
ctx . HTML ( 200 , tplHooks )
2015-12-05 21:24:13 +03:00
}
2016-11-24 10:04:31 +03:00
type orgRepoCtx struct {
2015-12-05 21:24:13 +03:00
OrgID int64
RepoID int64
Link string
NewTemplate base . TplName
}
// getOrgRepoCtx determines whether this is a repo context or organization context.
2016-11-24 10:04:31 +03:00
func getOrgRepoCtx ( ctx * context . Context ) ( * orgRepoCtx , error ) {
2015-12-05 21:24:13 +03:00
if len ( ctx . Repo . RepoLink ) > 0 {
2016-11-24 10:04:31 +03:00
return & orgRepoCtx {
2015-12-05 21:24:13 +03:00
RepoID : ctx . Repo . Repository . ID ,
Link : ctx . Repo . RepoLink ,
2016-11-07 23:58:22 +03:00
NewTemplate : tplHookNew ,
2015-12-05 21:24:13 +03:00
} , nil
}
if len ( ctx . Org . OrgLink ) > 0 {
2016-11-24 10:04:31 +03:00
return & orgRepoCtx {
2016-07-23 20:08:22 +03:00
OrgID : ctx . Org . Organization . ID ,
2015-12-05 21:24:13 +03:00
Link : ctx . Org . OrgLink ,
2016-11-07 23:58:22 +03:00
NewTemplate : tplOrgHookNew ,
2015-12-05 21:24:13 +03:00
} , nil
}
return nil , errors . New ( "Unable to set OrgRepo context" )
}
2016-03-11 19:56:52 +03:00
func checkHookType ( ctx * context . Context ) string {
2015-12-05 21:24:13 +03:00
hookType := strings . ToLower ( ctx . Params ( ":type" ) )
if ! com . IsSliceContainsStr ( setting . Webhook . Types , hookType ) {
2018-01-11 00:34:17 +03:00
ctx . NotFound ( "checkHookType" , nil )
2015-12-05 21:24:13 +03:00
return ""
}
return hookType
}
2016-11-24 10:04:31 +03:00
// WebhooksNew render creating webhook page
2016-03-11 19:56:52 +03:00
func WebhooksNew ( ctx * context . Context ) {
2015-12-05 21:24:13 +03:00
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 { } }
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2015-12-05 21:24:13 +03:00
return
}
2017-08-28 08:06:45 +03:00
hookType := checkHookType ( ctx )
ctx . Data [ "HookType" ] = hookType
2015-12-05 21:24:13 +03:00
if ctx . Written ( ) {
return
}
2017-08-28 08:06:45 +03:00
if hookType == "discord" {
ctx . Data [ "DiscordHook" ] = map [ string ] interface { } {
"Username" : "Gitea" ,
"IconURL" : setting . AppURL + "img/favicon.png" ,
}
}
2015-12-05 21:24:13 +03:00
ctx . Data [ "BaseLink" ] = orCtx . Link
ctx . HTML ( 200 , orCtx . NewTemplate )
}
2016-11-24 10:04:31 +03:00
// ParseHookEvent convert web form content to models.HookEvent
2015-12-05 21:24:13 +03:00
func ParseHookEvent ( form auth . WebhookForm ) * models . HookEvent {
return & models . HookEvent {
PushOnly : form . PushOnly ( ) ,
SendEverything : form . SendEverything ( ) ,
ChooseEvents : form . ChooseEvents ( ) ,
HookEvents : models . HookEvents {
2018-05-16 17:01:55 +03:00
Create : form . Create ,
Delete : form . Delete ,
Fork : form . Fork ,
Issues : form . Issues ,
IssueComment : form . IssueComment ,
Release : form . Release ,
Push : form . Push ,
PullRequest : form . PullRequest ,
Repository : form . Repository ,
2015-12-05 21:24:13 +03:00
} ,
}
}
2016-11-24 10:04:31 +03:00
// WebHooksNewPost response for creating webhook
2016-03-11 19:56:52 +03:00
func WebHooksNewPost ( ctx * context . Context , form auth . NewWebhookForm ) {
2017-05-29 10:17:15 +03:00
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 {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2017-05-29 10:17:15 +03:00
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 {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2017-05-29 10:17:15 +03:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "CreateWebhook" , err )
2017-05-29 10:17:15 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
}
// GogsHooksNewPost response for creating webhook
2017-10-08 14:37:31 +03:00
func GogsHooksNewPost ( ctx * context . Context , form auth . NewGogshookForm ) {
2015-12-05 21:24:13 +03:00
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" ] = "gogs"
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2015-12-05 21:24:13 +03:00
return
}
ctx . Data [ "BaseLink" ] = orCtx . Link
if ctx . HasError ( ) {
ctx . HTML ( 200 , orCtx . NewTemplate )
return
}
2016-11-07 23:58:22 +03:00
contentType := models . ContentTypeJSON
2016-11-07 19:53:22 +03:00
if models . HookContentType ( form . ContentType ) == models . ContentTypeForm {
contentType = models . ContentTypeForm
2015-12-05 21:24:13 +03:00
}
w := & models . Webhook {
RepoID : orCtx . RepoID ,
URL : form . PayloadURL ,
ContentType : contentType ,
Secret : form . Secret ,
HookEvent : ParseHookEvent ( form . WebhookForm ) ,
IsActive : form . Active ,
2018-06-21 08:22:03 +03:00
HookTaskType : models . GOGS ,
2015-12-05 21:24:13 +03:00
OrgID : orCtx . OrgID ,
}
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2015-12-05 21:24:13 +03:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "CreateWebhook" , err )
2015-12-05 21:24:13 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
}
2017-08-28 08:06:45 +03:00
// DiscordHooksNewPost response for creating discord hook
func DiscordHooksNewPost ( ctx * context . Context , form auth . NewDiscordHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2017-08-28 08:06:45 +03:00
return
}
if ctx . HasError ( ) {
ctx . HTML ( 200 , orCtx . NewTemplate )
return
}
meta , err := json . Marshal ( & models . DiscordMeta {
Username : form . Username ,
IconURL : form . IconURL ,
} )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "Marshal" , err )
2017-08-28 08:06:45 +03:00
return
}
w := & models . Webhook {
RepoID : orCtx . RepoID ,
URL : form . PayloadURL ,
ContentType : models . ContentTypeJSON ,
HookEvent : ParseHookEvent ( form . WebhookForm ) ,
IsActive : form . Active ,
HookTaskType : models . DISCORD ,
Meta : string ( meta ) ,
OrgID : orCtx . OrgID ,
}
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2017-08-28 08:06:45 +03:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "CreateWebhook" , err )
2017-08-28 08:06:45 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
}
2017-11-21 07:26:43 +03:00
// DingtalkHooksNewPost response for creating dingtalk hook
func DingtalkHooksNewPost ( ctx * context . Context , form auth . NewDingtalkHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2017-11-21 07:26:43 +03:00
return
}
if ctx . HasError ( ) {
ctx . HTML ( 200 , orCtx . NewTemplate )
return
}
w := & models . Webhook {
RepoID : orCtx . RepoID ,
URL : form . PayloadURL ,
ContentType : models . ContentTypeJSON ,
HookEvent : ParseHookEvent ( form . WebhookForm ) ,
IsActive : form . Active ,
HookTaskType : models . DINGTALK ,
Meta : "" ,
OrgID : orCtx . OrgID ,
}
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2017-11-21 07:26:43 +03:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "CreateWebhook" , err )
2017-11-21 07:26:43 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
}
2016-11-24 10:04:31 +03:00
// SlackHooksNewPost response for creating slack hook
2016-03-11 19:56:52 +03:00
func SlackHooksNewPost ( ctx * context . Context , form auth . NewSlackHookForm ) {
2015-12-05 21:24:13 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2015-12-05 21:24:13 +03:00
return
}
if ctx . HasError ( ) {
ctx . HTML ( 200 , orCtx . NewTemplate )
return
}
2018-09-10 17:31:08 +03:00
if form . HasInvalidChannel ( ) {
ctx . Flash . Error ( ctx . Tr ( "repo.settings.add_webhook.invalid_channel_name" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks/slack/new" )
return
}
2015-12-05 21:24:13 +03:00
meta , err := json . Marshal ( & models . SlackMeta {
2018-09-10 17:31:08 +03:00
Channel : strings . TrimSpace ( form . Channel ) ,
2015-12-05 21:24:13 +03:00
Username : form . Username ,
IconURL : form . IconURL ,
Color : form . Color ,
} )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "Marshal" , err )
2015-12-05 21:24:13 +03:00
return
}
w := & models . Webhook {
RepoID : orCtx . RepoID ,
URL : form . PayloadURL ,
2016-11-07 23:58:22 +03:00
ContentType : models . ContentTypeJSON ,
2015-12-05 21:24:13 +03:00
HookEvent : ParseHookEvent ( form . WebhookForm ) ,
IsActive : form . Active ,
HookTaskType : models . SLACK ,
Meta : string ( meta ) ,
OrgID : orCtx . OrgID ,
}
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2015-12-05 21:24:13 +03:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "CreateWebhook" , err )
2015-12-05 21:24:13 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
}
2016-11-24 10:04:31 +03:00
func checkWebhook ( ctx * context . Context ) ( * orgRepoCtx , * models . Webhook ) {
2015-12-05 21:24:13 +03:00
ctx . Data [ "RequireHighlightJS" ] = true
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "getOrgRepoCtx" , err )
2015-12-05 21:24:13 +03:00
return nil , nil
}
ctx . Data [ "BaseLink" ] = orCtx . Link
2016-07-15 20:02:55 +03:00
var w * models . Webhook
if orCtx . RepoID > 0 {
w , err = models . GetWebhookByRepoID ( ctx . Repo . Repository . ID , ctx . ParamsInt64 ( ":id" ) )
} else {
2016-07-23 20:08:22 +03:00
w , err = models . GetWebhookByOrgID ( ctx . Org . Organization . ID , ctx . ParamsInt64 ( ":id" ) )
2016-07-15 20:02:55 +03:00
}
2015-12-05 21:24:13 +03:00
if err != nil {
if models . IsErrWebhookNotExist ( err ) {
2018-01-11 00:34:17 +03:00
ctx . NotFound ( "GetWebhookByID" , nil )
2015-12-05 21:24:13 +03:00
} else {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GetWebhookByID" , err )
2015-12-05 21:24:13 +03:00
}
return nil , nil
}
2017-11-21 07:26:43 +03:00
ctx . Data [ "HookType" ] = w . HookTaskType . Name ( )
2015-12-05 21:24:13 +03:00
switch w . HookTaskType {
case models . SLACK :
ctx . Data [ "SlackHook" ] = w . GetSlackHook ( )
2017-08-28 08:06:45 +03:00
case models . DISCORD :
ctx . Data [ "DiscordHook" ] = w . GetDiscordHook ( )
2015-12-05 21:24:13 +03:00
}
ctx . Data [ "History" ] , err = w . History ( 1 )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "History" , err )
2015-12-05 21:24:13 +03:00
}
return orCtx , w
}
2016-11-24 10:04:31 +03:00
// WebHooksEdit render editing web hook page
2016-03-11 19:56:52 +03:00
func WebHooksEdit ( ctx * context . Context ) {
2015-12-05 21:24:13 +03:00
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
ctx . HTML ( 200 , orCtx . NewTemplate )
}
2016-11-24 10:04:31 +03:00
// WebHooksEditPost response for editing web hook
2016-03-11 19:56:52 +03:00
func WebHooksEditPost ( ctx * context . Context , form auth . NewWebhookForm ) {
2015-12-05 21:24:13 +03:00
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
}
2016-11-07 23:58:22 +03:00
contentType := models . ContentTypeJSON
2016-11-07 19:53:22 +03:00
if models . HookContentType ( form . ContentType ) == models . ContentTypeForm {
contentType = models . ContentTypeForm
2015-12-05 21:24:13 +03:00
}
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 {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2015-12-05 21:24:13 +03:00
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "WebHooksEditPost" , err )
2015-12-05 21:24:13 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2017-05-29 10:17:15 +03:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
}
// GogsHooksEditPost response for editing gogs hook
2017-10-08 14:37:31 +03:00
func GogsHooksEditPost ( ctx * context . Context , form auth . NewGogshookForm ) {
2017-05-29 10:17:15 +03:00
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 {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2017-05-29 10:17:15 +03:00
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GogsHooksEditPost" , err )
2017-05-29 10:17:15 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2015-12-05 21:24:13 +03:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
}
2016-11-27 14:59:12 +03:00
// SlackHooksEditPost response for editing slack hook
2016-03-11 19:56:52 +03:00
func SlackHooksEditPost ( ctx * context . Context , form auth . NewSlackHookForm ) {
2015-12-05 21:24:13 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
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
}
2018-09-10 17:31:08 +03:00
if form . HasInvalidChannel ( ) {
ctx . Flash . Error ( ctx . Tr ( "repo.settings.add_webhook.invalid_channel_name" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
return
}
2015-12-05 21:24:13 +03:00
meta , err := json . Marshal ( & models . SlackMeta {
2018-09-10 17:31:08 +03:00
Channel : strings . TrimSpace ( form . Channel ) ,
2015-12-05 21:24:13 +03:00
Username : form . Username ,
IconURL : form . IconURL ,
Color : form . Color ,
} )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "Marshal" , err )
2015-12-05 21:24:13 +03:00
return
}
w . URL = form . PayloadURL
w . Meta = string ( meta )
w . HookEvent = ParseHookEvent ( form . WebhookForm )
w . IsActive = form . Active
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2015-12-05 21:24:13 +03:00
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateWebhook" , err )
2017-08-28 08:06:45 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
}
// DiscordHooksEditPost response for editing discord hook
func DiscordHooksEditPost ( ctx * context . Context , form auth . NewDiscordHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
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
}
meta , err := json . Marshal ( & models . DiscordMeta {
Username : form . Username ,
IconURL : form . IconURL ,
} )
if err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "Marshal" , err )
2017-08-28 08:06:45 +03:00
return
}
w . URL = form . PayloadURL
w . Meta = string ( meta )
w . HookEvent = ParseHookEvent ( form . WebhookForm )
w . IsActive = form . Active
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2017-08-28 08:06:45 +03:00
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateWebhook" , err )
2015-12-05 21:24:13 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
}
2017-11-21 07:26:43 +03:00
// DingtalkHooksEditPost response for editing discord hook
func DingtalkHooksEditPost ( ctx * context . Context , form auth . NewDingtalkHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
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
}
w . URL = form . PayloadURL
w . HookEvent = ParseHookEvent ( form . WebhookForm )
w . IsActive = form . Active
if err := w . UpdateEvent ( ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateEvent" , err )
2017-11-21 07:26:43 +03:00
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "UpdateWebhook" , err )
2017-11-21 07:26:43 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
}
2016-11-24 10:04:31 +03:00
// TestWebhook test if web hook is work fine
2016-03-11 19:56:52 +03:00
func TestWebhook ( ctx * context . Context ) {
2017-08-29 17:55:24 +03:00
hookID := ctx . ParamsInt64 ( ":id" )
w , err := models . GetWebhookByRepoID ( ctx . Repo . Repository . ID , hookID )
if err != nil {
ctx . Flash . Error ( "GetWebhookByID: " + err . Error ( ) )
ctx . Status ( 500 )
return
}
2016-08-15 15:53:47 +03:00
// Grab latest commit or fake one if it's empty repository.
commit := ctx . Repo . Commit
if commit == nil {
ghost := models . NewGhostUser ( )
commit = & git . Commit {
2016-12-22 12:30:52 +03:00
ID : git . MustIDFromString ( git . EmptySHA ) ,
2016-08-15 15:53:47 +03:00
Author : ghost . NewGitSig ( ) ,
Committer : ghost . NewGitSig ( ) ,
CommitMessage : "This is a fake commit" ,
}
}
2016-08-14 14:17:26 +03:00
apiUser := ctx . User . APIFormat ( )
2015-12-05 21:24:13 +03:00
p := & api . PushPayload {
2016-12-22 12:30:52 +03:00
Ref : git . BranchPrefix + ctx . Repo . Repository . DefaultBranch ,
2016-08-15 15:53:47 +03:00
Before : commit . ID . String ( ) ,
After : commit . ID . String ( ) ,
2015-12-05 21:24:13 +03:00
Commits : [ ] * api . PayloadCommit {
{
2016-08-15 15:53:47 +03:00
ID : commit . ID . String ( ) ,
Message : commit . Message ( ) ,
2016-08-16 20:19:09 +03:00
URL : ctx . Repo . Repository . HTMLURL ( ) + "/commit/" + commit . ID . String ( ) ,
2016-08-14 14:17:26 +03:00
Author : & api . PayloadUser {
2016-08-15 15:53:47 +03:00
Name : commit . Author . Name ,
Email : commit . Author . Email ,
2016-08-10 08:01:57 +03:00
} ,
2016-08-14 14:17:26 +03:00
Committer : & api . PayloadUser {
2016-08-15 15:53:47 +03:00
Name : commit . Committer . Name ,
Email : commit . Committer . Email ,
2015-12-05 21:24:13 +03:00
} ,
} ,
} ,
2016-12-06 02:48:51 +03:00
Repo : ctx . Repo . Repository . APIFormat ( models . AccessModeNone ) ,
2016-08-14 14:17:26 +03:00
Pusher : apiUser ,
Sender : apiUser ,
2015-12-05 21:24:13 +03:00
}
2017-08-29 17:55:24 +03:00
if err := models . PrepareWebhook ( w , ctx . Repo . Repository , models . HookEventPush , p ) ; err != nil {
ctx . Flash . Error ( "PrepareWebhook: " + err . Error ( ) )
2015-12-05 21:24:13 +03:00
ctx . Status ( 500 )
} else {
go models . HookQueue . Add ( ctx . Repo . Repository . ID )
ctx . Flash . Info ( ctx . Tr ( "repo.settings.webhook.test_delivery_success" ) )
ctx . Status ( 200 )
}
}
2016-11-24 10:04:31 +03:00
// DeleteWebhook delete a webhook
2016-03-11 19:56:52 +03:00
func DeleteWebhook ( ctx * context . Context ) {
2016-07-17 03:33:59 +03:00
if err := models . DeleteWebhookByRepoID ( ctx . Repo . Repository . ID , ctx . QueryInt64 ( "id" ) ) ; err != nil {
ctx . Flash . Error ( "DeleteWebhookByRepoID: " + err . Error ( ) )
2015-12-05 21:24:13 +03:00
} else {
ctx . Flash . Success ( ctx . Tr ( "repo.settings.webhook_deletion_success" ) )
}
ctx . JSON ( 200 , map [ string ] interface { } {
"redirect" : ctx . Repo . RepoLink + "/settings/hooks" ,
} )
}