Merge pull request #12 from alphagov/blacklist_password

Blacklist password
This commit is contained in:
minglis
2015-12-04 15:53:13 +00:00
6 changed files with 48 additions and 2 deletions

View File

@@ -2,6 +2,8 @@ from flask_wtf import Form
from wtforms import StringField, PasswordField from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email, Length, Regexp from wtforms.validators import DataRequired, Email, Length, Regexp
from app.main.validators import Blacklist
class LoginForm(Form): class LoginForm(Form):
email_address = StringField('Email address', validators=[ email_address = StringField('Email address', validators=[
@@ -32,4 +34,5 @@ class RegisterUserForm(Form):
Regexp(regex=mobile_number, message='Please enter a +44 mobile number')]) Regexp(regex=mobile_number, message='Please enter a +44 mobile number')])
password = PasswordField('Create a password', password = PasswordField('Create a password',
validators=[DataRequired(message='Please enter your password'), validators=[DataRequired(message='Please enter your password'),
Length(10, 255, message='Password must be at least 10 characters')]) Length(10, 255, message='Password must be at least 10 characters'),
Blacklist(message='That password is blacklisted, too common')])

12
app/main/validators.py Normal file
View File

@@ -0,0 +1,12 @@
from wtforms import ValidationError
class Blacklist(object):
def __init__(self, message=None):
if not message:
message = 'Password is blacklisted.'
self.message = message
def __call__(self, form, field):
if field.data in ['password1234', 'passw0rd1234']:
raise ValidationError(self.message)

View File

@@ -1,6 +1,7 @@
from datetime import datetime from datetime import datetime
from flask import render_template, redirect, jsonify from flask import render_template, redirect, jsonify
from flask_login import login_user
from app.main import main from app.main import main
from app.main.dao import users_dao from app.main.dao import users_dao
@@ -26,8 +27,9 @@ def process_register():
role_id=1) role_id=1)
try: try:
users_dao.insert_user(user) users_dao.insert_user(user)
login_user(user)
return redirect('/two-factor') return redirect('/two-factor')
except Exception as e: except Exception as e:
return jsonify(database_error='encountered database error'), 400 return jsonify(database_error=e.message), 400
else: else:
return jsonify(form.errors), 400 return jsonify(form.errors), 400

View File

@@ -0,0 +1,17 @@
from pytest import fail
from app.main.forms import RegisterUserForm
def test_should_raise_validation_error_for_password(notifications_admin):
form = RegisterUserForm()
form.name.data = 'test'
form.email_address.data = 'teset@example.gov.uk'
form.mobile_number.data = '+441231231231'
form.password.data = 'password1234'
try:
form.validate()
fail()
except:
assert 'That password is blacklisted, too common' in form.errors['password']

View File

@@ -37,3 +37,14 @@ def test_should_return_400_when_email_is_not_gov_uk(notifications_admin, notific
assert response.status_code == 400 assert response.status_code == 400
assert 'Please enter a gov.uk email address' in response.get_data(as_text=True) assert 'Please enter a gov.uk email address' in response.get_data(as_text=True)
def test_should_return_400_if_password_is_blacklisted(notifications_admin, notifications_admin_db):
response = notifications_admin.test_client().post('/register',
data={'name': 'Bad Mobile',
'email_address': 'bad_mobile@example.not.right',
'mobile_number': '+44123412345',
'password': 'password1234'})
response.status_code == 400
assert 'That password is blacklisted, too common' in response.get_data(as_text=True)

View File

@@ -1,4 +1,5 @@
import pytest import pytest
from _pytest.monkeypatch import monkeypatch
from sqlalchemy.schema import MetaData, DropConstraint from sqlalchemy.schema import MetaData, DropConstraint
from app import create_app, db from app import create_app, db