Skip to content
Snippets Groups Projects

Registrace

Merged Martin Mareš requested to merge mj/registrace into devel
1 file
+ 36
28
Compare changes
  • Side-by-side
  • Inline
+ 36
28
@@ -7,7 +7,7 @@ from flask_wtf import FlaskForm
@@ -7,7 +7,7 @@ from flask_wtf import FlaskForm
import random
import random
import secrets
import secrets
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import joinedload
from typing import Optional
from typing import Optional, Dict
import werkzeug.exceptions
import werkzeug.exceptions
import wtforms
import wtforms
from wtforms import validators, ValidationError
from wtforms import validators, ValidationError
@@ -332,7 +332,7 @@ def create_acct():
@@ -332,7 +332,7 @@ def create_acct():
flash('Odeslán e-mail s odkazem na založení účtu', 'success')
flash('Odeslán e-mail s odkazem na založení účtu', 'success')
user = db.User(email=form.email.data, first_name='Nový', last_name='Uživatel')
user = db.User(email=form.email.data, first_name='Nový', last_name='Uživatel')
mo.util.send_confirm_create_email(user, reg1.email_token)
mo.util.send_confirm_create_email(user, reg1.email_token)
return redirect(url_for('confirm_email'))
return redirect(url_for('confirm_reg'))
form.captcha.description = reg1.captcha_task()
form.captcha.description = reg1.captcha_task()
if reg1.status != RegStatus.ok:
if reg1.status != RegStatus.ok:
@@ -352,16 +352,30 @@ def create_acct():
@@ -352,16 +352,30 @@ def create_acct():
class Reg2:
class Reg2:
 
reg_type: db.RegReqType
status: RegStatus
status: RegStatus
rr: db.RegRequest
rr: db.RegRequest
user: db.User
user: db.User
def __init__(self, token: str):
messages: Dict[db.RegReqType, Dict[RegStatus, str]] = {
 
db.RegReqType.register: {
 
RegStatus.new: 'Chybný registrační kód. Zkontrolujte, že jste odkaz z e-mailu zkopírovali správně.',
 
RegStatus.expired: 'Vypršela platnost registrace, vyplňte ji prosím znovu.',
 
RegStatus.already_spent: 'Tento odkaz na potvrzení registrace byl již využit.',
 
RegStatus.already_exists: 'Účet s touto adresou už existuje.',
 
},
 
}
 
 
def __init__(self, token: str, expected_type: db.RegReqType):
 
self.reg_type = expected_type
self.status = self._parse_token(token)
self.status = self._parse_token(token)
if self.status == RegStatus.ok:
if self.status == RegStatus.ok:
self.status = self._load_rr(token)
self.status = self._load_rr(token)
def _parse_token(self, token: str) -> RegStatus:
def _parse_token(self, token: Optional[str]) -> RegStatus:
 
if not token:
 
return RegStatus.new
 
token = mo.util.clean_up_token(token)
token = mo.util.clean_up_token(token)
fields = mo.tokens.verify_token(token, 'reg-request')
fields = mo.tokens.verify_token(token, 'reg-request')
if not fields:
if not fields:
@@ -393,6 +407,10 @@ class Reg2:
@@ -393,6 +407,10 @@ class Reg2:
app.logger.info('Reg2: Registrace spotřebována')
app.logger.info('Reg2: Registrace spotřebována')
return RegStatus.already_spent
return RegStatus.already_spent
 
if rr.type != self.reg_type:
 
app.logger.info('Reg2: Token špatného typu')
 
return RegStatus.new
 
self.rr = rr
self.rr = rr
return RegStatus.ok
return RegStatus.ok
@@ -430,6 +448,11 @@ class Reg2:
@@ -430,6 +448,11 @@ class Reg2:
self.user = user
self.user = user
return True
return True
 
def flash_message(self):
 
msgs = self.messages[self.reg_type]
 
if self.status in msgs:
 
flash(msgs[self.status], 'danger')
 
class Reg2Form(FlaskForm):
class Reg2Form(FlaskForm):
email = wtforms.StringField('E-mail', render_kw={"disabled": "disabled"})
email = wtforms.StringField('E-mail', render_kw={"disabled": "disabled"})
@@ -448,27 +471,15 @@ class Reg2Form(FlaskForm):
@@ -448,27 +471,15 @@ class Reg2Form(FlaskForm):
raise ValidationError('Hesla se neshodují.')
raise ValidationError('Hesla se neshodují.')
@app.route('/auth/confirm', methods=('GET', 'POST'))
@app.route('/auth/confirm/r', methods=('GET', 'POST'))
def confirm_email():
def confirm_reg():
"""Společný vstupní bod pro 2. krok registrace a potvrzení změny údajů."""
reg2 = Reg2(request.args.get('token'), db.RegReqType.register)
token = request.args.get('token')
if not token:
return render_template('acct_reg2.html', form=None)
reg2 = Reg2(token)
if reg2.status == RegStatus.new:
flash('Chybný registrační kód. Zkontrolujte, že jste odkaz z e-mailu zkopírovali správně.', 'danger')
return render_template('acct_reg2.html', form=None)
if reg2.status != RegStatus.ok:
if reg2.status != RegStatus.ok:
if reg2.status == RegStatus.expired:
reg2.flash_message()
flash('Vypršela platnost registrace, vyplňte ji prosím znovu.', 'danger')
if reg2.status == RegStatus.new:
elif reg2.status == RegStatus.already_spent:
return render_template('acct_reg2.html', form=None)
flash('Tento odkaz na potvrzení registrace byl již využit.', 'danger')
else:
return redirect(url_for('create_acct'))
return redirect(url_for('create_acct'))
if reg2.rr.type != db.RegReqType.register:
raise NotImplementedError()
form = Reg2Form()
form = Reg2Form()
if form.validate_on_submit():
if form.validate_on_submit():
@@ -477,12 +488,9 @@ def confirm_email():
@@ -477,12 +488,9 @@ def confirm_email():
app.logger.info(f'Login: Přihlásil se uživatel <{reg2.user.email}> po založení účtu')
app.logger.info(f'Login: Přihlásil se uživatel <{reg2.user.email}> po založení účtu')
return login_and_redirect(reg2.user, flash_msg='Účet úspěšně založen.')
return login_and_redirect(reg2.user, flash_msg='Účet úspěšně založen.')
if reg2.status == RegStatus.already_exists:
reg2.flash_message()
flash('Účet s touto adresou už existuje.', 'danger')
form.email.data = reg2.rr.email
form.email.data = reg2.rr.email
db.get_session().rollback() # Nechcme držet transakci otevřenou zbytečně dlouho
return render_template('acct_reg2.html', form=form)
return render_template('acct_reg2.html', form=form)
Loading