Ë
    0]jæ  ã                   ó    — d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
mZmZmZmZmZmZmZ d dlmZ d dlmZ  ee«      Z G d„ d	ee«      Zy
)é    )Ú	getLogger)ÚOptional)Úsettings)ÚAxesBaseHandlerÚAbstractAxesHandler)Ú	get_cacheÚget_cache_timeoutÚget_client_cache_keysÚget_client_strÚget_client_usernameÚget_credentialsÚget_failure_limitÚget_lockout_parameters)ÚAccessAttempt)Úuser_locked_outc            	       óv   — e Zd ZdZd„ Zddddœdee   dee   ded	efd
„Z	ddee
   d	efd„Zdde
fd„Zd„ Zd„ Zy)ÚAxesCacheHandlerzs
    Signal handler implementation that records user login attempts to cache and locks users out if necessary.
    c                 ó"   — t        «       | _        y ©N)r   Úcache)Úselfs    úJ/var/www/zogu/zoguvenv/lib/python3.12/site-packages/axes/handlers/cache.pyÚ__init__zAxesCacheHandler.__init__   s   € Ü“[ˆ�
ó    NF)Ú
ip_addressÚusernameÚip_or_usernamer   r   r   Úreturnc                ó$  — g }d}|€|€t        d«      ‚|rt        d«      ‚|j                  t        t        ||¬«      «      «       |D ]/  }| j                  j                  |«      }||�t        |«      ndz  }Œ1 t        j                  d|«       |S )Nr   z#Cannot clear all entries from cachez9Due to the cache key ip_or_username=True is not supported)r   r   é   z-AXES: Reset %d access attempts from database.)	ÚNotImplementedErrorÚextendr
   r   r   ÚdeleteÚintÚlogÚinfo)r   r   r   r   Ú
cache_keysÚcountÚ	cache_keyÚdeleteds           r   Úreset_attemptszAxesCacheHandler.reset_attempts   s¬   € ð ˆ
ØˆàÐ (Ð"2Ü%Ð&KÓLÐLÙÜ%ØKóð ð 	×ÑÜ!Ü x¸JÔGóô	
ð $ò 	@ˆIØ—j‘j×'Ñ'¨	Ó2ˆGØ WÐ%8”S˜”\¸aÑ?‰Eð	@ô 	�‰Ð@À%ÔHàˆr   Úcredentialsc                 óH   ‡ — t        ||«      }t        ˆ fd„|D «       «      }|S )Nc              3   óX   •K  — | ]!  }‰j                   j                  |d ¬«      –— Œ# y­w)r   ©ÚdefaultN)r   Úget)Ú.0r)   r   s     €r   ú	<genexpr>z0AxesCacheHandler.get_failures.<locals>.<genexpr>?   s'   øè ø€ ò 
Ø5>ˆD�J‰J�N‰N˜9¨aˆN×0ñ
ùs   ƒ'*)r
   Úmax)r   Úrequestr,   r'   Úfailure_counts   `    r   Úget_failureszAxesCacheHandler.get_failures=   s.   ø€ Ü*¨7°KÓ@ˆ
Üó 
ØBLô
ó 
ˆð Ðr   c           	      ó€  — |€t         j                  d«       yt        ||«      }t        ||«      }|dgk(  r|€t         j	                  d«       yt
        j                  s7|j                  r+||_        t        j                  d|||j                  ¬«       yt        ||j                  |j                  |j                  |«      }| j                  ||«      rt         j!                  d|«       yt#        ||«      }t%        |«      }	g }
|D ]}  }| j&                  j)                  |d|	¬	«      }|r|
j+                  d«       Œ5|
j+                  | j&                  j-                  |d¬
«      «       | j&                  j/                  ||	¬«       Œ t1        |
«      }||_        |dkD  r#t         j	                  d||t5        ||«      «       nt         j	                  d|«       t
        j6                  rX|t5        ||«      k\  rHt         j	                  d|«       d|_        ||_        t        j                  d|||j                  ¬«       yyy)z°
        When user login fails, save attempt record in cache and lock user out if necessary.

        :raises AxesSignalPermissionDenied: if user should be locked out.
        NzMAXES: AxesCacheHandler.user_login_failed does not function without a request.r   zfAXES: Username is None and username is the only one lockout parameter, new record will NOT be created.Úaxes)r5   r   r   z.AXES: Login failed from whitelisted client %s.r    )ÚkeyÚvalueÚtimeout)r:   Údelta)r:   r<   z\AXES: Repeated login failure by %s. Count = %d of %d. Updating existing record in the cache.z@AXES: New login failure by %s. Creating new record in the cache.z3AXES: Locking out %s after repeated login failures.T)r%   Úerrorr   r   Úwarningr   Ú-AXES_RESET_COOL_OFF_ON_FAILURE_DURING_LOCKOUTÚaxes_locked_outÚaxes_credentialsr   ÚsendÚaxes_ip_addressr   Úaxes_user_agentÚaxes_path_infoÚis_whitelistedr&   r
   r	   r   ÚaddÚappendÚincrÚtouchr4   Úaxes_failures_since_startr   ÚAXES_LOCK_OUT_AT_FAILURE)r   Úsenderr,   r5   Úkwargsr   Úlockout_parametersÚ
client_strr'   Úcache_timeoutÚfailuresr)   ÚaddedÚfailures_since_starts                 r   Úuser_login_failedz"AxesCacheHandler.user_login_failedD   s(  € ð ˆ?Ü�I‰IØ_ôð ä& w°Ó<ˆÜ3°G¸[ÓIÐØ * Ò-°(Ð2BÜ�K‰KØxôð ô ×FÒFØ×'Ò'à'2ˆGÔ$Ü× Ñ ØØØ!Ø"×2Ñ2õ	ð ä#ØØ×#Ñ#Ø×#Ñ#Ø×"Ñ"Øó
ˆ
ð ×Ñ˜w¨Ô4Ü�H‰HÐEÀzÔRØä*¨7°KÓ@ˆ
Ü)¨'Ó2ˆØˆØ#ò 	GˆIØ—J‘J—N‘N y¸À=�NÓQˆEÙØ—‘ Õ"à—‘ §
¡
§¡°IÀQ Ó GÔHØ—
‘
× Ñ  Y¸Ð ÕFð	Gô  # 8›}ÐØ,@ˆÔ)à !Ò#Ü�K‰KØnØØ$Ü! '¨;Ó7õ	ô �K‰KØRØôô ×-Ò-Ø$Ô(9¸'À;Ó(OÒOä�K‰KØEÀzôð '+ˆGÔ#Ø'2ˆGÔ$Ü× Ñ ØØØ!Ø"×2Ñ2ö	ð Pð .r   c                 ó¦  — |j                  «       }t        |«      }t        ||j                  |j                  |j
                  |«      }t        j                  d|«       t        j                  rct        ||«      }|D ]Q  }	| j                  j                  |	d¬«      }
| j                  j                  |	«       t        j                  d|
|«       ŒS yy)zN
        When user logs in, update the AccessLog related to the user.
        zAXES: Successful login by %s.r   r/   z8AXES: Deleted %d failed login attempts by %s from cache.N)Úget_usernamer   r   rD   rE   rF   r%   r&   r   ÚAXES_RESET_ON_SUCCESSr
   r   r1   r#   )r   rN   r5   ÚuserrO   r   r,   rQ   r'   r)   rU   s              r   Úuser_logged_inzAxesCacheHandler.user_logged_inŸ   s¿   € ð
 ×$Ñ$Ó&ˆÜ% hÓ/ˆÜ#ØØ×#Ñ#Ø×#Ñ#Ø×"Ñ"Øó
ˆ
ô 	�‰Ð0°*Ô=ä×)Ò)Ü.¨w¸ÓDˆJØ'ò �	Ø'+§z¡z§~¡~°iÈ ~Ó'KÐ$Ø—
‘
×!Ñ! )Ô,Ü—‘ØNØ(Øõñð *r   c                 ó²   — |r|j                  «       nd }t        ||j                  |j                  |j                  |«      }t
        j                  d|«       y )NzAXES: Successful logout by %s.)rX   r   rD   rE   rF   r%   r&   )r   rN   r5   rZ   rO   r   rQ   s          r   Úuser_logged_outz AxesCacheHandler.user_logged_out»   sP   € Ù*.�4×$Ñ$Ô&°DˆÜ#ØØ×#Ñ#Ø×#Ñ#Ø×"Ñ"Øó
ˆ
ô 	�‰Ð1°:Õ>r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚstrÚboolr$   r+   Údictr7   rV   r[   r]   © r   r   r   r      s|   „ ñò!ð %)Ø"&Ø$òð ˜S‘Mðð ˜3‘-ð	ð
 ðð 
óñ>°¸$±ð È3ó ñY°Tó Yòvó8
?r   r   N)Úloggingr   Útypingr   Ú	axes.confr   Úaxes.handlers.baser   r   Úaxes.helpersr   r	   r
   r   r   r   r   r   Úaxes.modelsr   Úaxes.signalsr   r^   r%   r   re   r   r   ú<module>rm      sC   ðÝ Ý å ß C÷	÷ 	ó 	õ &Ý (á�Ó€ôo?Ð*¨Oõ o?r   