Skip to content

Commit e36e485

Browse files
committed
allow changing password or tier with user PUT
1 parent fa48639 commit e36e485

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

server/server_admin.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,10 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi
7474
req, err := readJSONWithLimit[apiUserAddOrUpdateRequest](r.Body, jsonBodyBytesLimit, false)
7575
if err != nil {
7676
return err
77-
} else if !user.AllowedUsername(req.Username) || req.Password == "" {
78-
return errHTTPBadRequest.Wrap("username invalid, or password missing")
77+
} else if !user.AllowedUsername(req.Username) {
78+
return errHTTPBadRequest.Wrap("username invalid")
79+
} else if req.Password == "" && req.Tier == "" {
80+
return errHTTPBadRequest.Wrap("need to provide at least one of \"password\" or \"tier\"")
7981
}
8082
u, err := s.userManager.User(req.Username)
8183
if err != nil && !errors.Is(err, user.ErrUserNotFound) {
@@ -84,10 +86,15 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi
8486
if u.IsAdmin() {
8587
return errHTTPForbidden
8688
}
87-
if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil {
89+
if req.Password != "" {
90+
if err := s.userManager.ChangePassword(req.Username, req.Password); err != nil {
91+
return err
92+
}
93+
}
94+
} else {
95+
if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil {
8896
return err
8997
}
90-
return s.writeJSON(w, newSuccessResponse())
9198
}
9299
var tier *user.Tier
93100
if req.Tier != "" {
@@ -98,9 +105,6 @@ func (s *Server) handleUsersUpdate(w http.ResponseWriter, r *http.Request, v *vi
98105
return err
99106
}
100107
}
101-
if err := s.userManager.AddUser(req.Username, req.Password, user.RoleUser); err != nil {
102-
return err
103-
}
104108
if tier != nil {
105109
if err := s.userManager.ChangeTier(req.Username, req.Tier); err != nil {
106110
return err

server/server_admin_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ func TestUser_AddRemove(t *testing.T) {
5757
require.Equal(t, "phil", users[0].Name)
5858
require.Equal(t, "emma", users[1].Name)
5959
require.Equal(t, user.Everyone, users[2].Name)
60+
61+
// Reject invalid user change
62+
rr = request(t, s, "PUT", "/v1/users", `{"username": "ben"}`, map[string]string{
63+
"Authorization": util.BasicAuth("phil", "phil"),
64+
})
65+
require.Equal(t, 400, rr.Code)
6066
}
6167

6268
func TestUser_ChangeUserPassword(t *testing.T) {
@@ -97,6 +103,46 @@ func TestUser_ChangeUserPassword(t *testing.T) {
97103
require.Equal(t, 200, rr.Code)
98104
}
99105

106+
func TestUser_ChangeUserTier(t *testing.T) {
107+
s := newTestServer(t, newTestConfigWithAuthFile(t))
108+
defer s.closeDatabases()
109+
110+
// Create admin, tier
111+
require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin))
112+
require.Nil(t, s.userManager.AddTier(&user.Tier{
113+
Code: "tier1",
114+
}))
115+
require.Nil(t, s.userManager.AddTier(&user.Tier{
116+
Code: "tier2",
117+
}))
118+
119+
// Create user with tier via API
120+
rr := request(t, s, "POST", "/v1/users", `{"username": "ben", "password":"ben", "tier": "tier1"}`, map[string]string{
121+
"Authorization": util.BasicAuth("phil", "phil"),
122+
})
123+
require.Equal(t, 200, rr.Code)
124+
125+
// Check users
126+
users, err := s.userManager.Users()
127+
require.Nil(t, err)
128+
require.Equal(t, 3, len(users))
129+
require.Equal(t, "phil", users[0].Name)
130+
require.Equal(t, "ben", users[1].Name)
131+
require.Equal(t, user.RoleUser, users[1].Role)
132+
require.Equal(t, "tier1", users[1].Tier.Code)
133+
134+
// Change user tier via API
135+
rr = request(t, s, "PUT", "/v1/users", `{"username": "ben", "tier": "tier2"}`, map[string]string{
136+
"Authorization": util.BasicAuth("phil", "phil"),
137+
})
138+
require.Equal(t, 200, rr.Code)
139+
140+
// Check users again
141+
users, err = s.userManager.Users()
142+
require.Nil(t, err)
143+
require.Equal(t, "tier2", users[1].Tier.Code)
144+
}
145+
100146
func TestUser_DontChangeAdminPassword(t *testing.T) {
101147
s := newTestServer(t, newTestConfigWithAuthFile(t))
102148
defer s.closeDatabases()

0 commit comments

Comments
 (0)