o
    ul~i9                     @   sH  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dl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gZd	d
dddZdZdd Zdd Zdd dd edZdd Zdd dd edZefddZedZdd  Zd!d" Zd#d$ Zdddded%fd&dZ dddded%fd'dZ!ee _ee _ee!_ee!_dS )(    N)settings)caches)ImproperlyConfigured)import_string)ALLUNSAFEis_ratelimited	get_usage   <   i  iQ )smhd   c                 C   s   t tdd }|s| jd }|stdn,t|r|| }n#t|tr/d|v r/t|}|| }n|| jv r:| j| }ntd| d|v rKt tdd}nt td	d
}tj	| d| dd}t|j
S )NRATELIMIT_IP_META_KEYREMOTE_ADDRzIP address in REMOTE_ADDR is empty. This can happen when using a reverse proxy and connecting to the app server with Unix sockets. See the documentation for RATELIMIT_IP_META_KEY: https://bit.ly/3iIpy2x.z"Could not get IP address from "%s":RATELIMIT_IPV6_MASK@   RATELIMIT_IPV4_MASK    /F)strict)getattrr   METAr   callable
isinstancestrr   	ipaddress
ip_networknetwork_address)requestip_metaip
ip_meta_fnmasknetwork r)   \/var/www/newdalilibackend/backend/venv/lib/python3.10/site-packages/django_ratelimit/core.py_get_ip   s.   




r+   c                 C   s   | j jr
t| j jS t| S N)useris_authenticatedr   pkr+   )r#   r)   r)   r*   
user_or_ip?   s   r0   c                 C   s   t | S r,   )r+   rr)   r)   r*   <lambda>F   s    r3   c                 C   s   t | jjS r,   )r   r-   r/   r1   r)   r)   r*   r3   G   s    )r%   r-   r0   c                 C   s"   d| dd  }| j|dS )NHTTP_-_ )replaceupperr   get)r#   headerkeyr)   r)   r*   
get_headerL   s   r=   c                 C      | j |dS Nr7   )GETr:   r2   kr)   r)   r*   r3   R       c                 C   r>   r?   )POSTr:   rA   r)   r)   r*   r3   S   rC   )r:   postr;   c                 C   s4   |t krdS t|ttfs|g}| jdd |D v S )NTc                 S      g | ]}|  qS r)   r9   .0r   r)   r)   r*   
<listcomp>]       z!_method_match.<locals>.<listcomp>)r   r   listtuplemethod)r#   rN   r)   r)   r*   _method_matchX   s
   rO   z([\d]+)/([\d]*)([smhd])?c                 C   sV   t | tr| S t|  \}}}t|}|sd}t|  }|r'|t| }||fS )Nr   )r   rM   rate_rematchgroupsint_PERIODSlower)ratecountmultiperiodsecondsr)   r)   r*   _split_ratec   s   
r[   c                 C   sZ   t t }|dkr|S t| ts| d} |||  t| |  }||k r+|| S |S )zs
    Given a value, and time period return when the end of the current time
    period for rate evaluation is.
    r
   utf-8)rS   timer   bytesencodezlibcrc32)valuerY   tswr)   r)   r*   _get_windowp   s   

re   c                 C   s   t |\}}d||f }| ||t|g}|d ur7|tkrd}nt|ttfr2dtdd |D }|| t	t
dd}	t	t
dtj}
t|
trNt|
 n|
}|	|d|d  S )	Nz%d/%dsr7   c                 S   rF   r)   rG   rH   r)   r)   r*   rJ      rK   z#_make_cache_key.<locals>.<listcomp>RATELIMIT_CACHE_PREFIXzrl:RATELIMIT_HASH_ALGORITHMr\   )r[   r   r   r   rL   rM   joinsortedappendr   r   hashlibsha256r   r_   	hexdigest)groupwindowrV   rb   methodsrW   rY   	safe_ratepartsprefixattralgo_clsr)   r)   r*   _make_cache_key   s    
rv   Fc                 C   s(   t | ||||||}|d u rdS |d S )NFshould_limit)r	   )r#   rn   fnr<   rV   rN   	incrementusager)   r)   r*   r      s   c                 C   s  |d u r|d u rt dttddsd S t| |sd S |d u rXg }t|tjr*|j}|jdkr5|j	d j
}t|dr@||j t|drM||jjj ||j d|}t|rb||| }nt|trtd|v rtt|}||| }|d u rzd S t|\}	}
|
dkrt d	|st d
t|r||| }n=|tv rt| | }n2d|v r|dd\}}|tvrt d| t| | |}nd|v rt|}||| }nt d| t||
}|rdnd}ttdd}t| }t|||||}d }z||||
t }W n tjy   d}Y nw |r|}n|r(z| |}W n t!y'   Y nw |"||}|d u s8|du rHttddrAd S dddddS |t#t$$  }||	||	k|dS )Nz>get_usage must be called with either `group` or `fn` argumentsRATELIMIT_ENABLET
bound_funcr   
__module____self__r   z'Ratelimit period must be greater than 0zRatelimit key must be specifiedr   r
   zUnknown ratelimit key: %sz&Could not understand ratelimit key: %sRATELIMIT_USE_CACHEdefaultFRATELIMIT_FAIL_OPEN)rW   limitrw   	time_left)%r   r   r   rO   r   	functoolspartialfunc__name____closure__cell_contentshasattrrj   r}   r~   	__class____qualname__rh   r   r   r   r[   _SIMPLE_KEYSsplit_ACCESSOR_KEYSre   r   rv   addEXPIRATION_FUDGEsocketgaierrorincr
ValueErrorr:   rS   r]   )r#   rn   rx   r<   rV   rN   ry   rr   ratefnr   rY   rb   accessorrB   keyfnro   initial_value
cache_namecache	cache_keyrW   addedr   r)   r)   r*   r	      s   






)"r    r   rk   rer   r]   r`   django.confr   django.core.cacher   django.core.exceptionsr   django.utils.module_loadingr   django_ratelimitr   r   __all__rT   r   r+   r0   r   r=   r   rO   compilerP   r[   re   rv   r   r	   r)   r)   r)   r*   <module>   sZ    !


	
l
