from datetime import datetime, timedelta import json import logging from auth0_block_users import config from auth0_block_users.auth0 import Auth0 from auth0_block_users.constants import STATUS_OK, STATUS_LOCKED from auth0_block_users.redis_db import get_redis_lock def handler(logger: logging.Logger) -> dict: """Handler contains business logic Args: logger: Logger instance Returns: JSON serializable response """ # set lock for 10 m to avoid possible race condition between lambdas lock = get_redis_lock() if not lock.acquire(blocking=False): logger.info('Locked') return { 'meta': { "status": STATUS_LOCKED } } today = datetime.utcnow() minus90d = (today - timedelta(minutes=config.AUTH0_BLOCK_INACTIVE_PERIOD_MINUTES)) users_blocked = 0 # expect '["auth0|userid1", ".."]' list for operation limit limit_users = json.loads(config.AUTH0_LIMIT_USERS) if config.AUTH0_LIMIT_USERS else [] limit_users_query = '(' + ' OR '.join(['user_id:"{}"'.format(i) for i in limit_users]) + ') AND ' \ if limit_users else '' auth0 = Auth0(logger) # block inactive users users = auth0.get_users( fields='user_id,app_metadata', query=limit_users_query + 'last_login:[{} TO {}] AND app_metadata.blockReasons.byInactivity:false' .format('*', minus90d.isoformat()) ) for user_id, user in users.items(): block_reasons = None if not user['app_metadata'] or not user['app_metadata']['blockReasons']: block_reasons = {'byInactivity': True} if user['app_metadata'] \ and user['app_metadata']['blockReasons'] \ and not user['app_metadata']['blockReasons']['byInactivity']: block_reasons = user['app_metadata']['blockReasons'] block_reasons['byInactivity'] = True if block_reasons: auth0.update_user(user_id, { 'app_metadata': { 'blockReasons': block_reasons } }) users_blocked = users_blocked + 1 lock.release() return { 'meta': { "status": STATUS_OK, "users_blocked_by_inactivity": users_blocked, "query": limit_users_query + 'last_login:[{} TO {}] AND app_metadata.blockReasons.byInactivity:false' .format('*', minus90d.isoformat()) } }