Skip to content

Commit d09ea4e

Browse files
committed
fix: don't drop oidc_id when updating users
1 parent ad137d6 commit d09ea4e

2 files changed

Lines changed: 33 additions & 16 deletions

File tree

api/user.go

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -445,35 +445,32 @@ func (a *UserAPI) ChangePassword(ctx *gin.Context) {
445445
// $ref: "#/definitions/Error"
446446
func (a *UserAPI) UpdateUserByID(ctx *gin.Context) {
447447
withID(ctx, "id", func(id uint) {
448-
var user *model.UpdateUserExternal
449-
if err := ctx.Bind(&user); err == nil {
450-
oldUser, err := a.DB.GetUserByID(id)
448+
var updatedUser *model.UpdateUserExternal
449+
if err := ctx.Bind(&updatedUser); err == nil {
450+
dbUser, err := a.DB.GetUserByID(id)
451451
if success := successOrAbort(ctx, 500, err); !success {
452452
return
453453
}
454-
if oldUser != nil {
454+
if dbUser != nil {
455455
adminCount, err := a.DB.CountUser(&model.User{Admin: true})
456456
if success := successOrAbort(ctx, 500, err); !success {
457457
return
458458
}
459-
if !user.Admin && oldUser.Admin && adminCount == 1 {
459+
if !updatedUser.Admin && dbUser.Admin && adminCount == 1 {
460460
ctx.AbortWithError(400, errors.New("cannot delete last admin"))
461461
return
462462
}
463-
internal := &model.User{
464-
ID: oldUser.ID,
465-
Name: user.Name,
466-
Admin: user.Admin,
467-
Pass: oldUser.Pass,
468-
CreatedAt: oldUser.CreatedAt,
469-
}
470-
if user.Pass != "" {
471-
internal.Pass = password.CreatePassword(user.Pass, a.PasswordStrength)
463+
464+
dbUser.Name = updatedUser.Name
465+
dbUser.Admin = updatedUser.Admin
466+
467+
if updatedUser.Pass != "" {
468+
dbUser.Pass = password.CreatePassword(updatedUser.Pass, a.PasswordStrength)
472469
}
473-
if success := successOrAbort(ctx, 500, a.DB.UpdateUser(internal)); !success {
470+
if success := successOrAbort(ctx, 500, a.DB.UpdateUser(dbUser)); !success {
474471
return
475472
}
476-
ctx.JSON(200, toExternalUser(internal))
473+
ctx.JSON(200, toExternalUser(dbUser))
477474
} else {
478475
ctx.AbortWithError(404, errors.New("user does not exist"))
479476
}

api/user_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,26 @@ func (s *UserSuite) Test_UpdateUserByID_UpdatePassword() {
392392
assert.True(s.T(), password.ComparePassword(user.Pass, []byte("new")))
393393
}
394394

395+
func (s *UserSuite) Test_UpdateUserByID_PreservesOIDCID() {
396+
oidcID := "https://issuer.example.com#subject"
397+
s.db.CreateUser(&model.User{ID: 2, Name: "nico", OIDCID: &oidcID})
398+
399+
s.ctx.Params = gin.Params{{Key: "id", Value: "2"}}
400+
401+
s.ctx.Request = httptest.NewRequest("POST", "/user/2", strings.NewReader(`{"name": "tom", "pass": "", "admin": true}`))
402+
s.ctx.Request.Header.Set("Content-Type", "application/json")
403+
404+
s.a.UpdateUserByID(s.ctx)
405+
406+
assert.Equal(s.T(), 200, s.recorder.Code)
407+
user, err := s.db.GetUserByID(2)
408+
assert.NoError(s.T(), err)
409+
assert.NotNil(s.T(), user)
410+
if assert.NotNil(s.T(), user.OIDCID) {
411+
assert.Equal(s.T(), oidcID, *user.OIDCID)
412+
}
413+
}
414+
395415
func (s *UserSuite) Test_UpdatePassword() {
396416
s.db.CreateUser(&model.User{ID: 1, Name: "jmattheis", Pass: password.CreatePassword("old", 5)})
397417

0 commit comments

Comments
 (0)