Enforce order of permissions decorators

At the moment we mostly have `user_has_permissions` execute first. It
shouldn’t matter, but it feels right for us to check that a user is
logged in before we check their permissions to a service. Otherwise a
malicious user could (maybe) check if a service ID belongs to a real
service, and go on to do something malicious with that information.

This commit adds some extra test code to enforce that the order is
always the same.

N.B. decorators in Python execute from closest to furthest (from the
line on which the function is defined).
This commit is contained in:
Chris Hill-Scott
2019-07-01 13:45:21 +01:00
parent 91f2da8b68
commit 3da9e84ece
13 changed files with 179 additions and 159 deletions

View File

@@ -30,8 +30,8 @@ from app.utils import is_gov_user, redact_mobile_number, user_has_permissions
@main.route("/services/<service_id>/users")
@login_required
@user_has_permissions(allow_org_user=True)
@login_required
def manage_users(service_id):
return render_template(
'views/manage-users.html',
@@ -44,8 +44,8 @@ def manage_users(service_id):
@main.route("/services/<service_id>/users/invite", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def invite_user(service_id):
form = InviteUserForm(
@@ -81,8 +81,8 @@ def invite_user(service_id):
@main.route("/services/<service_id>/users/<user_id>", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def edit_user_permissions(service_id, user_id):
service_has_email_auth = current_service.has_permission('email_auth')
user = current_service.get_team_member(user_id)
@@ -122,8 +122,8 @@ def edit_user_permissions(service_id, user_id):
@main.route("/services/<service_id>/users/<user_id>/delete", methods=['POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def remove_user_from_service(service_id, user_id):
try:
service_api_client.remove_user_from_service(service_id, user_id)
@@ -144,8 +144,8 @@ def remove_user_from_service(service_id, user_id):
@main.route("/services/<service_id>/users/<uuid:user_id>/edit-email", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def edit_user_email(service_id, user_id):
user = current_service.get_team_member(user_id)
user_email = user.email_address
@@ -172,8 +172,8 @@ def edit_user_email(service_id, user_id):
@main.route("/services/<service_id>/users/<uuid:user_id>/edit-email/confirm", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def confirm_edit_user_email(service_id, user_id):
user = current_service.get_team_member(user_id)
if 'team_member_email_change' in session:
@@ -207,8 +207,8 @@ def confirm_edit_user_email(service_id, user_id):
@main.route("/services/<service_id>/users/<uuid:user_id>/edit-mobile-number", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def edit_user_mobile_number(service_id, user_id):
user = current_service.get_team_member(user_id)
user_mobile_number = redact_mobile_number(user.mobile_number)
@@ -232,8 +232,8 @@ def edit_user_mobile_number(service_id, user_id):
@main.route("/services/<service_id>/users/<uuid:user_id>/edit-mobile-number/confirm", methods=['GET', 'POST'])
@login_required
@user_has_permissions('manage_service')
@login_required
def confirm_edit_user_mobile_number(service_id, user_id):
user = current_service.get_team_member(user_id)
if 'team_member_mobile_change' in session: