diff --git a/backend/app/sane_url.py b/backend/app/sane_url.py index e48931064d311c1207466773115fbae2d9cb23be..8928f9ef8c0f4dac0c1f56d6df881eb5eb75dcca 100644 --- a/backend/app/sane_url.py +++ b/backend/app/sane_url.py @@ -12,6 +12,7 @@ from pydantic import BaseModel from .config import SXPLR_EBRAINS_IAM_SA_CLIENT_ID, SXPLR_EBRAINS_IAM_SA_CLIENT_SECRET, SXPLR_BUCKET_NAME, HOST_PATHNAME from .const import EBRAINS_IAM_DISCOVERY_URL from ._store import DataproxyStore +from .user import get_user router = APIRouter() @@ -76,9 +77,10 @@ class SaneUrlDPStore(DataproxyStore): return super()._get_bucket() def _prepare_aux(self, request: Optional[Request]=None): + user = get_user(request) if request else None return { - "userId": None, - "expiry": SaneUrlDPStore.GetTimeMs() + (self.expiry_s * 1e3) + "userId": user.get("id") if user else None, + "expiry": None if user else SaneUrlDPStore.GetTimeMs() + (self.expiry_s * 1e3) } def get(self, key: str): diff --git a/backend/app/user.py b/backend/app/user.py index dc5789038610f0de3f190143a06673f8f4f1b605..d01801994c116de828dcf6c1d34f8a5717de45a8 100644 --- a/backend/app/user.py +++ b/backend/app/user.py @@ -9,35 +9,32 @@ import json from .const import PROFILE_KEY from .auth import _store -def is_authenticated(fn): - - class NotAuthenticatedEx(Exception): ... +class NotAuthenticatedEx(Exception): ... - def check_auth(request: Request): - if PROFILE_KEY not in request.session: - raise NotAuthenticatedEx - - profile_uuid = request.session[PROFILE_KEY] - user = _store.get(profile_uuid) - if not user: - raise NotAuthenticatedEx - - request.state.user = json.loads(user) +def get_user(request: Request): + if PROFILE_KEY not in request.session: + return None + + profile_uuid = request.session[PROFILE_KEY] + user = _store.get(profile_uuid) + + return json.loads(user) if user else None +def is_authenticated(fn): @wraps(fn) async def async_wrapper(*args, request: Request, **kwargs): - try: - check_auth(request) - except NotAuthenticatedEx: + user = get_user(request) + if not user: return Response("Not authenticated", 401) + request.state.user = user return await fn(*args, request=request, **kwargs) @wraps(fn) def sync_wrapper(*args, request: Request, **kwargs): - try: - check_auth(request) - except NotAuthenticatedEx: + user = get_user(request) + if not user: return Response("Not authenticated", 401) + request.state.user = user return fn(*args, request=request, **kwargs) return async_wrapper if iscoroutine(fn) else sync_wrapper diff --git a/docs/releases/v2.13.5.md b/docs/releases/v2.13.5.md new file mode 100644 index 0000000000000000000000000000000000000000..99554e57121c0a0908ecaf0775f81e308af09d75 --- /dev/null +++ b/docs/releases/v2.13.5.md @@ -0,0 +1,5 @@ +# v2.13.5 + +## Bugfix + +- Fix saneurl generation. Logged in user can generate long lived saneurls again diff --git a/mkdocs.yml b/mkdocs.yml index dd014bb59f47efbe81010951fd0be4d184404be6..4e782a75f743f652947a8e4899fd4243710ce17e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -33,6 +33,7 @@ nav: - Fetching datasets: 'advanced/datasets.md' - Display non-atlas volumes: 'advanced/otherVolumes.md' - Release notes: + - v2.13.5: 'releases/v2.13.5.md' - v2.13.4: 'releases/v2.13.4.md' - v2.13.3: 'releases/v2.13.3.md' - v2.13.2: 'releases/v2.13.2.md' diff --git a/package.json b/package.json index 1bbda561272633686c7c388c68220cff4f83c4ed..a8d4d91d281340a14821537ae29b3cf76def7d3f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "siibra-explorer", - "version": "2.13.4", + "version": "2.13.5", "description": "siibra-explorer - explore brain atlases. Based on humanbrainproject/nehuba & google/neuroglancer. Built with angular", "scripts": { "lint": "eslint src --ext .ts",