2015-12-06 01:13:13 +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.
package admin
import (
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/routers/api/v1/user"
2017-11-13 10:02:25 +03:00
api "code.gitea.io/sdk/gitea"
2015-12-06 01:13:13 +03:00
)
2016-03-14 01:49:16 +03:00
func parseLoginSource ( ctx * context . APIContext , u * models . User , sourceID int64 , loginName string ) {
2015-12-06 01:13:13 +03:00
if sourceID == 0 {
return
}
source , err := models . GetLoginSourceByID ( sourceID )
if err != nil {
2016-08-31 10:56:10 +03:00
if models . IsErrLoginSourceNotExist ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , err )
2015-12-06 01:13:13 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "GetLoginSourceByID" , err )
2015-12-06 01:13:13 +03:00
}
return
}
u . LoginType = source . Type
u . LoginSource = source . ID
u . LoginName = loginName
}
2017-11-13 10:02:25 +03:00
// CreateUser create a user
2016-03-14 01:49:16 +03:00
func CreateUser ( ctx * context . APIContext , form api . CreateUserOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation POST /admin/users admin adminCreateUser
// ---
// summary: Create a user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/CreateUserOption"
// responses:
// "201":
// "$ref": "#/responses/User"
// "403":
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"
2015-12-06 01:13:13 +03:00
u := & models . User {
Name : form . Username ,
2016-07-26 21:43:06 +03:00
FullName : form . FullName ,
2015-12-06 01:13:13 +03:00
Email : form . Email ,
Passwd : form . Password ,
IsActive : true ,
2016-11-07 19:30:04 +03:00
LoginType : models . LoginPlain ,
2015-12-06 01:13:13 +03:00
}
parseLoginSource ( ctx , u , form . SourceID , form . LoginName )
if ctx . Written ( ) {
return
}
if err := models . CreateUser ( u ) ; err != nil {
if models . IsErrUserAlreadyExist ( err ) ||
models . IsErrEmailAlreadyUsed ( err ) ||
models . IsErrNameReserved ( err ) ||
models . IsErrNamePatternNotAllowed ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , err )
2015-12-06 01:13:13 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "CreateUser" , err )
2015-12-06 01:13:13 +03:00
}
return
}
log . Trace ( "Account created by admin (%s): %s" , ctx . User . Name , u . Name )
2016-07-15 19:36:39 +03:00
// Send email notification.
2015-12-06 01:13:13 +03:00
if form . SendNotify && setting . MailService != nil {
2016-07-15 19:36:39 +03:00
models . SendRegisterNotifyMail ( ctx . Context . Context , u )
2015-12-06 01:13:13 +03:00
}
2016-08-14 14:17:26 +03:00
ctx . JSON ( 201 , u . APIFormat ( ) )
2015-12-06 01:13:13 +03:00
}
2016-11-24 10:04:31 +03:00
// EditUser api for modifying a user's information
2016-03-14 01:49:16 +03:00
func EditUser ( ctx * context . APIContext , form api . EditUserOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation PATCH /admin/users/{username} admin adminEditUser
// ---
// summary: Edit an existing user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user to edit
// type: string
// required: true
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/EditUserOption"
// responses:
// "200":
// "$ref": "#/responses/User"
// "403":
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"
2015-12-06 01:13:13 +03:00
u := user . GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
parseLoginSource ( ctx , u , form . SourceID , form . LoginName )
if ctx . Written ( ) {
return
}
if len ( form . Password ) > 0 {
u . Passwd = form . Password
2016-12-20 15:32:02 +03:00
var err error
if u . Salt , err = models . GetUserSalt ( ) ; err != nil {
ctx . Error ( 500 , "UpdateUser" , err )
return
}
2015-12-06 01:13:13 +03:00
u . EncodePasswd ( )
}
u . LoginName = form . LoginName
u . FullName = form . FullName
u . Email = form . Email
u . Website = form . Website
u . Location = form . Location
if form . Active != nil {
u . IsActive = * form . Active
}
if form . Admin != nil {
u . IsAdmin = * form . Admin
}
if form . AllowGitHook != nil {
u . AllowGitHook = * form . AllowGitHook
}
if form . AllowImportLocal != nil {
u . AllowImportLocal = * form . AllowImportLocal
}
2016-08-11 21:49:31 +03:00
if form . MaxRepoCreation != nil {
u . MaxRepoCreation = * form . MaxRepoCreation
}
2015-12-06 01:13:13 +03:00
if err := models . UpdateUser ( u ) ; err != nil {
if models . IsErrEmailAlreadyUsed ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , err )
2015-12-06 01:13:13 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "UpdateUser" , err )
2015-12-06 01:13:13 +03:00
}
return
}
log . Trace ( "Account profile updated by admin (%s): %s" , ctx . User . Name , u . Name )
2016-08-14 14:17:26 +03:00
ctx . JSON ( 200 , u . APIFormat ( ) )
2015-12-06 01:13:13 +03:00
}
2016-11-24 10:04:31 +03:00
// DeleteUser api for deleting a user
2016-03-14 01:49:16 +03:00
func DeleteUser ( ctx * context . APIContext ) {
2017-11-13 10:02:25 +03:00
// swagger:operation DELETE /admin/users/{username} admin adminDeleteUser
// ---
// summary: Delete a user
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user to delete
// type: string
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "403":
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"
2015-12-06 01:13:13 +03:00
u := user . GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
if err := models . DeleteUser ( u ) ; err != nil {
if models . IsErrUserOwnRepos ( err ) ||
models . IsErrUserHasOrgs ( err ) {
2016-03-14 01:49:16 +03:00
ctx . Error ( 422 , "" , err )
2015-12-06 01:13:13 +03:00
} else {
2016-03-14 01:49:16 +03:00
ctx . Error ( 500 , "DeleteUser" , err )
2015-12-06 01:13:13 +03:00
}
return
}
log . Trace ( "Account deleted by admin(%s): %s" , ctx . User . Name , u . Name )
ctx . Status ( 204 )
}
2016-11-24 10:04:31 +03:00
// CreatePublicKey api for creating a public key to a user
2016-03-14 01:49:16 +03:00
func CreatePublicKey ( ctx * context . APIContext , form api . CreateKeyOption ) {
2017-11-13 10:02:25 +03:00
// swagger:operation POST /admin/users/{username}/keys admin adminCreatePublicKey
// ---
// summary: Add a public key on behalf of a user
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of the user
// type: string
// required: true
// responses:
// "201":
// "$ref": "#/responses/PublicKey"
// "403":
// "$ref": "#/responses/forbidden"
// "422":
// "$ref": "#/responses/validationError"
2015-12-06 01:13:13 +03:00
u := user . GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
2016-07-23 20:08:22 +03:00
user . CreateUserPublicKey ( ctx , form , u . ID )
2015-12-06 01:13:13 +03:00
}
2017-12-06 13:27:10 +03:00
// DeleteUserPublicKey api for deleting a user's public key
func DeleteUserPublicKey ( ctx * context . APIContext ) {
// swagger:operation DELETE /admin/users/{username}/keys/{id} admin adminDeleteUserPublicKey
// ---
// summary: Delete a user's public key
// produces:
// - application/json
// parameters:
// - name: username
// in: path
// description: username of user
// type: string
// required: true
// - name: id
// in: path
// description: id of the key to delete
// type: integer
// required: true
// responses:
// "204":
// "$ref": "#/responses/empty"
// "403":
// "$ref": "#/responses/forbidden"
// "404":
// "$ref": "#/responses/notFound"
u := user . GetUserByParams ( ctx )
if ctx . Written ( ) {
return
}
if err := models . DeletePublicKey ( u , ctx . ParamsInt64 ( ":id" ) ) ; err != nil {
if models . IsErrKeyNotExist ( err ) {
ctx . Status ( 404 )
} else if models . IsErrKeyAccessDenied ( err ) {
ctx . Error ( 403 , "" , "You do not have access to this key" )
} else {
ctx . Error ( 500 , "DeleteUserPublicKey" , err )
}
return
}
log . Trace ( "Key deleted by admin(%s): %s" , ctx . User . Name , u . Name )
ctx . Status ( 204 )
}