diff --git a/mo/web/acct.py b/mo/web/acct.py index a90723018688e1c4e0b4aa3e198997534b970646..b15a62bef94a30c4d43358b40b68a4a5d4f95003 100644 --- a/mo/web/acct.py +++ b/mo/web/acct.py @@ -23,6 +23,7 @@ import mo.rights import mo.tokens import mo.users import mo.util +from mo.util import assert_not_none from mo.web import app, NeedLoginError import mo.web.fields as mo_fields @@ -183,8 +184,11 @@ def user_settings_personal(): if not form.submit.data: form.email.data = user.email - if form.validate_on_submit(): - ok = True + def process_submit() -> bool: + if not mo.users.check_password(user, assert_not_none(form.current_passwd.data)): + flash('Nesouhlasí aktuální heslo.', 'danger') + return False + if form.new_passwd.data: app.logger.info(f'Settings: Změněno heslo uživatele #{user.user_id}') mo.users.set_password(user, form.new_passwd.data) @@ -195,10 +199,12 @@ def user_settings_personal(): ) sess.commit() flash('Heslo změněno.', 'success') + if form.email.data != user.email: - if mo.users.user_by_email(form.email.data) is not None: + if mo.users.user_by_email(assert_not_none(form.email.data)) is not None: + # Tady prosakuje informace o existenci účtu, ale tu prozrazuje i login. flash('Tuto e-mailovou adresu už používá jiný uživatel.', 'danger') - ok = False + return False else: rr = mo.users.new_reg_request(db.RegReqType.change_email, request.remote_addr) if rr: @@ -212,9 +218,11 @@ def user_settings_personal(): else: app.logger.info('Settings: Rate limit') flash('Příliš mnoho požadavků na změny e-mailu. Počkejte prosím chvíli a zkuste to znovu.', 'danger') - ok = False - if ok: - return redirect(url_for('user_settings')) + return False + return True + + if form.validate_on_submit() and process_submit(): + return redirect(url_for('user_settings')) return render_template('settings_change.html', form=form)