diff --git a/src/c3nav/api/urls.py b/src/c3nav/api/urls.py index e9727691..8b337877 100644 --- a/src/c3nav/api/urls.py +++ b/src/c3nav/api/urls.py @@ -37,7 +37,7 @@ router.register(r'locations/by_slug', LocationBySlugViewSet, base_name='location router.register(r'locationgroupcategories', LocationGroupCategoryViewSet) router.register(r'locationgroups', LocationGroupViewSet) -router.register(r'user', UserViewSet, base_name='user') +router.register(r'users', UserViewSet, base_name='users') router.register(r'routing', RoutingViewSet, base_name='routing') diff --git a/src/c3nav/mapdata/api.py b/src/c3nav/mapdata/api.py index 8867f583..0ea10114 100644 --- a/src/c3nav/mapdata/api.py +++ b/src/c3nav/mapdata/api.py @@ -28,6 +28,7 @@ from c3nav.mapdata.utils.locations import (get_location_by_id_for_request, get_l searchable_locations_for_request, visible_locations_for_request) from c3nav.mapdata.utils.models import get_submodels from c3nav.mapdata.utils.user import get_user_data +from c3nav.mapdata.views import set_tile_access_cookie def optimize_query(qs): @@ -381,7 +382,13 @@ class AccessRestrictionViewSet(MapdataViewSet): queryset = AccessRestriction.objects.all() -class UserViewSet(MapdataViewSet): +class UserViewSet(GenericViewSet): + """ + Get display information about the current user. This endpoint also sets the tile access cookie. + The tile access cookie is only valid for 1 minute, so if you are displaying a map, call this endpoint repeatedly. + """ @list_route(methods=['get']) def current(self, request, key=None): - return Response(get_user_data(request)) + response = Response(get_user_data(request)) + set_tile_access_cookie(request, response) + return response diff --git a/src/c3nav/mapdata/urls.py b/src/c3nav/mapdata/urls.py index 47d77061..870654af 100644 --- a/src/c3nav/mapdata/urls.py +++ b/src/c3nav/mapdata/urls.py @@ -1,6 +1,6 @@ from django.conf.urls import url -from c3nav.mapdata.views import get_cache_package, map_history, tile, tile_access +from c3nav.mapdata.views import get_cache_package, map_history, tile urlpatterns = [ url(r'^(?P\d+)/(?P-?\d+)/(?P-?\d+)/(?P-?\d+).png$', tile, name='mapdata.tile'), @@ -9,5 +9,4 @@ urlpatterns = [ url(r'^history/(?P\d+)/(?Pbase|composite)\.(?Ppng|data)$', map_history, name='mapdata.map_history'), url(r'^cache/package\.(?Ptar|tar\.gz|tar\.xz)$', get_cache_package, name='mapdata.cache_package'), - url(r'^tile_access$', tile_access, name='mapdata.tile_access'), ] diff --git a/src/c3nav/mapdata/views.py b/src/c3nav/mapdata/views.py index 66834878..d867d118 100644 --- a/src/c3nav/mapdata/views.py +++ b/src/c3nav/mapdata/views.py @@ -1,6 +1,5 @@ import base64 import os -from functools import wraps from wsgiref.util import FileWrapper from django.conf import settings @@ -20,21 +19,15 @@ from c3nav.mapdata.utils.tiles import (build_access_cache_key, build_base_cache_ build_tile_etag, get_tile_bounds, parse_tile_access_cookie) -def set_tile_access_cookie(func): - @wraps(func) - def wrapper(request, *args, **kwargs): - response = func(request, *args, **kwargs) - - access_permissions = AccessPermission.get_for_request(request) - if access_permissions: - cookie = build_tile_access_cookie(access_permissions, settings.SECRET_TILE_KEY) - response.set_cookie(settings.TILE_ACCESS_COOKIE_NAME, cookie, max_age=60, - domain=settings.TILE_ACCESS_COOKIE_DOMAIN) - else: - response.delete_cookie(settings.TILE_ACCESS_COOKIE_NAME) - - return response - return wrapper +def set_tile_access_cookie(request, response): + access_permissions = AccessPermission.get_for_request(request) + if access_permissions: + cookie = build_tile_access_cookie(access_permissions, settings.SECRET_TILE_KEY) + response.set_cookie(settings.TILE_ACCESS_COOKIE_NAME, cookie, max_age=60, + domain=settings.TILE_ACCESS_COOKIE_DOMAIN) + else: + response.delete_cookie(settings.TILE_ACCESS_COOKIE_NAME) + response['Cache-Control'] = 'no-cache' encoded_tile_secret = base64.b64encode(settings.SECRET_TILE_KEY.encode()).decode() @@ -145,14 +138,6 @@ def tile(request, level, zoom, x, y, access_permissions=None): return response -@no_language() -@set_tile_access_cookie -def tile_access(request): - response = HttpResponse(content_type='text/plain') - response['Cache-Control'] = 'no-cache' - return response - - @etag(lambda *args, **kwargs: MapUpdate.current_processed_cache_key()) @no_language() def map_history(request, level, mode, filetype): diff --git a/src/c3nav/site/static/site/js/c3nav.js b/src/c3nav/site/static/site/js/c3nav.js index 2db53396..32c431ca 100644 --- a/src/c3nav/site/static/site/js/c3nav.js +++ b/src/c3nav/site/static/site/js/c3nav.js @@ -855,7 +855,7 @@ c3nav = { window.setTimeout(c3nav.refresh_tile_access, 16000); }, refresh_tile_access: function () { - $.ajax('/map/tile_access'); + $.ajax('/api/users/current/'); c3nav.schedule_refresh_tile_access(); } }; diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index bceb1ba9..d1a4bdd9 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -35,7 +35,6 @@ def check_location(location: Optional[str], request) -> Optional[SpecificLocatio return location -@set_tile_access_cookie def map_index(request, mode=None, slug=None, slug2=None, details=None, level=None, x=None, y=None, zoom=None): origin = None destination = None @@ -78,7 +77,9 @@ def map_index(request, mode=None, slug=None, slug2=None, details=None, level=Non 'tile_cache_server': settings.TILE_CACHE_SERVER, 'user_data': get_user_data(request), } - return render(request, 'site/map.html', ctx) + response = render(request, 'site/map.html', ctx) + set_tile_access_cookie(request, response) + return response def qr_code_etag(request, path):