U
    ª}agæ  ã                   @   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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_keysÚget_client_strÚget_client_usernameÚget_credentialsÚget_failure_limitÚget_lockout_parameters)ÚAccessAttempt)Úuser_locked_outc                   @   st   e Zd ZdZdd„ Zddddœee 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   úK/var/www/html/publicvenv/lib/python3.8/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 kr |d kr t dƒ‚|r,t dƒ‚| tt||d�ƒ¡ |D ](}| j |¡}||d k	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krt  d¡ dS t||ƒ}t||ƒ}|dgkrJ|dkrJt  d¡ dS tjst|jrt||_t	j
d|||jd� dS t||j|j|j|ƒ}|  ||¡r¦t  d|¡ dS t||ƒ}t|ƒ}	g }
|D ]L}| jj|d|	d	�}|ræ|
 d¡ qÀ|
 | jj|dd
�¡ | jj||	d� qÀt|
ƒ}||_|dk�r>t  d||t||ƒ¡ nt  d|¡ tj�rŽ|t||ƒk�rŽt  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.r   zfAXES: Username is None and username is the only one lockout parameter, new record will NOT be created.Zaxes)r.   r   r   z.AXES: Login failed from whitelisted client %s.r   )ÚkeyÚvalueÚtimeout)r0   Údelta)r0   r2   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   Z-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	   r   r   ÚaddÚappendÚincrÚtouchr-   Zaxes_failures_since_startr   ZAXES_LOCK_OUT_AT_FAILURE)r   Úsenderr'   r.   Úkwargsr   Zlockout_parametersÚ
client_strr#   Zcache_timeoutZfailuresr%   ÚaddedÚfailures_since_startr   r   r   Úuser_login_failedD   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
   r7   r8   r9   r!   r"   r   ZAXES_RESET_ON_SUCCESSr	   r   r*   r   )r   r>   r.   Úuserr?   r   r'   r@   r#   r%   rB   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.)rD   r
   r7   r8   r9   r!   r"   )r   r>   r.   rE   r?   r   r@   r   r   r   Úuser_logged_out»   s    ûz AxesCacheHandler.user_logged_out)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ÚstrÚboolr    r&   Údictr/   rC   rF   rG   r   r   r   r   r      s   ûú[r   N)Úloggingr   Útypingr   Z	axes.confr   Zaxes.handlers.baser   r   Zaxes.helpersr   r   r	   r
   r   r   r   r   Zaxes.modelsr   Zaxes.signalsr   rH   r!   r   r   r   r   r   Ú<module>   s   (
