2015-11-19 05:21:47 +03:00
// 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.
2015-12-05 01:16:42 +03:00
package repo
2015-11-19 05:21:47 +03:00
import (
"fmt"
2016-11-11 12:39:44 +03:00
api "code.gitea.io/sdk/gitea"
2015-11-19 05:21:47 +03:00
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/routers/api/v1/convert"
2015-11-19 05:21:47 +03:00
)
func composeDeployKeysAPILink ( repoPath string ) string {
2016-11-27 13:14:25 +03:00
return setting . AppURL + "api/v1/repos/" + repoPath + "/keys/"
2015-11-19 05:21:47 +03:00
}
2016-11-24 10:04:31 +03:00
// ListDeployKeys list all the deploy keys of a repository
// see https://github.com/gogits/go-gogs-client/wiki/Repositories-Deploy-Keys#list-deploy-keys
2016-03-14 01:49:16 +03:00
func ListDeployKeys ( ctx * context . APIContext ) {
2015-11-19 05:21:47 +03:00
keys , err := models . ListDeployKeys ( ctx . Repo . Repository . ID )
if err != nil {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "ListDeployKeys" , err )
2015-11-19 05:21:47 +03:00
return
}
apiLink := composeDeployKeysAPILink ( ctx . Repo . Owner . Name + "/" + ctx . Repo . Repository . Name )
apiKeys := make ( [ ] * api . DeployKey , len ( keys ) )
for i := range keys {
if err = keys [ i ] . GetContent ( ) ; err != nil {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "GetContent" , err )
2015-11-19 05:21:47 +03:00
return
}
2016-03-14 06:20:22 +03:00
apiKeys [ i ] = convert . ToDeployKey ( apiLink , keys [ i ] )
2015-11-19 05:21:47 +03:00
}
ctx . JSON ( 200 , & apiKeys )
}
2016-11-24 10:04:31 +03:00
// GetDeployKey get a deploy key by id
// see https://github.com/gogits/go-gogs-client/wiki/Repositories-Deploy-Keys#get-a-deploy-key
2016-03-14 01:49:16 +03:00
func GetDeployKey ( ctx * context . APIContext ) {
2015-11-19 05:21:47 +03:00
key , err := models . GetDeployKeyByID ( ctx . ParamsInt64 ( ":id" ) )
if err != nil {
if models . IsErrDeployKeyNotExist ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Status ( 404 )
2015-11-19 05:21:47 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "GetDeployKeyByID" , err )
2015-11-19 05:21:47 +03:00
}
return
}
if err = key . GetContent ( ) ; err != nil {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "GetContent" , err )
2015-11-19 05:21:47 +03:00
return
}
apiLink := composeDeployKeysAPILink ( ctx . Repo . Owner . Name + "/" + ctx . Repo . Repository . Name )
2016-03-14 06:20:22 +03:00
ctx . JSON ( 200 , convert . ToDeployKey ( apiLink , key ) )
2015-11-19 05:21:47 +03:00
}
2016-11-24 10:04:31 +03:00
// HandleCheckKeyStringError handle check key error
2016-03-14 01:49:16 +03:00
func HandleCheckKeyStringError ( ctx * context . APIContext , err error ) {
2015-12-03 08:24:37 +03:00
if models . IsErrKeyUnableVerify ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , "Unable to verify key content" )
2015-12-03 08:24:37 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , fmt . Errorf ( "Invalid key content: %v" , err ) )
2015-12-03 08:24:37 +03:00
}
}
2016-11-24 10:04:31 +03:00
// HandleAddKeyError handle add key error
2016-03-14 01:49:16 +03:00
func HandleAddKeyError ( ctx * context . APIContext , err error ) {
2015-12-03 08:24:37 +03:00
switch {
case models . IsErrKeyAlreadyExist ( err ) :
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , "Key content has been used as non-deploy key" )
2015-12-03 08:24:37 +03:00
case models . IsErrKeyNameAlreadyUsed ( err ) :
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , "Key title has been used" )
2015-12-03 08:24:37 +03:00
default :
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "AddKey" , err )
2015-12-03 08:24:37 +03:00
}
}
2016-11-24 10:04:31 +03:00
// CreateDeployKey create deploy key for a repository
// see https://github.com/gogits/go-gogs-client/wiki/Repositories-Deploy-Keys#add-a-new-deploy-key
2016-03-14 01:49:16 +03:00
func CreateDeployKey ( ctx * context . APIContext , form api . CreateKeyOption ) {
2015-11-19 05:21:47 +03:00
content , err := models . CheckPublicKeyString ( form . Key )
if err != nil {
2015-12-05 01:16:42 +03:00
HandleCheckKeyStringError ( ctx , err )
2015-11-19 05:21:47 +03:00
return
}
key , err := models . AddDeployKey ( ctx . Repo . Repository . ID , form . Title , content )
if err != nil {
2015-12-05 01:16:42 +03:00
HandleAddKeyError ( ctx , err )
2015-11-19 05:21:47 +03:00
return
}
key . Content = content
apiLink := composeDeployKeysAPILink ( ctx . Repo . Owner . Name + "/" + ctx . Repo . Repository . Name )
2016-03-14 06:20:22 +03:00
ctx . JSON ( 201 , convert . ToDeployKey ( apiLink , key ) )
2015-11-19 05:21:47 +03:00
}
2016-11-24 10:04:31 +03:00
// DeleteDeploykey delete deploy key for a repository
// see https://github.com/gogits/go-gogs-client/wiki/Repositories-Deploy-Keys#remove-a-deploy-key
2016-03-14 01:49:16 +03:00
func DeleteDeploykey ( ctx * context . APIContext ) {
2015-12-03 08:24:37 +03:00
if err := models . DeleteDeployKey ( ctx . User , ctx . ParamsInt64 ( ":id" ) ) ; err != nil {
if models . IsErrKeyAccessDenied ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Error ( 403 , "" , "You do not have access to this key" )
2015-12-03 08:24:37 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "DeleteDeployKey" , err )
2015-12-03 08:24:37 +03:00
}
2015-11-19 05:21:47 +03:00
return
}
ctx . Status ( 204 )
}