HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/buyercall_forms/buyercall/buyercall/lib/__pycache__/rate_limit.cpython-38.pyc
U

k�if�0�@stddlZddlmZmZddlmZddlZddlmZmZddl	m
Z
e�e�Z
Gdd�de�ZGdd	�d	�ZdS)
�N)�datetime�	timedelta)�Enum)�jsonify�request)�current_userc@sNeZdZdZdZdZdZdZdZdZ	e
eed�d	d
��Z
e
ed�dd
��ZdS)�
TimePeriod�second�minute�hour�day�week�month�year)�value�returncCs|dd�|j��D�kS)NcSsg|]
}|j�qS��r)�.0�memberrr�J/home/arjun/projects/buyercall_forms/buyercall/buyercall/lib/rate_limit.py�
<listcomp>sz'TimePeriod.is_valid.<locals>.<listcomp>)�__members__�values)�clsrrrr�is_validszTimePeriod.is_validrcCs |D]}|j|kr|SqdS�Nr)rr�itemrrr�get_by_values
zTimePeriod.get_by_valueN)�__name__�
__module__�__qualname__�SECOND�MINUTE�HOUR�DAY�WEEK�MONTH�YEAR�classmethod�str�boolrrrrrrrsrc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zede	d�dd
��Z
ded�dd�Zee
ed�dd��Zdd�Zeed�dd��Zd
S)�	RateLimitz"Custom rate-limiting functionalitycCsd|_d|_d|_dSr)�redis_client�
parsed_limits�
excluded_urls��selfrrr�__init__#szRateLimit.__init__cCsLtj|j�d�|j�d�d�|_|�|j�d��|_|�|j�d��|_dS)N�REDIS_CONFIG_URL�REDIS_CONFIG_PORT)�host�port�REQUEST_RATE_LIMIT�REQUEST_RATE_LIMIT_EXCLUDE)	�redisZStrictRedis�config�getr-�
_parse_limitsr.�_validate_excludesr/)r1Z	flask_apprrr�init_app(s

�zRateLimit.init_appc
Cs�|��r4tdd�|jdD��r4tdd�|jD��r8dS�zLt��}d}dd�|jdD�}|rh|dnd}|svWdSd}tj�d��r^d	tj	k�rXtj	�
d	d�}|s�WdS|�d
�d}|s�WdSddlm
}|�|�}|s�WdSdd
lm}	|	j�|	j|k���}
|
�sWdSddlm}d|
j�d|��}|j�|jdk|j|
jk���}|j}nWdS|�spt�spWdS|�s�t�r�t��}d|�d|��}|j�|�}
d}|j�
dg�D] }||�
d�k�r�|}�qԐq�|
�r�t|
�
d|d��}t|
�
dd��}t|
�
dd��}|
�
dt���|��}t�|� �|�}t��|k�r�|d}d}d}|�!|d�}t��t"|d�}|j�#|d|�|j�#|d|�|j�#|d|�|��|j�#|d|�|dk�r0|d7}|�
d��r�||�
dd�k�r�|dk�r�ddl$m%}ddl&m'}|d�d|d��}tj(�
d��r:tj(�
d�n
tj(�
d �}|�)|�}|�
d!d��r�|�
d!d"��d#|�
d$d"��d#|�
d%d"���}nd}|j*|tj|tj+||d&�|j�#|dd�n|j�#|d|�t,d'd(�d)fWSnR|d}d}|�!|d�}t��t"|d�}|j�#|d|�|j�#|d|�|��||dk�r@dnd8}|||dk�rZdn|d7}|j�#|d|�|j�#|d|�Wn8t-k
�r�}zt.�/d*t0|����W5d}~XYnXdS)+NcSsg|]}ttj��|��qSr�r*r�path�
startswith�r�urlrrrr0sz!RateLimit.set.<locals>.<listcomp>�urlscSsg|]}ttj��|��qSrr?rBrrrr1s�%Y-%m-%d %H:%M:%ScSs g|]}ttj��|�r|�qSrr?�r�_patternrrrr6srz/apiZ	Authorize� �)�ApiToken)�Partnership)�Userzrate_limit:partnership-�:�partnerzrate_limit:user-�detail�remaining_requests�number�
requests_sentsnotify_limit�expiry�period��seconds�notify_limit)� send_request_limit_exceeded_mail)�IpApi� per �HTTP_X_FORWARDED_FOR�REMOTE_ADDR�city�z, �
regionName�country)�method�user_ip�locationz%Rate limit exceeded. Try again later.)�errorsi�zRate-Limit Error : )1�_is_config_valid�anyr.r/r�get_idrr@rA�headersr;�split�'buyercall.blueprints.partnership.modelsrJZcheck_tokenrK�query�filterZapi_token_id�first� buyercall.blueprints.user.modelsrL�id�role�partnership_idr-�hgetall�intr�utcnow�strftime�strptime�decode�_get_expiryrZhsetZ#buyercall.blueprints.sysadmin.tasksrXZ.buyercall.blueprints.sysadmin.utilities.ip_apirY�environ�get_request_complete_details�delayrar�	Exception�logger�warningr*)r1�user_id�	dt_stringrG�key�auth_header�tokenrJZ	api_tokenrK�partnershiprLZpartner_user�rate_limit_data�_limit_item�rule�remaining_requests�
requests_sentrW�expiry�expiry_date�expiry_timerXrYZ
_limit_stringrbZ
ip_detailsrc�excrrr�set.s���

�


�
�
.�&z
RateLimit.setcCs�|��r4tdd�|jdD��r4tdd�|jD��r8|St��}d}dd�|jdD�}|rd|dnd}|sp|Sd|�d	|��}d}|j�d
g�D]}||�d�kr�|}q�q�|j�|�}|d}	d}
|�	|d
�}t
��t|d�}|�r6t
|�d|d��}	t
|�dd��}
|�dt
���|��}
t
�|
��|�}dt|d�fdt|
�fdt|	�fd|�|�fg}|D]}|jj|��ql|S)NcSsg|]}ttj��|��qSrr?rBrrrr�sz!RateLimit.get.<locals>.<listcomp>rDcSsg|]}ttj��|��qSrr?rBrrrr�srEcSs g|]}ttj��|�r|�qSrr?rFrrrr�srzrate_limit:rMrOrQrIrTrUrPrRrSzX-RateLimit-LimitzX-RateLimit-SentzX-RateLimit-RemainingzX-RateLimit-Reset)rerfr.r/rrgr;r-rrrxrrtrrsrurvrwr*rh�
add_header)r1�responserr�rGr�r�r�r�r�r�r�r�r�rh�headerrrrr;�sH
��

�z
RateLimit.getN)�limit_stringcCs�zp|rdt|�kr*t�d|�d��WdS|�d�\}}t�|�sZt�d|�d��WdSt�|�}t|�|fWStk
r�t�d|�d��YdSXdS)NZper�Invalid config: "�"rZ)	r*r}r~rirrrrsr|)r��limitrTrrr�_parse_limit_value�s

zRateLimit._parse_limit_value)�
limit_rulec

sz�ggd�}|D]����dg�}��d�}��d�}t�fdd�dD��sRWdSt|t�sdWdS|rl|stWdS|�|�\}}|r�|s�WdS||||d�}|d	�|�|d
�|�q|WStk
�r}	z t�	dt
|	��d��WY�dSd}	~	XYnXdS)
N)rDrO�url_starts_withr�rWc3s|]}|�kVqdSrr)rr��r�rr�	<genexpr>�sz*RateLimit._parse_limits.<locals>.<genexpr>)r�r�)rDrQrTrWrDrOr�r�)r;�all�
isinstance�listr��extend�appendr|r}�debugr*)
r1r�Z	rl_configZ_urls�_limitZ
_notify_limitrQrTZ_item_config�err�rr<�s4



�zRateLimit._parse_limits)rTrcCs:tjdtjdtjdtjdtjdtjdtjdi}|�|d�S)	NrI�<ii�Qi�:	i�'i�3�r)	rr"r#r$r%r&r'r(r;)rT�periodsrrrrx�s �	zRateLimit._get_expirycCs|jst�d�dSdS)NzEInvalid configuration: REQUEST_RATE_LIMIT. Rate limit is not applied.FT)r.r}r~r0rrrre	s
zRateLimit._is_config_valid)rcCs6|sgSt|t�sgS|D]}t|t�sgSq|Sr)r�r�r*)rDrCrrrr=s


zRateLimit._validate_excludes)N)N)rr r!�__doc__r2r>r�r;�staticmethodr*r��dictr<rrsrxrer�r=rrrrr, sr-r,)�loggingrr�enumrr9�flaskrr�flask_loginr�	getLoggerrr}rr,rrrr�<module>s