attempt to reduce code duplication

This commit is contained in:
Leo Hemsted
2017-11-07 16:47:40 +00:00
parent 67ae1fdb7b
commit 0146e2d935
2 changed files with 55 additions and 45 deletions
+44 -37
View File
@@ -3,7 +3,7 @@ import uuid
from datetime import datetime from datetime import datetime
from urllib.parse import urlencode from urllib.parse import urlencode
from flask import (jsonify, request, Blueprint, current_app) from flask import (jsonify, request, Blueprint, current_app, abort)
from app.config import QueueNames from app.config import QueueNames
from app.dao.users_dao import ( from app.dao.users_dao import (
@@ -23,7 +23,7 @@ from app.dao.users_dao import (
from app.dao.permissions_dao import permission_dao from app.dao.permissions_dao import permission_dao
from app.dao.services_dao import dao_fetch_service_by_id from app.dao.services_dao import dao_fetch_service_by_id
from app.dao.templates_dao import dao_get_template_by_id from app.dao.templates_dao import dao_get_template_by_id
from app.models import SMS_TYPE, KEY_TYPE_NORMAL, EMAIL_TYPE, Service from app.models import KEY_TYPE_NORMAL, Service, SMS_TYPE, EMAIL_TYPE
from app.notifications.process_notifications import ( from app.notifications.process_notifications import (
persist_notification, persist_notification,
send_notification_to_queue send_notification_to_queue
@@ -147,59 +147,66 @@ def verify_user_code(user_id):
return jsonify({}), 204 return jsonify({}), 204
@user_blueprint.route('/<uuid:user_id>/sms-code', methods=['POST']) @user_blueprint.route('/<uuid:user_id>/<code_type>-code', methods=['POST'])
def send_user_sms_code(user_id): def send_user_2fa_code(user_id, code_type):
user_to_send_to = get_user_by_id(user_id=user_id)
if count_user_verify_codes(user_to_send_to) >= current_app.config.get('MAX_VERIFY_CODE_COUNT'):
# Prevent more than `MAX_VERIFY_CODE_COUNT` active verify codes at a time
current_app.logger.warn('Too many verify codes created for user {}'.format(user_to_send_to.id))
else:
data = request.get_json() data = request.get_json()
user_to_send_to = validate_2fa_call(user_id, data, post_send_user_sms_code_schema) if code_type == SMS_TYPE:
if not user_to_send_to: validate(data, post_send_user_sms_code_schema)
return jsonify({}), 204 send_user_sms_code(user_to_send_to, data)
elif code_type == EMAIL_TYPE:
validate(data, post_send_user_email_code_schema)
send_user_email_code(user_to_send_to, data)
else:
abort(404)
return '{}', 204
def send_user_sms_code(user_to_send_to, data):
recipient = data.get('to') or user_to_send_to.mobile_number
secret_code = create_secret_code() secret_code = create_secret_code()
create_user_code(user_to_send_to, secret_code, SMS_TYPE)
mobile = data.get('to') or user_to_send_to.mobile_number
template = dao_get_template_by_id(current_app.config['SMS_CODE_TEMPLATE_ID'])
personalisation = {'verify_code': secret_code} personalisation = {'verify_code': secret_code}
create_2fa_code(template, mobile, personalisation) create_2fa_code(
return jsonify({}), 204 current_app.config['SMS_CODE_TEMPLATE_ID'],
user_to_send_to,
secret_code,
recipient,
personalisation
)
@user_blueprint.route('/<uuid:user_id>/email-code', methods=['POST']) def send_user_email_code(user_to_send_to, data):
def send_user_email_code(user_id): recipient = user_to_send_to.email_address
data = request.get_json()
user_to_send_to = validate_2fa_call(user_id, data, post_send_user_email_code_schema)
if not user_to_send_to:
return jsonify({}), 204
secret_code = str(uuid.uuid4()) secret_code = str(uuid.uuid4())
create_user_code(user_to_send_to, secret_code, EMAIL_TYPE)
template = dao_get_template_by_id(current_app.config['EMAIL_2FA_TEMPLATE_ID'])
personalisation = { personalisation = {
'name': user_to_send_to.name, 'name': user_to_send_to.name,
'url': _create_2fa_url(user_to_send_to, secret_code, data.get('next')) 'url': _create_2fa_url(user_to_send_to, secret_code, data.get('next'))
} }
create_2fa_code(template, user_to_send_to.email_address, personalisation) create_2fa_code(
current_app.config['EMAIL_2FA_TEMPLATE_ID'],
return '{}', 204 user_to_send_to,
secret_code,
recipient,
personalisation
)
def validate_2fa_call(user_id, data, schema): def create_2fa_code(template_id, user_to_send_to, secret_code, recipient, personalisation):
validate(data, schema) template = dao_get_template_by_id(template_id)
user_to_send_to = get_user_by_id(user_id=user_id)
if count_user_verify_codes(user_to_send_to) >= current_app.config.get('MAX_VERIFY_CODE_COUNT'): # save the code in the VerifyCode table
# Prevent more than `MAX_VERIFY_CODE_COUNT` active verify codes at a time create_user_code(user_to_send_to, secret_code, template.template_type)
current_app.logger.warn('Max verify code has exceeded for user {}'.format(user_to_send_to.id))
return
return user_to_send_to
def create_2fa_code(template, recipient, personalisation):
saved_notification = persist_notification( saved_notification = persist_notification(
template_id=template.id, template_id=template.id,
template_version=template.version, template_version=template.version,
+10 -7
View File
@@ -185,7 +185,7 @@ def test_send_user_sms_code(client,
mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async') mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async')
resp = client.post( resp = client.post(
url_for('user.send_user_sms_code', user_id=sample_user.id), url_for('user.send_user_2fa_code', code_type='sms', user_id=sample_user.id),
data=json.dumps({}), data=json.dumps({}),
headers=[('Content-Type', 'application/json'), auth_header]) headers=[('Content-Type', 'application/json'), auth_header])
assert resp.status_code == 204 assert resp.status_code == 204
@@ -218,7 +218,7 @@ def test_send_user_code_for_sms_with_optional_to_field(client,
auth_header = create_authorization_header() auth_header = create_authorization_header()
resp = client.post( resp = client.post(
url_for('user.send_user_sms_code', user_id=sample_user.id), url_for('user.send_user_2fa_code', code_type='sms', user_id=sample_user.id),
data=json.dumps({'to': to_number}), data=json.dumps({'to': to_number}),
headers=[('Content-Type', 'application/json'), auth_header]) headers=[('Content-Type', 'application/json'), auth_header])
@@ -236,7 +236,7 @@ def test_send_sms_code_returns_404_for_bad_input_data(client):
uuid_ = uuid.uuid4() uuid_ = uuid.uuid4()
auth_header = create_authorization_header() auth_header = create_authorization_header()
resp = client.post( resp = client.post(
url_for('user.send_user_sms_code', user_id=uuid_), url_for('user.send_user_2fa_code', code_type='sms', user_id=uuid_),
data=json.dumps({}), data=json.dumps({}),
headers=[('Content-Type', 'application/json'), auth_header]) headers=[('Content-Type', 'application/json'), auth_header])
assert resp.status_code == 404 assert resp.status_code == 404
@@ -257,7 +257,7 @@ def test_send_sms_code_returns_204_when_too_many_codes_already_created(client, s
assert VerifyCode.query.count() == 10 assert VerifyCode.query.count() == 10
auth_header = create_authorization_header() auth_header = create_authorization_header()
resp = client.post( resp = client.post(
url_for('user.send_user_sms_code', user_id=sample_user.id), url_for('user.send_user_2fa_code', code_type='sms', user_id=sample_user.id),
data=json.dumps({}), data=json.dumps({}),
headers=[('Content-Type', 'application/json'), auth_header]) headers=[('Content-Type', 'application/json'), auth_header])
assert resp.status_code == 204 assert resp.status_code == 204
@@ -347,7 +347,8 @@ def test_send_user_email_code(admin_request, mocker, sample_user, email_2fa_code
'to': None 'to': None
} }
admin_request.post( admin_request.post(
'user.send_user_email_code', 'user.send_user_2fa_code',
code_type='email',
user_id=sample_user.id, user_id=sample_user.id,
_data=data, _data=data,
_expected_status=204 _expected_status=204
@@ -370,7 +371,8 @@ def test_send_user_email_code_with_urlencoded_next_param(admin_request, mocker,
'next': '/services' 'next': '/services'
} }
admin_request.post( admin_request.post(
'user.send_user_email_code', 'user.send_user_2fa_code',
code_type='email',
user_id=sample_user.id, user_id=sample_user.id,
_data=data, _data=data,
_expected_status=204 _expected_status=204
@@ -382,7 +384,8 @@ def test_send_user_email_code_with_urlencoded_next_param(admin_request, mocker,
def test_send_email_code_returns_404_for_bad_input_data(admin_request): def test_send_email_code_returns_404_for_bad_input_data(admin_request):
resp = admin_request.post( resp = admin_request.post(
'user.send_user_email_code', 'user.send_user_2fa_code',
code_type='email',
user_id=uuid.uuid4(), user_id=uuid.uuid4(),
_data={}, _data={},
_expected_status=404 _expected_status=404