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 (
2014-10-14 05:54:45 +04:00
"math"
2014-08-29 11:32:52 +04:00
"strings"
"github.com/Unknwon/com"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
2014-09-14 21:35:22 +04:00
"github.com/gogits/gogs/modules/setting"
2014-08-29 11:32:52 +04:00
)
const (
USERS base . TplName = "admin/user/list"
USER_NEW base . TplName = "admin/user/new"
USER_EDIT base . TplName = "admin/user/edit"
)
2014-08-29 16:50:43 +04:00
func pagination ( ctx * middleware . Context , count int64 , pageNum int ) int {
2014-10-10 11:28:21 +04:00
p := ctx . QueryInt ( "p" )
2014-08-29 11:32:52 +04:00
if p < 1 {
p = 1
}
curCount := int64 ( ( p - 1 ) * pageNum + pageNum )
2014-10-10 11:28:21 +04:00
if curCount >= count {
2014-10-14 05:54:45 +04:00
p = int ( math . Ceil ( float64 ( count ) / float64 ( pageNum ) ) )
2014-10-10 11:28:21 +04:00
} else {
2014-08-29 11:32:52 +04:00
ctx . Data [ "NextPageNum" ] = p + 1
}
if p > 1 {
ctx . Data [ "LastPageNum" ] = p - 1
}
2014-08-29 16:50:43 +04:00
return p
}
func Users ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
pageNum := 50
p := pagination ( ctx , models . CountUsers ( ) , pageNum )
2014-08-29 11:32:52 +04:00
2014-10-09 02:29:18 +04:00
users , err := models . GetUsers ( pageNum , ( p - 1 ) * pageNum )
2014-08-29 11:32:52 +04:00
if err != nil {
2014-08-29 16:50:43 +04:00
ctx . Handle ( 500 , "GetUsers" , err )
2014-08-29 11:32:52 +04:00
return
}
2014-10-09 02:29:18 +04:00
ctx . Data [ "Users" ] = users
2014-08-29 11:32:52 +04:00
ctx . HTML ( 200 , USERS )
}
func NewUser ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.new_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
auths , err := models . GetAuths ( )
if err != nil {
ctx . Handle ( 500 , "GetAuths" , err )
return
}
ctx . Data [ "LoginSources" ] = auths
ctx . HTML ( 200 , USER_NEW )
}
func NewUserPost ( ctx * middleware . Context , form auth . RegisterForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.new_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
if ctx . HasError ( ) {
ctx . HTML ( 200 , USER_NEW )
return
}
if form . Password != form . Retype {
ctx . Data [ "Err_Password" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.password_not_match" ) , USER_NEW , & form )
return
}
u := & models . User {
Name : form . UserName ,
Email : form . Email ,
Passwd : form . Password ,
IsActive : true ,
LoginType : models . PLAIN ,
}
if len ( form . LoginType ) > 0 {
// NOTE: need rewrite.
fields := strings . Split ( form . LoginType , "-" )
tp , _ := com . StrTo ( fields [ 0 ] ) . Int ( )
u . LoginType = models . LoginType ( tp )
u . LoginSource , _ = com . StrTo ( fields [ 1 ] ) . Int64 ( )
u . LoginName = form . LoginName
}
if err := models . CreateUser ( u ) ; err != nil {
switch err {
case models . ErrUserAlreadyExist :
ctx . Data [ "Err_UserName" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.username_been_taken" ) , USER_NEW , & form )
case models . ErrEmailAlreadyUsed :
ctx . Data [ "Err_Email" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.email_been_used" ) , USER_NEW , & form )
case models . ErrUserNameIllegal :
ctx . Data [ "Err_UserName" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.illegal_username" ) , USER_NEW , & form )
default :
ctx . Handle ( 500 , "CreateUser" , err )
}
return
}
log . Trace ( "Account created by admin(%s): %s" , ctx . User . Name , u . Name )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/admin/users" )
2014-08-29 11:32:52 +04:00
}
func EditUser ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.edit_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
uid := com . StrTo ( ctx . Params ( ":userid" ) ) . MustInt64 ( )
if uid == 0 {
ctx . Handle ( 404 , "EditUser" , nil )
return
}
u , err := models . GetUserById ( uid )
if err != nil {
ctx . Handle ( 500 , "GetUserById" , err )
return
}
ctx . Data [ "User" ] = u
auths , err := models . GetAuths ( )
if err != nil {
ctx . Handle ( 500 , "GetAuths" , err )
return
}
ctx . Data [ "LoginSources" ] = auths
ctx . HTML ( 200 , USER_EDIT )
}
func EditUserPost ( ctx * middleware . Context , form auth . AdminEditUserForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "admin.users.edit_account" )
ctx . Data [ "PageIsAdmin" ] = true
ctx . Data [ "PageIsAdminUsers" ] = true
uid := com . StrTo ( ctx . Params ( ":userid" ) ) . MustInt64 ( )
if uid == 0 {
ctx . Handle ( 404 , "EditUser" , nil )
return
}
u , err := models . GetUserById ( uid )
if err != nil {
ctx . Handle ( 500 , "GetUserById" , err )
return
}
if ctx . HasError ( ) {
ctx . HTML ( 200 , USER_EDIT )
return
}
2014-11-17 22:53:41 +03:00
// FIXME: need password length check
2014-08-29 11:32:52 +04:00
if len ( form . Passwd ) > 0 {
u . Passwd = form . Passwd
u . Salt = models . GetUserSalt ( )
u . EncodePasswd ( )
}
u . Email = form . Email
u . Website = form . Website
u . Location = form . Location
if len ( form . Avatar ) == 0 {
form . Avatar = form . Email
}
u . Avatar = base . EncodeMd5 ( form . Avatar )
u . AvatarEmail = form . Avatar
u . IsActive = form . Active
u . IsAdmin = form . Admin
2014-11-17 22:53:41 +03:00
u . AllowGitHook = form . AllowGitHook
2014-12-01 02:29:16 +03:00
ctx . Data [ "User" ] = u
2014-08-29 11:32:52 +04:00
if err := models . UpdateUser ( u ) ; err != nil {
2014-12-01 02:29:16 +03:00
if err == models . ErrEmailAlreadyUsed {
ctx . Data [ "Err_Email" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.email_been_used" ) , USER_EDIT , & form )
} else {
ctx . Handle ( 500 , "UpdateUser" , err )
}
2014-08-29 11:32:52 +04:00
return
}
log . Trace ( "Account profile updated by admin(%s): %s" , ctx . User . Name , u . Name )
ctx . Flash . Success ( ctx . Tr ( "admin.users.update_profile_success" ) )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/admin/users/" + ctx . Params ( ":userid" ) )
2014-08-29 11:32:52 +04:00
}
func DeleteUser ( ctx * middleware . Context ) {
uid := com . StrTo ( ctx . Params ( ":userid" ) ) . MustInt64 ( )
if uid == 0 {
ctx . Handle ( 404 , "DeleteUser" , nil )
return
}
u , err := models . GetUserById ( uid )
if err != nil {
ctx . Handle ( 500 , "GetUserById" , err )
return
}
if err = models . DeleteUser ( u ) ; err != nil {
switch err {
case models . ErrUserOwnRepos :
ctx . Flash . Error ( ctx . Tr ( "admin.users.still_own_repo" ) )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/admin/users/" + ctx . Params ( ":userid" ) )
2014-11-13 13:27:01 +03:00
case models . ErrUserHasOrgs :
ctx . Flash . Error ( ctx . Tr ( "admin.users.still_has_org" ) )
ctx . Redirect ( setting . AppSubUrl + "/admin/users/" + ctx . Params ( ":userid" ) )
2014-08-29 11:32:52 +04:00
default :
ctx . Handle ( 500 , "DeleteUser" , err )
}
return
}
log . Trace ( "Account deleted by admin(%s): %s" , ctx . User . Name , u . Name )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/admin/users" )
2014-08-29 11:32:52 +04:00
}