a
    x=ic                     @   s   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 d dlmZ d dlmZ eeZG dd	 d	eeZd
S )    )	getLogger)Optional)settings)AxesBaseHandlerAbstractAxesHandler)	get_cacheget_cache_timeoutget_client_cache_keyget_client_strget_client_usernameget_credentialsget_failure_limit)AccessAttempt)user_locked_outc                   @   sl   e Zd ZdZdd Zddddeeeeddd	Zde	e
 ed
ddZde
dddZdd Zdd ZdS )AxesCacheHandlerzs
    Signal handler implementation that records user login attempts to cache and locks users out if necessary.
    c                 C   s   t  | _d S )N)r   cacheself r   d/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/axes/handlers/cache.py__init__   s    zAxesCacheHandler.__init__NF)
ip_addressusernameip_or_username)r   r   r   returnc                C   s   g }d}|d u r |d u r t d|r,t d|tt||d |D ](}| j|}||d urht|nd7 }qFt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_keyZdeletedr   r   r   reset_attempts   s$    
zAxesCacheHandler.reset_attempts)credentialsr   c                    s$   t ||}t fdd|D }|S )Nc                 3   s   | ]} j j|d dV  qdS )r   defaultN)r   get).0r$   r   r   r   	<genexpr>>   s   z0AxesCacheHandler.get_failures.<locals>.<genexpr>)r	   max)r   requestr&   r"   Zfailure_countr   r   r   get_failures<   s
    
zAxesCacheHandler.get_failures)r&   c                 K   s\  |du rt d dS t||}tjr<|du r<t d dS tjsf|jrf||_t	j
d|||jd dS t||j|j|j|}| ||rt d| dS d| || }||_|dkrt d||t|| nt d	| t||}|D ]*}	| jj|	d
d}
| j|	|
d t  qtjrX|t||krXt d| d|_||_t	j
d|||jd dS )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.z^AXES: Username is None and AXES_ONLY_USER_FAILURES is enabled, new record will NOT be created.Zaxes)r-   r   r   z.AXES: Login failed from whitelisted client %s.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.r   r'   z3AXES: Locking out %s after repeated login failures.T)r    errorr   r   ZAXES_ONLY_USER_FAILURESwarningZ-AXES_RESET_COOL_OFF_ON_FAILURE_DURING_LOCKOUTZaxes_locked_outZaxes_credentialsr   sendaxes_ip_addressr
   axes_user_agentaxes_path_infoZis_whitelistedr!   r.   Zaxes_failures_since_startr   r	   r   r)   setr   ZAXES_LOCK_OUT_AT_FAILURE)r   senderr&   r-   kwargsr   
client_strfailures_since_startr"   r$   Zfailuresr   r   r   user_login_failedC   s    

z"AxesCacheHandler.user_login_failedc                 K   sz   |  }t|}t||j|j|j|}td| tj	rvt
||}|D ].}	| jj|	dd}
| j|	 td|
| qFdS )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
   r2   r3   r4   r    r!   r   ZAXES_RESET_ON_SUCCESSr	   r   r)   r   )r   r6   r-   userr7   r   r&   r8   r"   r$   r9   r   r   r   user_logged_in   s(    
zAxesCacheHandler.user_logged_inc                 K   s6   |r|  nd }t||j|j|j|}td| d S )NzAXES: Successful logout by %s.)r;   r
   r2   r3   r4   r    r!   )r   r6   r-   r<   r7   r   r8   r   r   r   user_logged_out   s    z AxesCacheHandler.user_logged_out)N)N)__name__
__module____qualname____doc__r   strboolr   r%   r   dictr.   r:   r=   r>   r   r   r   r   r      s   Tr   N)loggingr   typingr   Z	axes.confr   Zaxes.handlers.baser   r   Zaxes.helpersr   r   r	   r
   r   r   r   Zaxes.modelsr   Zaxes.signalsr   r?   r    r   r   r   r   r   <module>   s   $	