Merge pull request #2700 from alphagov/re-validate-user-email

Add email_access_valdiated_at field to user table, populate it
This commit is contained in:
Pea M. Tyczynska
2020-01-30 15:35:39 +00:00
committed by GitHub
10 changed files with 98 additions and 28 deletions

View File

@@ -28,15 +28,17 @@ def save_user_attribute(usr, update_dict={}):
db.session.commit()
def save_model_user(usr, update_dict={}, pwd=None):
if pwd:
usr.password = pwd
usr.password_changed_at = datetime.utcnow()
def save_model_user(user, update_dict={}, password=None, validated_email_access=False):
if password:
user.password = password
user.password_changed_at = datetime.utcnow()
if validated_email_access:
user.email_access_validated_at = datetime.utcnow()
if update_dict:
_remove_values_for_keys_if_present(update_dict, ['id', 'password_changed_at'])
db.session.query(User).filter_by(id=usr.id).update(update_dict)
db.session.query(User).filter_by(id=user.id).update(update_dict)
else:
db.session.add(usr)
db.session.add(user)
db.session.commit()
@@ -121,10 +123,12 @@ def reset_failed_login_count(user):
db.session.commit()
def update_user_password(user, password):
def update_user_password(user, password, validated_email_access=False):
# reset failed login count - they've just reset their password so should be fine
user.password = password
user.password_changed_at = datetime.utcnow()
if validated_email_access:
user.email_access_validated_at = datetime.utcnow()
db.session.add(user)
db.session.commit()

View File

@@ -114,6 +114,7 @@ class User(db.Model):
platform_admin = db.Column(db.Boolean, nullable=False, default=False)
current_session_id = db.Column(UUID(as_uuid=True), nullable=True)
auth_type = db.Column(db.String, db.ForeignKey('auth_type.name'), index=True, nullable=False, default=SMS_AUTH_TYPE)
email_access_validated_at = db.Column(db.DateTime, index=False, unique=False, nullable=False)
# either email auth or a mobile number must be provided
CheckConstraint("auth_type = 'email_auth' or mobile_number is not null")
@@ -162,6 +163,7 @@ class User(db.Model):
'auth_type': self.auth_type,
'current_session_id': self.current_session_id,
'failed_login_count': self.failed_login_count,
'email_access_validated_at': self.email_access_validated_at,
'logged_in_at': self.logged_in_at.strftime(DATETIME_FORMAT) if self.logged_in_at else None,
'mobile_number': self.mobile_number,
'organisations': [x.id for x in self.organisations if x.active],

View File

@@ -101,6 +101,7 @@ class UserSchema(BaseSchema):
model = models.User
exclude = (
"updated_at",
"email_access_validated_at",
"created_at",
"user_to_service",
"user_to_organisation",

View File

@@ -78,7 +78,7 @@ def create_user():
if not req_json.get('password', None):
errors.update({'password': ['Missing data for required field.']})
raise InvalidRequest(errors, status_code=400)
save_model_user(user_to_create, pwd=req_json.get('password'))
save_model_user(user_to_create, password=req_json.get('password'), validated_email_access=True)
result = user_to_create.serialize()
return jsonify(data=result), 201
@@ -197,6 +197,8 @@ def verify_user_code(user_id):
user_to_verify.current_session_id = str(uuid.uuid4())
user_to_verify.logged_in_at = datetime.utcnow()
if user_to_verify.auth_type == 'email_auth':
user_to_verify.email_access_validated_at = datetime.utcnow()
user_to_verify.failed_login_count = 0
save_model_user(user_to_verify)
@@ -459,11 +461,12 @@ def send_user_reset_password():
def update_password(user_id):
user = get_user_by_id(user_id=user_id)
req_json = request.get_json()
pwd = req_json.get('_password')
password = req_json.get('_password')
validated_email_access = req_json.get('validated_email_access')
update_dct, errors = user_update_password_schema_load_json.load(req_json)
if errors:
raise InvalidRequest(errors, status_code=400)
update_user_password(user, pwd)
update_user_password(user, password, validated_email_access=validated_email_access)
return jsonify(data=user.serialize()), 200