o
    ;h[                     @  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)successZdangererror	blueprintdefaultcallableentityZ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,    r2   I/var/www/html/venv/lib/python3.10/site-packages/flask_limiter/commands.pyrender_func/   s
   
r4   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   Z_storage_uristorageadd	__class__r0   r   Z_storage_optionscheck)r5   renderZhealthr2   r2   r3   render_storage7   s   


r=   strategyr	   strc                 C  s   d| j j dS )Nr6   r7   )r:   r0   )r>   r2   r2   r3   render_strategyE   s   r@   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_forr8   r;   rA   testrC   Zget_window_statsamount)rA   rB   rC   rD   rE   argsrH   statsr2   r2   r3   render_limit_stateI   s   rL   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])r?   rC   Zdeduct_whenappendr4   Zexempt_whenjoin)rC   rM   r<   optionsr2   r2   r3   render_limitY   s   
rR   GET appr   limitstuple[list[Limit], ...]
str | Noner%   ruleRule | Noneexemption_scoper   rH   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: rT   r   rF   r%   r)   r&   F[]z [http](z
)[/http][/z[/z[exempt]Exempt[/exempt]c                   s   g | ]}  |qS r2   r9   ).0entry
renderabler2   r3   
<listcomp>   s    z!render_limits.<locals>.<listcomp>)r   view_functionsgetlimit_managerZblueprint_limitsZdecorated_limitsr   
per_methodmethodsrR   rL   rO   r9   )rU   rA   rV   rB   r%   rY   r[   rH   rE   r\   Z_labelentriesrC   Z	view_funcsourcerenderedrb   r2   rc   r3   render_limitsg   sX   


	
rn   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)rE   Z
query_argsz[error]Error: z, could not be matched to an endpoint[/error]r]   )r   rf   printurl_mapbindr   matchrp   queryr   r?   r   r   upper
SystemExit)	rU   ro   rB   rp   rE   adapterparsedfilter_endpoint_r2   r2   r3   get_filtered_endpoint   s8   



	r|   z-Flask-Limiter maintenance & utility commmands)helpNonec                   C  s   d S Nr2   r2   r2   r2   r3   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themerA   r   zFlask-Limiter Config)titleZNotesConfigurationValueZEnabledzKey Functionz
Key PrefixInstanceBackendStatuszRate Limiting ConfigApplication Limitsc                 S     g | ]}t |qS r2   rR   ra   rC   r2   r2   r3   re          zconfig.<locals>.<listcomp>zApplicationLimits LimitszDefault Limitsc                 S  r   r2   r   r   r2   r2   r3   re     r   zMeta Limitsc                 S  r   r2   r   r   r2   r2   r3   re   ;  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
extensionsrg   setr   
add_columnadd_rowr   ZENABLEDr   enabledZKEY_FUNCr4   Z	_key_funcZ
KEY_PREFIXZ_key_prefixr   ZSTRATEGYr@   rA   r9   ZSTORAGE_URIZSTORAGE_OPTIONSr=   rh   application_limitsZAPPLICATION_LIMITSZAPPLICATION_LIMITS_PER_METHODZ_application_limits_per_methodZAPPLICATION_LIMITS_EXEMPT_WHENZ_application_limits_exempt_whenZAPPLICATION_LIMITS_DEDUCT_WHENZ_application_limits_deduct_whenZAPPLICATION_LIMITS_COSTZ_application_limits_costZdefault_limitsZDEFAULT_LIMITSZDEFAULT_LIMITS_PER_METHODZ_default_limits_per_methodZDEFAULT_LIMITS_EXEMPT_WHENZ_default_limits_exempt_whenZDEFAULT_LIMITS_DEDUCT_WHENZ_default_limits_deduct_whenZDEFAULT_LIMITS_COSTZ_default_limits_cost_meta_limitsZMETA_LIMITS	itertoolschainZ_headers_enabledZHEADERS_ENABLEDZHEADER_RESETZHEADER_REMAININGZHEADER_RETRY_AFTERZHEADER_RETRY_AFTER_VALUEZ_header_mappingr   RESETZ	REMAININGZRETRY_AFTERZ_retry_afterZFAIL_ON_FIRST_BREACHZ_fail_on_first_breachZ	ON_BREACHZ
_on_breachrq   )	ro   limitersrA   Zextension_detailsZlimiter_configZlimiter_config_valuesnodeZheader_configsheader_valuesr2   r2   r3   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 )NrA   r   r   c                 S     t | S r   r?   rr2   r2   r3   <lambda>      zlimits.<locals>.<lambda>rD   staticr/   rF   )r[   rE   rH   rootrT   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])rH   rE   r\   z![gold3]Application Limits[/gold3]r   z[gold3]z[/gold3]z[blue]z[/blue]c                   s   g | ]}  | qS r2   r`   )ra   rd   Z
group_treer2   r3   re     s    z6limits.<locals>.console_renderable.<locals>.<listcomp>)
rh   r   rn   r   r   r   r   r   r   name)r   rB   groupsrD   rA   rE   rp   r   r3   console_renderable  s@   
z"limits.<locals>.console_renderableg?T)ro   refresh_per_secondscreenr   r   r   )r-   r   )r   r   r   rg   r   r   r
   r   rh   r|   sortedrr   
iter_rulesrB   lensplitrP   
setdefaultrO   r   rn   resolve_limitsr[   r   rq   r   updatetimesleepKeyboardInterrupt)rB   rp   rE   rD   r   r   ro   managerrz   rY   rule_endpointbp_fullnamer   liver2   r   r3   rV   n  s   



 W$zClear limits for a specific keyzKey to reset the limits for)r&   requiredr}   z-yzSkip prompt for confirmation)Z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 )NrA   r   r   c                   @  s   e Zd ZU ded< ded< dS )zclear.<locals>.Detailsr   rY   rW   rV   N)r0   r1   __qualname____annotations__r2   r2   r2   r3   Details   s   
 r   c                 S  r   r   r   r   r2   r2   r3   r     r   zclear.<locals>.<lambda>r   r   r/   rF   r   )rY   rV   rT   r   )r\   rH   rV   rY   )rY   rH   z/Proceed with resetting limits for key: [danger]z
[/danger]?z: [success]Cleared[/success]r   r   r   )"r   r   r   r   rg   r   r
   r   rh   r|   r   r   rr   r   rB   r   r   rP   r   r   rq   rn   itemsr   askr   rA   clearrC   rG   r9   rR   ri   rj   )rD   rB   rp   rE   r   r   rA   ro   r   rz   r   Zrule_limitsrY   r   r   r   detailsr   rC   r&   Z	decoratedZrule_methodr2   r2   r3   r     s   


	







$ r   __main__)r,   r   r-   r.   )r5   r   r-   r   )r>   r	   r-   r?   )rA   r   rB   r?   rC   r   rD   r?   rE   r?   r-   r?   )T)rC   r   rM   rN   r-   r?   )rU   r   rA   r   rV   rW   rB   rX   r%   rX   rY   rZ   r[   r   rH   rX   rE   r?   r\   rX   r-   r   r   )rU   r   ro   r
   rB   rX   rp   rX   rE   rX   r-   rX   )r-   r~   )NNrS   NF)rB   rX   rp   rX   rE   r?   rD   rX   r   rN   r-   r~   )NNrS   F)rD   r?   rB   rX   rp   rX   rE   r?   r   rN   r-   r~   )F
__future__r   r   r   	functoolsr   typingr   urllib.parser   ZclickZflaskr   r   Z	flask.clir   Zlimits.strategiesr	   Zrich.consoler
   r   Z	rich.liver   Zrich.prettyr   Zrich.promptr   Z
rich.tabler   Z
rich.themer   Z	rich.treer   typing_extensionsr   Zwerkzeug.exceptionsr   r   Zwerkzeug.routingr   Zflask_limiterr   Zflask_limiter.constantsr   r   r   Zflask_limiter.typingr   r   r   Zflask_limiter.utilr   Zflask_limiter.wrappersr   r   r4   r=   r@   rL   rR   NONErn   r|   r   commandr   r+   rV   r   r0   r2   r2   r2   r3   <module>   s    



C
#
 
 
s
s
