about summary refs log tree commit diff
path: root/uploader/oauth2/client.py
diff options
context:
space:
mode:
Diffstat (limited to 'uploader/oauth2/client.py')
-rw-r--r--uploader/oauth2/client.py28
1 files changed, 23 insertions, 5 deletions
diff --git a/uploader/oauth2/client.py b/uploader/oauth2/client.py
index e119cc3..b94a044 100644
--- a/uploader/oauth2/client.py
+++ b/uploader/oauth2/client.py
@@ -1,6 +1,7 @@
 """OAuth2 client utilities."""
 import json
 import time
+import uuid
 import random
 from datetime import datetime, timedelta
 from urllib.parse import urljoin, urlparse
@@ -42,7 +43,8 @@ def __fetch_auth_server_jwks__() -> KeySet:
     return KeySet([
         JsonWebKey.import_key(key)
         for key in requests.get(
-                urljoin(authserver_uri(), "auth/public-jwks")
+                urljoin(authserver_uri(), "auth/public-jwks"),
+                timeout=(9.13, 20)
         ).json()["jwks"]])
 
 
@@ -61,7 +63,7 @@ def __update_auth_server_jwks__(jwks) -> KeySet:
 
 def auth_server_jwks() -> KeySet:
     """Fetch the auth-server JSON Web Keys information."""
-    _jwks = session.session_info().get("auth_server_jwks")
+    _jwks = session.session_info().get("auth_server_jwks") or {}
     if bool(_jwks):
         return __update_auth_server_jwks__({
             "last-updated": _jwks["last-updated"],
@@ -112,7 +114,8 @@ def oauth2_client():
                 try:
                     jwt = JsonWebToken(["RS256"]).decode(
                         token["access_token"], key=jwk)
-                    return datetime.now().timestamp() > jwt["exp"]
+                    if bool(jwt.get("exp")):
+                        return datetime.now().timestamp() > jwt["exp"]
                 except BadSignatureError as _bse:
                     pass
 
@@ -145,9 +148,24 @@ def oauth2_client():
         __client__)
 
 
+def fetch_user_details() -> Either:
+    """Retrieve user details from the auth server"""
+    suser = session.session_info()["user"]
+    if suser["email"] == "anon@ymous.user":
+        udets = oauth2_get("auth/user/").then(
+            lambda usrdets: session.set_user_details({
+                "user_id": uuid.UUID(usrdets["user_id"]),
+                "name": usrdets["name"],
+                "email": usrdets["email"],
+                "token": session.user_token()}))
+        return udets
+    return Right(suser)
+
+
 def user_logged_in():
     """Check whether the user has logged in."""
     suser = session.session_info()["user"]
+    fetch_user_details()
     return suser["logged_in"] and suser["token"].is_right()
 
 
@@ -191,7 +209,7 @@ def oauth2_get(url, **kwargs) -> Either:
                 return Right(resp.json())
             return Left(resp)
         except Exception as exc:#pylint: disable=[broad-except]
-            app.logger.error("Error retriving data from auth server: (GET %s)",
+            app.logger.error("Error retrieving data from auth server: (GET %s)",
                              _uri,
                              exc_info=True)
             return Left(exc)
@@ -223,7 +241,7 @@ def oauth2_post(url, data=None, json=None, **kwargs):#pylint: disable=[redefined
                 return Right(resp.json())
             return Left(resp)
         except Exception as exc:#pylint: disable=[broad-except]
-            app.logger.error("Error retriving data from auth server: (POST %s)",
+            app.logger.error("Error retrieving data from auth server: (POST %s)",
                              _uri,
                              exc_info=True)
             return Left(exc)