U
    `                     @   s   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
 d dlmZ dd Zd	d
 Zdd Zdd ZG dd deZdd ZG dd de
ZdS )    )settings)timezone)
exceptionsserializers)	CSRFCheck)JWTAuthentication)TokenRefreshSerializerc                 C   sh   ddl m} ttdd }t |j }ttdd}ttdd}ttdd	}|rd| j||||||d
 d S )Nr   api_settingsJWT_AUTH_COOKIEJWT_AUTH_SECUREFJWT_AUTH_HTTPONLYTJWT_AUTH_SAMESITELax)expiressecurehttponlysamesite)!rest_framework_simplejwt.settingsr
   getattrr   r   nowACCESS_TOKEN_LIFETIME
set_cookie)responseaccess_tokenjwt_settingscookie_nameaccess_token_expirationcookie_securecookie_httponlycookie_samesite r!   =/Users/michael/Projects/dj-rest-auth/dj_rest_auth/jwt_auth.pyset_jwt_access_cookie	   s    r#   c           	   	   C   sv   ddl m} t |j }ttdd }ttdd}ttdd}ttdd	}ttd
d}|rr| j|||||||d d S )Nr   r	   JWT_AUTH_REFRESH_COOKIEJWT_AUTH_REFRESH_COOKIE_PATH/r   Fr   Tr   r   )r   r   r   r   path)r   r
   r   r   ZREFRESH_TOKEN_LIFETIMEr   r   r   )	r   refresh_tokenr   refresh_token_expirationrefresh_cookie_namerefresh_cookie_pathr   r   r    r!   r!   r"   set_jwt_refresh_cookie   s"    r,   c                 C   s   t | | t| | d S )N)r#   r,   )r   r   r(   r!   r!   r"   set_jwt_cookies1   s    
r-   c                 C   sH   t tdd }t tdd }t tdd}|r2| | |rD| j||d d S )Nr   r$   r%   r&   )r'   )r   r   delete_cookie)r   r   r*   r+   r!   r!   r"   unset_jwt_cookies6   s    
r/   c                       s2   e Zd ZejdddZdd Z fddZ  ZS )CookieTokenRefreshSerializerFzWIll override cookie.)required	help_textc                 C   sj   | j d }d|jkr,|jd dkr,|jd S ttdd }|rR||jkrR|j|S ddlm} |dd S )Nrequestrefresh r$   r   )InvalidTokenzNo valid refresh token found.)contextdatar   r   COOKIESgetZ#rest_framework_simplejwt.exceptionsr6   )selfr3   r   r6   r!   r!   r"   extract_refresh_tokenD   s    

z2CookieTokenRefreshSerializer.extract_refresh_tokenc                    s   |   |d< t |S )Nr4   )r<   supervalidate)r;   attrs	__class__r!   r"   r>   O   s    z%CookieTokenRefreshSerializer.validate)	__name__
__module____qualname__r   	CharFieldr4   r<   r>   __classcell__r!   r!   r@   r"   r0   A   s   r0   c                     s0   ddl m  ddlm}  G  fddd| }|S )z7 Returns a Token Refresh CBV without a circular import r   r	   )TokenRefreshViewc                       s"   e Zd ZeZ fddZ  ZS )z6get_refresh_view.<locals>.RefreshViewWithCookieSupportc                    sr   |j dkr8d|jkr8t||jd  t j |jd< |j dkr\d|jkr\t||jd  t j||f||S )N   accessr   r4   )	status_coder8   r#   r   r   r   r,   r=   finalize_response)r;   r3   r   argskwargs)rA   r   r!   r"   rK   \   s    zHget_refresh_view.<locals>.RefreshViewWithCookieSupport.finalize_response)rB   rC   rD   r0   serializer_classrK   rF   r!   r   r@   r"   RefreshViewWithCookieSupportY   s   rP   )r   r
   Zrest_framework_simplejwt.viewsrG   )rG   rP   r!   rO   r"   get_refresh_viewT   s    
rQ   c                   @   s    e Zd ZdZdd Zdd ZdS )JWTCookieAuthenticationz
    An authentication plugin that hopefully authenticates requests through a JSON web
    token provided in a request cookie (and through the header as normal, with a
    preference to the header).
    c                 C   s8   t  }|| ||ddi }|r4td| dS )zK
        Enforce CSRF validation for session based authentication.
        Nr!   zCSRF Failed: )r   process_requestprocess_viewr   PermissionDenied)r;   r3   checkreasonr!   r!   r"   enforce_csrfl   s
    
z$JWTCookieAuthentication.enforce_csrfc                 C   s   t tdd }| |}|d krl|rf|j|}t tddrF| | qj|d k	rjt tddrj| | qvd S n
| |}|d krd S | |}| ||fS )Nr   /JWT_AUTH_COOKIE_ENFORCE_CSRF_ON_UNAUTHENTICATEDFJWT_AUTH_COOKIE_USE_CSRF)	r   r   
get_headerr9   r:   rX   Zget_raw_tokenZget_validated_tokenget_user)r;   r3   r   headerZ	raw_tokenZvalidated_tokenr!   r!   r"   authenticatex   s    


z$JWTCookieAuthentication.authenticateN)rB   rC   rD   __doc__rX   r^   r!   r!   r!   r"   rR   f   s   rR   N)django.confr   django.utilsr   rest_frameworkr   r   Zrest_framework.authenticationr   Z'rest_framework_simplejwt.authenticationr   $rest_framework_simplejwt.serializersr   r#   r,   r-   r/   r0   rQ   rR   r!   r!   r!   r"   <module>   s   