2015-12-03 00:24:37 -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 user
2015-12-03 00:24:37 -05:00
import (
2016-11-11 10:39:44 +01:00
api "code.gitea.io/sdk/gitea"
2015-12-03 00:24:37 -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"
"code.gitea.io/gitea/routers/api/v1/repo"
2015-12-03 00:24:37 -05:00
)
2018-11-01 03:40:49 +00:00
// appendPrivateInformation appends the owner and key type information to api.PublicKey
func appendPrivateInformation ( apiKey * api . PublicKey , key * models . PublicKey , defaultUser * models . User ) ( * api . PublicKey , error ) {
if key . Type == models . KeyTypeDeploy {
apiKey . KeyType = "deploy"
} else if key . Type == models . KeyTypeUser {
apiKey . KeyType = "user"
if defaultUser . ID == key . OwnerID {
apiKey . Owner = defaultUser . APIFormat ( )
} else {
user , err := models . GetUserByID ( key . OwnerID )
if err != nil {
return apiKey , err
}
apiKey . Owner = user . APIFormat ( )
}
} else {
apiKey . KeyType = "unknown"
}
apiKey . ReadOnly = key . Mode == models . AccessModeRead
return apiKey , nil
}
2016-11-24 15:04:31 +08:00
// GetUserByParamsName get user by name
2016-03-13 18:49:16 -04:00
func GetUserByParamsName ( ctx * context . APIContext , name string ) * models . User {
2015-12-17 02:28:47 -05:00
user , err := models . GetUserByName ( ctx . Params ( name ) )
2015-12-04 17:16:42 -05:00
if err != nil {
if models . IsErrUserNotExist ( err ) {
2016-03-13 18:49:16 -04:00
ctx . Status ( 404 )
2015-12-04 17:16:42 -05:00
} else {
2016-03-13 18:49:16 -04:00
ctx . Error ( 500 , "GetUserByName" , err )
2015-12-04 17:16:42 -05:00
}
return nil
2015-12-03 00:24:37 -05:00
}
2015-12-04 17:16:42 -05:00
return user
2015-12-03 00:24:37 -05:00
}
2015-12-17 02:28:47 -05:00
// GetUserByParams returns user whose name is presented in URL paramenter.
2016-03-13 18:49:16 -04:00
func GetUserByParams ( ctx * context . APIContext ) * models . User {
2015-12-17 02:28:47 -05:00
return GetUserByParamsName ( ctx , ":username" )
}
2015-12-03 00:24:37 -05:00
func composePublicKeysAPILink ( ) string {
2016-11-27 18:14:25 +08:00
return setting . AppURL + "api/v1/user/keys/"
2015-12-03 00:24:37 -05:00
}
2018-11-01 03:40:49 +00:00
func listPublicKeys ( ctx * context . APIContext , user * models . User ) {
var keys [ ] * models . PublicKey
var err error
fingerprint := ctx . Query ( "fingerprint" )
username := ctx . Params ( "username" )
if fingerprint != "" {
// Querying not just listing
if username != "" {
// Restrict to provided uid
keys , err = models . SearchPublicKey ( user . ID , fingerprint )
} else {
// Unrestricted
keys , err = models . SearchPublicKey ( 0 , fingerprint )
}
} else {
// Use ListPublicKeys
keys , err = models . ListPublicKeys ( user . ID )
}
2015-12-03 00:24:37 -05:00
if err != nil {
2016-03-13 18:49:16 -04:00
ctx . Error ( 500 , "ListPublicKeys" , err )
2015-12-03 00:24:37 -05:00
return
}
apiLink := composePublicKeysAPILink ( )
apiKeys := make ( [ ] * api . PublicKey , len ( keys ) )
for i := range keys {
2016-03-13 23:20:22 -04:00
apiKeys [ i ] = convert . ToPublicKey ( apiLink , keys [ i ] )
2018-11-01 03:40:49 +00:00
if ctx . User . IsAdmin || ctx . User . ID == keys [ i ] . OwnerID {
apiKeys [ i ] , _ = appendPrivateInformation ( apiKeys [ i ] , keys [ i ] , user )
}
2015-12-03 00:24:37 -05:00
}
ctx . JSON ( 200 , & apiKeys )
}
2017-11-12 23:02:25 -08:00
// ListMyPublicKeys list all of the authenticated user's public keys
2016-03-13 18:49:16 -04:00
func ListMyPublicKeys ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /user/keys user userCurrentListKeys
// ---
// summary: List the authenticated user's public keys
2018-11-01 03:40:49 +00:00
// parameters:
// - name: fingerprint
// in: query
// description: fingerprint of the key
// type: string
2017-11-12 23:02:25 -08:00
// produces:
// - application/json
// responses:
// "200":
// "$ref": "#/responses/PublicKeyList"
2018-11-01 03:40:49 +00:00
listPublicKeys ( ctx , ctx . User )
2015-12-04 17:16:42 -05:00
}
2017-11-12 23:02:25 -08:00
// ListPublicKeys list the given user's public keys
2016-03-13 18:49:16 -04:00
func ListPublicKeys ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /users/{username}/keys user userListKeys
// ---
// summary: List the given user's public keys
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user
// type: string
// required: true
2018-11-01 03:40:49 +00:00
// - name: fingerprint
// in: query
// description: fingerprint of the key
// type: string
2017-11-12 23:02:25 -08:00
// responses:
// "200":
// "$ref": "#/responses/PublicKeyList"
2015-12-05 17:13:13 -05:00
user := GetUserByParams ( ctx )
2015-12-04 17:16:42 -05:00
if ctx . Written ( ) {
2015-12-03 00:24:37 -05:00
return
}
2018-11-01 03:40:49 +00:00
listPublicKeys ( ctx , user )
2015-12-03 00:24:37 -05:00
}
2017-11-12 23:02:25 -08:00
// GetPublicKey get a public key
2016-03-13 18:49:16 -04:00
func GetPublicKey ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation GET /user/keys/{id} user userCurrentGetKey
// ---
// summary: Get a public key
// produces:
// - application/json
// parameters:
// - name: id
// in: path
// description: id of key to get
// type: integer
2018-10-21 04:40:42 +01:00
// format: int64
2017-11-12 23:02:25 -08:00
// required: true
// responses:
// "200":
// "$ref": "#/responses/PublicKey"
// "404":
// "$ref": "#/responses/notFound"
2015-12-03 00:24:37 -05:00
key , err := models . GetPublicKeyByID ( ctx . ParamsInt64 ( ":id" ) )
if err != nil {
if models . IsErrKeyNotExist ( err ) {
2016-03-13 18:49:16 -04:00
ctx . Status ( 404 )
2015-12-03 00:24:37 -05:00
} else {
2016-03-13 18:49:16 -04:00
ctx . Error ( 500 , "GetPublicKeyByID" , err )
2015-12-03 00:24:37 -05:00
}
return
}
apiLink := composePublicKeysAPILink ( )
2018-11-01 03:40:49 +00:00
apiKey := convert . ToPublicKey ( apiLink , key )
if ctx . User . IsAdmin || ctx . User . ID == key . OwnerID {
apiKey , _ = appendPrivateInformation ( apiKey , key , ctx . User )
}
ctx . JSON ( 200 , apiKey )
2015-12-03 00:24:37 -05:00
}
2015-12-05 17:13:13 -05:00
// CreateUserPublicKey creates new public key to given user by ID.
2016-03-13 18:49:16 -04:00
func CreateUserPublicKey ( ctx * context . APIContext , form api . CreateKeyOption , uid int64 ) {
2015-12-03 00:24:37 -05:00
content , err := models . CheckPublicKeyString ( form . Key )
if err != nil {
2015-12-04 17:16:42 -05:00
repo . HandleCheckKeyStringError ( ctx , err )
2015-12-03 00:24:37 -05:00
return
}
2018-05-24 06:59:02 +02:00
key , err := models . AddPublicKey ( uid , form . Title , content , 0 )
2015-12-03 00:24:37 -05:00
if err != nil {
2015-12-04 17:16:42 -05:00
repo . HandleAddKeyError ( ctx , err )
2015-12-03 00:24:37 -05:00
return
}
apiLink := composePublicKeysAPILink ( )
2018-11-01 03:40:49 +00:00
apiKey := convert . ToPublicKey ( apiLink , key )
if ctx . User . IsAdmin || ctx . User . ID == key . OwnerID {
apiKey , _ = appendPrivateInformation ( apiKey , key , ctx . User )
}
ctx . JSON ( 201 , apiKey )
2015-12-04 17:16:42 -05:00
}
2016-11-24 15:04:31 +08:00
// CreatePublicKey create one public key for me
2016-03-13 18:49:16 -04:00
func CreatePublicKey ( ctx * context . APIContext , form api . CreateKeyOption ) {
2017-11-12 23:02:25 -08:00
// swagger:operation POST /user/keys user userCurrentPostKey
// ---
// summary: Create a public key
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateKeyOption"
// responses:
// "201":
// "$ref": "#/responses/PublicKey"
// "422":
// "$ref": "#/responses/validationError"
2016-07-24 01:08:22 +08:00
CreateUserPublicKey ( ctx , form , ctx . User . ID )
2015-12-03 00:24:37 -05:00
}
2017-11-12 23:02:25 -08:00
// DeletePublicKey delete one public key
2016-03-13 18:49:16 -04:00
func DeletePublicKey ( ctx * context . APIContext ) {
2017-11-12 23:02:25 -08:00
// swagger:operation DELETE /user/keys/{id} user userCurrentDeleteKey
// ---
// summary: Delete a public key
// produces:
// - application/json
// parameters:
// - name: id
// in: path
// description: id of key to delete
// type: integer
2018-10-21 04:40:42 +01:00
// format: int64
2017-11-12 23:02:25 -08:00
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "403":
// "$ref": "#/responses/forbidden"
2017-12-06 12:27:10 +02:00
// "404":
// "$ref": "#/responses/notFound"
2015-12-03 00:24:37 -05:00
if err := models . DeletePublicKey ( ctx . User , ctx . ParamsInt64 ( ":id" ) ) ; err != nil {
2017-12-06 12:27:10 +02:00
if models . IsErrKeyNotExist ( err ) {
ctx . Status ( 404 )
} else 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 , "DeletePublicKey" , err )
2015-12-03 00:24:37 -05:00
}
return
}
ctx . Status ( 204 )
}