From 5d26d4457fd5c3ce8eefb38da36e966b9ac1b126 Mon Sep 17 00:00:00 2001 From: chrisw Date: Thu, 25 Jan 2018 15:29:05 +0000 Subject: [PATCH] manage api keys permission should be able to see senders --- app/__init__.py | 6 +- app/main/views/service_settings.py | 8 +- app/templates/components/table.html | 6 +- app/templates/main_nav.html | 4 +- app/templates/views/api/callbacks.html | 6 +- app/templates/views/callbacks.html | 2 +- app/templates/views/features.html | 4 +- app/templates/views/integration-testing.html | 2 +- app/templates/views/roadmap.html | 2 +- app/templates/views/security.html | 2 +- app/templates/views/service-settings.html | 88 ++++++++++++++++--- .../service-settings/email_reply_to.html | 18 ++-- .../letter-contact-details.html | 13 +-- .../views/service-settings/sms-senders.html | 20 ++--- app/templates/views/user-profile.html | 2 +- tests/app/main/views/test_dashboard.py | 12 ++- 16 files changed, 133 insertions(+), 62 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 67ff8ca72..0d01c194e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -18,7 +18,7 @@ from flask import ( ) from flask._compat import string_types from flask.globals import _lookup_req_object, _request_ctx_stack -from flask_login import LoginManager +from flask_login import LoginManager, current_user from flask_wtf import CSRFProtect from flask_wtf.csrf import CSRFError from functools import partial @@ -153,6 +153,10 @@ def init_app(application): def _attach_current_service(): return {'current_service': current_service} + @application.context_processor + def _attach_current_user(): + return{'current_user': current_user} + @application.before_request def record_start_time(): g.start = monotonic() diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index e5e5da052..b3a2a81eb 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -43,7 +43,7 @@ from notifications_utils.formatters import formatted_list @main.route("/services//service-settings") @login_required -@user_has_permissions('manage_settings', admin_override=True) +@user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True) def service_settings(service_id): letter_branding_organisations = email_branding_client.get_letter_email_branding() if current_service['email_branding']: @@ -340,7 +340,7 @@ def service_set_reply_to_email(service_id): @main.route("/services//service-settings/email-reply-to", methods=['GET']) @login_required -@user_has_permissions('manage_settings', admin_override=True) +@user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True) def service_email_reply_to(service_id): reply_to_email_addresses = service_api_client.get_reply_to_email_addresses(service_id) return render_template( @@ -520,7 +520,7 @@ def service_set_auth_type(service_id): @main.route("/services//service-settings/letter-contacts", methods=['GET']) @login_required -@user_has_permissions('manage_settings', admin_override=True) +@user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True) def service_letter_contact_details(service_id): letter_contact_details = service_api_client.get_letter_contacts(service_id) return render_template( @@ -576,7 +576,7 @@ def service_edit_letter_contact(service_id, letter_contact_id): @main.route("/services//service-settings/sms-sender", methods=['GET']) @login_required -@user_has_permissions('manage_settings', admin_override=True) +@user_has_permissions('manage_settings', 'manage_api_keys', admin_override=True, any_=True) def service_sms_senders(service_id): def attach_hint(sender): diff --git a/app/templates/components/table.html b/app/templates/components/table.html index d9fe3b23c..ee0a9c5cf 100644 --- a/app/templates/components/table.html +++ b/app/templates/components/table.html @@ -105,9 +105,11 @@ {% endcall %} {%- endmacro %} -{% macro edit_field(text, link) -%} +{% macro edit_field(text, link, permissions=[]) -%} {% call field(align='right') %} - {{ text }} + {% if current_user.has_permissions(*permissions, **{'any_':True, 'admin_override': True}) or not permissions %} + {{ text }} + {% endif %} {% endcall %} {%- endmacro %} diff --git a/app/templates/main_nav.html b/app/templates/main_nav.html index c6165b2d7..dd8c02b52 100644 --- a/app/templates/main_nav.html +++ b/app/templates/main_nav.html @@ -50,10 +50,12 @@ {% if current_user.has_permissions('manage_users', 'manage_settings', admin_override=True) %}
  • Team members
  • Usage
  • -
  • Settings
  • {% elif current_user.has_permissions('view_activity') %}
  • Team members
  • {% endif %} + {% if current_user.has_permissions('manage_api_keys', 'manage_settings', admin_override=True, any_=True) %} +
  • Settings
  • + {% endif %} {% if current_user.has_permissions('manage_api_keys', admin_override=True) %}
  • API integration
  • {% endif %} diff --git a/app/templates/views/api/callbacks.html b/app/templates/views/api/callbacks.html index 126342b37..be53a3717 100644 --- a/app/templates/views/api/callbacks.html +++ b/app/templates/views/api/callbacks.html @@ -1,7 +1,7 @@ {% extends "withnav_template.html" %} {% from "components/textbox.html" import textbox %} {% from "components/page-footer.html" import page_footer %} -{% from "components/table.html" import mapping_table, row, text_field, edit_field, optional_text_field %} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, optional_text_field with context %} {% block service_page_title %} @@ -25,8 +25,8 @@ {% call row() %} {{ text_field('Callbacks for received text messages') }} - {{ optional_text_field(received_text_messages_callback) }} - {{ edit_field('Change', url_for('.received_text_messages_callback', service_id=current_service.id)) }} + {{ optional_text_field(received_text_messages_callback) }} + {{ edit_field('Change', url_for('.received_text_messages_callback', service_id=current_service.id)) }} {% endcall %} {% endcall %} diff --git a/app/templates/views/callbacks.html b/app/templates/views/callbacks.html index dceb32a46..d60aa1b93 100644 --- a/app/templates/views/callbacks.html +++ b/app/templates/views/callbacks.html @@ -1,4 +1,4 @@ -{% from "components/table.html" import mapping_table, row, text_field, edit_field, field, row_heading%} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, field, row_heading with context %} {% extends "withoutnav_template.html" %} {% block per_page_title %} diff --git a/app/templates/views/features.html b/app/templates/views/features.html index 198bb9913..4864975c0 100644 --- a/app/templates/views/features.html +++ b/app/templates/views/features.html @@ -1,5 +1,5 @@ {% extends "withoutnav_template.html" %} -{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %} {% from "components/sub-navigation.html" import sub_navigation %} {% block per_page_title %} @@ -81,5 +81,5 @@

    Reliable and resilient

    Notify sends messages through multiple providers. If one provider fails, Notify automatically switches to another so that your messages aren’t affected.

    - + {% endblock %} diff --git a/app/templates/views/integration-testing.html b/app/templates/views/integration-testing.html index 22164abc8..45ae8ffb5 100644 --- a/app/templates/views/integration-testing.html +++ b/app/templates/views/integration-testing.html @@ -1,4 +1,4 @@ -{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %} {% extends "withoutnav_template.html" %} {% block per_page_title %} diff --git a/app/templates/views/roadmap.html b/app/templates/views/roadmap.html index 536097901..08a46ce50 100644 --- a/app/templates/views/roadmap.html +++ b/app/templates/views/roadmap.html @@ -1,4 +1,4 @@ -{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %} {% from "components/sub-navigation.html" import sub_navigation %} {% extends "withoutnav_template.html" %} diff --git a/app/templates/views/security.html b/app/templates/views/security.html index 453377313..25a15226c 100644 --- a/app/templates/views/security.html +++ b/app/templates/views/security.html @@ -1,5 +1,5 @@ {% extends "withoutnav_template.html" %} -{% from "components/table.html" import mapping_table, row, text_field, edit_field, field %} +{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %} {% from "components/sub-navigation.html" import sub_navigation %} {% block per_page_title %} diff --git a/app/templates/views/service-settings.html b/app/templates/views/service-settings.html index b378f5320..5057419b8 100644 --- a/app/templates/views/service-settings.html +++ b/app/templates/views/service-settings.html @@ -1,7 +1,7 @@ {% extends "withnav_template.html" %} {% from "components/banner.html" import banner_wrapper %} {% from "components/browse-list.html" import browse_list %} -{% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field %} +{% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field with context %} {% block service_page_title %} Settings @@ -23,7 +23,12 @@ {% call row() %} {{ text_field('Service name') }} {{ text_field(current_service.name) }} - {{ edit_field('Change', url_for('.service_name_change', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_name_change', service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% call row() %} @@ -33,7 +38,13 @@ if 'email_auth' in current_service.permissions else 'Text message code' ) }} - {{ edit_field('Change', url_for('.service_set_auth_type', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_auth_type', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% endcall %} @@ -48,7 +59,13 @@ {% call row() %} {{ text_field('Send emails') }} {{ boolean_field('email' in current_service.permissions) }} - {{ edit_field('Change', url_for('.service_set_email', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_email', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% if 'email' in current_service.permissions %} @@ -65,8 +82,11 @@ {% endif %} {% endcall %} {{ edit_field( - 'Manage' if reply_to_email_address_count else 'Change', - url_for('.service_email_reply_to', service_id=current_service.id)) + 'Manage' if reply_to_email_address_count else 'Change', + url_for('.service_email_reply_to', + service_id=current_service.id), + permissions=['manage_settings','manage_api_keys'] + ) }} {% endcall %} @@ -84,7 +104,13 @@ {% call row() %} {{ text_field('Send text messages') }} {{ boolean_field('sms' in current_service.permissions) }} - {{ edit_field('Change', url_for('.service_set_sms', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_sms', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% if 'sms' in current_service.permissions %} @@ -99,25 +125,49 @@ {% endif %} {% endcall %} - {{ edit_field('Manage' if sms_sender_count else 'Change', url_for('.service_sms_senders', service_id=current_service.id)) }} + {{ edit_field( + 'Manage' if sms_sender_count else 'Change', + url_for('.service_sms_senders', + service_id=current_service.id), + permissions=['manage_settings','manage_api_keys'] + ) + }} {% endcall %} {% call row() %} {{ text_field('Text messages start with service name') }} {{ boolean_field(prefix_sms) }} - {{ edit_field('Change', url_for('.service_set_sms_prefix', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_sms_prefix', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% call row() %} {{ text_field('International text messages') }} {{ boolean_field('international_sms' in current_service.permissions) }} - {{ edit_field('Change', url_for('.service_set_international_sms', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_international_sms', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% call row() %} {{ text_field('Receive text messages') }} {{ boolean_field('inbound_sms' in current_service.permissions) }} - {{ edit_field('Change', url_for('.service_set_inbound_sms', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_inbound_sms', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% endif %} @@ -134,7 +184,13 @@ {% call row() %} {{ text_field('Send letters') }} {{ boolean_field('letter' in current_service.permissions) }} - {{ edit_field('Change', url_for('.service_set_letters', service_id=current_service.id)) }} + {{ edit_field( + 'Change', + url_for('.service_set_letters', + service_id=current_service.id), + permissions=['manage_settings'] + ) + }} {% endcall %} {% if 'letter' in current_service.permissions %} @@ -148,7 +204,13 @@ {% endif %} {% endcall %} - {{ edit_field('Manage' if letter_contact_details_count else 'Change', url_for('.service_letter_contact_details', service_id=current_service.id)) }} + {{ edit_field( + 'Manage' if letter_contact_details_count else 'Change', + url_for('.service_letter_contact_details', + service_id=current_service.id), + permissions=['manage_settings','manage_api_keys'] + ) + }} {% endcall %} {% endif %} diff --git a/app/templates/views/service-settings/email_reply_to.html b/app/templates/views/service-settings/email_reply_to.html index 71ce4c627..9cd903adf 100644 --- a/app/templates/views/service-settings/email_reply_to.html +++ b/app/templates/views/service-settings/email_reply_to.html @@ -1,7 +1,7 @@ {% extends "withnav_template.html" %} {% from "components/api-key.html" import api_key %} {% from "components/page-footer.html" import page_footer %} -{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table %} +{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table with context %} {% block service_page_title %} Email reply to addresses @@ -15,9 +15,11 @@ Email reply to addresses - + {% if current_user.has_permissions('manage_settings', admin_override=True) %} + + {% endif %}
    {% if not reply_to_email_addresses %} @@ -34,11 +36,9 @@ {% endif %} - + {% if current_user.has_permissions('manage_settings', admin_override=True) %} + Change + {% endif %} {% if reply_to_email_addresses|length > 1 %} {{ api_key(item.id, thing="ID") }} {% endif %} diff --git a/app/templates/views/service-settings/letter-contact-details.html b/app/templates/views/service-settings/letter-contact-details.html index a017cf022..5e06e8014 100644 --- a/app/templates/views/service-settings/letter-contact-details.html +++ b/app/templates/views/service-settings/letter-contact-details.html @@ -1,7 +1,7 @@ {% extends "withnav_template.html" %} {% from "components/api-key.html" import api_key %} {% from "components/page-footer.html" import page_footer %} -{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table %} +{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table with context %} {% block service_page_title %} Sender addresses @@ -15,9 +15,11 @@ Sender addresses
    - + {% if current_user.has_permissions('manage_settings', admin_override=True) %} + + {% endif %}
    {% if not letter_contact_details %} @@ -35,8 +37,9 @@ (default) {% endif %}

    - + {% if current_user.has_permissions('manage_settings', admin_override=True) %} Change + {% endif %} {% if letter_contact_details|length > 1 %} {{ api_key(item.id, thing="ID") }} {% endif %} diff --git a/app/templates/views/service-settings/sms-senders.html b/app/templates/views/service-settings/sms-senders.html index ee11c3e4c..ab5d8b1bd 100644 --- a/app/templates/views/service-settings/sms-senders.html +++ b/app/templates/views/service-settings/sms-senders.html @@ -1,7 +1,7 @@ {% extends "withnav_template.html" %} {% from "components/api-key.html" import api_key %} {% from "components/page-footer.html" import page_footer %} -{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table %} +{% from "components/table.html" import row_group, row, text_field, edit_field, field, boolean_field, list_table with context%} {% block service_page_title %} Text message senders @@ -14,16 +14,18 @@ Text message senders
    - + {% if current_user.has_permissions('manage_settings', admin_override=True) %} + + {% endif %}
    {% if not sms_senders %}
    You haven’t added any sms senders yet
    - {% endif %} + {% endif %} {% for item in sms_senders %}

    @@ -35,11 +37,9 @@ {% endif %}

    - + {% if current_user.has_permissions('manage_settings', admin_override=True) %} + Change + {% endif %} {% if sms_senders|length > 1 %} {{ api_key(item.id, thing="ID") }} {% endif %} diff --git a/app/templates/views/user-profile.html b/app/templates/views/user-profile.html index 588d4d319..9950af7c5 100644 --- a/app/templates/views/user-profile.html +++ b/app/templates/views/user-profile.html @@ -1,6 +1,6 @@ {% extends "withoutnav_template.html" %} {% from "components/table.html" import list_table, row, field %} -{% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field %} +{% from "components/table.html" import mapping_table, row, text_field, optional_text_field, edit_field, field, boolean_field with context %} {% block per_page_title %} Your profile diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 1b3a492be..7e09c5fc5 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -827,14 +827,12 @@ def test_menu_manage_api_keys( api_user_active, service_one, ['view_activity', 'manage_api_keys']) - page = resp.get_data(as_text=True) - assert url_for( - 'main.choose_template', - service_id=service_one['id'], - ) in page - assert url_for('main.manage_users', service_id=service_one['id']) in page - assert url_for('main.service_settings', service_id=service_one['id']) not in page + page = resp.get_data(as_text=True) + + assert url_for('main.choose_template', service_id=service_one['id'],) in page + assert url_for('main.manage_users', service_id=service_one['id']) in page + assert url_for('main.service_settings', service_id=service_one['id']) in page assert url_for('main.api_integration', service_id=service_one['id']) in page