mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix broken migration on webhook (#13911)
* Fix broken migration on webhook * Fix lint Co-authored-by: John Olheiser <john.olheiser@gmail.com>
This commit is contained in:
		@@ -267,6 +267,8 @@ var migrations = []Migration{
 | 
			
		||||
	NewMigration("Add block on official review requests branch protection", addBlockOnOfficialReviewRequests),
 | 
			
		||||
	// v161 -> v162
 | 
			
		||||
	NewMigration("Convert task type from int to string", convertTaskTypeToString),
 | 
			
		||||
	// v162 -> v163
 | 
			
		||||
	NewMigration("Convert webhook task type from int to string", convertWebhookTaskTypeToString),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetCurrentDBVersion returns the current db version
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										59
									
								
								models/migrations/v162.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								models/migrations/v162.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
// Copyright 2020 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.
 | 
			
		||||
 | 
			
		||||
package migrations
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"xorm.io/xorm"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func convertWebhookTaskTypeToString(x *xorm.Engine) error {
 | 
			
		||||
	const (
 | 
			
		||||
		GOGS int = iota + 1
 | 
			
		||||
		SLACK
 | 
			
		||||
		GITEA
 | 
			
		||||
		DISCORD
 | 
			
		||||
		DINGTALK
 | 
			
		||||
		TELEGRAM
 | 
			
		||||
		MSTEAMS
 | 
			
		||||
		FEISHU
 | 
			
		||||
		MATRIX
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var hookTaskTypes = map[int]string{
 | 
			
		||||
		GITEA:    "gitea",
 | 
			
		||||
		GOGS:     "gogs",
 | 
			
		||||
		SLACK:    "slack",
 | 
			
		||||
		DISCORD:  "discord",
 | 
			
		||||
		DINGTALK: "dingtalk",
 | 
			
		||||
		TELEGRAM: "telegram",
 | 
			
		||||
		MSTEAMS:  "msteams",
 | 
			
		||||
		FEISHU:   "feishu",
 | 
			
		||||
		MATRIX:   "matrix",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	type Webhook struct {
 | 
			
		||||
		Type string `xorm:"char(16) index"`
 | 
			
		||||
	}
 | 
			
		||||
	if err := x.Sync2(new(Webhook)); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, s := range hookTaskTypes {
 | 
			
		||||
		if _, err := x.Exec("UPDATE webhook set type = ? where hook_task_type=?", s, i); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err := sess.Begin(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	if err := dropTableColumns(sess, "webhook", "hook_task_type"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
@@ -117,17 +117,17 @@ func GenerateWebhooks(ctx DBContext, templateRepo, generateRepo *Repository) err
 | 
			
		||||
 | 
			
		||||
	for _, templateWebhook := range templateWebhooks {
 | 
			
		||||
		generateWebhook := &Webhook{
 | 
			
		||||
			RepoID:       generateRepo.ID,
 | 
			
		||||
			URL:          templateWebhook.URL,
 | 
			
		||||
			HTTPMethod:   templateWebhook.HTTPMethod,
 | 
			
		||||
			ContentType:  templateWebhook.ContentType,
 | 
			
		||||
			Secret:       templateWebhook.Secret,
 | 
			
		||||
			HookEvent:    templateWebhook.HookEvent,
 | 
			
		||||
			IsActive:     templateWebhook.IsActive,
 | 
			
		||||
			HookTaskType: templateWebhook.HookTaskType,
 | 
			
		||||
			OrgID:        templateWebhook.OrgID,
 | 
			
		||||
			Events:       templateWebhook.Events,
 | 
			
		||||
			Meta:         templateWebhook.Meta,
 | 
			
		||||
			RepoID:      generateRepo.ID,
 | 
			
		||||
			URL:         templateWebhook.URL,
 | 
			
		||||
			HTTPMethod:  templateWebhook.HTTPMethod,
 | 
			
		||||
			ContentType: templateWebhook.ContentType,
 | 
			
		||||
			Secret:      templateWebhook.Secret,
 | 
			
		||||
			HookEvent:   templateWebhook.HookEvent,
 | 
			
		||||
			IsActive:    templateWebhook.IsActive,
 | 
			
		||||
			Type:        templateWebhook.Type,
 | 
			
		||||
			OrgID:       templateWebhook.OrgID,
 | 
			
		||||
			Events:      templateWebhook.Events,
 | 
			
		||||
			Meta:        templateWebhook.Meta,
 | 
			
		||||
		}
 | 
			
		||||
		if err := createWebhook(ctx.e, generateWebhook); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
 
 | 
			
		||||
@@ -110,11 +110,11 @@ type Webhook struct {
 | 
			
		||||
	Secret          string `xorm:"TEXT"`
 | 
			
		||||
	Events          string `xorm:"TEXT"`
 | 
			
		||||
	*HookEvent      `xorm:"-"`
 | 
			
		||||
	IsSSL           bool `xorm:"is_ssl"`
 | 
			
		||||
	IsActive        bool `xorm:"INDEX"`
 | 
			
		||||
	HookTaskType    HookTaskType
 | 
			
		||||
	Meta            string     `xorm:"TEXT"` // store hook-specific attributes
 | 
			
		||||
	LastStatus      HookStatus // Last delivery status
 | 
			
		||||
	IsSSL           bool         `xorm:"is_ssl"`
 | 
			
		||||
	IsActive        bool         `xorm:"INDEX"`
 | 
			
		||||
	Type            HookTaskType `xorm:"char(16) 'type'"`
 | 
			
		||||
	Meta            string       `xorm:"TEXT"` // store hook-specific attributes
 | 
			
		||||
	LastStatus      HookStatus   // Last delivery status
 | 
			
		||||
 | 
			
		||||
	CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
 | 
			
		||||
	UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"`
 | 
			
		||||
 
 | 
			
		||||
@@ -227,7 +227,7 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook {
 | 
			
		||||
		"url":          w.URL,
 | 
			
		||||
		"content_type": w.ContentType.Name(),
 | 
			
		||||
	}
 | 
			
		||||
	if w.HookTaskType == models.SLACK {
 | 
			
		||||
	if w.Type == models.SLACK {
 | 
			
		||||
		s := webhook.GetSlackHook(w)
 | 
			
		||||
		config["channel"] = s.Channel
 | 
			
		||||
		config["username"] = s.Username
 | 
			
		||||
@@ -237,7 +237,7 @@ func ToHook(repoLink string, w *models.Webhook) *api.Hook {
 | 
			
		||||
 | 
			
		||||
	return &api.Hook{
 | 
			
		||||
		ID:      w.ID,
 | 
			
		||||
		Type:    string(w.HookTaskType),
 | 
			
		||||
		Type:    string(w.Type),
 | 
			
		||||
		URL:     fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID),
 | 
			
		||||
		Active:  w.IsActive,
 | 
			
		||||
		Config:  config,
 | 
			
		||||
 
 | 
			
		||||
@@ -132,10 +132,10 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID
 | 
			
		||||
			},
 | 
			
		||||
			BranchFilter: form.BranchFilter,
 | 
			
		||||
		},
 | 
			
		||||
		IsActive:     form.Active,
 | 
			
		||||
		HookTaskType: models.HookTaskType(form.Type),
 | 
			
		||||
		IsActive: form.Active,
 | 
			
		||||
		Type:     models.HookTaskType(form.Type),
 | 
			
		||||
	}
 | 
			
		||||
	if w.HookTaskType == models.SLACK {
 | 
			
		||||
	if w.Type == models.SLACK {
 | 
			
		||||
		channel, ok := form.Config["channel"]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			ctx.Error(http.StatusUnprocessableEntity, "", "Missing config option: channel")
 | 
			
		||||
@@ -219,7 +219,7 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *models.Webho
 | 
			
		||||
			w.ContentType = models.ToHookContentType(ct)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if w.HookTaskType == models.SLACK {
 | 
			
		||||
		if w.Type == models.SLACK {
 | 
			
		||||
			if channel, ok := form.Config["channel"]; ok {
 | 
			
		||||
				meta, err := json.Marshal(&webhook.SlackMeta{
 | 
			
		||||
					Channel:  channel,
 | 
			
		||||
 
 | 
			
		||||
@@ -208,7 +208,7 @@ func GiteaHooksNewPost(ctx *context.Context, form auth.NewWebhookForm) {
 | 
			
		||||
		Secret:          form.Secret,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.GITEA,
 | 
			
		||||
		Type:            models.GITEA,
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
	}
 | 
			
		||||
@@ -261,7 +261,7 @@ func newGogsWebhookPost(ctx *context.Context, form auth.NewGogshookForm, kind mo
 | 
			
		||||
		Secret:          form.Secret,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    kind,
 | 
			
		||||
		Type:            kind,
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
	}
 | 
			
		||||
@@ -311,7 +311,7 @@ func DiscordHooksNewPost(ctx *context.Context, form auth.NewDiscordHookForm) {
 | 
			
		||||
		ContentType:     models.ContentTypeJSON,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.DISCORD,
 | 
			
		||||
		Type:            models.DISCORD,
 | 
			
		||||
		Meta:            string(meta),
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -353,7 +353,7 @@ func DingtalkHooksNewPost(ctx *context.Context, form auth.NewDingtalkHookForm) {
 | 
			
		||||
		ContentType:     models.ContentTypeJSON,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.DINGTALK,
 | 
			
		||||
		Type:            models.DINGTALK,
 | 
			
		||||
		Meta:            "",
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -404,7 +404,7 @@ func TelegramHooksNewPost(ctx *context.Context, form auth.NewTelegramHookForm) {
 | 
			
		||||
		ContentType:     models.ContentTypeJSON,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.TELEGRAM,
 | 
			
		||||
		Type:            models.TELEGRAM,
 | 
			
		||||
		Meta:            string(meta),
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -458,7 +458,7 @@ func MatrixHooksNewPost(ctx *context.Context, form auth.NewMatrixHookForm) {
 | 
			
		||||
		HTTPMethod:      "PUT",
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.MATRIX,
 | 
			
		||||
		Type:            models.MATRIX,
 | 
			
		||||
		Meta:            string(meta),
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -500,7 +500,7 @@ func MSTeamsHooksNewPost(ctx *context.Context, form auth.NewMSTeamsHookForm) {
 | 
			
		||||
		ContentType:     models.ContentTypeJSON,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.MSTEAMS,
 | 
			
		||||
		Type:            models.MSTEAMS,
 | 
			
		||||
		Meta:            "",
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -559,7 +559,7 @@ func SlackHooksNewPost(ctx *context.Context, form auth.NewSlackHookForm) {
 | 
			
		||||
		ContentType:     models.ContentTypeJSON,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.SLACK,
 | 
			
		||||
		Type:            models.SLACK,
 | 
			
		||||
		Meta:            string(meta),
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -601,7 +601,7 @@ func FeishuHooksNewPost(ctx *context.Context, form auth.NewFeishuHookForm) {
 | 
			
		||||
		ContentType:     models.ContentTypeJSON,
 | 
			
		||||
		HookEvent:       ParseHookEvent(form.WebhookForm),
 | 
			
		||||
		IsActive:        form.Active,
 | 
			
		||||
		HookTaskType:    models.FEISHU,
 | 
			
		||||
		Type:            models.FEISHU,
 | 
			
		||||
		Meta:            "",
 | 
			
		||||
		OrgID:           orCtx.OrgID,
 | 
			
		||||
		IsSystemWebhook: orCtx.IsSystemWebhook,
 | 
			
		||||
@@ -647,8 +647,8 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *models.Webhook) {
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Data["HookType"] = w.HookTaskType
 | 
			
		||||
	switch w.HookTaskType {
 | 
			
		||||
	ctx.Data["HookType"] = w.Type
 | 
			
		||||
	switch w.Type {
 | 
			
		||||
	case models.SLACK:
 | 
			
		||||
		ctx.Data["SlackHook"] = webhook.GetSlackHook(w)
 | 
			
		||||
	case models.DISCORD:
 | 
			
		||||
 
 | 
			
		||||
@@ -128,7 +128,7 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
 | 
			
		||||
	// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.).
 | 
			
		||||
	// Integration webhooks (e.g. drone) still receive the required data.
 | 
			
		||||
	if pushEvent, ok := p.(*api.PushPayload); ok &&
 | 
			
		||||
		w.HookTaskType != models.GITEA && w.HookTaskType != models.GOGS &&
 | 
			
		||||
		w.Type != models.GITEA && w.Type != models.GOGS &&
 | 
			
		||||
		len(pushEvent.Commits) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
@@ -144,11 +144,11 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
 | 
			
		||||
 | 
			
		||||
	var payloader api.Payloader
 | 
			
		||||
	var err error
 | 
			
		||||
	webhook, ok := webhooks[w.HookTaskType]
 | 
			
		||||
	webhook, ok := webhooks[w.Type]
 | 
			
		||||
	if ok {
 | 
			
		||||
		payloader, err = webhook.payloadCreator(p, event, w.Meta)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("create payload for %s[%s]: %v", w.HookTaskType, event, err)
 | 
			
		||||
			return fmt.Errorf("create payload for %s[%s]: %v", w.Type, event, err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		p.SetSecret(w.Secret)
 | 
			
		||||
@@ -172,7 +172,7 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
 | 
			
		||||
	if err = models.CreateHookTask(&models.HookTask{
 | 
			
		||||
		RepoID:      repo.ID,
 | 
			
		||||
		HookID:      w.ID,
 | 
			
		||||
		Typ:         w.HookTaskType,
 | 
			
		||||
		Typ:         w.Type,
 | 
			
		||||
		URL:         w.URL,
 | 
			
		||||
		Signature:   signature,
 | 
			
		||||
		Payloader:   payloader,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user