Skip to content
Snippets Groups Projects
Commit 1195ddeb authored by Martin Mareš's avatar Martin Mareš
Browse files

Registrace ošetřuje kolize při změně e-mailu

Při implementaci registrace jsme na to úplně zapomněli.

Closes #307 and #321.
parent 66692424
No related branches found
No related tags found
1 merge request!129Bezpečné transakce při zakládání uživatelů/účastníků/účastí
......@@ -193,6 +193,10 @@ 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:
flash('Tuto e-mailovou adresu už používá jiný uživatel.', 'danger')
ok = False
else:
rr = mo.users.new_reg_request(db.RegReqType.change_email, request.remote_addr)
if rr:
rr.user_id = user.user_id
......@@ -436,6 +440,7 @@ class Reg2:
RegStatus.new: 'Chybný potvrzovací kód. Zkontrolujte, že jste odkaz z e-mailu zkopírovali správně.',
RegStatus.expired: 'Vypršela platnost potvrzovacího kódu, požádejte prosím o změnu e-mailu znovu.',
RegStatus.already_spent: 'Tento odkaz na potvrzení změny e-mailu byl již využit.',
RegStatus.already_exists: 'Tuto adresu už použivá jiný účet.',
},
db.RegReqType.reset_passwd: {
RegStatus.new: 'Chybný kód pro obnovení hesla. Zkontrolujte, že jste odkaz z e-mailu zkopírovali správně.',
......@@ -519,9 +524,16 @@ class Reg2:
self.user = user
return True
def change_email(self):
def change_email(self) -> bool:
sess = db.get_session()
user = self.rr.user
if mo.users.user_by_email(self.rr.email) is not None:
app.logger.info(f'Reg2: Uživatel #{user.user_id} si chce změnit email na <{user.email}>, ale už je použitý jiným účtem.')
self.status = RegStatus.already_exists
return False
# Tady je krátké okénko, kdy může nastat race condition. Chytí ji integritní omezení v DB a vznikne výjimka.
user.email = self.rr.email
app.logger.info(f'Reg2: Uživatel #{user.user_id} si změnil email na <{user.email}>')
......@@ -536,6 +548,7 @@ class Reg2:
self.rr.used_at = mo.now
sess.commit()
return True
def change_passwd(self, new_passwd: str):
sess = db.get_session()
......@@ -610,13 +623,15 @@ def confirm_email():
form = ConfirmEmailForm()
if form.validate_on_submit():
if form.submit.data:
reg2.change_email()
if reg2.change_email():
flash('E-mail změněn.', 'success')
return redirect(url_for('user_settings'))
elif form.cancel.data:
reg2.spend_request()
flash('Požadavek na změnu e-mailu zrušen.', 'success')
return redirect(url_for('user_settings'))
reg2.flash_message()
form.orig_email.data = reg2.rr.user.email
form.new_email.data = reg2.rr.email
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment