o
    PDi[                     @  s  d dl m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
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l*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 eddddddddddddZ6drd#d$Z7dsd(d)Z8dtd-d.Z9dud5d6Z:dvdwd:d;Z;ddde,j<dd<d=fdxdJdKZ=	dydzdOdPZ>e
jdQdRd{dTdUZ?e?j@dVdRed{dWdXZAe?j@dYdRe
jBdZdd[d\e
jBd]dd^d\e
jBd_dd`d\e
jBdaddbd\e
jBdcddded\e			<		dd|d}dgd@ZCe?j@dhdRe
jBdZdd[d\e
jBd]dd^d\e
jBd_dd`d\e
jBdadd7didje
jBdkd7dldme			<	dd~ddodpZDeEdqkrue?  dS dS )    )annotationsN)partial)Any)urlparse)Flaskcurrent_app)with_appcontext)RateLimiter)Consolegroup)Live)Pretty)Confirm)Table)Theme)Tree)	TypedDict)MethodNotAllowedNotFound)Rule)Limiter)
ConfigVarsExemptionScopeHeaderNames)Callable	Generatorcast)get_qualified_name)Limitz
bold greenbold redmagentacyanyellowzbold yellow)successdangererror	blueprintdefaultcallableentityexemptroutehttpoptionfuncr   returnstr | Prettyc                 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   )r.    r4   O/var/www/Datamplify/venv/lib/python3.10/site-packages/flask_limiter/commands.pyrender_func/   s
   
r6   extr   r   c                 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__r2   r   _storage_optionscheck)r7   renderhealthr4   r4   r5   render_storage7   s   


rB   strategyr	   strc                 C  s   d| j j dS )Nr8   r9   )r=   r2   )rC   r4   r4   r5   render_strategyE   s   rE   limiterendpointlimitr   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;   r?   rF   testrH   get_window_statsamount)rF   rG   rH   rI   rJ   argsrM   statsr4   r4   r5   render_limit_stateI   s   rR   Tsimpleboolc                 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])rD   rH   deduct_whenappendr6   exempt_whenjoin)rH   rS   r@   optionsr4   r4   r5   render_limitY   s   
rZ   GET appr   limitstuple[list[Limit], ...]
str | Noner&   ruleRule | Noneexemption_scoper   rM   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   rK   r&   r+   r'   F[]z [http](z
)[/http][/z[/z[exempt]Exempt[/exempt]c                   s   g | ]}  |qS r4   r<   ).0entry
renderabler4   r5   
<listcomp>   s    z!render_limits.<locals>.<listcomp>)r   view_functionsgetlimit_managerblueprint_limitsdecorated_limitsr   
per_methodmethodsrZ   rR   rV   r<   )r]   rF   r^   rG   r&   ra   rc   rM   rJ   rd   _labelentriesrH   	view_funcsourcerenderedrj   r4   rk   r5   render_limitsg   sX   


	
rz   consoler
   pathc           	   
   C  s   |s|sd S |r|t jv r|S |d| d t|rg| jd}t|}z|j|j||jd\}}t	t
|W S  tyK   |d| d Y t tyf   |sUJ |d|  d| d Y tw t)Nz[red]Error: z
 not foundzdev.null)rJ   
query_argsz[error]Error: z, could not be matched to an endpoint[/error]re   )r   rn   printurl_mapbindr   matchr|   queryr   rD   r   r   upper
SystemExit)	r]   r{   rG   r|   rJ   adapterparsedfilter_endpoint_r4   r4   r5   get_filtered_endpoint   s8   



	r   z-Flask-Limiter maintenance & utility commmands)helpNonec                   C  s   d S Nr4   r4   r4   r4   r5   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themerF   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 r4   rZ   ri   rH   r4   r4   r5   rm          zconfig.<locals>.<listcomp>zApplicationLimits LimitszDefault Limitsc                 S  r   r4   r   r   r4   r4   r5   rm     r   zMeta Limitsc                 S  r   r4   r   r   r4   r4   r5   rm   ;  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
extensionsro   setr   
add_columnadd_rowr   ENABLEDr   enabledKEY_FUNCr6   	_key_func
KEY_PREFIX_key_prefixr   STRATEGYrE   rF   r<   STORAGE_URISTORAGE_OPTIONSrB   rp   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~   )	r{   limitersrF   extension_detailslimiter_configlimiter_config_valuesnodeheader_configsheader_valuesr4   r4   r5   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rAq7t|
dd	krvd|
dd d
 }|g ttt |t |
||
||	|t |
|d
 q7dg ttt |t |
d|
d |	|t |
d d
 q7t d 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 )NrF   r   r   c                 S     t | S r   rD   rr4   r4   r5   <lambda>      zlimits.<locals>.<lambda>rI   staticr1   rK   )rc   rJ   rM   rootr\   r/   r   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])rM   rJ   rd   z![gold3]Application Limits[/gold3]r   z[gold3]z[/gold3]z[blue]z[/blue]c                   s   g | ]}  | qS r4   rh   )ri   rl   
group_treer4   r5   rm     s    z6limits.<locals>.console_renderable.<locals>.<listcomp>)
rp   r   rz   r   r   r   r   r   r   name)r   rG   groupsrI   rF   rJ   r|   r   r5   console_renderable  s@   
z"limits.<locals>.console_renderableg?T)r{   refresh_per_secondscreenr   r   r   )r/   r   )r   r   r   ro   r   r   r
   r   rp   r   sortedr   
iter_rulesrG   lensplitrX   
setdefaultrV   r   rz   resolve_limitsrc   r   r~   r   updatetimesleepKeyboardInterrupt)rG   r|   rJ   rI   r   r   r{   managerr   ra   rule_endpointbp_fullnamer   liver4   r   r5   r^   n  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  b tt jdt }|r|d nd }ttd}|rM|j}t	t ||||}	G dd dt
}
i }tt j|	dd dD ]:}|j}|d	krKqAt|d
dkrnd
|d
d d }|
||t ||d||< qA|
||t |dd||< qAd }|	s|jj}|s|r|tt ||g fd| d | D ]\}}|d r|tt ||d ||d | d q|std|  drL|rtd}|D ]}|j|j| |d| |t| d q|| | D ]`\}}|d rKt|}|d \}}|| D ]C}|j r-|d r-|d j!r-|s-|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 skw   Y  d S )NrF   r   r   c                   @  s   e Zd ZU ded< ded< dS )zclear.<locals>.Detailsr   ra   r_   r^   N)r2   r3   __qualname____annotations__r4   r4   r4   r5   Details   s   
 r  c                 S  r   r   r   r   r4   r4   r5   r     r   zclear.<locals>.<lambda>r   r   r1   rK   r   )ra   r^   r\   r   )rd   rM   r^   ra   )ra   rM   z/Proceed with resetting limits for key: [danger]z
[/danger]?z: [success]Cleared[/success]r   r   r   )"r   r   r   r   ro   r   r
   r   rp   r   r   r   r   r   rG   r   r   rX   r   r   r~   rz   itemsr   askr   rF   clearrH   rL   r<   rZ   rs   rt   )rI   rG   r|   rJ   r  r   rF   r{   r   r   r  rule_limitsra   r   r   r   detailsr   rH   r'   	decoratedrule_methodr4   r4   r5   r    s   


	







$ r  __main__)r.   r   r/   r0   )r7   r   r/   r   )rC   r	   r/   rD   )rF   r   rG   rD   rH   r   rI   rD   rJ   rD   r/   rD   )T)rH   r   rS   rT   r/   rD   )r]   r   rF   r   r^   r_   rG   r`   r&   r`   ra   rb   rc   r   rM   r`   rJ   rD   rd   r`   r/   r   r   )r]   r   r{   r
   rG   r`   r|   r`   rJ   r`   r/   r`   )r/   r   )NNr[   NF)rG   r`   r|   r`   rJ   rD   rI   r`   r   rT   r/   r   )NNr[   F)rI   rD   rG   r`   r|   r`   rJ   rD   r  rT   r/   r   )F
__future__r   r   r   	functoolsr   typingr   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.typingr   r   r   flask_limiter.utilr   flask_limiter.wrappersr   r   r6   rB   rE   rR   rZ   NONErz   r   r   commandr   r-   r^   r  r2   r4   r4   r4   r5   <module>   s    



C
#
 
 
s
s
