2014-08-29 11:32:52 +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 admin
import (
"strings"
"github.com/Unknwon/com"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/routers"
2014-08-29 11:32:52 +04:00
)
const (
2016-11-21 06:21:24 +03:00
tplUsers base . TplName = "admin/user/list"
tplUserNew base . TplName = "admin/user/new"
tplUserEdit base . TplName = "admin/user/edit"
2014-08-29 11:32:52 +04:00
)
2016-11-21 06:21:24 +03:00
// Users show all the users
2016-03-11 19:56:52 +03:00
func Users ( ctx * context . Context ) {
2014-08-29 16:50:43 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
2017-10-24 20:36:19 +03:00
routers . RenderUserSearch ( ctx , & models . SearchUserOptions {
2016-11-07 19:53:22 +03:00
Type : models . UserTypeIndividual ,
2016-07-23 19:23:54 +03:00
PageSize : setting . UI . Admin . UserPagingNum ,
2017-10-24 20:36:19 +03:00
} , tplUsers )
2014-08-29 11:32:52 +04:00
}
2016-11-21 06:21:24 +03:00
// NewUser render adding a new user page
2016-03-11 19:56:52 +03:00
func NewUser ( ctx * context . Context ) {
2014-08-29 11:32:52 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.new_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
2015-09-13 16:51:51 +03:00
ctx . Data [ "login_type" ] = "0-0"
sources , err := models . LoginSources ( )
2014-08-29 11:32:52 +04:00
if err != nil {
2015-09-13 16:51:51 +03:00
ctx . Handle ( 500 , "LoginSources" , err )
2014-08-29 11:32:52 +04:00
return
}
2015-09-13 16:51:51 +03:00
ctx . Data [ "Sources" ] = sources
2015-09-26 02:45:44 +03:00
ctx . Data [ "CanSendEmail" ] = setting . MailService != nil
2016-11-21 06:21:24 +03:00
ctx . HTML ( 200 , tplUserNew )
2014-08-29 11:32:52 +04:00
}
2016-11-21 06:21:24 +03:00
// NewUserPost response for adding a new user
2016-11-27 09:03:59 +03:00
func NewUserPost ( ctx * context . Context , form auth . AdminCreateUserForm ) {
2014-08-29 11:32:52 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.new_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
2015-09-13 16:51:51 +03:00
sources , err := models . LoginSources ( )
if err != nil {
ctx . Handle ( 500 , "LoginSources" , err )
2014-08-29 11:32:52 +04:00
return
}
2015-09-13 16:51:51 +03:00
ctx . Data [ "Sources" ] = sources
2014-08-29 11:32:52 +04:00
2015-09-26 02:45:44 +03:00
ctx . Data [ "CanSendEmail" ] = setting . MailService != nil
2015-09-13 16:51:51 +03:00
if ctx . HasError ( ) {
2016-11-21 06:21:24 +03:00
ctx . HTML ( 200 , tplUserNew )
2014-08-29 11:32:52 +04:00
return
}
u := & models . User {
Name : form . UserName ,
Email : form . Email ,
Passwd : form . Password ,
IsActive : true ,
2016-11-07 19:30:04 +03:00
LoginType : models . LoginPlain ,
2014-08-29 11:32:52 +04:00
}
if len ( form . LoginType ) > 0 {
fields := strings . Split ( form . LoginType , "-" )
2015-09-13 16:51:51 +03:00
if len ( fields ) == 2 {
u . LoginType = models . LoginType ( com . StrTo ( fields [ 0 ] ) . MustInt ( ) )
u . LoginSource = com . StrTo ( fields [ 1 ] ) . MustInt64 ( )
u . LoginName = form . LoginName
}
2014-08-29 11:32:52 +04:00
}
if err := models . CreateUser ( u ) ; err != nil {
2015-03-27 00:11:47 +03:00
switch {
case models . IsErrUserAlreadyExist ( err ) :
2014-08-29 11:32:52 +04:00
ctx . Data [ "Err_UserName" ] = true
2016-11-21 06:21:24 +03:00
ctx . RenderWithErr ( ctx . Tr ( "form.username_been_taken" ) , tplUserNew , & form )
2015-03-27 00:11:47 +03:00
case models . IsErrEmailAlreadyUsed ( err ) :
2014-08-29 11:32:52 +04:00
ctx . Data [ "Err_Email" ] = true
2016-11-21 06:21:24 +03:00
ctx . RenderWithErr ( ctx . Tr ( "form.email_been_used" ) , tplUserNew , & form )
2015-03-27 00:11:47 +03:00
case models . IsErrNameReserved ( err ) :
2014-08-29 11:32:52 +04:00
ctx . Data [ "Err_UserName" ] = true
2016-11-21 06:21:24 +03:00
ctx . RenderWithErr ( ctx . Tr ( "user.form.name_reserved" , err . ( models . ErrNameReserved ) . Name ) , tplUserNew , & form )
2015-03-27 00:11:47 +03:00
case models . IsErrNamePatternNotAllowed ( err ) :
ctx . Data [ "Err_UserName" ] = true
2016-11-21 06:21:24 +03:00
ctx . RenderWithErr ( ctx . Tr ( "user.form.name_pattern_not_allowed" , err . ( models . ErrNamePatternNotAllowed ) . Pattern ) , tplUserNew , & form )
2014-08-29 11:32:52 +04:00
default :
ctx . Handle ( 500 , "CreateUser" , err )
}
return
}
2015-12-06 01:13:13 +03:00
log . Trace ( "Account created by admin (%s): %s" , ctx . User . Name , u . Name )
2015-09-13 16:51:51 +03:00
2016-07-15 19:36:39 +03:00
// Send email notification.
2015-09-26 02:45:44 +03:00
if form . SendNotify && setting . MailService != nil {
2016-07-15 19:36:39 +03:00
models . SendRegisterNotifyMail ( ctx . Context , u )
2015-09-26 02:45:44 +03:00
}
2015-09-13 16:51:51 +03:00
ctx . Flash . Success ( ctx . Tr ( "admin.users.new_success" , u . Name ) )
2016-11-27 13:14:25 +03:00
ctx . Redirect ( setting . AppSubURL + "/admin/users/" + com . ToStr ( u . ID ) )
2014-08-29 11:32:52 +04:00
}
2016-03-11 19:56:52 +03:00
func prepareUserInfo ( ctx * context . Context ) * models . User {
2015-09-13 18:07:21 +03:00
u , err := models . GetUserByID ( ctx . ParamsInt64 ( ":userid" ) )
2014-08-29 11:32:52 +04:00
if err != nil {
2015-08-08 17:43:14 +03:00
ctx . Handle ( 500 , "GetUserByID" , err )
2015-09-13 18:07:21 +03:00
return nil
2014-08-29 11:32:52 +04:00
}
ctx . Data [ "User" ] = u
2015-09-13 16:51:51 +03:00
2015-09-13 18:07:21 +03:00
if u . LoginSource > 0 {
ctx . Data [ "LoginSource" ] , err = models . GetLoginSourceByID ( u . LoginSource )
if err != nil {
ctx . Handle ( 500 , "GetLoginSourceByID" , err )
return nil
}
} else {
ctx . Data [ "LoginSource" ] = & models . LoginSource { }
}
2015-09-13 16:51:51 +03:00
sources , err := models . LoginSources ( )
2014-08-29 11:32:52 +04:00
if err != nil {
2015-09-13 16:51:51 +03:00
ctx . Handle ( 500 , "LoginSources" , err )
2015-09-13 18:07:21 +03:00
return nil
2014-08-29 11:32:52 +04:00
}
2015-09-13 18:07:21 +03:00
ctx . Data [ "Sources" ] = sources
return u
2014-08-29 11:32:52 +04:00
}
2016-11-21 06:21:24 +03:00
// EditUser show editting user page
2016-03-11 19:56:52 +03:00
func EditUser ( ctx * context . Context ) {
2014-08-29 11:32:52 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.edit_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
2017-02-14 15:16:00 +03:00
ctx . Data [ "DisableRegularOrgCreation" ] = setting . Admin . DisableRegularOrgCreation
2014-08-29 11:32:52 +04:00
2015-09-13 18:07:21 +03:00
prepareUserInfo ( ctx )
if ctx . Written ( ) {
2014-08-29 11:32:52 +04:00
return
}
2016-11-21 06:21:24 +03:00
ctx . HTML ( 200 , tplUserEdit )
2015-09-13 18:07:21 +03:00
}
2016-11-21 06:21:24 +03:00
// EditUserPost response for editting user
2016-03-11 19:56:52 +03:00
func EditUserPost ( ctx * context . Context , form auth . AdminEditUserForm ) {
2015-09-13 18:07:21 +03:00
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.edit_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
u := prepareUserInfo ( ctx )
if ctx . Written ( ) {
2014-08-29 11:32:52 +04:00
return
}
if ctx . HasError ( ) {
2016-11-21 06:21:24 +03:00
ctx . HTML ( 200 , tplUserEdit )
2014-08-29 11:32:52 +04:00
return
}
2015-09-13 18:07:21 +03:00
fields := strings . Split ( form . LoginType , "-" )
if len ( fields ) == 2 {
loginType := models . LoginType ( com . StrTo ( fields [ 0 ] ) . MustInt ( ) )
loginSource := com . StrTo ( fields [ 1 ] ) . MustInt64 ( )
if u . LoginSource != loginSource {
u . LoginSource = loginSource
u . LoginType = loginType
}
}
2015-03-17 10:21:58 +03:00
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 . Handle ( 500 , "UpdateUser" , err )
return
}
2014-08-29 11:32:52 +04:00
u . EncodePasswd ( )
}
2015-09-13 18:26:25 +03:00
u . LoginName = form . LoginName
2015-04-28 18:59:05 +03:00
u . FullName = form . FullName
2014-08-29 11:32:52 +04:00
u . Email = form . Email
u . Website = form . Website
u . Location = form . Location
2015-12-10 20:37:53 +03:00
u . MaxRepoCreation = form . MaxRepoCreation
2014-08-29 11:32:52 +04:00
u . IsActive = form . Active
u . IsAdmin = form . Admin
2014-11-17 22:53:41 +03:00
u . AllowGitHook = form . AllowGitHook
2015-11-04 02:40:52 +03:00
u . AllowImportLocal = form . AllowImportLocal
2016-12-31 05:33:30 +03:00
u . AllowCreateOrganization = form . AllowCreateOrganization
2016-07-16 05:22:16 +03:00
u . ProhibitLogin = form . ProhibitLogin
2014-12-01 02:29:16 +03:00
2014-08-29 11:32:52 +04:00
if err := models . UpdateUser ( u ) ; err != nil {
2015-03-27 00:11:47 +03:00
if models . IsErrEmailAlreadyUsed ( err ) {
2014-12-01 02:29:16 +03:00
ctx . Data [ "Err_Email" ] = true
2016-11-21 06:21:24 +03:00
ctx . RenderWithErr ( ctx . Tr ( "form.email_been_used" ) , tplUserEdit , & form )
2014-12-01 02:29:16 +03:00
} else {
ctx . Handle ( 500 , "UpdateUser" , err )
}
2014-08-29 11:32:52 +04:00
return
}
2015-12-06 01:13:13 +03:00
log . Trace ( "Account profile updated by admin (%s): %s" , ctx . User . Name , u . Name )
2015-09-13 18:07:21 +03:00
2014-08-29 11:32:52 +04:00
ctx . Flash . Success ( ctx . Tr ( "admin.users.update_profile_success" ) )
2016-11-27 13:14:25 +03:00
ctx . Redirect ( setting . AppSubURL + "/admin/users/" + ctx . Params ( ":userid" ) )
2014-08-29 11:32:52 +04:00
}
2016-11-21 06:21:24 +03:00
// DeleteUser response for deleting a user
2016-03-11 19:56:52 +03:00
func DeleteUser ( ctx * context . Context ) {
2015-09-13 20:26:20 +03:00
u , err := models . GetUserByID ( ctx . ParamsInt64 ( ":userid" ) )
2014-08-29 11:32:52 +04:00
if err != nil {
2015-08-08 17:43:14 +03:00
ctx . Handle ( 500 , "GetUserByID" , err )
2014-08-29 11:32:52 +04:00
return
}
if err = models . DeleteUser ( u ) ; err != nil {
2015-03-18 04:51:39 +03:00
switch {
case models . IsErrUserOwnRepos ( err ) :
2014-08-29 11:32:52 +04:00
ctx . Flash . Error ( ctx . Tr ( "admin.users.still_own_repo" ) )
2015-09-13 20:26:20 +03:00
ctx . JSON ( 200 , map [ string ] interface { } {
2016-11-27 13:14:25 +03:00
"redirect" : setting . AppSubURL + "/admin/users/" + ctx . Params ( ":userid" ) ,
2015-09-13 20:26:20 +03:00
} )
2015-03-18 04:51:39 +03:00
case models . IsErrUserHasOrgs ( err ) :
2014-11-13 13:27:01 +03:00
ctx . Flash . Error ( ctx . Tr ( "admin.users.still_has_org" ) )
2015-09-13 20:26:20 +03:00
ctx . JSON ( 200 , map [ string ] interface { } {
2016-11-27 13:14:25 +03:00
"redirect" : setting . AppSubURL + "/admin/users/" + ctx . Params ( ":userid" ) ,
2015-09-13 20:26:20 +03:00
} )
2014-08-29 11:32:52 +04:00
default :
ctx . Handle ( 500 , "DeleteUser" , err )
}
return
}
2015-12-06 01:13:13 +03:00
log . Trace ( "Account deleted by admin (%s): %s" , ctx . User . Name , u . Name )
2015-09-13 20:26:20 +03:00
ctx . Flash . Success ( ctx . Tr ( "admin.users.deletion_success" ) )
ctx . JSON ( 200 , map [ string ] interface { } {
2016-11-27 13:14:25 +03:00
"redirect" : setting . AppSubURL + "/admin/users" ,
2015-09-13 20:26:20 +03:00
} )
2014-08-29 11:32:52 +04:00
}