o
    Yli\                     @   s  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ d dlmZ d dlZd dlmZ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 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( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 e$ddddddddddddZ8dedee9ef fdd Z:d!e/de&fd"d#Z;d$ede9fd%d&Z<d'e/d(e9d)e7d*e9d+e9de9fd,d-Z=dbd)e7d/e>de9fd0d1Z?ddde2j@dd2d3fd4ed'e/d5ee	e7 d6f d(e
e9 d7e
e9 d8e
e- d9e2d:e
e9 d+e9d;e
e9 de&fd<d=ZA	dcd4ed>ed(e
e9 d?e
e9 d+e
e9 de
e9 fd@dAZBejdBdCdddDdEZCeCjDdFdCedddGdHZEeCjDdIdCejFdJddKdLejFdMddNdLejFdOddPdLejFdQddRdLejFdSdTdUdLe			2		Tded(e
e9 d?e
e9 d+e9d*e
e9 dVe>ddfdWd5ZGeCjDdXdCejFdJddKdLejFdMddNdLejFdOddPdLejFdQdd.dYdZejFd[d.d\d]e			2	Tdfd*e9d(e
e9 d?e
e9 d+e9d^e>ddfd_d`ZHeIdakreC  dS dS )g    N)partial)	AnyCallableDict	GeneratorListOptionalSetTupleUnion)urlparse)Flaskcurrent_app)with_appcontext)RateLimiter)Consolegroup)Live)Pretty)Confirm)Table)Theme)Tree)	TypedDict)MethodNotAllowedNotFound)Rule)Limiter)
ConfigVarsExemptionScopeHeaderNames)get_qualified_name)Limitz
bold greenbold redmagentacyanyellowzbold yellow)successdangererror	blueprintdefaultcallableentityexemptroutehttpoptionfuncreturnc                 C   s>   t | r| jdkrd| j dS d| j d| j dS t| S )Nz<lambda>z[callable]<lambda>(z)[/callable]z
[callable].z()[/callable])r,   __name__
__module__r   )r2    r7   f/var/www/html/tatsat2dev/dashboard-backend/venv/lib/python3.10/site-packages/flask_limiter/commands.pyrender_func,   s
   
r9   extc                 C   s   t | jpd}| jr>|d| jjj d |d| jj d |t| jp(i  | j }|r9|d |S |d |S )NzN/A[entity]	[/entity]z[success]OK[/success]z[error]Error[/error])	r   _storage_uristorageadd	__class__r5   r   _storage_optionscheck)r:   renderhealthr7   r7   r8   render_storage4   s   


rE   strategyc                 C   s   d| j j dS )Nr;   r<   )r@   r5   )rF   r7   r7   r8   render_strategyB   s   rG   limiterendpointlimitkeymethodc                 C   s   || ||g}| jr| jr| j sdS | jj|jg|R  }| jj|jg|R  }|s:d|d  d|jj dS d|d  d|jj dS )Nz&: [error]Storage not available[/error]z: [error]Fail[/error] (   z out of z remaining)z: [success]Pass[/success] ()	scope_forr>   rB   rH   testrJ   get_window_statsamount)rH   rI   rJ   rK   rL   argsrO   statsr7   r7   r8   render_limit_stateF   s   rT   Tsimplec                 C   sl   t | j}|r	|S g }| jr|dt| j  | jr'|dt| j  |r4| dd| d}|S )Nzdeduct_when: zexempt_when: z
 [option]{z, z
}[/option])strrJ   deduct_whenappendr9   exempt_whenjoin)rJ   rU   rC   optionsr7   r7   r8   render_limitV   s   
r\   GET applimits.r*   ruleexemption_scoperO   labelc
                    s~  d }
|r|r| d| }
|
p|	pd}	t |	 g }|d |d  D ]}|rL| j|d }|r9||j| |v r9dn||j|rCt|ndv rIdnd}nd}|jr|r|jr|jD ])}t	|d}d	| d
| d| d| d
	}|r}|t
||pwd|||7 }|| qYq!t	|d}d	| d
| d| d
}|r|t
||pd|||7 }|| q!|s|r d  S  fdd|D   S )N: r^   r   rM   r*   r/   r+   F[]z [http](z
)[/http][/z[/z[exempt]Exempt[/exempt]c                    s   g | ]}  |qS r7   r?   ).0entry
renderabler7   r8   
<listcomp>   s    z!render_limits.<locals>.<listcomp>)r   view_functionsgetlimit_managerblueprint_limitsdecorated_limitsr!   
per_methodmethodsr\   rT   rX   r?   )r_   rH   r`   rI   r*   ra   rb   rO   rL   rc   _labelentriesrJ   	view_funcsourcerenderedri   r7   rj   r8   render_limitsd   sX   


	
ry   consolepathc           	   
   C   s   |s|sd S |r|t jv r|S |d| d t|rd| jd}t|}z|j|j||jd\}}|W S  t	yH   |d| d Y t t
yc   |sRJ |d|  d| d Y tw t)Nz[red]Error: z
 not foundzdev.null)rL   
query_argsz[error]Error: z, could not be matched to an endpoint[/error]rd   )r   rm   printurl_mapbindr   matchr{   queryr   r   upper
SystemExit)	r_   rz   rI   r{   rL   adapterparsedfilter_endpoint_r7   r7   r8   get_filtered_endpoint   s8   



	r   z-Flask-Limiter maintenance & utility commmands)helpc                   C   s   d S Nr7   r7   r7   r7   r8   cli   s   r   z View the extension configurationc            	   	   C   s  t   ttd} tt jdt }|ot|d }|rtdd}|	d |	d |	d |
d	tjt|j |
d
tjt|j |
dtjt|j ttj}tt|j}|tj}|d |d |tj |d |t| |
d|| |jjr|
dtjtdd |jjD  |
d tjt|j  |
d tj!t|j" |
d tj#t|j$ |
d tj%t|j& n
|
dtjtg  |jj'r|
dtj(tdd |jj'D  |
d tj)t|j* |
d tj+t|j, |
d tj-t|j. |
d tj/t|j0 n
|
dtj(tg  |j1r:|
dtj2tdd t3j4|j1 D  |j5rttj6}|tj7 |tj8 |tj9 |tj: tt|j5}|t|j;t<j=  |t|j;t<j>  |t|j;t<j?  |t|j@ |
d|| n
|
dtj6td |
dtjAt|jB |
dtjCt|jD | E| n| jEdt  dd W d    d S W d    d S 1 sw   Y  d S )NthemerH   r   zFlask-Limiter Config)titleNotesConfigurationValueEnabledzKey Functionz
Key PrefixInstanceBackendStatuszRate Limiting ConfigApplication Limitsc                 S      g | ]}t |qS r7   r\   rh   rJ   r7   r7   r8   rl          zconfig.<locals>.<listcomp>zApplicationLimits LimitszDefault Limitsc                 S   r   r7   r   r   r7   r7   r8   rl     r   zMeta Limitsc                 S   r   r7   r   r   r7   r7   r8   rl   6  r   zHeader configurationFzFail on first breachzOn breach callback(No Flask-Limiter extension installed on r#   style)Fr   test_request_contextr   limiter_themelist
extensionsrn   setr   
add_columnadd_rowr   ENABLEDr   enabledKEY_FUNCr9   	_key_func
KEY_PREFIX_key_prefixr   STRATEGYrG   rH   r?   STORAGE_URISTORAGE_OPTIONSrE   ro   application_limitsAPPLICATION_LIMITSAPPLICATION_LIMITS_PER_METHOD_application_limits_per_methodAPPLICATION_LIMITS_EXEMPT_WHEN_application_limits_exempt_whenAPPLICATION_LIMITS_DEDUCT_WHEN_application_limits_deduct_whenAPPLICATION_LIMITS_COST_application_limits_costdefault_limitsDEFAULT_LIMITSDEFAULT_LIMITS_PER_METHOD_default_limits_per_methodDEFAULT_LIMITS_EXEMPT_WHEN_default_limits_exempt_whenDEFAULT_LIMITS_DEDUCT_WHEN_default_limits_deduct_whenDEFAULT_LIMITS_COST_default_limits_cost_meta_limitsMETA_LIMITS	itertoolschain_headers_enabledHEADERS_ENABLEDHEADER_RESETHEADER_REMAININGHEADER_RETRY_AFTERHEADER_RETRY_AFTER_VALUE_header_mappingr    RESET	REMAININGRETRY_AFTER_retry_afterFAIL_ON_FIRST_BREACH_fail_on_first_breach	ON_BREACH
_on_breachr}   )	rz   limitersrH   extension_detailslimiter_configlimiter_config_valuesnodeheader_configsheader_valuesr7   r7   r8   config   s.  














   $r   z3Enumerate details about all routes with rate limitsz
--endpointzEndpoint to filter by)r+   r   z--pathzPath to filter byz--methodzHTTP Method to filter byz--keyzTest the limitz--watch/--no-watchFzCreate a live dashboardwatchc                    s"  t   t jdt }|rt|d nd ttd}rj}i t	t | }t
t j|dd dD ]^}	|	j}
|
dkrBq8t|
dd	krwd|
dd d
 }|g ttt |t |
||
||	|t |
|d
 q8dg ttt |t |
d|
d |	|t |
d d
 q8t dtf fdd}|s||  nMt| |ddd!}	 z||  td W n	 ty   Y nw qW d    n1 sw   Y  n|jdt  dd W d    d S W d    d S W d    d S 1 s
w   Y  d S )NrH   r   r   c                 S      t | S r   rV   rr7   r7   r8   <lambda>      zlimits.<locals>.<lambda>rK   staticr4   rM   )rb   rL   rO   rootr^   r3   c                  3   s    r-j jr-s-s-ttttjj g fddV  ttj jg fddV  D ]&} | dkr?tdtj	 d ntd|  d  fd	d
|  D   V  q/d S )Nz[gold3]Meta Limits[/gold3])rO   rL   rc   z![gold3]Application Limits[/gold3]r   z[gold3]z[/gold3]z[blue]z[/blue]c                    s   g | ]}  | qS r7   rg   )rh   rk   
group_treer7   r8   rl     s    z6limits.<locals>.console_renderable.<locals>.<listcomp>)
ro   r   ry   r   r   r   r   r   r   name)r   rI   groupsrK   rH   rL   r{   r   r8   console_renderable  s@   
z"limits.<locals>.console_renderableg?T)rz   refresh_per_secondscreenr   r#   r   )r   r   r   rn   r   r   r   r   ro   r   sortedr~   
iter_rulesrI   lensplitrZ   
setdefaultrX   r   ry   resolve_limitsrb   r   r   r}   r   updatetimesleepKeyboardInterrupt)rI   r{   rL   rK   r   r   rz   managerr   ra   rule_endpointbp_fullnamer   liver7   r   r8   r`   i  s   


 W$zClear limits for a specific keyzKey to reset the limits for)r+   requiredr   z-yzSkip prompt for confirmation)is_flagr   yc                 C   s  t  h tt jdt }|r|d nd }ttd}|rS|j}t	t ||||}	t
dtttt df d}
i }tt j|	dd d	D ]:}|j}|d
krQqGt|ddkrtd|dd d }|
||t ||d||< qG|
||t |dd||< qGd }|	s|jj}|s|r|tt ||g fd| d | D ]\}}|d r|tt ||d ||d | d q|std|  drR|rtd}|D ]}|j|j | |!d| |"t#| d q|| | D ]`\}}|d rQt|}|d \}}|| D ]C}|j$r3|d r3|d j%r3|s3|d j%D ]}|j|j | |!|| q!n|j|j | |!|| |"t#| d q|| qn|jdt  dd W d    d S W d    d S 1 sqw   Y  d S )NrH   r   r   Details.)ra   r`   c                 S   r   r   r   r   r7   r7   r8   r     r   zclear.<locals>.<lambda>r   r   r4   rM   r   r^   r   )rc   rO   r`   ra   )ra   rO   z/Proceed with resetting limits for key: [danger]z
[/danger]?z: [success]Cleared[/success]r   r#   r   )&r   r   r   r   rn   r   r   r   ro   r   r   r   r
   r   r"   r   r~   r   rI   r   r   rZ   r   r   r}   ry   itemsr   askr   rH   clearrJ   rN   r?   r\   rr   rs   )rK   rI   r{   rL   r   r   rH   rz   r   r   r  rule_limitsra   r   r   r   detailsr   rJ   r+   	decoratedrule_methodr7   r7   r8   r    s   


	







$ r  __main__)Tr   )r3   N)NNr]   NF)NNr]   F)Jr   r   	functoolsr   typingr   r   r   r   r   r   r	   r
   r   urllib.parser   clickflaskr   r   	flask.clir   limits.strategiesr   rich.consoler   r   	rich.liver   rich.prettyr   rich.promptr   
rich.tabler   
rich.themer   	rich.treer   typing_extensionsr   werkzeug.exceptionsr   r   werkzeug.routingr   flask_limiterr   flask_limiter.constantsr   r   r    flask_limiter.utilr!   flask_limiter.wrappersr"   r   rV   r9   rE   rG   rT   boolr\   NONEry   r   r   commandr   r1   r`   r  r5   r7   r7   r7   r8   <module>   s8   ,
	

A

#
 
 
s
u
