Skip to content

Commit

Permalink
(NOBIDS) prevent pw reset if not allowed
Browse files Browse the repository at this point in the history
  • Loading branch information
guybrush committed Mar 11, 2024
1 parent f00ee6d commit e46f3ff
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-- +goose Up
-- +goose StatementBegin
SELECT 'up SQL query - add column users.password_reset_not_allowed';
ALTER TABLE users ADD COLUMN IF NOT EXISTS password_reset_not_allowed BOOLEAN NOT NULL DEFAULT FALSE;
-- +goose StatementEnd

-- +goose Down
-- +goose StatementBegin
SELECT 'down SQL query - drop column users.password_reset_not_allowed';
ALTER TABLE users DROP COLUMN IF EXISTS password_reset_not_allowed;
-- +goose StatementEnd
9 changes: 9 additions & 0 deletions handlers/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,15 @@ func sendPasswordResetEmail(email string) error {
}
defer tx.Rollback()

var passwordResetNotAllowed bool
err = tx.Get(&passwordResetNotAllowed, "SELECT password_reset_not_allowed FROM users WHERE email = $1", email)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return fmt.Errorf("error getting password_reset_not_allowed: %w", err)
}
if passwordResetNotAllowed {
return fmt.Errorf("password-reset not allowed for user: %v", email)
}

var lastTs *time.Time
err = tx.Get(&lastTs, "SELECT password_reset_ts FROM users WHERE email = $1", email)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
Expand Down
18 changes: 13 additions & 5 deletions handlers/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -1046,13 +1046,14 @@ func UserUpdatePasswordPost(w http.ResponseWriter, r *http.Request) {
pwdOld := r.FormValue("old-password")

currentUser := struct {
ID int64 `db:"id"`
Email string `db:"email"`
Password string `db:"password"`
Confirmed bool `db:"email_confirmed"`
ID int64 `db:"id"`
Email string `db:"email"`
Password string `db:"password"`
Confirmed bool `db:"email_confirmed"`
PasswordResetNotAllowed bool `db:"password_reset_not_allowed"`
}{}

err = db.FrontendWriterDB.Get(&currentUser, "SELECT id, email, password, email_confirmed FROM users WHERE id = $1", user.UserID)
err = db.FrontendWriterDB.Get(&currentUser, "SELECT id, email, password, email_confirmed, password_reset_not_allowed FROM users WHERE id = $1", user.UserID)
if err != nil {
if err != sql.ErrNoRows {
logger.Errorf("error retrieving password for user %v: %v", user.UserID, err)
Expand All @@ -1063,6 +1064,13 @@ func UserUpdatePasswordPost(w http.ResponseWriter, r *http.Request) {
return
}

if currentUser.PasswordResetNotAllowed {
session.AddFlash("Error: Password reset is not allowed for this account!")
session.Save(r, w)
http.Redirect(w, r, "/user/settings", http.StatusSeeOther)
return
}

if !currentUser.Confirmed {
session.AddFlash("Error: Email has not been confirmed, please click the link in the email we sent you or <a href='/resend'>resend link</a>!")
session.Save(r, w)
Expand Down

0 comments on commit e46f3ff

Please sign in to comment.