Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions cmd/admin_user_change_password.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
user_model "code.gitea.io/gitea/models/user"
pwd "code.gitea.io/gitea/modules/auth/password"
"code.gitea.io/gitea/modules/setting"
user_service "code.gitea.io/gitea/services/user"

"github.com/urfave/cli/v2"
)
Expand Down Expand Up @@ -65,11 +66,8 @@ func runChangePassword(c *cli.Context) error {
if err != nil {
return err
}
if err = user.SetPassword(c.String("password")); err != nil {
return err
}

if err = user_model.UpdateUserCols(ctx, user, "passwd", "passwd_hash_algo", "salt"); err != nil {
if err := user_service.ChangePassword(ctx, user, c.String("password"), user.MustChangePassword); err != nil {
return err
}

Expand Down
5 changes: 5 additions & 0 deletions models/auth/auth_token.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ func DeleteAuthTokenByID(ctx context.Context, id string) error {
return err
}

func DeleteAuthTokensByUserID(ctx context.Context, uid int64) error {
_, err := db.GetEngine(ctx).Where(builder.Eq{"user_id": uid}).Delete(&AuthToken{})
return err
}

func DeleteExpiredAuthTokens(ctx context.Context) error {
_, err := db.GetEngine(ctx).Where(builder.Lt{"expires_unix": timeutil.TimeStampNow()}).Delete(&AuthToken{})
return err
Expand Down
15 changes: 6 additions & 9 deletions routers/api/v1/admin/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,10 @@ func EditUser(ctx *context.APIContext) {
return
}

if form.MustChangePassword != nil {
ctx.ContextUser.MustChangePassword = *form.MustChangePassword
}

if len(form.Password) != 0 {
if len(form.Password) < setting.MinPasswordLength {
ctx.Error(http.StatusBadRequest, "PasswordTooShort", fmt.Errorf("password must be at least %d characters", setting.MinPasswordLength))
Expand All @@ -203,20 +207,13 @@ func EditUser(ctx *context.APIContext) {
ctx.Error(http.StatusBadRequest, "PasswordPwned", errors.New("PasswordPwned"))
return
}
if ctx.ContextUser.Salt, err = user_model.GetUserSalt(); err != nil {
ctx.Error(http.StatusInternalServerError, "UpdateUser", err)
return
}
if err = ctx.ContextUser.SetPassword(form.Password); err != nil {

if err := user_service.ChangePassword(ctx, ctx.ContextUser, form.Password, ctx.ContextUser.MustChangePassword); err != nil {
ctx.InternalServerError(err)
return
}
}

if form.MustChangePassword != nil {
ctx.ContextUser.MustChangePassword = *form.MustChangePassword
}

ctx.ContextUser.LoginName = form.LoginName

if form.FullName != nil {
Expand Down
8 changes: 2 additions & 6 deletions routers/web/admin/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -381,12 +381,8 @@ func EditUserPost(ctx *context.Context) {
return
}

if u.Salt, err = user_model.GetUserSalt(); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
if err = u.SetPassword(form.Password); err != nil {
ctx.ServerError("SetPassword", err)
if err := user_service.ChangePassword(ctx, u, form.Password, u.MustChangePassword); err != nil {
ctx.ServerError("ChangePassword", err)
return
}
}
Expand Down
20 changes: 4 additions & 16 deletions routers/web/auth/password.go
Original file line number Diff line number Diff line change
Expand Up @@ -228,13 +228,8 @@ func ResetPasswdPost(ctx *context.Context) {
ctx.ServerError("UpdateUser", err)
return
}
if err = u.SetPassword(passwd); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
u.MustChangePassword = false
if err := user_model.UpdateUserCols(ctx, u, "must_change_password", "passwd", "passwd_hash_algo", "rands", "salt"); err != nil {
ctx.ServerError("UpdateUser", err)
if err := user_service.ChangePassword(ctx, u, passwd, false); err != nil {
ctx.ServerError("ChangePassword", err)
return
}

Expand Down Expand Up @@ -321,15 +316,8 @@ func MustChangePasswordPost(ctx *context.Context) {
return
}

if err = u.SetPassword(form.Password); err != nil {
ctx.ServerError("UpdateUser", err)
return
}

u.MustChangePassword = false

if err := user_model.UpdateUserCols(ctx, u, "must_change_password", "passwd", "passwd_hash_algo", "salt"); err != nil {
ctx.ServerError("UpdateUser", err)
if err := user_service.ChangePassword(ctx, u, form.Password, false); err != nil {
ctx.ServerError("ChangePassword", err)
return
}

Expand Down
11 changes: 4 additions & 7 deletions routers/web/user/setting/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,13 @@ func AccountPost(ctx *context.Context) {
}
ctx.Flash.Error(errMsg)
} else {
var err error
if err = ctx.Doer.SetPassword(form.Password); err != nil {
ctx.ServerError("UpdateUser", err)
return
}
if err := user_model.UpdateUserCols(ctx, ctx.Doer, "salt", "passwd_hash_algo", "passwd"); err != nil {
ctx.ServerError("UpdateUser", err)
if err := user_service.ChangePassword(ctx, ctx.Doer, form.Password, false); err != nil {
ctx.ServerError("ChangePassword", err)
return
}

log.Trace("User password updated: %s", ctx.Doer.Name)

ctx.Flash.Success(ctx.Tr("settings.change_password_success"))
}

Expand Down
5 changes: 1 addition & 4 deletions services/auth/source/db/authenticate.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,7 @@ func Authenticate(ctx context.Context, user *user_model.User, login, password st
// Or update the password when the salt length doesn't match the current
// recommended salt length, this in order to migrate user's salts to a more secure salt.
if user.PasswdHashAlgo != setting.PasswordHashAlgo || len(user.Salt) != user_model.SaltByteLength*2 {
if err := user.SetPassword(password); err != nil {
return nil, err
}
if err := user_model.UpdateUserCols(ctx, user, "passwd", "passwd_hash_algo", "salt"); err != nil {
if err := user_service.ChangePassword(ctx, user, password, user.MustChangePassword); err != nil {
return nil, err
}
}
Expand Down
16 changes: 16 additions & 0 deletions services/user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (

"code.gitea.io/gitea/models"
asymkey_model "code.gitea.io/gitea/models/asymkey"
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/organization"
packages_model "code.gitea.io/gitea/models/packages"
Expand Down Expand Up @@ -120,6 +121,21 @@ func RenameUser(ctx context.Context, u *user_model.User, newUserName string) err
return nil
}

// ChangePassword sets the users password and invalidates all existing auth tokens
func ChangePassword(ctx context.Context, u *user_model.User, password string, mustChangePassword bool) error {
if err := u.SetPassword(password); err != nil {
return err
}

u.MustChangePassword = mustChangePassword

if err := user_model.UpdateUserCols(ctx, u, "must_change_password", "passwd", "passwd_hash_algo", "rands", "salt"); err != nil {
return err
}

return auth_model.DeleteAuthTokensByUserID(ctx, u.ID)
}

// DeleteUser completely and permanently deletes everything of a user,
// but issues/comments/pulls will be kept and shown as someone has been deleted,
// unless the user is younger than USER_DELETE_WITH_COMMENTS_MAX_DAYS.
Expand Down