ó
    â*Âjø  ã                   óÀ   • S r SSKrSSKJr  SSKJr  SSKJrJrJ	r	  SSK
Jr  SSKJr  SSKJrJr  S	rS
\4S jr\" SS9S
\	4S j5       rS\S
\4S jrS\S
\\   4S jrg)un  AdatbÃ¡zisban tÃ¡rolt TITKOS Ã©rtÃ©kek (pl. az SMTP-jelszÃ³) szimmetrikus titkosÃ­tÃ¡sa.

MIÃ‰RT KELL?
    A rendszeradmin felÃ¼letrÅ‘l beÃ¡llÃ­thatÃ³ SMTP-jelszÃ³t az adatbÃ¡zisban (rendszer_beallitasok
    tÃ¡bla) tÃ¡roljuk. Ha ott nyers szÃ¶vegkÃ©nt Ã¡llna, egy adatbÃ¡zis-mentÃ©s, egy elveszett dump
    vagy egy mÃ¡sik fejlesztÅ‘ DB-hozzÃ¡fÃ©rÃ©se azonnal felfednÃ©. EzÃ©rt az Ã©rtÃ©k TITKOSÃ�TVA kerÃ¼l
    a DB-be, a visszafejtÃ©sÃ©hez szÃ¼ksÃ©ges kulcs viszont NEM az adatbÃ¡zisban, hanem a szerver
    kÃ¶rnyezetÃ©ben (.env) Ã©l - a kettÅ‘ egyÃ¼tt kell a titok megismerÃ©sÃ©hez.

HOGYAN MÅ°KÃ–DIK?
    - Algoritmus: Fernet (cryptography csomag) = AES-128-CBC + HMAC-SHA256, hitelesÃ­tett
      titkosÃ­tÃ¡s: ha valaki belenyÃºl a titkosÃ­tott szÃ¶vegbe, a visszafejtÃ©s hibÃ¡t ad (nem ad
      hamis eredmÃ©nyt).
    - Kulcs-forrÃ¡sok (MultiFernet, ebben a sorrendben):
        1. CONFIG_ENCRYPTION_KEY a .env-bÅ‘l (OPCIONÃ�LIS, dedikÃ¡lt kulcs) - ezzel TITKOSÃ�TUNK, ha
           meg van adva, Ã©s ezt prÃ³bÃ¡ljuk elsÅ‘kÃ©nt visszafejtÃ©skor is.
        2. A SECRET_KEY-bÅ‘l HKDF-fel SZÃ�RMAZTATOTT kulcs - ez mindig rendelkezÃ©sre Ã¡ll, Ã­gy
           a funkciÃ³ Ãºj .env-vÃ¡ltozÃ³ nÃ©lkÃ¼l is mÅ±kÃ¶dik (ezzel titkosÃ­tunk, ha nincs dedikÃ¡lt kulcs).
      A kÃ©t kulcs egyszerre aktÃ­v visszafejtÃ©skor, ezÃ©rt ha utÃ³lag felveszik a
      CONFIG_ENCRYPTION_KEY-t, a korÃ¡bban a szÃ¡rmaztatott kulccsal titkosÃ­tott Ã©rtÃ©kek
      tovÃ¡bbra is olvashatÃ³k maradnak (a kÃ¶vetkezÅ‘ mentÃ©skor mÃ¡r az Ãºj kulccsal Ã­rÃ³dnak Ãºjra).
    - Fontos kÃ¶vetkezmÃ©ny: ha a SECRET_KEY-t megvÃ¡ltoztatjÃ¡k (Ã©s nincs dedikÃ¡lt kulcs), a
      mentett titkos Ã©rtÃ©kek NEM fejthetÅ‘k vissza tÃ¶bbÃ© - ilyenkor a visszafejt() None-t ad, Ã©s a
      rendszeradmin felÃ¼let jelzi, hogy a jelszÃ³t Ãºjra be kell Ã­rni (az alkalmazÃ¡s nem omlik Ã¶ssze).

MIT NE TEGYÃ‰L?
    - Ne naplÃ³zd/Ã­rd ki a visszafejtett Ã©rtÃ©ket (print, hibaÃ¼zenet, sablon-kontextus).
    - Ne cserÃ©ld le a SECRET_KEY-t vagy a CONFIG_ENCRYPTION_KEY-t anÃ©lkÃ¼l, hogy tudnÃ¡d: a mÃ¡r
      titkosÃ­tott Ã©rtÃ©keket Ãºjra be kell Ã­rni.

RÃ©szletes leÃ­rÃ¡s: docs/EMAIL_RENDSZER.md
é    N)Ú	lru_cache)ÚOptional)ÚFernetÚInvalidTokenÚMultiFernet)Úhashes)ÚHKDF)Ú
SECRET_KEYÚCONFIG_ENCRYPTION_KEYs   emelog-config-encryption-v1Úreturnc                  óº   • [        [        R                  " 5       SS[        S9R	                  [
        R                  " S5      5      n [        R                  " U 5      $ )u`   A SECRET_KEY-bÅ‘l HKDF-SHA256-tal elÅ‘Ã¡llÃ­t egy Fernet-kompatibilis (url-safe base64) kulcsot.é    N)Ú	algorithmÚlengthÚsaltÚinfoúutf-8)	r	   r   ÚSHA256Ú
_HKDF_INFOÚderiver
   ÚencodeÚbase64Úurlsafe_b64encode)Únyerss    Ú#/var/www/website/titkosito_utils.pyÚ_szarmaztatott_kulcsr   2   sK   € äÜ—-’-“/ØØÜñ	÷
 �fŒZ×Ò˜wÓ'Ó(ð 
ô ×#Ò# EÓ*Ð*ó    é   )Úmaxsizec                  óD  • / n [         =(       d    SR                  5       nU(       a*   U R                  [        UR	                  S5      5      5        U R                  [        [        5       5      5        [        U 5      $ ! [
        [        4 a  n[        S5      UeSnAff = f)u�   Ã–sszeÃ¡llÃ­tja (Ã©s memÃ³riÃ¡ban tartja) a kulcskÃ©szletet. Az ELSÅ� kulccsal titkosÃ­tunk,
visszafejtÃ©skor mindegyiket sorban kiprÃ³bÃ¡ljuk.Ú r   u¦   A CONFIG_ENCRYPTION_KEY (.env) nem Ã©rvÃ©nyes Fernet-kulcs. GenerÃ¡lj Ãºjat: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"N)
r   ÚstripÚappendr   r   Ú
ValueErrorÚ	TypeErrorÚRuntimeErrorr   r   )ÚkulcsokÚdedikaltÚes      r   Ú_fernetr*   =   s‘   € ð €Gä%×+¨×2Ñ2Ó4€HÞð	Ø�N‰Nœ6 (§/¡/°'Ó":Ó;Ô<ð ‡N�N”6Ô.Ó0Ó1Ô2Ü�wÓÐøô œIÐ&ó 	ô ðnóð ðûð	ús   ¨)A> Á>BÂBÂBÚszovegc                 ó€   • U (       d  g[        5       R                  U R                  S5      5      R                  S5      $ )u°   TitkosÃ­t egy szÃ¶veget; a visszatÃ©rÃ©si Ã©rtÃ©k DB-ben tÃ¡rolhatÃ³ (ASCII) karakterlÃ¡nc.
Ãœres bemenetre Ã¼res szÃ¶veget ad (nincs Ã©rtelme az Ã¼res Ã©rtÃ©ket titkosÃ­tani).r!   r   Úascii)r*   Úencryptr   Údecode)r+   s    r   Útitkositr0   S   s1   € ö ØÜ‹9×Ñ˜VŸ]™]¨7Ó3Ó4×;Ñ;¸GÓDÐDr   Útokenc                 ó¸   • U (       d  g [        5       R                  U R                  S5      5      R                  S5      $ ! [        [
        [        4 a     gf = f)uD  Visszafejt egy, a titkosit()-tal kÃ©szÃ¼lt szÃ¶veget.

VisszatÃ©rÃ©s:
    - ""   : Ã¼res bemenet esetÃ©n,
    - None : ha a visszafejtÃ©s nem sikerÃ¼l (megvÃ¡ltozott kulcs, sÃ©rÃ¼lt/Ã¡tÃ­rt adat) -
             a hÃ­vÃ³nak ezt kezelnie kell (pl. "Ã­rd be Ãºjra a jelszÃ³t" Ã¼zenettel),
    - str  : a visszafejtett szÃ¶veg.
r!   r-   r   N)r*   Údecryptr   r/   r   r$   ÚUnicodeError)r1   s    r   Ú
visszafejtr5   [   sO   € ö ØðÜ‹y× Ñ  §¡¨gÓ!6Ó7×>Ñ>¸wÓGÐGøÜœ*¤lÐ3ó Ùðús   Š6A ÁAÁA)Ú__doc__r   Ú	functoolsr   Útypingr   Úcryptography.fernetr   r   r   Úcryptography.hazmat.primitivesr   Ú'cryptography.hazmat.primitives.kdf.hkdfr	   Úconfigr
   r   r   Úbytesr   r*   Ústrr0   r5   © r   r   Ú<module>r@      s…   ðñó@ Ý Ý ç AÑ AÝ 1Ý 8ç 4ð ,€
ð+˜eô +ñ �1Ñð �ó  ó ð ð*E�Sð E˜Sô Eð�cð ˜h s™mõ r   