ó
    > Ìj°  ã                   óÈ   • S r SSKrSSKJr  SSKJr  SSKJrJr  SSK	J
r
  SSS.S\S	\S
\S\\   S\\   SS4S jjrSS\S\4S jjrSS jrS\S	\S
\S\4S jrS\SS4S jrg)u•  
rate_limit.py â€” limiteur de tentatives PERSISTANT (MySQL), par clÃ© (ex. IP).

StockÃ© en base et non en mÃ©moire : la fenÃªtre est partagÃ©e entre tous les
workers uvicorn et survit Ã  un redÃ©marrage â€” un attaquant ne peut plus
remettre son compteur Ã  zÃ©ro en provoquant un restart.

    from core.rate_limit import enforce
    enforce(f"photos-lookup:{ip}", max_attempts=20, window_seconds=300)
é    N)ÚOptional)ÚHTTPException)Úget_dbÚ
named_lock)Ú	client_ip)Úaudit_actionÚ
ip_addressÚkeyÚmax_attemptsÚwindow_secondsr   r	   Úreturnc                óú  • [         R                   " 5       nXR-
  n[        SU  35         [        5        nUR                  SX45        UR                  SU 45      R	                  5       S   nX�:¬  n	U	(       d  UR                  SX45        UR                  5         SSS5        SSS5        W	(       a*  U(       a  SSKJn
  U
R                  X4XS	.S
S9  [        SSS9eg! , (       d  f       NH= f! , (       d  f       NQ= f)uŠ   LÃ¨ve HTTPException(429) si `key` a dÃ©passÃ© `max_attempts` dans les
`window_seconds` derniÃ¨res secondes. Sinon enregistre la tentative.zrate:z*DELETE FROM rate_hits WHERE key=? AND ts<?z/SELECT COUNT(*) AS n FROM rate_hits WHERE key=?Únú,INSERT INTO rate_hits (key, ts) VALUES (?,?)Nr   )Úaudit_service)r   r   Úcritical)r	   ÚdetailsÚseverityi­  u&   Too many attempts â€” try again later.)Údetail)
Útimer   r   ÚexecuteÚfetchoneÚcommitÚservicesr   Ú	log_eventr   )r
   r   r   r   r	   ÚnowÚcutoffÚconnr   Úblockedr   s              ÚRD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\core\rate_limit.pyÚenforcer!      sÙ   € ô �)Š)‹+€CØÑ!€Fä	�e˜C˜5�MÕ	"¤F¤H°Ø�‰ÐAÀCÀ=ÔQØ�L‰LÐJÈSÈFÓS×\Ñ\Ó^Ð_bÑcˆØÑ#ˆÞØ�L‰LÐGÈ#ÈÔTØ�‰Œ÷ %-×	"ö ÞÝ.Ø×#Ñ#ØØ)5ÑXØ#ð $ñ ô
 ˜CÐ(PÑQÐQð ÷ %-¥Hú×	"Õ	"ús#   ¨C,³A&CÂC,Ã
C)	Ã%C,Ã,
C:Úmax_age_secondsc                 óÖ   • [        5        nUR                  S[        R                  " 5       U -
  45      nUR                  5         UR                  sS S S 5        $ ! , (       d  f       g = f)Nz DELETE FROM rate_hits WHERE ts<?)r   r   r   r   Úrowcount)r"   r   Úcurs      r    Ú	purge_oldr&   /   sB   € Ü	Œ�TØ�l‰lÐ=ÄÇ	Â	ÃÈoÑ@]Ð?_Ó`ˆØ�‰ŒØ�|‰|÷ 
��ús   ‹AAÁ
A(c                  óŽ   • [        5        n U R                  S5        U R                  5         SSS5        g! , (       d  f       g= f)z Vide tous les compteurs (tests).zDELETE FROM rate_hitsN)r   r   r   )r   s    r    Ú	reset_allr(   6   s)   € ä	Œ�TØ�‰Ð,Ô-Ø�‰Œ÷ 
�Žús	   ‹"6¶
Ac                 óÒ   • [         R                   " 5       U-
  n[        5        nUR                  SX45      R                  5       S   nSSS5        XQ:¬  $ ! , (       d  f       WU:¬  $ = f)u­   Vrai si `key` a dÃ©jÃ  `max_attempts` Ã©vÃ©nements enregistrÃ©s dans la fenÃªtre.
Ne compte rien lui-mÃªme : Ã  associer Ã  `record_hit` (ex. n'enregistrer que les Ã©checs).z9SELECT COUNT(*) AS n FROM rate_hits WHERE key=? AND ts>=?r   N)r   r   r   r   )r
   r   r   r   r   r   s         r    Ú
is_blockedr*   =   s`   € ô �YŠY‹[˜>Ñ)€FÜ	Œ�TØ�L‰LÐTÐWZÐVcÓd×mÑmÓoÐpsÑtˆ÷ 
àÑÐ÷ 
Œà�ÑÐús   £%AÁ
A&c                 óº   • [        5        nUR                  SU [        R                  " 5       45        UR                  5         S S S 5        g ! , (       d  f       g = f)Nr   )r   r   r   r   )r
   r   s     r    Ú
record_hitr,   F   s6   € Ü	Œ�TØ�‰ÐCÀcÌ4Ï9Ê9Ë;ÐEWÔXØ�‰Œ÷ 
�Žús   ‹8AÁ
A)i€Q )r   N)Ú__doc__r   Útypingr   Úfastapir   Úcore.dbr   r   Úcore.securityr   ÚstrÚintr!   r&   r(   Úboolr*   r,   © ó    r    Ú<module>r7      s´   ðñ	ó Ý å !ç &Ý #ð
 &*ÀtòRØ	ðRØðRØ14ðRà˜c‘]ðRà7?À±}ðRð 
õRñ6˜sð ¨sõ ôð�Cð  sð ¸Cð ÀDô ð�Cð ˜Dõ r6   