Skip to content

Commit 4b0a3e8

Browse files
authored
feat(api,cli): admin can update username (#6508)
1 parent ac32454 commit 4b0a3e8

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

cli/cdsctl/admin_user.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,41 @@ var adminUsersCmd = cli.Command{
1818
func adminUsers() *cobra.Command {
1919
return cli.NewCommand(adminUsersCmd, nil, []*cobra.Command{
2020
cli.NewCommand(adminUserSetOrganizationCmd, adminUserSetOrganizationRun, nil),
21+
cli.NewCommand(adminUserRenameCmd, adminUserRenameRun, nil),
2122
})
2223
}
2324

25+
var adminUserRenameCmd = cli.Command{
26+
Name: "rename",
27+
Short: "Rename a given user",
28+
Args: []cli.Arg{
29+
{
30+
Name: "username",
31+
},
32+
{
33+
Name: "new-username",
34+
},
35+
},
36+
}
37+
38+
func adminUserRenameRun(v cli.Values) error {
39+
ctx := context.Background()
40+
username := v.GetString("username")
41+
usernameNew := v.GetString("new-username")
42+
43+
u, err := client.UserGet(ctx, username)
44+
if err != nil {
45+
return err
46+
}
47+
u.Username = usernameNew
48+
if err := client.UserUpdate(ctx, username, u); err != nil {
49+
return err
50+
}
51+
52+
fmt.Printf("User %q has been renamed to %q\n", username, usernameNew)
53+
return nil
54+
}
55+
2456
var adminUserSetOrganizationCmd = cli.Command{
2557
Name: "set-organization",
2658
Short: "Set organization for given user",

engine/api/auth.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ func (api *API) postAuthSigninHandler() service.Handler {
128128
return err
129129
}
130130

131+
ctx = context.WithValue(ctx, cdslog.AuthUsername, userInfo.Username)
132+
SetTracker(w, cdslog.AuthUsername, userInfo.Username)
133+
131134
tx, err := api.mustDB().Begin()
132135
if err != nil {
133136
return sdk.WithStack(err)

engine/api/user.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,18 @@ func (api *API) putUserHandler() service.Handler {
8383
}
8484

8585
newUser := *oldUser
86+
87+
if oldUser.Username != data.Username {
88+
// Only an admin can change the username
89+
if isAdmin(ctx) {
90+
trackSudo(ctx, w)
91+
log.Info(ctx, "putUserHandler> %s change username of user %s from %s to %s", consumer.AuthConsumerUser.AuthentifiedUserID, oldUser.ID, oldUser.Username, data.Username)
92+
newUser.Username = data.Username
93+
} else {
94+
return sdk.WithStack(sdk.ErrForbidden)
95+
}
96+
}
97+
8698
newUser.Fullname = data.Fullname
8799

88100
// Only an admin can change the ring of a user
@@ -116,7 +128,7 @@ func (api *API) putUserHandler() service.Handler {
116128
}
117129

118130
newUser.Ring = data.Ring
119-
log.Debug(ctx, "putUserHandler> %s change ring of user %s from %s to %s", consumer.AuthConsumerUser.AuthentifiedUserID, oldUser.ID, oldUser.Ring, newUser.Ring)
131+
log.Info(ctx, "putUserHandler> %s change ring of user %s from %s to %s", consumer.AuthConsumerUser.AuthentifiedUserID, oldUser.ID, oldUser.Ring, newUser.Ring)
120132
}
121133

122134
if err := user.Update(ctx, tx, &newUser); err != nil {

engine/api/user_test.go

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,11 @@ func Test_putUserHandler(t *testing.T) {
8181
ExpectedStatus int
8282
}{
8383
{
84-
Name: "A lambda user can't change username but can change fullname",
84+
Name: "A lambda user can change fullname",
8585
JWT: jwtInitialRaw,
8686
TargetUsername: initial.Username,
8787
Data: sdk.AuthentifiedUser{
88-
Username: sdk.RandomString(10),
88+
Username: initial.Username,
8989
Fullname: initialNewFullname,
9090
Ring: initial.Ring,
9191
},
@@ -97,6 +97,23 @@ func Test_putUserHandler(t *testing.T) {
9797
},
9898
ExpectedStatus: http.StatusOK,
9999
},
100+
{
101+
Name: "A lambda user can't change username",
102+
JWT: jwtInitialRaw,
103+
TargetUsername: initial.Username,
104+
Data: sdk.AuthentifiedUser{
105+
Username: sdk.RandomString(10),
106+
Fullname: initialNewFullname,
107+
Ring: initial.Ring,
108+
},
109+
Expected: sdk.AuthentifiedUser{
110+
Username: initial.Username,
111+
Fullname: initialNewFullname,
112+
Ring: initial.Ring,
113+
Organization: "default",
114+
},
115+
ExpectedStatus: http.StatusForbidden,
116+
},
100117
{
101118
Name: "A lambda user can't change its ring",
102119
JWT: jwtInitialRaw,
@@ -190,6 +207,23 @@ func Test_putUserHandler(t *testing.T) {
190207
},
191208
ExpectedStatus: http.StatusForbidden,
192209
},
210+
{
211+
Name: "A admin user can change username",
212+
JWT: jwtAdmin2Raw,
213+
TargetUsername: initial.Username,
214+
Data: sdk.AuthentifiedUser{
215+
Username: initial.Username + ".updated",
216+
Fullname: initialNewFullname,
217+
Ring: sdk.UserRingMaintainer,
218+
},
219+
Expected: sdk.AuthentifiedUser{
220+
Username: initial.Username + ".updated",
221+
Fullname: initialNewFullname,
222+
Ring: sdk.UserRingMaintainer,
223+
Organization: "default",
224+
},
225+
ExpectedStatus: http.StatusOK,
226+
},
193227
}
194228

195229
o := sdk.Organization{Name: "my-org"}

0 commit comments

Comments
 (0)