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(): ...@@ -193,6 +193,10 @@ def user_settings_personal():
sess.commit() sess.commit()
flash('Heslo změněno.', 'success') flash('Heslo změněno.', 'success')
if form.email.data != user.email: 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) rr = mo.users.new_reg_request(db.RegReqType.change_email, request.remote_addr)
if rr: if rr:
rr.user_id = user.user_id rr.user_id = user.user_id
...@@ -436,6 +440,7 @@ class Reg2: ...@@ -436,6 +440,7 @@ class Reg2:
RegStatus.new: 'Chybný potvrzovací kód. Zkontrolujte, že jste odkaz z e-mailu zkopírovali správně.', 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.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_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: { db.RegReqType.reset_passwd: {
RegStatus.new: 'Chybný kód pro obnovení hesla. Zkontrolujte, že jste odkaz z e-mailu zkopírovali správně.', 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: ...@@ -519,9 +524,16 @@ class Reg2:
self.user = user self.user = user
return True return True
def change_email(self): def change_email(self) -> bool:
sess = db.get_session() sess = db.get_session()
user = self.rr.user 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 user.email = self.rr.email
app.logger.info(f'Reg2: Uživatel #{user.user_id} si změnil email na <{user.email}>') app.logger.info(f'Reg2: Uživatel #{user.user_id} si změnil email na <{user.email}>')
...@@ -536,6 +548,7 @@ class Reg2: ...@@ -536,6 +548,7 @@ class Reg2:
self.rr.used_at = mo.now self.rr.used_at = mo.now
sess.commit() sess.commit()
return True
def change_passwd(self, new_passwd: str): def change_passwd(self, new_passwd: str):
sess = db.get_session() sess = db.get_session()
...@@ -610,13 +623,15 @@ def confirm_email(): ...@@ -610,13 +623,15 @@ def confirm_email():
form = ConfirmEmailForm() form = ConfirmEmailForm()
if form.validate_on_submit(): if form.validate_on_submit():
if form.submit.data: if form.submit.data:
reg2.change_email() if reg2.change_email():
flash('E-mail změněn.', 'success') flash('E-mail změněn.', 'success')
return redirect(url_for('user_settings'))
elif form.cancel.data: elif form.cancel.data:
reg2.spend_request() reg2.spend_request()
flash('Požadavek na změnu e-mailu zrušen.', 'success') flash('Požadavek na změnu e-mailu zrušen.', 'success')
return redirect(url_for('user_settings')) return redirect(url_for('user_settings'))
reg2.flash_message()
form.orig_email.data = reg2.rr.user.email form.orig_email.data = reg2.rr.user.email
form.new_email.data = reg2.rr.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