a
    xds                     @   s   d dl Z d dlmZmZ d dlmZ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lmZ d	Zd
ZdZdZdZdZG dd deZG dd deZdS )    N)AnyOptional)ParseResulturlparse)HttpRequestHttpResponse)patch_vary_headers)MiddlewareMixin)conf)check_request_enabledzAccess-Control-Allow-OriginzAccess-Control-Expose-Headersz Access-Control-Allow-CredentialszAccess-Control-Allow-HeaderszAccess-Control-Allow-MethodszAccess-Control-Max-Agec                   @   sB   e Zd ZeddddZeddddZeeeedddd	ZdS )
CorsPostCsrfMiddlewareNrequestreturnc                 C   s0   t jr,d|jv r,|jd }||jd< |jd= dS )zj
        Put the HTTP_REFERER back to its original value and delete the
        temporary storage
        ORIGINAL_HTTP_REFERERHTTP_REFERERN)r
   CORS_REPLACE_HTTPS_REFERERMETA)selfr   http_referer r   N/var/www/html/Ranjet/env/lib/python3.9/site-packages/corsheaders/middleware.py_https_referer_replace_reverse   s    

z5CorsPostCsrfMiddleware._https_referer_replace_reversec                 C   s   |  | d S Nr   r   r   r   r   r   process_request   s    
z&CorsPostCsrfMiddleware.process_requestr   callbackcallback_argscallback_kwargsr   c                 C   s   |  | d S r   r   r   r   r   r   r    r   r   r   process_view#   s    
z#CorsPostCsrfMiddleware.process_view)__name__
__module____qualname__r   r   r   r   r"   r   r   r   r   r      s   
r   c                   @   s   e Zd ZeddddZeee dddZeeeedddd	Z	e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eedddZeedddZdS )CorsMiddlewareNr   c                 C   s   |j d}| r|rd|j vrt|}tjs@| ||s@dS z<|j d }d|j d  }|j  |_ ||j d< ||j d< W n ty   Y n0 dS )a  
        When https is enabled, django CSRF checking includes referer checking
        which breaks when using CORS. This function updates the HTTP_REFERER
        header to make sure it matches HTTP_HOST, provided that our cors logic
        succeeds
        HTTP_ORIGINr   Nr   zhttps://%s/Z	HTTP_HOST)	r   getZ	is_securer   r
   CORS_ALLOW_ALL_ORIGINSorigin_found_in_white_listscopyKeyError)r   r   originurlr   Z	http_hostr   r   r   _https_referer_replace/   s*    


z%CorsMiddleware._https_referer_replacec                 C   sL   |  ||_|jrHtjr"| | |jdkrHd|jv rHt }d|d< |S dS )a  
        If CORS preflight header, then create an
        empty body response (200 OK) and return it

        Django won't bother calling any other request
        view/exception middleware along with the requested view;
        it will call any response middlewares
        OPTIONSZ"HTTP_ACCESS_CONTROL_REQUEST_METHOD0zContent-LengthN)
is_enabled_cors_enabledr
   r   r/   methodr   r   )r   r   responser   r   r   r   N   s    	
zCorsMiddleware.process_requestr   c                 C   s   |j rtjr| | dS )z9
        Do the referer replacement here as well
        N)r3   r
   r   r/   r!   r   r   r   r"   e   s    

zCorsMiddleware.process_view)r   r5   r   c                 C   s  t |dd}|du r| |}|s&|S t|dg |jd}|sF|S zt|}W n tyh   | Y S 0 tjrxd|t	< tj
s| ||s| |s|S tj
rtjsd|t< n||t< ttjrdtj|t< |jdkrdtj|t< dtj|t< tjrttj|t< |S )	z1
        Add the respective CORS headers
        r3   NZOriginr'   true*z, r0   )getattrr2   r   r   r(   r   
ValueErrorr
   ZCORS_ALLOW_CREDENTIALS ACCESS_CONTROL_ALLOW_CREDENTIALSr)   r*   check_signalACCESS_CONTROL_ALLOW_ORIGINlenZCORS_EXPOSE_HEADERSjoinACCESS_CONTROL_EXPOSE_HEADERSr4   ZCORS_ALLOW_HEADERSACCESS_CONTROL_ALLOW_HEADERSZCORS_ALLOW_METHODSACCESS_CONTROL_ALLOW_METHODSZCORS_PREFLIGHT_MAX_AGEstrACCESS_CONTROL_MAX_AGE)r   r   r5   Zenabledr-   r.   r   r   r   process_responses   sF    




zCorsMiddleware.process_response)r-   r.   r   c                 C   s&   |dkr|t jv p$| |p$| |S )Nnull)r
   CORS_ALLOWED_ORIGINS_url_in_whitelistregex_domain_match)r   r-   r.   r   r   r   r*      s
    z*CorsMiddleware.origin_found_in_white_lists)r-   r   c                    s   t  fddtjD S )Nc                 3   s   | ]}t | V  qd S r   )rematch).0Zdomain_patternr-   r   r   	<genexpr>   s   z4CorsMiddleware.regex_domain_match.<locals>.<genexpr>)anyr
   ZCORS_ALLOWED_ORIGIN_REGEXES)r   r-   r   rL   r   rH      s    z!CorsMiddleware.regex_domain_matchc                 C   s   t ttj|jp| |S r   )boolrI   rJ   r
   ZCORS_URLS_REGEXZ	path_infor;   r   r   r   r   r2      s
    zCorsMiddleware.is_enabledc                 C   s    t jd |d}tdd |D S )N)Zsenderr   c                 s   s   | ]\}}|V  qd S r   r   )rK   functionZreturn_valuer   r   r   rM          z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   sendrN   )r   r   Zsignal_responsesr   r   r   r;      s    zCorsMiddleware.check_signal)r.   r   c                    s&   dd t jD }t fdd|D S )Nc                 S   s   g | ]}t |qS r   )r   )rK   or   r   r   
<listcomp>   rQ   z4CorsMiddleware._url_in_whitelist.<locals>.<listcomp>c                 3   s&   | ]}|j  j ko|j jkV  qd S r   )schemenetloc)rK   r-   r.   r   r   rM      s   z3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r
   rF   rN   )r   r.   Zoriginsr   rW   r   rG      s    z CorsMiddleware._url_in_whitelist)r#   r$   r%   r   r/   r   r   r   r   r"   rD   rB   r   rO   r*   rH   r2   r;   rG   r   r   r   r   r&   .   s    4r&   )rI   typingr   r   urllib.parser   r   Zdjango.httpr   r   Zdjango.utils.cacher   Zdjango.utils.deprecationr	   Zcorsheaders.confr
   Zcorsheaders.signalsr   r<   r?   r:   r@   rA   rC   r   r&   r   r   r   r   <module>   s   