Ë
    ÈÌj™  ã                   óª  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ  ej                  d«      Zh d£Zi Zeeef   ed<   d	ed
efd„Zd
efd„Zd
efd„Zded
efd„Zdede	e   d
efd„Zdeded
efd„Zdeded
eeef   fd„Zdededed
efd„Zde e   fd„Z! e!ejD                  «      Z#ded
efd„Z$d
efd„Z%d
e e   fd „Z&y)!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                 ó:  — | t         v r	t         |    S t        «       5 }|j                  dd| › �t        j                  d«      f«       |j                  «        |j                  dd| › �f«      j                  «       d   }ddd«       t         | <   |S # 1 sw Y   ŒxY w)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      ú(/var/www/photos/backend/core/security.pyÚ_persistent_secretr      s¦   € ð Œ}ÑÜ˜TÑ"Ð"Ü	‹ð n�TØ�‰ÐMØ ˜vÐ&¬×(9Ñ(9¸"Ó(=Ð>ô	@à�‰ŒØ—‘ÐCÈÐPTÈvÐFVÐEXÓY×bÑbÓdÐelÑmˆ÷	nð
  „M�$ÑØ€L÷nð nús   œA"BÂBc                  ó<   — t         j                  xs t        d«      S )NÚjwt)r   ÚADMIN_JWT_SECRETr   © ó    r   Ú
jwt_secretr   )   s   € Ü×"Ñ"Ò?Ô&8¸Ó&?Ð?r   c                  óº   — t         j                  rt         j                  S t        j                  dt	        «       z   j                  «       «      j                  «       S )Nzmedia:)r   ÚMEDIA_SECRETÚhashlibÚsha256r   ÚencodeÚ	hexdigestr   r   r   Úmedia_secretr%   -   s?   € Ü×ÒÜ×"Ñ"Ð"Ü�>‰>˜8¤j£lÑ2×:Ñ:Ó<Ó=×GÑGÓIÐIr   r   c                 ó  — t        j                  d«      }t        j                  | j	                  «       |dddd¬«      }dt        j                  |«      j                  «       › dt        j                  |«      j                  «       › �S )	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           
      óB  — |sy	 |j                  d«      \  }}}|dk7  ryt        j                  |«      t        j                  |«      }}t        j                  | j                  «       |dddt        |«      ¬«      }t        j                  ||«      S # t        $ r Y yw xY w)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 xÓ0Ð0øÜò Ùðús   …B  A1B Â	BÂBÚaÚbc                 óf   — t        j                  | j                  «       |j                  «       «      S ©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                 ó  — t        t        j                  «       «      |z   }t        j                  t	        «       j                  «       | › d|› �j                  «       t        j                  «      j                  «       d d }||fS )Nú|r   )	ÚintÚtimer>   Únewr%   r#   r!   r"   r$   )rK   rL   ÚexpÚsigs       r   ÚsignrT   O   sg   € Ü
Œ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                 ó$  — |t        j                   «       k  ryt        j                  t        «       j	                  «       | › d|› �j	                  «       t
        j                  «      j                  «       d d }t        j                  ||xs d«      S )NFrN   r   Ú )	rP   r>   rQ   r%   r#   r!   r"   r$   r?   )rK   rR   rS   rD   s       r   Úverify_signaturerW   U   sq   € Ø
Œ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                 ó°   — g }| D ])  }	 |j                  t        j                  |d¬«      «       Œ+ |S # t        $ r t        j                  d|«       Y ŒOw xY w)NF)Ústrictz!TRUSTED_PROXIES: entry ignored %r)ÚappendÚ	ipaddressÚ
ip_networkÚ
ValueErrorÚlogÚwarning)rX   ÚnetsÚits      r   Ú_parse_networksrc   ^   s`   € Ø€DØò Aˆð	AØ�K‰Kœ	×,Ñ,¨R¸Ô>Õ?ðAð
 €Køô ò 	AÜ�K‰KÐ;¸RÖ@ð	Aús   ‰&3³AÁAÚipc                 ó~   ‡— 	 t        j                  | «      Št        ˆfd„t        D «       «      S # t        $ r Y yw xY w)NFc              3   ó&   •K  — | ]  }‰|v –— Œ
 y ­wrI   r   )Ú.0r-   Úaddrs     €r   ú	<genexpr>z_is_trusted.<locals>.<genexpr>p   s   øè ø€ Ò0˜Qˆt�qŒyÑ0ùs   ƒ)r\   Ú
ip_addressr^   ÚanyÚ_trusted_nets)rd   rh   s    @r   Ú_is_trustedrm   k   s?   ø€ ðÜ×#Ñ# BÓ'ˆô Ó0¤-Ô0Ó0Ð0øô ò Ùðús   ƒ0 °	<»<c                 óh  — | j                   r| j                   j                  nd}t        |«      s|S | j                  j	                  dd«      }|s|S t        |j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% c}«      D ]  }t        |«      rŒ|c S  |S c c}w )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Úhostrm   ÚheadersÚgetÚreversedr;   Ústrip)ÚrequestÚpeerÚxffr/   Ú	candidates        r   Ú	client_ipr{   s   s—   € ð #*§.¢.ˆ7�>‰>×Ò°i€DÜ�tÔØˆØ
�/‰/×
Ñ
Ð/°Ó
4€CÙØˆÜ°#·)±)¸C³.ÖN¨QÀAÇGÁGÅI˜qŸw™w�yÒNÓOò ˆ	Ü˜9Õ%ØÒðð €Kùò Os   Á*B/Â B/c                  óÔ  — g } t         j                  }|r$|j                  «       t        v st	        |«      dk  r| j                  d«       t         j                  r;t	        t         j                  «      dk  st         j                  j                  d«      r| j                  d«       t         j                  s| j                  d«       t         j                  s| j                  d«       | S )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Ø�‰Ð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_PROXIESrl   rm   r{   r†   r   r   r   ú<module>r”      si  ðòó Û Û Û Û Û Û Ý å Ý à€g×ÑÐ+Ó,€ò 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   