mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-04 05:18:25 +00:00 
			
		
		
		
	@@ -5,7 +5,7 @@ Gogs - Go Git Service [
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##### Current version: 0.7.31 Beta
 | 
					##### Current version: 0.7.32 Beta
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<table>
 | 
					<table>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -397,6 +397,7 @@ func runWeb(ctx *cli.Context) {
 | 
				
			|||||||
				m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
 | 
									m.Post("/gogs/new", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksNewPost)
 | 
				
			||||||
				m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
									m.Post("/slack/new", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksNewPost)
 | 
				
			||||||
				m.Get("/:id", repo.WebHooksEdit)
 | 
									m.Get("/:id", repo.WebHooksEdit)
 | 
				
			||||||
 | 
									m.Post("/:id/test", repo.TestWebhook)
 | 
				
			||||||
				m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
 | 
									m.Post("/gogs/:id", bindIgnErr(auth.NewWebhookForm{}), repo.WebHooksEditPost)
 | 
				
			||||||
				m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
									m.Post("/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -597,6 +597,9 @@ settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whe
 | 
				
			|||||||
settings.webhook_deletion = Delete Webhook
 | 
					settings.webhook_deletion = Delete Webhook
 | 
				
			||||||
settings.webhook_deletion_desc = Delete this webhook will remove its information and all delivery history. Do you want to continue?
 | 
					settings.webhook_deletion_desc = Delete this webhook will remove its information and all delivery history. Do you want to continue?
 | 
				
			||||||
settings.webhook_deletion_success = Webhook has been deleted successfully!
 | 
					settings.webhook_deletion_success = Webhook has been deleted successfully!
 | 
				
			||||||
 | 
					settings.webhook.test_delivery = Test Delivery
 | 
				
			||||||
 | 
					settings.webhook.test_delivery_desc = Send a fake push event delivery to test your webhook settings
 | 
				
			||||||
 | 
					settings.webhook.test_delivery_success = Test webhook has been added to delivery queue. It may taks few seconds before it shows up in the delivery history.
 | 
				
			||||||
settings.webhook.request = Request
 | 
					settings.webhook.request = Request
 | 
				
			||||||
settings.webhook.response = Response
 | 
					settings.webhook.response = Response
 | 
				
			||||||
settings.webhook.headers = Headers
 | 
					settings.webhook.headers = Headers
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							@@ -17,7 +17,7 @@ import (
 | 
				
			|||||||
	"github.com/gogits/gogs/modules/setting"
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const APP_VER = "0.7.31.1205 Beta"
 | 
					const APP_VER = "0.7.32.1205 Beta"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	runtime.GOMAXPROCS(runtime.NumCPU())
 | 
						runtime.GOMAXPROCS(runtime.NumCPU())
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -451,24 +451,9 @@ func CommitRepoAction(
 | 
				
			|||||||
		IsPrivate:    repo.IsPrivate,
 | 
							IsPrivate:    repo.IsPrivate,
 | 
				
			||||||
	}); err != nil {
 | 
						}); err != nil {
 | 
				
			||||||
		return fmt.Errorf("NotifyWatchers: %v", err)
 | 
							return fmt.Errorf("NotifyWatchers: %v", err)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	repoLink := fmt.Sprintf("%s%s/%s", setting.AppUrl, repoUserName, repoName)
 | 
						payloadRepo := repo.ComposePayload()
 | 
				
			||||||
	payloadRepo := &api.PayloadRepo{
 | 
					 | 
				
			||||||
		ID:          repo.ID,
 | 
					 | 
				
			||||||
		Name:        repo.LowerName,
 | 
					 | 
				
			||||||
		URL:         repoLink,
 | 
					 | 
				
			||||||
		Description: repo.Description,
 | 
					 | 
				
			||||||
		Website:     repo.Website,
 | 
					 | 
				
			||||||
		Watchers:    repo.NumWatches,
 | 
					 | 
				
			||||||
		Owner: &api.PayloadAuthor{
 | 
					 | 
				
			||||||
			Name:     repo.Owner.DisplayName(),
 | 
					 | 
				
			||||||
			Email:    repo.Owner.Email,
 | 
					 | 
				
			||||||
			UserName: repo.Owner.Name,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
		Private: repo.IsPrivate,
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pusher_email, pusher_name := "", ""
 | 
						pusher_email, pusher_name := "", ""
 | 
				
			||||||
	pusher, err := GetUserByName(userName)
 | 
						pusher, err := GetUserByName(userName)
 | 
				
			||||||
@@ -494,7 +479,7 @@ func CommitRepoAction(
 | 
				
			|||||||
			commits[i] = &api.PayloadCommit{
 | 
								commits[i] = &api.PayloadCommit{
 | 
				
			||||||
				ID:      cmt.Sha1,
 | 
									ID:      cmt.Sha1,
 | 
				
			||||||
				Message: cmt.Message,
 | 
									Message: cmt.Message,
 | 
				
			||||||
				URL:     fmt.Sprintf("%s/commit/%s", repoLink, cmt.Sha1),
 | 
									URL:     fmt.Sprintf("%s/commit/%s", repo.RepoLink(), cmt.Sha1),
 | 
				
			||||||
				Author: &api.PayloadAuthor{
 | 
									Author: &api.PayloadAuthor{
 | 
				
			||||||
					Name:     cmt.AuthorName,
 | 
										Name:     cmt.AuthorName,
 | 
				
			||||||
					Email:    cmt.AuthorEmail,
 | 
										Email:    cmt.AuthorEmail,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,6 +28,7 @@ import (
 | 
				
			|||||||
	"gopkg.in/ini.v1"
 | 
						"gopkg.in/ini.v1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/git-shell"
 | 
						"github.com/gogits/git-shell"
 | 
				
			||||||
 | 
						api "github.com/gogits/go-gogs-client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/bindata"
 | 
						"github.com/gogits/gogs/modules/bindata"
 | 
				
			||||||
@@ -380,6 +381,27 @@ func (repo *Repository) SavePatch(index int64, patch []byte) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ComposePayload composes and returns *api.PayloadRepo corresponding to the repository.
 | 
				
			||||||
 | 
					func (repo *Repository) ComposePayload() *api.PayloadRepo {
 | 
				
			||||||
 | 
						cl := repo.CloneLink()
 | 
				
			||||||
 | 
						return &api.PayloadRepo{
 | 
				
			||||||
 | 
							ID:          repo.ID,
 | 
				
			||||||
 | 
							Name:        repo.LowerName,
 | 
				
			||||||
 | 
							URL:         repo.RepoLink(),
 | 
				
			||||||
 | 
							SSHURL:      cl.SSH,
 | 
				
			||||||
 | 
							CloneURL:    cl.HTTPS,
 | 
				
			||||||
 | 
							Description: repo.Description,
 | 
				
			||||||
 | 
							Website:     repo.Website,
 | 
				
			||||||
 | 
							Watchers:    repo.NumWatches,
 | 
				
			||||||
 | 
							Owner: &api.PayloadAuthor{
 | 
				
			||||||
 | 
								Name:     repo.MustOwner().DisplayName(),
 | 
				
			||||||
 | 
								Email:    repo.MustOwner().Email,
 | 
				
			||||||
 | 
								UserName: repo.MustOwner().Name,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Private: repo.IsPrivate,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) {
 | 
					func isRepositoryExist(e Engine, u *User, repoName string) (bool, error) {
 | 
				
			||||||
	has, err := e.Get(&Repository{
 | 
						has, err := e.Get(&Repository{
 | 
				
			||||||
		OwnerID:   u.Id,
 | 
							OwnerID:   u.Id,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -335,7 +335,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		t.ResponseInfo = &HookResponse{}
 | 
							t.ResponseInfo = &HookResponse{}
 | 
				
			||||||
		if err = json.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
 | 
							if err = json.Unmarshal([]byte(t.ResponseContent), t.ResponseInfo); err != nil {
 | 
				
			||||||
			log.Error(3, "Unmarshal[%d]: %v", t.ID, err)
 | 
								log.Error(3, "Unmarshal [%d]: %v", t.ID, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -343,7 +343,7 @@ func (t *HookTask) AfterSet(colName string, _ xorm.Cell) {
 | 
				
			|||||||
func (t *HookTask) MarshalJSON(v interface{}) string {
 | 
					func (t *HookTask) MarshalJSON(v interface{}) string {
 | 
				
			||||||
	p, err := json.Marshal(v)
 | 
						p, err := json.Marshal(v)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Error(3, "Marshal[%d]: %v", t.ID, err)
 | 
							log.Error(3, "Marshal [%d]: %v", t.ID, err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return string(p)
 | 
						return string(p)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -590,24 +590,24 @@ func DeliverHooks() {
 | 
				
			|||||||
	// Update hook task status.
 | 
						// Update hook task status.
 | 
				
			||||||
	for _, t := range tasks {
 | 
						for _, t := range tasks {
 | 
				
			||||||
		if err := UpdateHookTask(t); err != nil {
 | 
							if err := UpdateHookTask(t); err != nil {
 | 
				
			||||||
			log.Error(4, "UpdateHookTask(%d): %v", t.ID, err)
 | 
								log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Start listening on new hook requests.
 | 
						// Start listening on new hook requests.
 | 
				
			||||||
	for repoID := range HookQueue.Queue() {
 | 
						for repoID := range HookQueue.Queue() {
 | 
				
			||||||
		log.Trace("DeliverHooks[%v]: processing delivery hooks", repoID)
 | 
							log.Trace("DeliverHooks [%v]: processing delivery hooks", repoID)
 | 
				
			||||||
		HookQueue.Remove(repoID)
 | 
							HookQueue.Remove(repoID)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		tasks = make([]*HookTask, 0, 5)
 | 
							tasks = make([]*HookTask, 0, 5)
 | 
				
			||||||
		if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil {
 | 
							if err := x.Where("repo_id=? AND is_delivered=?", repoID, false).Find(&tasks); err != nil {
 | 
				
			||||||
			log.Error(4, "Get repository(%d) hook tasks: %v", repoID, err)
 | 
								log.Error(4, "Get repository [%d] hook tasks: %v", repoID, err)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for _, t := range tasks {
 | 
							for _, t := range tasks {
 | 
				
			||||||
			t.deliver()
 | 
								t.deliver()
 | 
				
			||||||
			if err := UpdateHookTask(t); err != nil {
 | 
								if err := UpdateHookTask(t); err != nil {
 | 
				
			||||||
				log.Error(4, "UpdateHookTask[%d]: %v", t.ID, err)
 | 
									log.Error(4, "UpdateHookTask [%d]: %v", t.ID, err)
 | 
				
			||||||
				continue
 | 
									continue
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -548,6 +548,19 @@ function initWebhook() {
 | 
				
			|||||||
            $('.events.fields').hide();
 | 
					            $('.events.fields').hide();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Test delivery
 | 
				
			||||||
 | 
					    $('#test-delivery').click(function () {
 | 
				
			||||||
 | 
					        var $this = $(this);
 | 
				
			||||||
 | 
					        $this.addClass('loading disabled');
 | 
				
			||||||
 | 
					        $.post($this.data('link'), {
 | 
				
			||||||
 | 
					            "_csrf": csrf
 | 
				
			||||||
 | 
					        }).done(
 | 
				
			||||||
 | 
					            setTimeout(function () {
 | 
				
			||||||
 | 
					                window.location.href = $this.data('redirect');
 | 
				
			||||||
 | 
					            }, 5000)
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,14 +5,9 @@
 | 
				
			|||||||
package repo
 | 
					package repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"encoding/json"
 | 
					 | 
				
			||||||
	"errors"
 | 
					 | 
				
			||||||
	"fmt"
 | 
					 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/Unknwon/com"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/gogits/gogs/models"
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/auth"
 | 
						"github.com/gogits/gogs/modules/auth"
 | 
				
			||||||
	"github.com/gogits/gogs/modules/base"
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
@@ -26,9 +21,6 @@ import (
 | 
				
			|||||||
const (
 | 
					const (
 | 
				
			||||||
	SETTINGS_OPTIONS base.TplName = "repo/settings/options"
 | 
						SETTINGS_OPTIONS base.TplName = "repo/settings/options"
 | 
				
			||||||
	COLLABORATION    base.TplName = "repo/settings/collaboration"
 | 
						COLLABORATION    base.TplName = "repo/settings/collaboration"
 | 
				
			||||||
	HOOKS            base.TplName = "repo/settings/hooks"
 | 
					 | 
				
			||||||
	HOOK_NEW         base.TplName = "repo/settings/hook_new"
 | 
					 | 
				
			||||||
	ORG_HOOK_NEW     base.TplName = "org/settings/hook_new"
 | 
					 | 
				
			||||||
	GITHOOKS         base.TplName = "repo/settings/githooks"
 | 
						GITHOOKS         base.TplName = "repo/settings/githooks"
 | 
				
			||||||
	GITHOOK_EDIT     base.TplName = "repo/settings/githook_edit"
 | 
						GITHOOK_EDIT     base.TplName = "repo/settings/githook_edit"
 | 
				
			||||||
	DEPLOY_KEYS      base.TplName = "repo/settings/deploy_keys"
 | 
						DEPLOY_KEYS      base.TplName = "repo/settings/deploy_keys"
 | 
				
			||||||
@@ -270,330 +262,6 @@ func Collaboration(ctx *middleware.Context) {
 | 
				
			|||||||
	ctx.HTML(200, COLLABORATION)
 | 
						ctx.HTML(200, COLLABORATION)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Webhooks(ctx *middleware.Context) {
 | 
					 | 
				
			||||||
	ctx.Data["Title"] = ctx.Tr("repo.settings.hooks")
 | 
					 | 
				
			||||||
	ctx.Data["PageIsSettingsHooks"] = true
 | 
					 | 
				
			||||||
	ctx.Data["BaseLink"] = ctx.Repo.RepoLink
 | 
					 | 
				
			||||||
	ctx.Data["Description"] = ctx.Tr("repo.settings.hooks_desc", "https://github.com/gogits/go-gogs-client/wiki/Repositories-Webhooks")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ws, err := models.GetWebhooksByRepoID(ctx.Repo.Repository.ID)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "GetWebhooksByRepoID", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx.Data["Webhooks"] = ws
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.HTML(200, HOOKS)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
type OrgRepoCtx struct {
 | 
					 | 
				
			||||||
	OrgID       int64
 | 
					 | 
				
			||||||
	RepoID      int64
 | 
					 | 
				
			||||||
	Link        string
 | 
					 | 
				
			||||||
	NewTemplate base.TplName
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// getOrgRepoCtx determines whether this is a repo context or organization context.
 | 
					 | 
				
			||||||
func getOrgRepoCtx(ctx *middleware.Context) (*OrgRepoCtx, error) {
 | 
					 | 
				
			||||||
	if len(ctx.Repo.RepoLink) > 0 {
 | 
					 | 
				
			||||||
		return &OrgRepoCtx{
 | 
					 | 
				
			||||||
			RepoID:      ctx.Repo.Repository.ID,
 | 
					 | 
				
			||||||
			Link:        ctx.Repo.RepoLink,
 | 
					 | 
				
			||||||
			NewTemplate: HOOK_NEW,
 | 
					 | 
				
			||||||
		}, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(ctx.Org.OrgLink) > 0 {
 | 
					 | 
				
			||||||
		return &OrgRepoCtx{
 | 
					 | 
				
			||||||
			OrgID:       ctx.Org.Organization.Id,
 | 
					 | 
				
			||||||
			Link:        ctx.Org.OrgLink,
 | 
					 | 
				
			||||||
			NewTemplate: ORG_HOOK_NEW,
 | 
					 | 
				
			||||||
		}, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return nil, errors.New("Unable to set OrgRepo context")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func checkHookType(ctx *middleware.Context) string {
 | 
					 | 
				
			||||||
	hookType := strings.ToLower(ctx.Params(":type"))
 | 
					 | 
				
			||||||
	if !com.IsSliceContainsStr(setting.Webhook.Types, hookType) {
 | 
					 | 
				
			||||||
		ctx.Handle(404, "checkHookType", nil)
 | 
					 | 
				
			||||||
		return ""
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return hookType
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func WebhooksNew(ctx *middleware.Context) {
 | 
					 | 
				
			||||||
	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 {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "getOrgRepoCtx", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Data["HookType"] = checkHookType(ctx)
 | 
					 | 
				
			||||||
	if ctx.Written() {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx.Data["BaseLink"] = orCtx.Link
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.HTML(200, orCtx.NewTemplate)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func ParseHookEvent(form auth.WebhookForm) *models.HookEvent {
 | 
					 | 
				
			||||||
	return &models.HookEvent{
 | 
					 | 
				
			||||||
		PushOnly:       form.PushOnly(),
 | 
					 | 
				
			||||||
		SendEverything: form.SendEverything(),
 | 
					 | 
				
			||||||
		ChooseEvents:   form.ChooseEvents(),
 | 
					 | 
				
			||||||
		HookEvents: models.HookEvents{
 | 
					 | 
				
			||||||
			Create: form.Create,
 | 
					 | 
				
			||||||
			Push:   form.Push,
 | 
					 | 
				
			||||||
		},
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func WebHooksNewPost(ctx *middleware.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"] = "gogs"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	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.JSON
 | 
					 | 
				
			||||||
	if models.HookContentType(form.ContentType) == models.FORM {
 | 
					 | 
				
			||||||
		contentType = models.FORM
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	w := &models.Webhook{
 | 
					 | 
				
			||||||
		RepoID:       orCtx.RepoID,
 | 
					 | 
				
			||||||
		URL:          form.PayloadURL,
 | 
					 | 
				
			||||||
		ContentType:  contentType,
 | 
					 | 
				
			||||||
		Secret:       form.Secret,
 | 
					 | 
				
			||||||
		HookEvent:    ParseHookEvent(form.WebhookForm),
 | 
					 | 
				
			||||||
		IsActive:     form.Active,
 | 
					 | 
				
			||||||
		HookTaskType: models.GOGS,
 | 
					 | 
				
			||||||
		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")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
 | 
					 | 
				
			||||||
	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 {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "getOrgRepoCtx", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if ctx.HasError() {
 | 
					 | 
				
			||||||
		ctx.HTML(200, orCtx.NewTemplate)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	meta, err := json.Marshal(&models.SlackMeta{
 | 
					 | 
				
			||||||
		Channel:  form.Channel,
 | 
					 | 
				
			||||||
		Username: form.Username,
 | 
					 | 
				
			||||||
		IconURL:  form.IconURL,
 | 
					 | 
				
			||||||
		Color:    form.Color,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "Marshal", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	w := &models.Webhook{
 | 
					 | 
				
			||||||
		RepoID:       orCtx.RepoID,
 | 
					 | 
				
			||||||
		URL:          form.PayloadURL,
 | 
					 | 
				
			||||||
		ContentType:  models.JSON,
 | 
					 | 
				
			||||||
		HookEvent:    ParseHookEvent(form.WebhookForm),
 | 
					 | 
				
			||||||
		IsActive:     form.Active,
 | 
					 | 
				
			||||||
		HookTaskType: models.SLACK,
 | 
					 | 
				
			||||||
		Meta:         string(meta),
 | 
					 | 
				
			||||||
		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")
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func checkWebhook(ctx *middleware.Context) (*OrgRepoCtx, *models.Webhook) {
 | 
					 | 
				
			||||||
	ctx.Data["RequireHighlightJS"] = true
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	orCtx, err := getOrgRepoCtx(ctx)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "getOrgRepoCtx", err)
 | 
					 | 
				
			||||||
		return nil, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx.Data["BaseLink"] = orCtx.Link
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	w, err := models.GetWebhookByID(ctx.ParamsInt64(":id"))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		if models.IsErrWebhookNotExist(err) {
 | 
					 | 
				
			||||||
			ctx.Handle(404, "GetWebhookByID", nil)
 | 
					 | 
				
			||||||
		} else {
 | 
					 | 
				
			||||||
			ctx.Handle(500, "GetWebhookByID", err)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		return nil, nil
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	switch w.HookTaskType {
 | 
					 | 
				
			||||||
	case models.SLACK:
 | 
					 | 
				
			||||||
		ctx.Data["SlackHook"] = w.GetSlackHook()
 | 
					 | 
				
			||||||
		ctx.Data["HookType"] = "slack"
 | 
					 | 
				
			||||||
	default:
 | 
					 | 
				
			||||||
		ctx.Data["HookType"] = "gogs"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Data["History"], err = w.History(1)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "History", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return orCtx, w
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func WebHooksEdit(ctx *middleware.Context) {
 | 
					 | 
				
			||||||
	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)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func WebHooksEditPost(ctx *middleware.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.JSON
 | 
					 | 
				
			||||||
	if models.HookContentType(form.ContentType) == models.FORM {
 | 
					 | 
				
			||||||
		contentType = models.FORM
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	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, "WebHooksEditPost", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
 | 
					 | 
				
			||||||
	ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
 | 
					 | 
				
			||||||
	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.SlackMeta{
 | 
					 | 
				
			||||||
		Channel:  form.Channel,
 | 
					 | 
				
			||||||
		Username: form.Username,
 | 
					 | 
				
			||||||
		IconURL:  form.IconURL,
 | 
					 | 
				
			||||||
		Color:    form.Color,
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		ctx.Handle(500, "Marshal", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	w.URL = form.PayloadURL
 | 
					 | 
				
			||||||
	w.Meta = string(meta)
 | 
					 | 
				
			||||||
	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, "UpdateWebhook", err)
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
 | 
					 | 
				
			||||||
	ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func DeleteWebhook(ctx *middleware.Context) {
 | 
					 | 
				
			||||||
	if err := models.DeleteWebhook(ctx.QueryInt64("id")); err != nil {
 | 
					 | 
				
			||||||
		ctx.Flash.Error("DeleteWebhook: " + err.Error())
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		ctx.Flash.Success(ctx.Tr("repo.settings.webhook_deletion_success"))
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.JSON(200, map[string]interface{}{
 | 
					 | 
				
			||||||
		"redirect": ctx.Repo.RepoLink + "/settings/hooks",
 | 
					 | 
				
			||||||
	})
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func parseOwnerAndRepo(ctx *middleware.Context) (*models.User, *models.Repository) {
 | 
					func parseOwnerAndRepo(ctx *middleware.Context) (*models.User, *models.Repository) {
 | 
				
			||||||
	owner, err := models.GetUserByName(ctx.Params(":username"))
 | 
						owner, err := models.GetUserByName(ctx.Params(":username"))
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										385
									
								
								routers/repo/webhook.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										385
									
								
								routers/repo/webhook.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,385 @@
 | 
				
			|||||||
 | 
					// Copyright 2015 The Gogs 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 repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/Unknwon/com"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						api "github.com/gogits/go-gogs-client"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/models"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/auth"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/base"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/middleware"
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/setting"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						HOOKS        base.TplName = "repo/settings/hooks"
 | 
				
			||||||
 | 
						HOOK_NEW     base.TplName = "repo/settings/hook_new"
 | 
				
			||||||
 | 
						ORG_HOOK_NEW base.TplName = "org/settings/hook_new"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Webhooks(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						ctx.Data["Title"] = ctx.Tr("repo.settings.hooks")
 | 
				
			||||||
 | 
						ctx.Data["PageIsSettingsHooks"] = true
 | 
				
			||||||
 | 
						ctx.Data["BaseLink"] = ctx.Repo.RepoLink
 | 
				
			||||||
 | 
						ctx.Data["Description"] = ctx.Tr("repo.settings.hooks_desc", "https://github.com/gogits/go-gogs-client/wiki/Repositories-Webhooks")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ws, err := models.GetWebhooksByRepoID(ctx.Repo.Repository.ID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "GetWebhooksByRepoID", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["Webhooks"] = ws
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.HTML(200, HOOKS)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type OrgRepoCtx struct {
 | 
				
			||||||
 | 
						OrgID       int64
 | 
				
			||||||
 | 
						RepoID      int64
 | 
				
			||||||
 | 
						Link        string
 | 
				
			||||||
 | 
						NewTemplate base.TplName
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// getOrgRepoCtx determines whether this is a repo context or organization context.
 | 
				
			||||||
 | 
					func getOrgRepoCtx(ctx *middleware.Context) (*OrgRepoCtx, error) {
 | 
				
			||||||
 | 
						if len(ctx.Repo.RepoLink) > 0 {
 | 
				
			||||||
 | 
							return &OrgRepoCtx{
 | 
				
			||||||
 | 
								RepoID:      ctx.Repo.Repository.ID,
 | 
				
			||||||
 | 
								Link:        ctx.Repo.RepoLink,
 | 
				
			||||||
 | 
								NewTemplate: HOOK_NEW,
 | 
				
			||||||
 | 
							}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(ctx.Org.OrgLink) > 0 {
 | 
				
			||||||
 | 
							return &OrgRepoCtx{
 | 
				
			||||||
 | 
								OrgID:       ctx.Org.Organization.Id,
 | 
				
			||||||
 | 
								Link:        ctx.Org.OrgLink,
 | 
				
			||||||
 | 
								NewTemplate: ORG_HOOK_NEW,
 | 
				
			||||||
 | 
							}, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil, errors.New("Unable to set OrgRepo context")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func checkHookType(ctx *middleware.Context) string {
 | 
				
			||||||
 | 
						hookType := strings.ToLower(ctx.Params(":type"))
 | 
				
			||||||
 | 
						if !com.IsSliceContainsStr(setting.Webhook.Types, hookType) {
 | 
				
			||||||
 | 
							ctx.Handle(404, "checkHookType", nil)
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return hookType
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func WebhooksNew(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						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 {
 | 
				
			||||||
 | 
							ctx.Handle(500, "getOrgRepoCtx", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["HookType"] = checkHookType(ctx)
 | 
				
			||||||
 | 
						if ctx.Written() {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["BaseLink"] = orCtx.Link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.HTML(200, orCtx.NewTemplate)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ParseHookEvent(form auth.WebhookForm) *models.HookEvent {
 | 
				
			||||||
 | 
						return &models.HookEvent{
 | 
				
			||||||
 | 
							PushOnly:       form.PushOnly(),
 | 
				
			||||||
 | 
							SendEverything: form.SendEverything(),
 | 
				
			||||||
 | 
							ChooseEvents:   form.ChooseEvents(),
 | 
				
			||||||
 | 
							HookEvents: models.HookEvents{
 | 
				
			||||||
 | 
								Create: form.Create,
 | 
				
			||||||
 | 
								Push:   form.Push,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func WebHooksNewPost(ctx *middleware.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"] = "gogs"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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.JSON
 | 
				
			||||||
 | 
						if models.HookContentType(form.ContentType) == models.FORM {
 | 
				
			||||||
 | 
							contentType = models.FORM
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						w := &models.Webhook{
 | 
				
			||||||
 | 
							RepoID:       orCtx.RepoID,
 | 
				
			||||||
 | 
							URL:          form.PayloadURL,
 | 
				
			||||||
 | 
							ContentType:  contentType,
 | 
				
			||||||
 | 
							Secret:       form.Secret,
 | 
				
			||||||
 | 
							HookEvent:    ParseHookEvent(form.WebhookForm),
 | 
				
			||||||
 | 
							IsActive:     form.Active,
 | 
				
			||||||
 | 
							HookTaskType: models.GOGS,
 | 
				
			||||||
 | 
							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")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SlackHooksNewPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
 | 
				
			||||||
 | 
						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 {
 | 
				
			||||||
 | 
							ctx.Handle(500, "getOrgRepoCtx", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctx.HasError() {
 | 
				
			||||||
 | 
							ctx.HTML(200, orCtx.NewTemplate)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						meta, err := json.Marshal(&models.SlackMeta{
 | 
				
			||||||
 | 
							Channel:  form.Channel,
 | 
				
			||||||
 | 
							Username: form.Username,
 | 
				
			||||||
 | 
							IconURL:  form.IconURL,
 | 
				
			||||||
 | 
							Color:    form.Color,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "Marshal", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						w := &models.Webhook{
 | 
				
			||||||
 | 
							RepoID:       orCtx.RepoID,
 | 
				
			||||||
 | 
							URL:          form.PayloadURL,
 | 
				
			||||||
 | 
							ContentType:  models.JSON,
 | 
				
			||||||
 | 
							HookEvent:    ParseHookEvent(form.WebhookForm),
 | 
				
			||||||
 | 
							IsActive:     form.Active,
 | 
				
			||||||
 | 
							HookTaskType: models.SLACK,
 | 
				
			||||||
 | 
							Meta:         string(meta),
 | 
				
			||||||
 | 
							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")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func checkWebhook(ctx *middleware.Context) (*OrgRepoCtx, *models.Webhook) {
 | 
				
			||||||
 | 
						ctx.Data["RequireHighlightJS"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						orCtx, err := getOrgRepoCtx(ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "getOrgRepoCtx", err)
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ctx.Data["BaseLink"] = orCtx.Link
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						w, err := models.GetWebhookByID(ctx.ParamsInt64(":id"))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							if models.IsErrWebhookNotExist(err) {
 | 
				
			||||||
 | 
								ctx.Handle(404, "GetWebhookByID", nil)
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								ctx.Handle(500, "GetWebhookByID", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch w.HookTaskType {
 | 
				
			||||||
 | 
						case models.SLACK:
 | 
				
			||||||
 | 
							ctx.Data["SlackHook"] = w.GetSlackHook()
 | 
				
			||||||
 | 
							ctx.Data["HookType"] = "slack"
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							ctx.Data["HookType"] = "gogs"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Data["History"], err = w.History(1)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "History", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return orCtx, w
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func WebHooksEdit(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func WebHooksEditPost(ctx *middleware.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.JSON
 | 
				
			||||||
 | 
						if models.HookContentType(form.ContentType) == models.FORM {
 | 
				
			||||||
 | 
							contentType = models.FORM
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						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, "WebHooksEditPost", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
 | 
				
			||||||
 | 
						ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) {
 | 
				
			||||||
 | 
						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.SlackMeta{
 | 
				
			||||||
 | 
							Channel:  form.Channel,
 | 
				
			||||||
 | 
							Username: form.Username,
 | 
				
			||||||
 | 
							IconURL:  form.IconURL,
 | 
				
			||||||
 | 
							Color:    form.Color,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							ctx.Handle(500, "Marshal", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						w.URL = form.PayloadURL
 | 
				
			||||||
 | 
						w.Meta = string(meta)
 | 
				
			||||||
 | 
						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, "UpdateWebhook", err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success"))
 | 
				
			||||||
 | 
						ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, w.ID))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestWebhook(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						p := &api.PushPayload{
 | 
				
			||||||
 | 
							Ref:    ctx.Repo.Repository.DefaultBranch,
 | 
				
			||||||
 | 
							Before: ctx.Repo.CommitID,
 | 
				
			||||||
 | 
							After:  ctx.Repo.CommitID,
 | 
				
			||||||
 | 
							Commits: []*api.PayloadCommit{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ID:      ctx.Repo.CommitID,
 | 
				
			||||||
 | 
									Message: ctx.Repo.Commit.Message(),
 | 
				
			||||||
 | 
									URL:     ctx.Repo.RepoLink + "/commit/" + ctx.Repo.CommitID,
 | 
				
			||||||
 | 
									Author: &api.PayloadAuthor{
 | 
				
			||||||
 | 
										Name:  ctx.Repo.Commit.Author.Name,
 | 
				
			||||||
 | 
										Email: ctx.Repo.Commit.Author.Email,
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							Repo: ctx.Repo.Repository.ComposePayload(),
 | 
				
			||||||
 | 
							Sender: &api.PayloadUser{
 | 
				
			||||||
 | 
								UserName:  ctx.User.Name,
 | 
				
			||||||
 | 
								ID:        ctx.User.Id,
 | 
				
			||||||
 | 
								AvatarUrl: setting.AppUrl + ctx.User.RelAvatarLink(),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if err := models.PrepareWebhooks(ctx.Repo.Repository, models.HOOK_EVENT_PUSH, p); err != nil {
 | 
				
			||||||
 | 
							ctx.Flash.Error("PrepareWebhooks: " + err.Error())
 | 
				
			||||||
 | 
							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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func DeleteWebhook(ctx *middleware.Context) {
 | 
				
			||||||
 | 
						if err := models.DeleteWebhook(ctx.QueryInt64("id")); err != nil {
 | 
				
			||||||
 | 
							ctx.Flash.Error("DeleteWebhook: " + err.Error())
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							ctx.Flash.Success(ctx.Tr("repo.settings.webhook_deletion_success"))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.JSON(200, map[string]interface{}{
 | 
				
			||||||
 | 
							"redirect": ctx.Repo.RepoLink + "/settings/hooks",
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1 +1 @@
 | 
				
			|||||||
0.7.31.1205 Beta
 | 
					0.7.32.1205 Beta
 | 
				
			||||||
@@ -1,6 +1,12 @@
 | 
				
			|||||||
{{if .PageIsSettingsHooksEdit}}
 | 
					{{if .PageIsSettingsHooksEdit}}
 | 
				
			||||||
<h4 class="ui top attached header">
 | 
					<h4 class="ui top attached header">
 | 
				
			||||||
  {{.i18n.Tr "repo.settings.recent_deliveries"}}
 | 
					  {{.i18n.Tr "repo.settings.recent_deliveries"}}
 | 
				
			||||||
 | 
					  {{if .IsRepositoryAdmin}}
 | 
				
			||||||
 | 
					  <div class="ui right">
 | 
				
			||||||
 | 
					  	<button class="ui teal tiny button poping up" id="test-delivery" data-content=
 | 
				
			||||||
 | 
					  	"{{.i18n.Tr "repo.settings.webhook.test_delivery_desc"}}" data-variation="inverted tiny" data-link="{{.Link}}/test" data-redirect="{{.Link}}">{{.i18n.Tr "repo.settings.webhook.test_delivery"}}</button>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  {{end}}
 | 
				
			||||||
</h4>
 | 
					</h4>
 | 
				
			||||||
<div class="ui attached table segment">
 | 
					<div class="ui attached table segment">
 | 
				
			||||||
	<div class="ui hook history list">
 | 
						<div class="ui hook history list">
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user