From d09d75166d8035f7977ed077bf095dafe28d03c3 Mon Sep 17 00:00:00 2001 From: Drini Cami Date: Tue, 26 Nov 2024 17:19:07 -0500 Subject: [PATCH] Fix identifiers with page suffixes not working --- iiify/app.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/iiify/app.py b/iiify/app.py index dbe6243..dd6845c 100755 --- a/iiify/app.py +++ b/iiify/app.py @@ -81,7 +81,7 @@ def documentation(): @app.route('/iiif/helper//') def helper(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=false) metadata = requests.get('%s/metadata/%s' % (ARCHIVE, identifier)).json() @@ -111,7 +111,7 @@ def helper(identifier): @app.route('/iiif/') def view(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) domain = purify_domain(request.args.get('domain', request.url_root)) uri = '%s%s' % (domain, identifier) @@ -131,7 +131,7 @@ def view(identifier): @app.route('/iiif/3//collection.json') @cache.cached(timeout=cache_timeouts["med"], forced_update=cache_bust) def collection3JSON(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) domain = purify_domain(request.args.get('domain', request.url_root)) try: @@ -149,7 +149,7 @@ def collection3JSON(identifier): @app.route('/iiif/3///collection.json') @cache.cached(timeout=cache_timeouts["med"], forced_update=cache_bust) def collection3page(identifier, page): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) domain = purify_domain(request.args.get('domain', request.url_root)) try: @@ -168,21 +168,21 @@ def collection3page(identifier, page): @app.route('/iiif//collection.json') @cache.cached(timeout=cache_timeouts["long"], forced_update=cache_bust) def collectionJSON(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) return redirect(f'/iiif/3/{identifier}/collection.json', code=302) @app.route('/iiif///collection.json') @cache.cached(timeout=cache_timeouts["long"], forced_update=cache_bust) def collectionPage(identifier, page): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) return redirect(f'/iiif/3/{identifier}/{page}/collection.json', code=302) @app.route('/iiif/3//manifest.json') @cache.cached(timeout=cache_timeouts["long"], forced_update=cache_bust) def manifest3(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) domain = purify_domain(request.args.get('domain', request.url_root)) page = None @@ -201,14 +201,14 @@ def manifest3(identifier): @app.route('/iiif//annotations///.json') @cache.cached(timeout=cache_timeouts["long"], forced_update=cache_bust) def annnotations(version: str, identifier: str, fileName: str, canvas_no: int): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) domain = purify_domain(request.args.get('domain', request.url_root)) return ldjsonify(create_annotations(version, identifier, fileName, canvas_no, domain=domain)) @app.route('/iiif/vtt/streaming/.vtt') @cache.cached(timeout=cache_timeouts["long"], forced_update=cache_bust) def vtt_stream(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=False) response = make_response(create_vtt_stream(identifier)) response.headers['Content-Type'] = 'text/vtt' return response @@ -216,12 +216,12 @@ def vtt_stream(identifier): @app.route('/iiif//manifest.json') @cache.cached(timeout=cache_timeouts["long"], forced_update=cache_bust) def manifest(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) return redirect(f'/iiif/3/{identifier}/manifest.json', code=302) @app.route('/iiif/2//manifest.json') def manifest2(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) domain = purify_domain(request.args.get('domain', request.url_root)) page = None if '$' in identifier: @@ -237,28 +237,28 @@ def manifest2(identifier): @app.route('/iiif//info.json') def info(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) cantaloupe_id = cantaloupe_resolver(identifier) cantaloupe_url = f"{image_server}/2/{cantaloupe_id}/info.json" return redirect(cantaloupe_url, code=302) @app.route('/iiif/3//info.json') def info3(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) cantaloupe_id = cantaloupe_resolver(identifier) cantaloupe_url = f"{image_server}/3/{cantaloupe_id}/info.json" return redirect(cantaloupe_url, code=302) @app.route('/iiif/2//info.json') def info2(identifier): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) cantaloupe_id = cantaloupe_resolver(identifier) cantaloupe_url = f"{image_server}/2/{cantaloupe_id}/info.json" return redirect(cantaloupe_url, code=302) @app.route('/iiif/////.') def image_processor(identifier, region, size, rotation, quality, fmt): - validate_ia_identifier(identifier) + validate_ia_identifier(identifier, page_suffix=True) cantaloupe_id = cantaloupe_resolver(identifier) cantaloupe_url = f"{image_server}/2/{cantaloupe_id}/{region}/{size}/{rotation}/{quality}.{fmt}" return redirect(cantaloupe_url, code=302) @@ -275,9 +275,15 @@ def ldjsonify(data): j.mimetype = "application/ld+json" return j -def validate_ia_identifier(identifier: str) -> None: +def validate_ia_identifier(identifier: str, page_suffix: bool) -> None: + if page_suffix: + if not re.match(r'^[a-zA-Z0-9_.-]{1,100}(\$\d+)?$', identifier): + abort(400, "Invalid identifier") + return + if not re.match(r'^[a-zA-Z0-9_.-]{1,100}$', identifier): abort(400, "Invalid identifier") + return if __name__ == '__main__': app.run(**options)