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