diff --git a/app/__init__.py b/app/__init__.py index d3732e208..e3ec26fce 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -83,6 +83,10 @@ from app.notify_client.template_statistics_api_client import ( template_statistics_client, ) from app.notify_client.user_api_client import user_api_client +from app.url_converters import ( + LetterFileExtensionConverter, + TemplateTypeConverter, +) from app.utils import format_thousands, get_logo_cdn_domain, id_safe login_manager = LoginManager() @@ -229,6 +233,8 @@ def init_app(application): } application.url_map.converters['uuid'].to_python = lambda self, value: value + application.url_map.converters['template_type'] = TemplateTypeConverter + application.url_map.converters['letter_file_extension'] = LetterFileExtensionConverter def convert_to_boolean(value): diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 06f225e90..390eb7325 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -213,7 +213,7 @@ def view_job_updates(service_id, job_id): @main.route('/services//notifications', methods=['GET', 'POST']) -@main.route('/services//notifications/', methods=['GET', 'POST']) +@main.route('/services//notifications/', methods=['GET', 'POST']) @user_has_permissions() def view_notifications(service_id, message_type=None): return render_template( @@ -237,7 +237,7 @@ def view_notifications(service_id, message_type=None): @main.route('/services//notifications.json', methods=['GET', 'POST']) -@main.route('/services//notifications/.json', methods=['GET', 'POST']) +@main.route('/services//notifications/.json', methods=['GET', 'POST']) @user_has_permissions() def get_notifications_as_json(service_id, message_type=None): return jsonify(get_notifications( @@ -245,15 +245,14 @@ def get_notifications_as_json(service_id, message_type=None): )) -@main.route('/services//notifications/.csv', endpoint="view_notifications_csv") +@main.route('/services//notifications.csv', endpoint="view_notifications_csv") +@main.route('/services//notifications/.csv', endpoint="view_notifications_csv") @user_has_permissions() def get_notifications(service_id, message_type, status_override=None): # TODO get the api to return count of pages as well. page = get_page_from_request() if page is None: abort(404, "Invalid page argument ({}).".format(request.args.get('page'))) - if message_type not in ['email', 'sms', 'letter', None]: - abort(404) filter_args = parse_filter_args(request.args) filter_args['status'] = set_status_filters(filter_args) service_data_retention_days = None diff --git a/app/main/views/notifications.py b/app/main/views/notifications.py index f02db4dfd..5cff773e7 100644 --- a/app/main/views/notifications.py +++ b/app/main/views/notifications.py @@ -8,7 +8,6 @@ from datetime import datetime from dateutil import parser from flask import ( Response, - abort, flash, jsonify, redirect, @@ -180,15 +179,11 @@ def get_preview_error_image(): return file.read() -@main.route("/services//notification/.") +@main.route("/services//notification/.") @user_has_permissions('view_activity') def view_letter_notification_as_preview( service_id, notification_id, filetype, with_metadata=False ): - - if filetype not in ('pdf', 'png'): - abort(404) - try: preview = notification_api_client.get_notification_letter_preview( service_id, diff --git a/app/main/views/templates.py b/app/main/views/templates.py index 49ca6cfd2..e42aba388 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -106,8 +106,8 @@ def start_tour(service_id, template_id): @main.route("/services//templates", methods=['GET', 'POST']) @main.route("/services//templates/folders/", methods=['GET', 'POST']) -@main.route("/services//templates/", methods=['GET', 'POST']) -@main.route("/services//templates//folders/", methods=['GET', 'POST']) +@main.route("/services//templates/", methods=['GET', 'POST']) +@main.route("/services//templates//folders/", methods=['GET', 'POST']) @user_has_permissions() def choose_template(service_id, template_type='all', template_folder_id=None): template_folder = current_service.get_template_folder(template_folder_id) @@ -406,11 +406,11 @@ def _get_template_copy_name(template, existing_templates): @main.route(( '/services//templates/action-blocked/' - '' + '' )) @main.route(( '/services//templates/action-blocked/' - '//' + '//' )) @user_has_permissions('manage_templates') def action_blocked(service_id, notification_type, return_to='add_new_template', template_id=None): @@ -505,18 +505,16 @@ def delete_template_folder(service_id, template_folder_id): @main.route( - "/services//templates/add-", + "/services//templates/add-", methods=['GET', 'POST'], ) @main.route( - "/services//templates/folders//add-", + "/services//templates/folders//add-", methods=['GET', 'POST'], ) @user_has_permissions('manage_templates') def add_service_template(service_id, template_type, template_folder_id=None): - if template_type not in ['sms', 'email', 'letter']: - abort(404) if not current_service.has_permission('letter') and template_type == 'letter': abort(403) diff --git a/app/url_converters.py b/app/url_converters.py new file mode 100644 index 000000000..e90012f59 --- /dev/null +++ b/app/url_converters.py @@ -0,0 +1,11 @@ +from werkzeug.routing import BaseConverter + + +class TemplateTypeConverter(BaseConverter): + + regex = '(?:email|sms|letter)' + + +class LetterFileExtensionConverter(BaseConverter): + + regex = '(?:pdf|png)'