22import time
33from dataclasses import dataclass
44from datetime import datetime , timedelta
5- from typing import Any , Optional , Union
5+ from typing import Any , Union
66
77import httpx
88import jwt
@@ -31,10 +31,10 @@ class User:
3131 provider : str = "google"
3232 created_at : datetime = None
3333 last_login : datetime = None
34- jwt_token : Optional [ str ] = None
35- opensearch_username : Optional [ str ] = None
36- opensearch_credentials : Optional [ str ] = None # Raw base64 credentials (without "Basic " prefix)
37- db_user_id : Optional [ str ] = None # Internal OpenRAG users.id
34+ jwt_token : str | None = None
35+ opensearch_username : str | None = None
36+ opensearch_credentials : str | None = None # Raw base64 credentials (without "Basic " prefix)
37+ db_user_id : str | None = None # Internal OpenRAG users.id
3838
3939 def __post_init__ (self ):
4040 if self .created_at is None :
@@ -151,11 +151,11 @@ def _load_rsa_keys(self):
151151 self .public_key_pem = open (self .public_key_path , "r" ).read ()
152152
153153 except FileNotFoundError as e :
154- raise Exception (f"RSA key files not found: { e } " )
154+ raise Exception (f"RSA key files not found: { e } " ) from e
155155 except Exception as e :
156- raise Exception (f"Failed to load RSA keys: { e } " )
156+ raise Exception (f"Failed to load RSA keys: { e } " ) from e
157157
158- async def get_user_info_from_token (self , access_token : str ) -> Optional [ dict [str , Any ]] :
158+ async def get_user_info_from_token (self , access_token : str ) -> dict [str , Any ] | None :
159159 """Get user info from Google using access token"""
160160 try :
161161 async with httpx .AsyncClient () as client :
@@ -178,7 +178,7 @@ async def get_user_info_from_token(self, access_token: str) -> Optional[dict[str
178178 logger .error ("Error getting user info" , error = str (e ))
179179 return None
180180
181- async def create_user_session (self , access_token : str , issuer : str ) -> Optional [ str ] :
181+ async def create_user_session (self , access_token : str , issuer : str ) -> str | None :
182182 """Create user session from OAuth access token"""
183183 user_info = await self .get_user_info_from_token (access_token )
184184 if not user_info :
@@ -242,7 +242,7 @@ def create_jwt_token(self, user: User) -> str:
242242 token = jwt .encode (token_payload , self .private_key , algorithm = self .algorithm )
243243 return f"Bearer { token } "
244244
245- def verify_token (self , token : str ) -> Optional [ dict [str , Any ]] :
245+ def verify_token (self , token : str ) -> dict [str , Any ] | None :
246246 """Verify JWT token and return decoded claims, using an in-process cache."""
247247 if IBM_AUTH_ENABLED :
248248 return None
@@ -268,13 +268,13 @@ def verify_token(self, token: str) -> Optional[dict[str, Any]]:
268268 except jwt .InvalidTokenError :
269269 return None
270270
271- def get_user (self , user_id : str ) -> Optional [ User ] :
271+ def get_user (self , user_id : str ) -> User | None :
272272 """Get user by ID"""
273273 if user_id == "anonymous" :
274274 return AnonymousUser ()
275275 return self .users .get (user_id )
276276
277- def get_user_from_token (self , token : str ) -> Optional [ User ] :
277+ def get_user_from_token (self , token : str ) -> User | None :
278278 """Get user from JWT token"""
279279 payload = self .verify_token (token )
280280 if payload :
0 commit comments