U
    –6{iW  ã                   @   s  U d dl mZmZmZmZ 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 ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ejZeejee fƒsºefZdd„ eD ƒZ!ee" e#d< edeeƒZ$G dd„ dej%ƒZ&G dd„ de&ƒZ'e'Z(e$e)dœdd„Z*dS )é    )ÚOptionalÚSetÚTupleÚTypeVar)Úget_user_model)ÚAbstractBaseUser)Úgettext_lazy)ÚHTTP_HEADER_ENCODINGÚauthentication)ÚRequesté   )ÚAuthenticationFailedÚInvalidTokenÚ
TokenError)Ú	TokenUser)Úapi_settings)ÚToken)Úget_md5_hash_passwordc                 C   s   h | ]}|  t¡’qS © )Úencoder	   )Ú.0Úhr   r   úK/tmp/pip-unpacked-wheel-4okmn_yf/rest_framework_simplejwt/authentication.pyÚ	<setcomp>   s    r   ÚAUTH_HEADER_TYPE_BYTESÚAuthUserc                       sž   e Zd ZdZdZdZddœ‡ fdd„Zeee	e
ef  dœd	d
„Zeedœdd„Zeedœdd„Zeee dœdd„Zeedœdd„Zee
dœdd„Z‡  ZS )ÚJWTAuthenticationzy
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header.
    Úapizapplication/jsonN)Úreturnc                    s   t ƒ j||Ž tƒ | _d S ©N)ÚsuperÚ__init__r   Ú
user_model)ÚselfÚargsÚkwargs©Ú	__class__r   r   r!   $   s    zJWTAuthentication.__init__)Úrequestr   c                 C   sD   |   |¡}|d krd S |  |¡}|d kr,d S |  |¡}|  |¡|fS r   )Ú
get_headerÚget_raw_tokenÚget_validated_tokenÚget_user)r#   r(   ÚheaderÚ	raw_tokenÚvalidated_tokenr   r   r   Úauthenticate(   s    


zJWTAuthentication.authenticatec                 C   s   d  td | j¡S )Nz{} realm="{}"r   )ÚformatÚAUTH_HEADER_TYPESÚwww_authenticate_realm)r#   r(   r   r   r   Úauthenticate_header5   s    þz%JWTAuthentication.authenticate_headerc                 C   s&   |j  tj¡}t|tƒr"| t¡}|S )zc
        Extracts the header containing the JSON web token from the given
        request.
        )ZMETAÚgetr   ZAUTH_HEADER_NAMEÚ
isinstanceÚstrr   r	   )r#   r(   r-   r   r   r   r)   ;   s    

zJWTAuthentication.get_header)r-   r   c                 C   sL   |  ¡ }t|ƒdkrdS |d tkr(dS t|ƒdkrDttdƒdd�‚|d S )zm
        Extracts an unvalidated JSON web token from the given "Authorization"
        header value.
        r   Né   z<Authorization header must contain two space-delimited valuesZbad_authorization_header©Úcoder   )ÚsplitÚlenr   r   Ú_)r#   r-   Úpartsr   r   r   r*   H   s    þzJWTAuthentication.get_raw_token)r.   r   c                 C   st   g }t jD ]R}z||ƒW   S  tk
rZ } z | |j|j|jd dœ¡ W 5 d}~X Y q
X q
ttdƒ|dœƒ‚dS )zk
        Validates an encoded JSON web token and returns a validated token
        wrapper object.
        r   )Ztoken_classÚ
token_typeÚmessageNz(Given token not valid for any token type)ZdetailÚmessages)	r   ZAUTH_TOKEN_CLASSESr   ÚappendÚ__name__r?   r$   r   r=   )r#   r.   rA   Z	AuthTokenÚer   r   r   r+   _   s     
ýÿþÿz%JWTAuthentication.get_validated_token©r/   r   c                 C   sº   z|t j }W n  tk
r.   ttdƒƒ‚Y nX z| jjjf t j|iŽ}W n( | jj	k
rr   t
tdƒdd�‚Y nX |jsŠt
tdƒdd�‚t jr¶| t j¡t|jƒkr¶t
tdƒdd�‚|S )	zU
        Attempts to find and return a user using the given validated token.
        ú3Token contained no recognizable user identificationzUser not foundZuser_not_foundr9   zUser is inactiveZuser_inactivez%The user's password has been changed.Zpassword_changed)r   ÚUSER_ID_CLAIMÚKeyErrorr   r=   r"   Zobjectsr5   ZUSER_ID_FIELDZDoesNotExistr   Ú	is_activeZCHECK_REVOKE_TOKENZREVOKE_TOKEN_CLAIMr   Úpassword)r#   r/   Zuser_idÚuserr   r   r   r,   x   s*    ÿþ ÿzJWTAuthentication.get_user)rC   Ú
__module__Ú__qualname__Ú__doc__r3   Ú
media_typer!   r   r   r   r   r   r0   r7   r4   Úbytesr)   r*   r+   r,   Ú__classcell__r   r   r&   r   r      s   r   c                   @   s    e Zd ZdZeedœdd„ZdS )ÚJWTStatelessUserAuthenticationz¸
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header without performing a database lookup to obtain a user instance.
    rE   c                 C   s    t j|krttdƒƒ‚t  |¡S )zg
        Returns a stateless user object which is backed by the given validated
        token.
        rF   )r   rG   r   r=   ZTOKEN_USER_CLASS)r#   r/   r   r   r   r,   š   s    
z'JWTStatelessUserAuthentication.get_userN)rC   rL   rM   rN   r   r   r,   r   r   r   r   rR   ”   s   rR   )rK   r   c                 C   s   | d k	o| j S r   )rI   )rK   r   r   r   Ú default_user_authentication_ruleª   s    rS   N)+Útypingr   r   r   r   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   Zdjango.utils.translationr   r=   Zrest_frameworkr	   r
   Zrest_framework.requestr   Ú
exceptionsr   r   r   Úmodelsr   Úsettingsr   Útokensr   Úutilsr   r2   r6   ÚlistÚtupler   rP   Ú__annotations__r   ZBaseAuthenticationr   rR   ZJWTTokenUserAuthenticationÚboolrS   r   r   r   r   Ú<module>   s,    ÿy