U
    t=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   úg/var/www/html/mysite/school/venv/lib/python3.8/site-packages/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.
        )ÚMETAÚgetr   Ú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)ÚdetailÚmessages)	r   ÚAUTH_TOKEN_CLASSESr   ÚappendÚ__name__rA   r$   r   r?   )r#   r.   rD   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_foundr;   zUser is inactiveZuser_inactivez%The user's password has been changed.Úpassword_changed)r   ÚUSER_ID_CLAIMÚKeyErrorr   r?   r"   Úobjectsr6   ÚUSER_ID_FIELDÚDoesNotExistr   Ú	is_activeÚCHECK_REVOKE_TOKENÚREVOKE_TOKEN_CLAIMr   Úpassword)r#   r/   Úuser_idÚuserr   r   r   r,   x   s*    ÿþ ÿzJWTAuthentication.get_user)rG   Ú
__module__Ú__qualname__Ú__doc__r3   Ú
media_typer!   r   r   r   r   r   r0   r9   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.
    rI   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.
        rJ   )r   rL   r   r?   ÚTOKEN_USER_CLASS)r#   r/   r   r   r   r,   š   s    
z'JWTStatelessUserAuthentication.get_userN)rG   rW   rX   rY   r   r   r,   r   r   r   r   r]   ”   s   r]   )rV   r   c                 C   s   | d k	o| j S r   )rQ   )rV   r   r   r   Ú default_user_authentication_ruleª   s    r_   N)+Útypingr   r   r   r   Údjango.contrib.authr   Údjango.contrib.auth.modelsr   Údjango.utils.translationr   r?   Úrest_frameworkr	   r
   Úrest_framework.requestr   Ú
exceptionsr   r   r   Úmodelsr   Úsettingsr   Útokensr   Úutilsr   r2   r8   ÚlistÚtupler   r[   Ú__annotations__r   ZBaseAuthenticationr   r]   ZJWTTokenUserAuthenticationÚboolr_   r   r   r   r   Ú<module>   s,    ÿy