2015-12-10 14:48:01 +00:00
|
|
|
from datetime import datetime
|
|
|
|
|
|
2015-12-08 11:56:49 +00:00
|
|
|
from flask import session
|
2015-11-27 09:47:29 +00:00
|
|
|
from flask_wtf import Form
|
2015-12-08 15:44:40 +00:00
|
|
|
from wtforms import StringField, PasswordField
|
2015-12-01 13:23:54 +00:00
|
|
|
from wtforms.validators import DataRequired, Email, Length, Regexp
|
2015-11-27 09:47:29 +00:00
|
|
|
|
2015-12-15 10:17:43 +00:00
|
|
|
from app.main.dao import verify_codes_dao, services_dao
|
2015-12-10 15:21:06 +00:00
|
|
|
from app.main.encryption import check_hash
|
2015-12-01 15:51:09 +00:00
|
|
|
from app.main.validators import Blacklist
|
|
|
|
|
|
2015-11-27 09:47:29 +00:00
|
|
|
|
|
|
|
|
class LoginForm(Form):
|
|
|
|
|
email_address = StringField('Email address', validators=[
|
2015-11-27 16:25:56 +00:00
|
|
|
Length(min=5, max=255),
|
2015-11-27 09:47:29 +00:00
|
|
|
DataRequired(message='Email cannot be empty'),
|
|
|
|
|
Email(message='Please enter a valid email address')
|
|
|
|
|
])
|
2015-12-02 15:23:03 +00:00
|
|
|
password = PasswordField('Password', validators=[
|
2015-11-27 09:47:29 +00:00
|
|
|
DataRequired(message='Please enter your password')
|
|
|
|
|
])
|
2015-12-01 13:23:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
gov_uk_email = "(^[^@^\\s]+@[^@^\\.^\\s]+(\\.[^@^\\.^\\s]*)*.gov.uk)"
|
|
|
|
|
mobile_number = "^\\+44[\\d]{10}$"
|
2015-12-11 14:50:03 +00:00
|
|
|
verify_code = '^\d{5}$'
|
2015-12-01 13:23:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class RegisterUserForm(Form):
|
2015-12-02 15:23:03 +00:00
|
|
|
name = StringField('Full name',
|
2015-12-01 13:23:54 +00:00
|
|
|
validators=[DataRequired(message='Name can not be empty')])
|
|
|
|
|
email_address = StringField('Email address', validators=[
|
|
|
|
|
Length(min=5, max=255),
|
|
|
|
|
DataRequired(message='Email cannot be empty'),
|
|
|
|
|
Email(message='Please enter a valid email address'),
|
|
|
|
|
Regexp(regex=gov_uk_email, message='Please enter a gov.uk email address')
|
|
|
|
|
])
|
|
|
|
|
mobile_number = StringField('Mobile phone number',
|
|
|
|
|
validators=[DataRequired(message='Please enter your mobile number'),
|
|
|
|
|
Regexp(regex=mobile_number, message='Please enter a +44 mobile number')])
|
2015-12-02 15:23:03 +00:00
|
|
|
password = PasswordField('Create a password',
|
2015-12-01 13:23:54 +00:00
|
|
|
validators=[DataRequired(message='Please enter your password'),
|
2015-12-01 15:51:09 +00:00
|
|
|
Length(10, 255, message='Password must be at least 10 characters'),
|
|
|
|
|
Blacklist(message='That password is blacklisted, too common')])
|
2015-12-04 16:21:01 +00:00
|
|
|
|
|
|
|
|
|
2015-12-07 16:56:11 +00:00
|
|
|
class TwoFactorForm(Form):
|
2015-12-08 15:44:40 +00:00
|
|
|
sms_code = StringField('sms code', validators=[DataRequired(message='Please enter your code'),
|
|
|
|
|
Regexp(regex=verify_code, message='Code must be 5 digits')])
|
2015-12-07 16:56:11 +00:00
|
|
|
|
2015-12-08 12:36:54 +00:00
|
|
|
def validate_sms_code(self, a):
|
2015-12-17 14:25:03 +00:00
|
|
|
return validate_codes(self.sms_code, 'sms')
|
2015-12-08 12:36:54 +00:00
|
|
|
|
2015-12-07 16:56:11 +00:00
|
|
|
|
2015-12-04 16:21:01 +00:00
|
|
|
class VerifyForm(Form):
|
2015-12-08 15:30:55 +00:00
|
|
|
sms_code = StringField("Text message confirmation code",
|
|
|
|
|
validators=[DataRequired(message='SMS code can not be empty'),
|
2015-12-08 15:40:45 +00:00
|
|
|
Regexp(regex=verify_code, message='Code must be 5 digits')])
|
2015-12-08 15:30:55 +00:00
|
|
|
email_code = StringField("Email confirmation code",
|
|
|
|
|
validators=[DataRequired(message='Email code can not be empty'),
|
2015-12-08 15:40:45 +00:00
|
|
|
Regexp(regex=verify_code, message='Code must be 5 digits')])
|
2015-12-08 11:56:49 +00:00
|
|
|
|
|
|
|
|
def validate_email_code(self, a):
|
2015-12-17 14:25:03 +00:00
|
|
|
return validate_codes(self.email_code, 'email')
|
2015-12-08 11:56:49 +00:00
|
|
|
|
|
|
|
|
def validate_sms_code(self, a):
|
2015-12-17 14:25:03 +00:00
|
|
|
return validate_codes(self.sms_code, 'sms')
|
2015-12-14 17:12:28 +00:00
|
|
|
|
|
|
|
|
|
2015-12-15 15:35:30 +00:00
|
|
|
class EmailNotReceivedForm(Form):
|
|
|
|
|
email_address = StringField('Email address', validators=[
|
|
|
|
|
Length(min=5, max=255),
|
|
|
|
|
DataRequired(message='Email cannot be empty'),
|
|
|
|
|
Email(message='Please enter a valid email address'),
|
|
|
|
|
Regexp(regex=gov_uk_email, message='Please enter a gov.uk email address')
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class TextNotReceivedForm(Form):
|
|
|
|
|
mobile_number = StringField('Mobile phone number',
|
|
|
|
|
validators=[DataRequired(message='Please enter your mobile number'),
|
|
|
|
|
Regexp(regex=mobile_number, message='Please enter a +44 mobile number')])
|
|
|
|
|
|
|
|
|
|
|
2015-12-14 17:12:28 +00:00
|
|
|
class AddServiceForm(Form):
|
2015-12-15 10:17:43 +00:00
|
|
|
service_name = StringField(validators=[DataRequired(message='Please enter your service name')])
|
|
|
|
|
|
|
|
|
|
def validate_service_name(self, a):
|
|
|
|
|
if services_dao.find_service_by_service_name(self.service_name.data) is not None:
|
|
|
|
|
self.service_name.errors.append('Duplicate service name')
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
return True
|
2015-12-17 14:25:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_codes(field, code_type):
|
|
|
|
|
codes = verify_codes_dao.get_codes(user_id=session['user_id'], code_type=code_type)
|
2015-12-17 15:09:12 +00:00
|
|
|
is_valid = len([code for code in codes if validate_code(field, code)]) == 1
|
|
|
|
|
if is_valid:
|
|
|
|
|
field.errors.clear()
|
|
|
|
|
return is_valid
|
2015-12-17 14:25:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_code(field, code):
|
2015-12-17 15:09:12 +00:00
|
|
|
if field.data and check_hash(field.data, code.code):
|
|
|
|
|
if code.expiry_datetime <= datetime.now():
|
|
|
|
|
field.errors.append('Code has expired')
|
2015-12-17 14:25:03 +00:00
|
|
|
return False
|
2015-12-17 15:09:12 +00:00
|
|
|
return True
|
2015-12-17 14:25:03 +00:00
|
|
|
else:
|
2015-12-17 15:09:12 +00:00
|
|
|
field.errors.append('Code does not match')
|
2015-12-17 14:25:03 +00:00
|
|
|
return False
|