authentik.core.tasks
authentik core tasks
1"""authentik core tasks""" 2 3from datetime import datetime, timedelta 4 5from django.utils.timezone import now 6from django.utils.translation import gettext_lazy as _ 7from django_channels_postgres.models import GroupChannel, Message 8from django_postgres_cache.tasks import clear_expired_cache 9from dramatiq.actor import actor 10from structlog.stdlib import get_logger 11 12from authentik.core.models import ( 13 USER_ATTRIBUTE_EXPIRES, 14 USER_ATTRIBUTE_GENERATED, 15 ExpiringModel, 16 User, 17) 18from authentik.lib.utils.db import chunked_queryset 19from authentik.tasks.middleware import CurrentTask 20 21LOGGER = get_logger() 22 23 24@actor(description=_("Remove expired objects.")) 25def clean_expired_models(): 26 self = CurrentTask.get_task() 27 for cls in ExpiringModel.__subclasses__(): 28 cls: ExpiringModel 29 objects = ( 30 cls.objects.including_expired() 31 .all() 32 .exclude(expiring=False) 33 .exclude(expiring=True, expires__gt=now()) 34 ) 35 amount = objects.count() 36 for obj in chunked_queryset(objects): 37 obj.expire_action() 38 LOGGER.debug("Expired models", model=cls, amount=amount) 39 self.info(f"Expired {amount} {cls._meta.verbose_name_plural}") 40 clear_expired_cache() 41 for cls in [Message, GroupChannel]: 42 objects = cls.objects.all().filter(expires__lt=now()) 43 amount = objects.count() 44 for obj in chunked_queryset(objects): 45 obj.delete() 46 LOGGER.debug("Expired models", model=cls, amount=amount) 47 self.info(f"Expired {amount} {cls._meta.verbose_name_plural}") 48 49 50@actor(description=_("Remove temporary users created by SAML Sources.")) 51def clean_temporary_users(): 52 self = CurrentTask.get_task() 53 _now = datetime.now() 54 deleted_users = 0 55 for user in User.objects.filter(**{f"attributes__{USER_ATTRIBUTE_GENERATED}": True}): 56 if not user.attributes.get(USER_ATTRIBUTE_EXPIRES): 57 continue 58 delta: timedelta = _now - datetime.fromtimestamp( 59 user.attributes.get(USER_ATTRIBUTE_EXPIRES) 60 ) 61 if delta.total_seconds() > 0: 62 LOGGER.debug("User is expired and will be deleted.", user=user, delta=delta) 63 user.delete() 64 deleted_users += 1 65 self.info(f"Successfully deleted {deleted_users} users.")
LOGGER =
<BoundLoggerLazyProxy(logger=None, wrapper_class=None, processors=None, context_class=None, initial_values={}, logger_factory_args=())>