2014-05-01 13:44:22 +04:00
// Copyright 2014 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
2014-07-26 10:28:04 +04:00
import (
2014-08-24 16:59:47 +04:00
"encoding/json"
2014-09-04 15:17:00 +04:00
"errors"
2014-07-26 10:28:04 +04:00
"fmt"
"strings"
"time"
"github.com/Unknwon/com"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
2014-10-07 01:50:00 +04:00
"github.com/gogits/gogs/modules/git"
2014-07-26 10:28:04 +04:00
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
)
const (
2014-08-02 21:47:33 +04:00
SETTINGS_OPTIONS base . TplName = "repo/settings/options"
2014-08-07 14:40:05 +04:00
COLLABORATION base . TplName = "repo/settings/collaboration"
2014-08-09 21:29:51 +04:00
HOOKS base . TplName = "repo/settings/hooks"
2014-08-10 02:40:10 +04:00
HOOK_NEW base . TplName = "repo/settings/hook_new"
2014-09-04 15:17:00 +04:00
ORG_HOOK_NEW base . TplName = "org/settings/hook_new"
2015-08-06 17:48:11 +03:00
GITHOOKS base . TplName = "repo/settings/githooks"
GITHOOK_EDIT base . TplName = "repo/settings/githook_edit"
DEPLOY_KEYS base . TplName = "repo/settings/deploy_keys"
2014-07-26 10:28:04 +04:00
)
2014-08-02 21:47:33 +04:00
func Settings ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsOptions" ] = true
ctx . HTML ( 200 , SETTINGS_OPTIONS )
2014-07-26 10:28:04 +04:00
}
2014-08-02 21:47:33 +04:00
func SettingsPost ( ctx * middleware . Context , form auth . RepoSettingForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsOptions" ] = true
2014-07-26 10:28:04 +04:00
2015-08-31 08:36:31 +03:00
repo := ctx . Repo . Repository
2014-07-26 10:28:04 +04:00
switch ctx . Query ( "action" ) {
case "update" :
if ctx . HasError ( ) {
2014-08-02 21:47:33 +04:00
ctx . HTML ( 200 , SETTINGS_OPTIONS )
2014-07-26 10:28:04 +04:00
return
}
2015-09-01 18:43:53 +03:00
isNameChanged := false
2015-09-01 16:29:52 +03:00
oldRepoName := repo . Name
2014-07-26 10:28:04 +04:00
newRepoName := form . RepoName
// Check if repository name has been changed.
2015-08-31 08:36:31 +03:00
if repo . LowerName != strings . ToLower ( newRepoName ) {
2015-09-01 18:43:53 +03:00
isNameChanged = true
2015-08-31 08:36:31 +03:00
if err := models . ChangeRepositoryName ( ctx . Repo . Owner , repo . Name , newRepoName ) ; err != nil {
ctx . Data [ "Err_RepoName" ] = true
2015-03-27 00:11:47 +03:00
switch {
2015-08-08 12:10:34 +03:00
case models . IsErrRepoAlreadyExist ( err ) :
2015-03-27 00:11:47 +03:00
ctx . RenderWithErr ( ctx . Tr ( "form.repo_name_been_taken" ) , SETTINGS_OPTIONS , & form )
case models . IsErrNameReserved ( err ) :
ctx . RenderWithErr ( ctx . Tr ( "repo.form.name_reserved" , err . ( models . ErrNameReserved ) . Name ) , SETTINGS_OPTIONS , & form )
case models . IsErrNamePatternNotAllowed ( err ) :
ctx . RenderWithErr ( ctx . Tr ( "repo.form.name_pattern_not_allowed" , err . ( models . ErrNamePatternNotAllowed ) . Pattern ) , SETTINGS_OPTIONS , & form )
default :
2014-08-24 17:09:05 +04:00
ctx . Handle ( 500 , "ChangeRepositoryName" , err )
}
2014-07-26 10:28:04 +04:00
return
}
2015-09-01 18:43:53 +03:00
2015-08-31 08:36:31 +03:00
log . Trace ( "Repository name changed: %s/%s -> %s" , ctx . Repo . Owner . Name , repo . Name , newRepoName )
2014-07-26 10:28:04 +04:00
}
2015-08-31 08:36:31 +03:00
// In case it's just a case change.
repo . Name = newRepoName
repo . LowerName = strings . ToLower ( newRepoName )
2014-07-26 10:28:04 +04:00
2015-11-19 03:32:23 +03:00
if ctx . Repo . GitRepo . IsBranchExist ( form . Branch ) &&
repo . DefaultBranch != form . Branch {
2015-08-31 08:36:31 +03:00
repo . DefaultBranch = form . Branch
2015-11-19 03:32:23 +03:00
if err := ctx . Repo . GitRepo . SetDefaultBranch ( form . Branch ) ; err != nil {
if ! git . IsErrUnsupportedVersion ( err ) {
ctx . Handle ( 500 , "SetDefaultBranch" , err )
return
}
}
2014-07-26 10:28:04 +04:00
}
2015-08-31 08:36:31 +03:00
repo . Description = form . Description
repo . Website = form . Website
2015-11-18 23:01:11 +03:00
// Visibility of forked repository is forced sync with base repository.
if repo . IsFork {
form . Private = repo . BaseRepo . IsPrivate
}
2015-08-31 08:36:31 +03:00
visibilityChanged := repo . IsPrivate != form . Private
repo . IsPrivate = form . Private
if err := models . UpdateRepository ( repo , visibilityChanged ) ; err != nil {
2015-09-01 16:29:52 +03:00
ctx . Handle ( 500 , "UpdateRepository" , err )
return
2014-07-26 10:28:04 +04:00
}
2015-08-31 08:36:31 +03:00
log . Trace ( "Repository updated: %s/%s" , ctx . Repo . Owner . Name , repo . Name )
2014-07-26 10:28:04 +04:00
2015-09-01 18:43:53 +03:00
if isNameChanged {
if err := models . RenameRepoAction ( ctx . User , oldRepoName , repo ) ; err != nil {
log . Error ( 4 , "RenameRepoAction: %v" , err )
}
}
2015-08-31 08:36:31 +03:00
if repo . IsMirror {
2014-07-26 10:28:04 +04:00
if form . Interval > 0 {
ctx . Repo . Mirror . Interval = form . Interval
ctx . Repo . Mirror . NextUpdate = time . Now ( ) . Add ( time . Duration ( form . Interval ) * time . Hour )
if err := models . UpdateMirror ( ctx . Repo . Mirror ) ; err != nil {
log . Error ( 4 , "UpdateMirror: %v" , err )
}
}
}
2014-08-02 21:47:33 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_settings_success" ) )
2015-08-31 08:36:31 +03:00
ctx . Redirect ( fmt . Sprintf ( "%s/%s/%s/settings" , setting . AppSubUrl , ctx . Repo . Owner . Name , repo . Name ) )
2014-07-26 10:28:04 +04:00
case "transfer" :
2015-08-31 08:36:31 +03:00
if repo . Name != form . RepoName {
2014-08-02 21:47:33 +04:00
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_repo_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 10:28:04 +04:00
return
}
2015-08-31 08:36:31 +03:00
if ctx . Repo . Owner . IsOrganization ( ) {
if ! ctx . Repo . Owner . IsOwnedBy ( ctx . User . Id ) {
ctx . Error ( 404 )
return
}
}
2014-08-02 21:47:33 +04:00
newOwner := ctx . Query ( "new_owner_name" )
2015-02-23 02:24:49 +03:00
isExist , err := models . IsUserExist ( 0 , newOwner )
2014-07-26 10:28:04 +04:00
if err != nil {
2014-08-02 21:47:33 +04:00
ctx . Handle ( 500 , "IsUserExist" , err )
2014-07-26 10:28:04 +04:00
return
} else if ! isExist {
2014-08-02 21:47:33 +04:00
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_owner_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 10:28:04 +04:00
return
2015-03-06 03:20:27 +03:00
}
2015-08-31 08:36:31 +03:00
if err = models . TransferOwnership ( ctx . User , newOwner , repo ) ; err != nil {
2015-08-08 12:10:34 +03:00
if models . IsErrRepoAlreadyExist ( err ) {
2014-09-13 02:29:58 +04:00
ctx . RenderWithErr ( ctx . Tr ( "repo.settings.new_owner_has_same_repo" ) , SETTINGS_OPTIONS , nil )
} else {
ctx . Handle ( 500 , "TransferOwnership" , err )
}
2014-07-26 10:28:04 +04:00
return
}
2015-08-31 08:36:31 +03:00
log . Trace ( "Repository transfered: %s/%s -> %s" , ctx . Repo . Owner . Name , repo . Name , newOwner )
2014-09-17 22:52:46 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.transfer_succeed" ) )
2015-08-31 08:36:31 +03:00
ctx . Redirect ( setting . AppSubUrl + "/" + newOwner + "/" + repo . Name )
2014-07-26 10:28:04 +04:00
case "delete" :
2015-08-31 08:36:31 +03:00
if repo . Name != form . RepoName {
2014-08-02 21:47:33 +04:00
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_repo_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 10:28:04 +04:00
return
2014-08-27 12:39:36 +04:00
}
if ctx . Repo . Owner . IsOrganization ( ) {
2014-12-13 04:30:32 +03:00
if ! ctx . Repo . Owner . IsOwnedBy ( ctx . User . Id ) {
2014-08-27 12:39:36 +04:00
ctx . Error ( 404 )
return
}
2015-03-06 03:20:27 +03:00
}
2015-09-01 18:43:53 +03:00
if err := models . DeleteRepository ( ctx . Repo . Owner . Id , repo . ID ) ; err != nil {
2014-08-02 21:47:33 +04:00
ctx . Handle ( 500 , "DeleteRepository" , err )
2014-07-26 10:28:04 +04:00
return
}
2015-08-31 08:36:31 +03:00
log . Trace ( "Repository deleted: %s/%s" , ctx . Repo . Owner . Name , repo . Name )
ctx . Redirect ( ctx . Repo . Owner . DashboardLink ( ) )
2014-07-26 10:28:04 +04:00
}
}
2015-08-26 16:45:51 +03:00
func Collaboration ( ctx * middleware . Context ) {
2014-08-07 14:40:05 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsCollaboration" ] = true
if ctx . Req . Method == "POST" {
name := strings . ToLower ( ctx . Query ( "collaborator" ) )
if len ( name ) == 0 || ctx . Repo . Owner . LowerName == name {
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14:40:05 +04:00
return
}
u , err := models . GetUserByName ( name )
if err != nil {
2015-08-05 06:14:17 +03:00
if models . IsErrUserNotExist ( err ) {
2014-08-07 14:40:05 +04:00
ctx . Flash . Error ( ctx . Tr ( "form.user_not_exist" ) )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14:40:05 +04:00
} else {
ctx . Handle ( 500 , "GetUserByName" , err )
}
return
}
2014-10-10 14:15:27 +04:00
// Check if user is organization member.
if ctx . Repo . Owner . IsOrganization ( ) && ctx . Repo . Owner . IsOrgMember ( u . Id ) {
ctx . Flash . Info ( ctx . Tr ( "repo.settings.user_is_org_member" ) )
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/collaboration" )
return
}
2015-01-23 10:54:16 +03:00
if err = ctx . Repo . Repository . AddCollaborator ( u ) ; err != nil {
ctx . Handle ( 500 , "AddCollaborator" , err )
2014-08-07 14:40:05 +04:00
return
}
if setting . Service . EnableNotifyMail {
if err = mailer . SendCollaboratorMail ( ctx . Render , u , ctx . User , ctx . Repo . Repository ) ; err != nil {
ctx . Handle ( 500 , "SendCollaboratorMail" , err )
return
}
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_collaborator_success" ) )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14:40:05 +04:00
return
}
2014-07-26 10:28:04 +04:00
// Delete collaborator.
remove := strings . ToLower ( ctx . Query ( "remove" ) )
if len ( remove ) > 0 && remove != ctx . Repo . Owner . LowerName {
2015-01-23 10:54:16 +03:00
u , err := models . GetUserByName ( remove )
if err != nil {
ctx . Handle ( 500 , "GetUserByName" , err )
return
2014-08-24 17:09:05 +04:00
}
2015-01-23 10:54:16 +03:00
if err := ctx . Repo . Repository . DeleteCollaborator ( u ) ; err != nil {
ctx . Handle ( 500 , "DeleteCollaborator" , err )
return
2014-07-26 10:28:04 +04:00
}
2014-08-07 14:40:05 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.remove_collaborator_success" ) )
2014-07-26 10:28:04 +04:00
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/collaboration" )
return
}
2015-01-23 10:54:16 +03:00
users , err := ctx . Repo . Repository . GetCollaborators ( )
2014-07-26 10:28:04 +04:00
if err != nil {
2014-08-07 14:40:05 +04:00
ctx . Handle ( 500 , "GetCollaborators" , err )
2014-07-26 10:28:04 +04:00
return
}
2015-01-23 10:54:16 +03:00
ctx . Data [ "Collaborators" ] = users
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , COLLABORATION )
}
2014-08-09 21:29:51 +04:00
func Webhooks ( ctx * middleware . Context ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.hooks" )
2014-08-09 21:29:51 +04:00
ctx . Data [ "PageIsSettingsHooks" ] = true
2015-08-26 16:45:51 +03:00
ctx . Data [ "BaseLink" ] = ctx . Repo . RepoLink
2015-12-04 02:10:45 +03:00
ctx . Data [ "Description" ] = ctx . Tr ( "repo.settings.hooks_desc" , "https://github.com/gogits/go-gogs-client/wiki/Repositories-Webhooks" )
2014-07-26 10:28:04 +04:00
2015-11-19 05:21:47 +03:00
ws , err := models . GetWebhooksByRepoID ( ctx . Repo . Repository . ID )
2014-07-26 10:28:04 +04:00
if err != nil {
2015-11-19 05:21:47 +03:00
ctx . Handle ( 500 , "GetWebhooksByRepoID" , err )
2014-07-26 10:28:04 +04:00
return
}
ctx . Data [ "Webhooks" ] = ws
2015-08-26 16:45:51 +03:00
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , HOOKS )
}
2015-08-26 19:30:06 +03:00
type OrgRepoCtx struct {
OrgID int64
RepoID int64
Link string
NewTemplate base . TplName
2014-08-24 16:59:47 +04:00
}
2015-08-26 19:30:06 +03:00
// 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" )
2014-08-10 02:40:10 +04:00
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
2015-07-10 12:26:50 +03:00
2014-09-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2015-08-26 19:30:06 +03:00
ctx . Handle ( 500 , "getOrgRepoCtx" , err )
return
}
ctx . Data [ "HookType" ] = checkHookType ( ctx )
if ctx . Written ( ) {
2014-09-05 03:05:21 +04:00
return
2014-09-04 15:17:00 +04:00
}
2015-08-26 19:30:06 +03:00
ctx . Data [ "BaseLink" ] = orCtx . Link
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
}
2015-08-28 18:36: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 {
Create : form . Create ,
Push : form . Push ,
} ,
}
}
2014-08-10 02:40:10 +04:00
func WebHooksNewPost ( ctx * middleware . Context , form auth . NewWebhookForm ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.add_webhook" )
2014-08-10 02:40:10 +04:00
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
2015-08-26 19:30:06 +03:00
ctx . Data [ "HookType" ] = "gogs"
2014-07-26 10:28:04 +04:00
2014-09-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
2015-08-26 19:30:06 +03:00
ctx . Handle ( 500 , "getOrgRepoCtx" , err )
2014-09-05 03:05:21 +04:00
return
}
2015-08-26 19:30:06 +03:00
ctx . Data [ "BaseLink" ] = orCtx . Link
2014-09-04 15:17:00 +04:00
2014-07-26 10:28:04 +04:00
if ctx . HasError ( ) {
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
return
}
2015-08-26 19:30:06 +03:00
contentType := models . JSON
if models . HookContentType ( form . ContentType ) == models . FORM {
contentType = models . FORM
2014-07-26 10:28:04 +04:00
}
w := & models . Webhook {
2015-08-28 18:36:13 +03:00
RepoID : orCtx . RepoID ,
URL : form . PayloadURL ,
ContentType : contentType ,
Secret : form . Secret ,
HookEvent : ParseHookEvent ( form . WebhookForm ) ,
2014-08-24 16:59:47 +04:00
IsActive : form . Active ,
HookTaskType : models . GOGS ,
2015-08-26 19:30:06 +03:00
OrgID : orCtx . OrgID ,
2014-07-26 10:28:04 +04:00
}
if err := w . UpdateEvent ( ) ; err != nil {
2014-08-10 02:40:10 +04:00
ctx . Handle ( 500 , "UpdateEvent" , err )
2014-07-26 10:28:04 +04:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2014-08-10 02:40:10 +04:00
ctx . Handle ( 500 , "CreateWebhook" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-08-10 02:40:10 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
2014-09-05 03:05:21 +04:00
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
2014-07-26 10:28:04 +04:00
}
2015-08-26 20:04:23 +03:00
func SlackHooksNewPost ( ctx * middleware . Context , form auth . NewSlackHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
2014-08-10 02:40:10 +04:00
ctx . Data [ "PageIsSettingsHooks" ] = true
2015-08-26 20:04:23 +03:00
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
2014-07-26 10:28:04 +04:00
2015-08-26 19:30:06 +03:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "getOrgRepoCtx" , err )
2014-07-26 10:28:04 +04:00
return
}
2015-08-26 20:04:23 +03:00
if ctx . HasError ( ) {
ctx . HTML ( 200 , orCtx . NewTemplate )
return
}
2015-08-28 18:36:13 +03:00
meta , err := json . Marshal ( & models . SlackMeta {
2015-08-29 06:49:59 +03:00
Channel : form . Channel ,
Username : form . Username ,
IconURL : form . IconURL ,
Color : form . Color ,
2015-08-26 20:04:23 +03:00
} )
if err != nil {
ctx . Handle ( 500 , "Marshal" , err )
return
}
w := & models . Webhook {
2015-08-28 18:36:13 +03:00
RepoID : orCtx . RepoID ,
URL : form . PayloadURL ,
ContentType : models . JSON ,
HookEvent : ParseHookEvent ( form . WebhookForm ) ,
2015-08-26 20:04:23 +03:00
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" )
}
2015-08-27 18:06:14 +03:00
func checkWebhook ( ctx * middleware . Context ) ( * OrgRepoCtx , * models . Webhook ) {
2015-08-27 18:58:50 +03:00
ctx . Data [ "RequireHighlightJS" ] = true
2015-08-27 18:06:14 +03:00
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" ) )
2014-07-26 10:28:04 +04:00
if err != nil {
2015-08-27 18:06:14 +03:00
if models . IsErrWebhookNotExist ( err ) {
ctx . Handle ( 404 , "GetWebhookByID" , nil )
2014-07-26 10:28:04 +04:00
} else {
2015-08-27 18:06:14 +03:00
ctx . Handle ( 500 , "GetWebhookByID" , err )
2014-07-26 10:28:04 +04:00
}
2015-08-27 18:06:14 +03:00
return nil , nil
2014-07-26 10:28:04 +04:00
}
2014-08-24 16:59:47 +04:00
switch w . HookTaskType {
case models . SLACK :
2015-07-10 12:26:50 +03:00
ctx . Data [ "SlackHook" ] = w . GetSlackHook ( )
2015-08-26 19:30:06 +03:00
ctx . Data [ "HookType" ] = "slack"
2014-08-24 16:59:47 +04:00
default :
2015-08-26 19:30:06 +03:00
ctx . Data [ "HookType" ] = "gogs"
2014-08-24 16:59:47 +04:00
}
2015-08-27 18:06:14 +03:00
ctx . Data [ "History" ] , err = w . History ( 1 )
if err != nil {
ctx . Handle ( 500 , "History" , err )
}
return orCtx , w
2014-07-26 10:28:04 +04:00
}
2015-08-26 20:04:23 +03:00
func WebHooksEdit ( ctx * middleware . Context ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.update_webhook" )
2014-08-10 02:40:10 +04:00
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
2014-07-26 10:28:04 +04:00
2015-08-27 18:06:14 +03:00
orCtx , w := checkWebhook ( ctx )
2015-08-26 20:04:23 +03:00
if ctx . Written ( ) {
return
}
2015-08-27 18:06:14 +03:00
ctx . Data [ "Webhook" ] = w
2015-07-10 12:26:50 +03:00
2015-08-26 20:04:23 +03:00
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
2015-08-27 18:06:14 +03:00
orCtx , w := checkWebhook ( ctx )
2015-08-26 20:04:23 +03:00
if ctx . Written ( ) {
return
2015-07-10 12:26:50 +03:00
}
2014-08-10 02:40:10 +04:00
ctx . Data [ "Webhook" ] = w
2014-07-26 10:28:04 +04:00
if ctx . HasError ( ) {
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
return
}
2015-08-26 20:04:23 +03:00
contentType := models . JSON
2015-08-26 19:30:06 +03:00
if models . HookContentType ( form . ContentType ) == models . FORM {
2015-08-26 20:04:23 +03:00
contentType = models . FORM
2014-07-26 10:28:04 +04:00
}
2015-08-26 19:30:06 +03:00
w . URL = form . PayloadURL
2015-08-26 20:04:23 +03:00
w . ContentType = contentType
2014-07-26 10:28:04 +04:00
w . Secret = form . Secret
2015-08-28 18:36:13 +03:00
w . HookEvent = ParseHookEvent ( form . WebhookForm )
2014-07-26 10:28:04 +04:00
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
}
2014-08-10 02:40:10 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2015-08-26 20:04:23 +03:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
2014-08-24 16:59:47 +04:00
}
func SlackHooksEditPost ( ctx * middleware . Context , form auth . NewSlackHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
2015-08-27 18:06:14 +03:00
orCtx , w := checkWebhook ( ctx )
2015-08-26 20:04:23 +03:00
if ctx . Written ( ) {
2014-09-05 03:05:21 +04:00
return
}
2015-08-26 20:04:23 +03:00
ctx . Data [ "Webhook" ] = w
2014-09-05 03:05:21 +04:00
2014-08-24 16:59:47 +04:00
if ctx . HasError ( ) {
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-08-24 16:59:47 +04:00
return
}
2015-08-26 20:04:23 +03:00
2015-08-28 18:36:13 +03:00
meta , err := json . Marshal ( & models . SlackMeta {
2015-08-29 06:49:59 +03:00
Channel : form . Channel ,
Username : form . Username ,
IconURL : form . IconURL ,
Color : form . Color ,
2014-08-24 16:59:47 +04:00
} )
if err != nil {
2015-08-26 20:04:23 +03:00
ctx . Handle ( 500 , "Marshal" , err )
2014-08-24 16:59:47 +04:00
return
}
2015-08-26 19:30:06 +03:00
w . URL = form . PayloadURL
2014-08-24 16:59:47 +04:00
w . Meta = string ( meta )
2015-08-28 18:36:13 +03:00
w . HookEvent = ParseHookEvent ( form . WebhookForm )
2014-08-24 16:59:47 +04:00
w . IsActive = form . Active
if err := w . UpdateEvent ( ) ; err != nil {
ctx . Handle ( 500 , "UpdateEvent" , err )
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
2015-08-26 20:04:23 +03:00
ctx . Handle ( 500 , "UpdateWebhook" , err )
2014-08-24 16:59:47 +04:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2015-08-26 20:04:23 +03:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , w . ID ) )
2014-09-04 15:17:00 +04:00
}
2015-08-26 16:45:51 +03:00
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" ,
} )
}
2015-10-24 10:36:47 +03:00
func parseOwnerAndRepo ( ctx * middleware . Context ) ( * models . User , * models . Repository ) {
owner , err := models . GetUserByName ( ctx . Params ( ":username" ) )
2015-08-07 20:04:12 +03:00
if err != nil {
if models . IsErrUserNotExist ( err ) {
ctx . Handle ( 404 , "GetUserByName" , err )
} else {
ctx . Handle ( 500 , "GetUserByName" , err )
}
2015-10-24 10:36:47 +03:00
return nil , nil
2015-08-07 20:04:12 +03:00
}
2015-10-24 10:36:47 +03:00
repo , err := models . GetRepositoryByName ( owner . Id , ctx . Params ( ":reponame" ) )
2015-08-07 20:04:12 +03:00
if err != nil {
if models . IsErrRepoNotExist ( err ) {
ctx . Handle ( 404 , "GetRepositoryByName" , err )
} else {
ctx . Handle ( 500 , "GetRepositoryByName" , err )
}
2015-10-24 10:36:47 +03:00
return nil , nil
2015-08-07 20:04:12 +03:00
}
2015-10-24 10:36:47 +03:00
return owner , repo
2015-08-06 17:48:11 +03:00
}
2015-08-26 16:45:51 +03:00
func GitHooks ( ctx * middleware . Context ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.githooks" )
2014-10-07 01:50:00 +04:00
ctx . Data [ "PageIsSettingsGitHooks" ] = true
hooks , err := ctx . Repo . GitRepo . Hooks ( )
if err != nil {
ctx . Handle ( 500 , "Hooks" , err )
return
}
ctx . Data [ "Hooks" ] = hooks
ctx . HTML ( 200 , GITHOOKS )
}
2015-08-26 16:45:51 +03:00
func GitHooksEdit ( ctx * middleware . Context ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.githooks" )
2014-10-07 01:50:00 +04:00
ctx . Data [ "PageIsSettingsGitHooks" ] = true
name := ctx . Params ( ":name" )
hook , err := ctx . Repo . GitRepo . GetHook ( name )
if err != nil {
if err == git . ErrNotValidHook {
ctx . Handle ( 404 , "GetHook" , err )
} else {
ctx . Handle ( 500 , "GetHook" , err )
}
return
}
ctx . Data [ "Hook" ] = hook
ctx . HTML ( 200 , GITHOOK_EDIT )
}
2015-08-26 16:45:51 +03:00
func GitHooksEditPost ( ctx * middleware . Context ) {
2014-10-07 01:50:00 +04:00
name := ctx . Params ( ":name" )
hook , err := ctx . Repo . GitRepo . GetHook ( name )
if err != nil {
if err == git . ErrNotValidHook {
ctx . Handle ( 404 , "GetHook" , err )
} else {
ctx . Handle ( 500 , "GetHook" , err )
}
return
}
hook . Content = ctx . Query ( "content" )
if err = hook . Update ( ) ; err != nil {
ctx . Handle ( 500 , "hook.Update" , err )
return
}
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/hooks/git" )
}
2015-07-25 16:32:04 +03:00
2015-08-26 16:45:51 +03:00
func DeployKeys ( ctx * middleware . Context ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.deploy_keys" )
2015-08-06 17:48:11 +03:00
ctx . Data [ "PageIsSettingsKeys" ] = true
2015-08-08 17:43:14 +03:00
keys , err := models . ListDeployKeys ( ctx . Repo . Repository . ID )
2015-08-06 17:48:11 +03:00
if err != nil {
ctx . Handle ( 500 , "ListDeployKeys" , err )
return
}
ctx . Data [ "Deploykeys" ] = keys
ctx . HTML ( 200 , DEPLOY_KEYS )
}
2015-08-26 16:45:51 +03:00
func DeployKeysPost ( ctx * middleware . Context , form auth . AddSSHKeyForm ) {
2015-08-26 19:30:06 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings.deploy_keys" )
2015-08-06 17:48:11 +03:00
ctx . Data [ "PageIsSettingsKeys" ] = true
2015-08-20 12:11:29 +03:00
keys , err := models . ListDeployKeys ( ctx . Repo . Repository . ID )
if err != nil {
ctx . Handle ( 500 , "ListDeployKeys" , err )
return
}
ctx . Data [ "Deploykeys" ] = keys
2015-08-06 17:48:11 +03:00
if ctx . HasError ( ) {
ctx . HTML ( 200 , DEPLOY_KEYS )
return
}
content , err := models . CheckPublicKeyString ( form . Content )
if err != nil {
2015-11-19 05:21:47 +03:00
if models . IsErrKeyUnableVerify ( err ) {
2015-08-06 17:48:11 +03:00
ctx . Flash . Info ( ctx . Tr ( "form.unable_verify_ssh_key" ) )
} else {
ctx . Data [ "HasError" ] = true
ctx . Data [ "Err_Content" ] = true
ctx . Flash . Error ( ctx . Tr ( "form.invalid_ssh_key" , err . Error ( ) ) )
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/keys" )
return
}
}
2015-11-19 05:21:47 +03:00
key , err := models . AddDeployKey ( ctx . Repo . Repository . ID , form . Title , content )
if err != nil {
2015-08-06 17:48:11 +03:00
ctx . Data [ "HasError" ] = true
switch {
case models . IsErrKeyAlreadyExist ( err ) :
ctx . Data [ "Err_Content" ] = true
ctx . RenderWithErr ( ctx . Tr ( "repo.settings.key_been_used" ) , DEPLOY_KEYS , & form )
case models . IsErrKeyNameAlreadyUsed ( err ) :
ctx . Data [ "Err_Title" ] = true
ctx . RenderWithErr ( ctx . Tr ( "repo.settings.key_name_used" ) , DEPLOY_KEYS , & form )
default :
ctx . Handle ( 500 , "AddDeployKey" , err )
}
return
}
2015-08-08 17:43:14 +03:00
log . Trace ( "Deploy key added: %d" , ctx . Repo . Repository . ID )
2015-11-19 05:21:47 +03:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_key_success" , key . Name ) )
2015-08-06 17:48:11 +03:00
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/keys" )
}
func DeleteDeployKey ( ctx * middleware . Context ) {
2015-12-03 08:24:37 +03:00
if err := models . DeleteDeployKey ( ctx . User , ctx . QueryInt64 ( "id" ) ) ; err != nil {
2015-08-06 17:48:11 +03:00
ctx . Flash . Error ( "DeleteDeployKey: " + err . Error ( ) )
} else {
ctx . Flash . Success ( ctx . Tr ( "repo.settings.deploy_key_deletion_success" ) )
}
ctx . JSON ( 200 , map [ string ] interface { } {
"redirect" : ctx . Repo . RepoLink + "/settings/keys" ,
} )
2015-07-25 16:32:04 +03:00
}