Skip to content

Commit 2c5edbd

Browse files
committed
Add option to change username to the admin panel
1 parent 89cd4dd commit 2c5edbd

File tree

5 files changed

+94
-2
lines changed

5 files changed

+94
-2
lines changed

integrations/admin_user_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright 2017 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package integrations
6+
7+
import (
8+
"net/http"
9+
"strconv"
10+
"testing"
11+
12+
"code.gitea.io/gitea/models"
13+
"github.com/stretchr/testify/assert"
14+
)
15+
16+
func TestAdminViewUsers(t *testing.T) {
17+
prepareTestEnv(t)
18+
19+
session := loginUser(t, "user1")
20+
req := NewRequest(t, "GET", "/admin/users")
21+
session.MakeRequest(t, req, http.StatusOK)
22+
23+
session = loginUser(t, "user2")
24+
req = NewRequest(t, "GET", "/admin/users")
25+
session.MakeRequest(t, req, http.StatusForbidden)
26+
}
27+
28+
func TestAdminViewUser(t *testing.T) {
29+
prepareTestEnv(t)
30+
31+
session := loginUser(t, "user1")
32+
req := NewRequest(t, "GET", "/admin/users/1")
33+
session.MakeRequest(t, req, http.StatusOK)
34+
35+
session = loginUser(t, "user2")
36+
req = NewRequest(t, "GET", "/admin/users/1")
37+
session.MakeRequest(t, req, http.StatusForbidden)
38+
}
39+
40+
func TestAdminEditUser(t *testing.T) {
41+
prepareTestEnv(t)
42+
43+
testSuccessfullEdit(t, models.User{ID: 2, Name: "newusername", LoginName: "otherlogin", Email: "[email protected]"})
44+
}
45+
46+
func testSuccessfullEdit(t *testing.T, formData models.User) {
47+
makeRequest(t, formData, http.StatusFound)
48+
}
49+
50+
func makeRequest(t *testing.T, formData models.User, headerCode int) {
51+
session := loginUser(t, "user1")
52+
csrf := GetCSRF(t, session, "/admin/users/"+strconv.Itoa(int(formData.ID)))
53+
req := NewRequestWithValues(t, "POST", "/admin/users/"+strconv.Itoa(int(formData.ID)), map[string]string{
54+
"_csrf": csrf,
55+
"user_name": formData.Name,
56+
"login_name": formData.LoginName,
57+
"login_type": "0-0",
58+
"email": formData.Email,
59+
})
60+
61+
session.MakeRequest(t, req, headerCode)
62+
user := models.AssertExistsAndLoadBean(t, &models.User{ID: formData.ID}).(*models.User)
63+
assert.Equal(t, formData.Name, user.Name)
64+
assert.Equal(t, formData.LoginName, user.LoginName)
65+
assert.Equal(t, formData.Email, user.Email)
66+
}
67+
68+
func TestAdminDeleteUser(t *testing.T) {
69+
prepareTestEnv(t)
70+
71+
session := loginUser(t, "user1")
72+
73+
csrf := GetCSRF(t, session, "/admin/users/8")
74+
req := NewRequestWithValues(t, "POST", "/admin/users/8/delete", map[string]string{
75+
"_csrf": csrf,
76+
})
77+
session.MakeRequest(t, req, http.StatusOK)
78+
79+
models.AssertNotExistsBean(t, &models.User{ID: 8})
80+
models.CheckConsistencyFor(t, &models.User{})
81+
}

modules/auth/admin.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func (f *AdminCreateUserForm) Validate(ctx *macaron.Context, errs binding.Errors
2828
// AdminEditUserForm form for admin to create user
2929
type AdminEditUserForm struct {
3030
LoginType string `binding:"Required"`
31+
UserName string `binding:"AlphaDashDot;MaxSize(35)"`
3132
LoginName string
3233
FullName string `binding:"MaxSize(100)"`
3334
Email string `binding:"Required;Email;MaxSize(254)"`

public/js/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,6 +1015,7 @@ function initAdmin() {
10151015
$('.admin.edit.user').length > 0) {
10161016
$('#login_type').change(function () {
10171017
if ($(this).val().substring(0, 1) == '0') {
1018+
$('#user_name').removeAttr('disabled');
10181019
$('#login_name').removeAttr('required');
10191020
$('.non-local').hide();
10201021
$('.local').show();
@@ -1025,6 +1026,7 @@ function initAdmin() {
10251026
}
10261027

10271028
} else {
1029+
$('#user_name').attr('disabled', 'disabled');
10281030
$('#login_name').attr('required', 'required');
10291031
$('.non-local').show();
10301032
$('.local').hide();

routers/admin/users.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,14 @@ func EditUserPost(ctx *context.Context, form auth.AdminEditUserForm) {
205205
u.EncodePasswd()
206206
}
207207

208+
if u.IsLocal() && len(form.UserName) > 0 && u.Name != form.UserName {
209+
if err := models.ChangeUserName(u, form.UserName); err != nil {
210+
ctx.Handle(500, "ChangeUserName", err)
211+
return
212+
}
213+
u.Name = form.UserName
214+
}
215+
208216
u.LoginName = form.LoginName
209217
u.FullName = form.FullName
210218
u.Email = form.Email

templates/admin/user/edit.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
<div class="ui attached segment">
1010
<form class="ui form" action="{{.Link}}" method="post">
1111
{{.CsrfTokenHtml}}
12-
<div class="inline field {{if .Err_UserName}}error{{end}}">
12+
<div class="field {{if .Err_UserName}}error{{end}}">
1313
<label for="user_name">{{.i18n.Tr "username"}}</label>
14-
<span>{{.User.Name}}</span>
14+
<input id="user_name" name="user_name" value="{{.User.Name}}" autofocus {{if not .User.IsLocal }}disabled{{end}}>
1515
</div>
1616
<!-- Types and name -->
1717
<div class="inline required field {{if .Err_LoginType}}error{{end}}">

0 commit comments

Comments
 (0)