ó
    ŒÌj™  ã                   óÂ  • % S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	  SSK
Jr  SSKJr  \R                  " S5      r1 Skr0 r\\\4   \S'   S	\S
\4S jrS
\4S jrS
\4S jrS\S
\4S jrS\S\	\   S
\4S jrS\S\S
\4S jrS\S\S
\\\4   4S jrS\S\S\S
\4S jrS\ \   4S jr!\!" \RD                  5      r#S\S
\4S jr$S
\4S jr%S
\ \   4S  jr&g)!u™   
SÃ©curitÃ© transverse : secrets persistants, mots de passe, URLs signÃ©es,
IP client derriÃ¨re un reverse proxy, validation de la config de production.
é    N)ÚOptional)Úconfig)Úget_dbzmeeconic.security>   ÚadminÚchangemeÚpasswordÚdirection2026ú	change-meÚ_secret_cacheÚnameÚreturnc                 óJ  • U [         ;   a	  [         U    $ [        5        nUR                  SSU  3[        R                  " S5      45        UR                  5         UR                  SSU  345      R                  5       S   nSSS5        W[         U '   U$ ! , (       d  f       N= f)u“   Secret gÃ©nÃ©rÃ© une fois puis conservÃ© en base : identique entre workers et
entre redÃ©marrages (utilisÃ© seulement si le .env n'en fournit pas).z6INSERT OR IGNORE INTO app_kv (key, value) VALUES (?,?)zsecret:é    z$SELECT value FROM app_kv WHERE key=?ÚvalueN)r   r   ÚexecuteÚsecretsÚ	token_hexÚcommitÚfetchone)r   Úconnr   s      ÚPD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\core\security.pyÚ_persistent_secretr      sš   € ð Œ}ÓÜ˜TÑ"Ð"Ü	Œ�TØ�‰ÐMØ ˜vÐ&¬×(9Ò(9¸"Ó(=Ð>ô	@à�‰ŒØ—‘ÐCÈÐPTÈvÐFVÐEXÓY×bÑbÓdÐelÑmˆ÷	 
ð
  „M�$ÑØ€L÷ 
�ús   žA#BÂ
B"c                  óF   • [         R                  =(       d    [        S5      $ )NÚjwt)r   ÚADMIN_JWT_SECRETr   © ó    r   Ú
jwt_secretr   )   s   € Ü×"Ñ"×?Ô&8¸Ó&?Ð?r   c                  óÆ   • [         R                  (       a  [         R                  $ [        R                  " S[	        5       -   R                  5       5      R                  5       $ )Nzmedia:)r   ÚMEDIA_SECRETÚhashlibÚsha256r   ÚencodeÚ	hexdigestr   r   r   Úmedia_secretr%   -   s?   € Ü××Ü×"Ñ"Ð"Ü�>Š>˜8¤j£lÑ2×:Ñ:Ó<Ó=×GÑGÓIÐIr   r   c           	      ó  • [         R                  " S5      n[        R                  " U R	                  5       USSSSS9nS[
        R                  " U5      R                  5        S[
        R                  " U5      R                  5        3$ )	Né   é @  é   é   r   ©ÚsaltÚnÚrÚpÚdklenzscrypt$Ú$)r   Útoken_bytesr!   Úscryptr#   Úbase64Ú	b64encodeÚdecode)r   r,   Údks      r   Úhash_passwordr8   5   so   € Ü×Ò˜rÓ"€DÜ	�Š˜Ÿ™Ó)°¸À1ÈÐQSÑ	T€BØ”V×%Ò% dÓ+×2Ñ2Ó4Ð5°Q´v×7GÒ7GÈÓ7K×7RÑ7RÓ7TÐ6UÐVÐVr   Ústoredc           
      óL  • U(       d  g UR                  S5      u  p#nUS:w  a  g[        R                  " U5      [        R                  " U5      pe[        R                  " U R                  5       USSS[        U5      S9n[        R                  " Xv5      $ ! [         a     gf = f)NFr1   r3   r(   r)   r*   r+   )
Úsplitr4   Ú	b64decoder!   r3   r#   ÚlenÚhmacÚcompare_digestÚ	Exception)r   r9   ÚschemeÚsalt_b64Údk_b64r,   Úexpectedr7   s           r   Úverify_passwordrE   ;   s‘   € ÞØðØ#)§<¡<°Ó#4Ñ ˆ˜&Ø�XÓØÜ×)Ò)¨(Ó3´V×5EÒ5EÀfÓ5MˆhÜ�^Š^˜HŸO™OÓ-°D¸GÀqÈAÔUXÐYaÓUbÑcˆÜ×"Ò" 2Ó0Ð0øÜó Ùðús   ŠB ¥A0B Â
B#Â"B#ÚaÚbc                 óh   • [         R                  " U R                  5       UR                  5       5      $ ©N)r>   r?   r#   )rF   rG   s     r   Úconstant_time_eqrJ   I   s!   € Ü×Ò˜qŸx™x›z¨1¯8©8«:Ó6Ð6r   ÚpayloadÚttl_secsc                 ó
  • [        [        R                  " 5       5      U-   n[        R                  " [	        5       R                  5       U  SU 3R                  5       [        R                  5      R                  5       S S nX#4$ )NÚ|r   )	ÚintÚtimer>   Únewr%   r#   r!   r"   r$   )rK   rL   ÚexpÚsigs       r   ÚsignrT   O   se   € Ü
Œd�iŠi‹kÓ
˜XÑ
%€CÜ
�(Š(”<“>×(Ñ(Ó*¨w¨i°q¸¸Ð,>×,EÑ,EÓ,GÌÏÉÓ
X×
bÑ
bÓ
dÐehÐfhÐ
i€CØˆ8€Or   rR   rS   c                 ó4  • U[         R                   " 5       :  a  g[        R                  " [        5       R	                  5       U  SU 3R	                  5       [
        R                  5      R                  5       S S n[        R                  " X2=(       d    S5      $ )NFrN   r   Ú )	rP   r>   rQ   r%   r#   r!   r"   r$   r?   )rK   rR   rS   rD   s       r   Úverify_signaturerW   U   so   € Ø
ŒT�YŠY‹[ÓØÜ�xŠxœ›×-Ñ-Ó/°G°9¸A¸c¸UÐ1C×1JÑ1JÓ1LÌgÏnÉnÓ]×gÑgÓiÐjmÐkmÐn€HÜ×Ò˜x¯°Ó3Ð3r   Úitemsc                 ó´   • / nU  H(  n UR                  [        R                  " USS95        M*     U$ ! [         a    [        R                  SU5         MQ  f = f)NF)Ústrictz!TRUSTED_PROXIES: entry ignored %r)ÚappendÚ	ipaddressÚ
ip_networkÚ
ValueErrorÚlogÚwarning)rX   ÚnetsÚits      r   Ú_parse_networksrc   ^   sY   € Ø€DÛˆð	AØ�K‰Kœ	×,Ò,¨R¸Ñ>Ö?ñ ð
 €Køô ó 	AÜ�K‰KÐ;¸R×@ð	Aús   ‰$3³ AÁAÚipc                 ó„   ^•  [         R                  " U 5      m[        U4S j[         5       5      $ ! [         a     gf = f)NFc              3   ó.   >#   • U  H
  nTU;   v •  M     g 7frI   r   )Ú.0r-   Úaddrs     €r   Ú	<genexpr>Ú_is_trusted.<locals>.<genexpr>p   s   øé € Ð0¢-˜Qˆt�qŽy¢-ùs   ƒ)r\   Ú
ip_addressr^   ÚanyÚ_trusted_nets)rd   rh   s    @r   Ú_is_trustedrn   k   s?   ø€ ðÜ×#Ò# BÓ'ˆô Ô0¥-Ó0Ó0Ð0øô ó Ùðús   ƒ2 ²
?¾?c                 ó¤  • U R                   (       a  U R                   R                  OSn[        U5      (       d  U$ U R                  R	                  SS5      nU(       d  U$ [        UR                  S5       Vs/ s H)  o3R                  5       (       d  M  UR                  5       PM+     sn5       H  n[        U5      (       a  M  Us  $    U$ s  snf )uä   IP rÃ©elle du client. X-Forwarded-For n'est lu que si la connexion vient d'un
proxy de confiance ; on remonte la chaÃ®ne depuis la droite jusqu'Ã  la premiÃ¨re
adresse non fiable (un client ne peut donc pas forger sa propre IP).Úunknownzx-forwarded-forrV   Ú,)ÚclientÚhostrn   ÚheadersÚgetÚreversedr;   Ústrip)ÚrequestÚpeerÚxffr/   Ú	candidates        r   Ú	client_ipr|   s   s�   € ð #*§.§.ˆ7�>‰>×Ò°i€DÜ�t×ÑØˆØ
�/‰/×
Ñ
Ð/°Ó
4€CÞØˆÜ°#·)±)¸C´.ÓN².¨QÇGÁGÇI›y˜qŸw™wžy±.ÑNÖOˆ	Ü˜9×%Ó%ØÒñ Pð €Kùò Os   Á9CÂCc                  ó  • / n [         R                  nU(       a'  UR                  5       [        ;   d  [	        U5      S:  a  U R                  S5        [         R                  (       aA  [	        [         R                  5      S:  d$  [         R                  R                  S5      (       a  U R                  S5        [         R                  (       d  U R                  S5        [         R                  (       d  U R                  S5        U $ )u8   Retourne la liste des problÃ¨mes bloquants (vide si OK).é
   uG   ADMIN_PASSWORD absent, par dÃ©faut ou trop court (min. 10 caractÃ¨res).r   r
   u<   ADMIN_JWT_SECRET absent ou trop court (min. 32 caractÃ¨res).uI   STRIPE_SECRET_KEY absent : les commandes ne pourraient pas Ãªtre payÃ©es.u[   STRIPE_WEBHOOK_SECRET absent : les paiements ne seraient jamais confirmÃ©s de faÃ§on sÃ»re.)
r   ÚADMIN_PASSWORDÚlowerÚ_DEFAULT_PASSWORDSr=   r[   r   Ú
startswithÚSTRIPE_SECRET_KEYÚSTRIPE_WEBHOOK_SECRET)ÚproblemsÚpws     r   Úvalidate_production_configr‡   …   sª   € à€HÜ	×	Ñ	€BÞ�—‘“Ô1Ó1´S¸³W¸r³\Ø�‰ÐaÔbÜ×"×"¤c¬&×*AÑ*AÓ&BÀRÓ&GÌ6×KbÑKb×KmÑKmÐny×KzÑKzØ�‰ÐVÔWÜ×#×#Ø�‰ÐcÔdÜ×'×'Ø�‰ÐuÔvØ€Or   )'Ú__doc__r4   r!   r>   r\   Úloggingr   rP   Útypingr   Úcorer   Úcore.dbr   Ú	getLoggerr_   r�   r   ÚdictÚstrÚ__annotations__r   r   r%   r8   ÚboolrE   rJ   rO   ÚtuplerT   rW   Úlistrc   ÚTRUSTED_PROXIESrm   rn   r|   r‡   r   r   r   Ú<module>r•      sg  ðòó Û Û Û Û Û Û Ý å Ý à×ÒÐ+Ó,€ò UÐ Ø "€ˆt�C˜�H‰~Ó "ð
˜Sð  Sô ð@�Cô @ðJ�cô JðW˜Cð W Cô Wð˜cð ¨8°C©=ð ¸Tô ð7˜ð 7 ð 7¨ô 7ð�#ð  ð ¨¨s°C¨x©ô ð4˜cð 4¨ð 4°#ð 4¸$ô 4ð˜4 ™9ô ñ   × 6Ñ 6Ó7€ð1�Cð 1˜Dô 1ð˜#ô ð$ D¨¡Iõ r   