o
    TiW                     @   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(de$de)f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/evchargy.com/venv/lib/python3.10/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 fddZdedee	e
ef  fd	d
ZdedefddZdedefddZdedee fddZdedefddZdede
fddZ  ZS )JWTAuthenticationzy
    An authentication plugin that authenticates requests through a JSON web
    token provided in a request header.
    apizapplication/jsonreturnNc                    s   t  j|i | t | _d S N)super__init__r   
user_model)selfargskwargs	__class__r   r   r!   $   s   zJWTAuthentication.__init__requestc                 C   sD   |  |}|d u rd S | |}|d u 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_headerr-   c                 C   sL   |  }t|dkrdS |d tvrdS t|dkr"t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_tokenr.   c                 C   sp   g }t jD ])}z||W   S  ty. } z||j|j|jd d W Y d}~qd}~ww ttd|d)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   ZAUTH_TOKEN_CLASSESr   append__name__r?   r$   r   r=   )r#   r.   rB   Z	AuthTokener   r   r   r+   _   s$   
	z%JWTAuthentication.get_validated_tokenr/   c                 C   s   z|t j }W n ty   ttdw z| jjjd
i t j|i}W n | jj	y5   t
tdddw |jsAt
tdddt jrW|t jt|jkrWt
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_changedNr   )r   USER_ID_CLAIMKeyErrorr   r=   r"   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)r   N)rD   
__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dedef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.
    r/   r   c                 C   s    t j|v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)rD   rM   rN   rO   r   r   r,   r   r   r   r   rS      s    rS   rL   r   c                 C   s   | d uo| j S r   )rJ   )rL   r   r   r    default_user_authentication_rule   s   rT   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   rQ   __annotations__r   ZBaseAuthenticationr   rS   ZJWTTokenUserAuthenticationboolrT   r   r   r   r   <module>   s,    y