about summary refs log tree commit diff
path: root/uploader/session.py
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/session.py')
-rw-r--r--uploader/session.py28
1 files changed, 20 insertions, 8 deletions
diff --git a/uploader/session.py b/uploader/session.py
index 399f28c..1dcf8ac 100644
--- a/uploader/session.py
+++ b/uploader/session.py
@@ -1,4 +1,5 @@
 """Deal with user sessions"""
+import logging
 from uuid import UUID, uuid4
 from datetime import datetime
 from typing import Any, Optional, TypedDict
@@ -7,6 +8,8 @@ from authlib.jose import KeySet
 from flask import request, session
 from pymonad.either import Left, Right, Either
 
+logger = logging.getLogger(__name__)
+
 
 class UserDetails(TypedDict):
     """Session information relating specifically to the user."""
@@ -22,8 +25,6 @@ class SessionInfo(TypedDict):
     session_id: UUID
     user: UserDetails
     anon_id: UUID
-    user_agent: str
-    ip_addr: str
     masquerade: Optional[UserDetails]
     auth_server_jwks: Optional[dict[str, Any]]
 
@@ -66,9 +67,6 @@ def session_info() -> SessionInfo:
                 "logged_in": False
             },
             "anon_id": anon_id,
-            "user_agent": request.headers.get("User-Agent"),
-            "ip_addr": request.environ.get("HTTP_X_FORWARDED_FOR",
-                                           request.remote_addr),
             "masquerading": None
         }))
 
@@ -77,17 +75,31 @@ def set_user_token(token: str) -> SessionInfo:
     """Set the user's token."""
     info = session_info()
     return save_session_info({
-        **info, "user": {**info["user"], "token": Right(token)}})#type: ignore[misc]
+        **info,
+        "user": {**info["user"], "token": Right(token), "logged_in": True}
+    })#type: ignore[misc]
 
 
 def set_user_details(userdets: UserDetails) -> SessionInfo:
     """Set the user details information"""
-    return save_session_info({**session_info(), "user": userdets})#type: ignore[misc]
+    info = session_info()
+    return save_session_info({**info, "user": {**info["user"], **userdets}})#type: ignore[misc]
 
 def user_details() -> UserDetails:
     """Retrieve user details."""
     return session_info()["user"]
 
+
+def logged_in_user_id() -> Optional[UUID]:
+    """Get user id for logged in user. If user has not logged in, return None."""
+    return user_token().then(
+        lambda _tok: user_details()
+    ).then(
+        lambda _user: Either(_user["user_id"],
+                             (None, _user["email"] != "anon@ymous.user"))
+    ).either(lambda _err: None, lambda uid: uid)
+
+
 def user_token() -> Either:
     """Retrieve the user token."""
     return session_info()["user"]["token"]
@@ -96,7 +108,7 @@ def user_token() -> Either:
 def set_auth_server_jwks(keyset: KeySet) -> KeySet:
     """Update the JSON Web Keys in the session."""
     save_session_info({
-        **session_info(),
+        **session_info(),# type: ignore[misc]
         "auth_server_jwks": {
             "last-updated": datetime.now().timestamp(),
             "jwks": keyset.as_dict()