From 6167c92e98e8ffdee482814069d90340eebb65e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Thu, 19 Dec 2024 00:51:48 +0100 Subject: [PATCH] implement level permissions in tileserver/cachepackage --- src/c3nav/mapdata/render/renderdata.py | 4 +++- src/c3nav/mapdata/utils/cache/package.py | 28 +++++++++++++++++++----- src/c3nav/mapdata/views.py | 5 ++++- src/c3nav/tileserver/wsgi.py | 9 ++++++-- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/c3nav/mapdata/render/renderdata.py b/src/c3nav/mapdata/render/renderdata.py index f7bd5e7f..bec74635 100644 --- a/src/c3nav/mapdata/render/renderdata.py +++ b/src/c3nav/mapdata/render/renderdata.py @@ -358,7 +358,9 @@ class LevelRenderData: map_history.save_level(render_level.pk, 'composite') - package.add_level(render_level.pk, theme, map_history, access_restriction_affected) + package.add_level(level_id=render_level.pk, theme_id=theme, history=map_history, + restrictions=access_restriction_affected, + level_restriction=render_level.access_restriction_id) render_data.save(update_cache_key, render_level.pk, theme) diff --git a/src/c3nav/mapdata/utils/cache/package.py b/src/c3nav/mapdata/utils/cache/package.py index 9e028df3..10ad48e5 100644 --- a/src/c3nav/mapdata/utils/cache/package.py +++ b/src/c3nav/mapdata/utils/cache/package.py @@ -4,7 +4,7 @@ from collections import namedtuple from io import BytesIO from pathlib import Path from tarfile import TarFile, TarInfo -from typing import BinaryIO, Optional, Self +from typing import BinaryIO, Optional, Self, NamedTuple from pyzstd import CParameter, ZstdError, ZstdFile @@ -16,7 +16,12 @@ except ImportError: from threading import local as LocalContext ZSTD_MAGIC_NUMBER = b"\x28\xb5\x2f\xfd" -CachePackageLevel = namedtuple('CachePackageLevel', ('history', 'restrictions')) + + +class CachePackageLevel(NamedTuple): + history: MapHistory + restrictions: AccessRestrictionAffected + global_restrictions: frozenset[int] class CachePackage: @@ -25,8 +30,13 @@ class CachePackage: self.levels = {} if levels is None else levels self.theme_ids = [] - def add_level(self, level_id: int, theme_id, history: MapHistory, restrictions: AccessRestrictionAffected): - self.levels[(level_id, theme_id)] = CachePackageLevel(history, restrictions) + def add_level(self, level_id: int, theme_id, history: MapHistory, restrictions: AccessRestrictionAffected, + level_restriction: int | None): + self.levels[(level_id, theme_id)] = CachePackageLevel( + history=history, + restrictions=restrictions, + global_restrictions=frozenset() if level_restriction is None else frozenset((level_restriction, )) + ) if theme_id not in self.theme_ids: self.theme_ids.append(theme_id) @@ -62,6 +72,10 @@ class CachePackage: key = '%d' % level_id else: key = '%d_%d' % (level_id, theme_id) + self._add_bytesio(f, 'global_restrictions_%s' % key, + BytesIO(struct.pack('