import random from time import * from datetime import datetime from datetime import timedelta from daemonJwtHandler.constants import auth from daemonJwtHandler.logic import jwt_services def get_jwt_cache_expiry(jwt_token_expiration): """Compute jwt cache expiry. Args: jwt_token_expiration (str): jwt token expiration utc time. Returns: dict: cache expiration time and expiry in seconds. """ jwtInstance = jwt_services.JwtServices.getInstance() log = jwtInstance.logger() try: # Current Time current_time = datetime.utcnow() # JWT expiration Time jwt_expiration_date_time_obj = datetime.strptime( jwt_token_expiration, '%Y-%m-%d %H:%M:%S.%f') # Random jitter random_jitter = random.randint(0, 60) # Actual expiration time for cache with delta and jitter in seconds actual_expiration_time = \ jwt_expiration_date_time_obj - timedelta( seconds=auth.TOKEN_EXPIRATION_DELTA - random_jitter) # JWT time to expiry datetime object token_expiration = actual_expiration_time - current_time # JWT time to expiry in seconds token_expiration_in_seconds = token_expiration.days * 24 * 3600 + \ token_expiration.seconds return { 'jwt_expiration_time': actual_expiration_time, 'jwt_expiry_secs': token_expiration_in_seconds } except Exception as e: log.info( f'Failed to compute jwt cache timeout in ' f'Exception: {str(e)}') # If cache timeout not computed as expected, default timeout is set return { 'jwt_expiration_time': None, 'jwt_expiry_secs': -1 }