U
    Æ½„b  ã                   @   s    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 ddlmZ ejZeejeefƒsdefZdd„ eD ƒZG d	d
„ d
ejƒZG dd„ deƒZdd„ ZdS )é    )Úget_user_model)Úgettext_lazy)ÚHTTP_HEADER_ENCODINGÚauthenticationé   )ÚAuthenticationFailedÚInvalidTokenÚ
TokenError)Úapi_settingsc                 C   s   h | ]}|  t¡’qS © )Úencoder   )Ú.0Úhr   r   úK/tmp/pip-unpacked-wheel-cvqxdfy5/rest_framework_simplejwt/authentication.pyÚ	<setcomp>   s     r   c                       sX   e Zd ZdZdZdZ‡ fdd„Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚJWTAuthenticationzy
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header.
    Úapizapplication/jsonc                    s   t ƒ j||Ž tƒ | _d S ©N)ÚsuperÚ__init__r   Ú
user_model)ÚselfÚargsÚkwargs©Ú	__class__r   r   r      s    zJWTAuthentication.__init__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   ÚrequestÚ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_header*   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   0   s    

zJWTAuthentication.get_headerc                 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ÚlenÚAUTH_HEADER_TYPE_BYTESr   Ú_)r   r!   Úpartsr   r   r   r   =   s    þzJWTAuthentication.get_raw_tokenc                 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__r4   r   r   r2   )r   r"   r6   Z	AuthTokenÚer   r   r   r   T   s     
ýÿþÿz%JWTAuthentication.get_validated_tokenc                 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�‚|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_foundr-   zUser is inactiveZuser_inactive)r
   ÚUSER_ID_CLAIMÚKeyErrorr   r2   r   Zobjectsr)   ZUSER_ID_FIELDZDoesNotExistr   Ú	is_active)r   r#   Zuser_idÚuserr   r   r   r   m   s    zJWTAuthentication.get_user)r8   Ú
__module__Ú__qualname__Ú__doc__r'   Ú
media_typer   r$   r(   r   r   r   r   Ú__classcell__r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚJWTTokenUserAuthenticationc                 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.
        r:   )r
   r;   r   r2   ZTOKEN_USER_CLASS)r   r#   r   r   r   r   ‚   s    
z#JWTTokenUserAuthentication.get_userN)r8   r?   r@   r   r   r   r   r   rD   �   s   rD   c                 C   s   | d k	o| j S r   )r=   )r>   r   r   r   Ú default_user_authentication_rule�   s    rE   N)Zdjango.contrib.authr   Zdjango.utils.translationr   r2   Zrest_frameworkr   r   Ú
exceptionsr   r   r	   Úsettingsr
   r&   r*   ÚlistÚtupler1   ZBaseAuthenticationr   rD   rE   r   r   r   r   Ú<module>   s   q