ó
    7ÇÃjƒ  ã                   óP  • 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JrJr  SSK	J
r
  SSKJr  SSKrSSKrSSKJr  SSKJrJrJr  SSKJrJr  SS	KJr  SSKrSS
KJrJr  SrSrSr Sr!\RD                  " S5      r#Sr$Sr%Sr&Sr'S\(4S jr)S\*S\(S\(4S jr+S\RX                  SS4S jr-S\RX                  S\(SS4S jr.S\S\*S\\(   4S jr/S\RX                  S\\(   4S jr0S\RX                  S\(S\(4S jr1S \(S\(4S! jr2S\\(   4S" jr3  SDS\(S#\\*   S$\\4   S\\*   4S% jjr5SES\S\RX                  S$\\4   S\64S& jjr7SES\S\RX                  S$\\4   S\64S' jjr8S\RX                  SS4S( jr9S)r:S\;" 5       S*.r<\
" 5       r=SFS+ jr>SGS\S,\6S\;4S- jjr?SGS\S\RX                  S,\6S\64S. jjr@S\S\RX                  S\64S/ jrAS\RX                  S\64S0 jrBS\RX                  S\64S1 jrCS\RX                  S\(4S2 jrDS\S\RX                  S\(4S3 jrES\4S4 jrFS\S5\RŽ                  S6\6S\64S7 jrHS\S\I4S8 jrJS\S5\RŽ                  S\I4S9 jrKS\S5\RŽ                  S\I4S: jrLS\S;\RX                  S<\RX                  S\64S= jrMSHS\S>\*S?\*S@\6SA\6SS4SB jjrNS\RX                  SS4SC jrOg)Iuj  KÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©s (2FA, TOTP) - alapfÃ¼ggvÃ©nyek (2026-10-04, 2FA 1. fÃ¡zis).

MI EZ?
    A TOTP (RFC 6238) az a 6 szÃ¡mjegyÅ± kÃ³d, amit a felhasznÃ¡lÃ³ telefonjÃ¡n a hitelesÃ­tÅ‘ alkalmazÃ¡s
    (Google Authenticator, Microsoft Authenticator, Aegis, 2FAS ...) 30 mÃ¡sodpercenkÃ©nt ÃºjragenerÃ¡l.
    A szerver Ã©s a telefon ugyanazt a TITKOT ismeri; az idÅ‘ alapjÃ¡n mindkettÅ‘ ugyanazt a kÃ³dot
    szÃ¡molja ki, Ã­gy a jelszÃ³ mellÃ© egy mÃ¡sodik, "birtokolt" tÃ©nyezÅ‘ is kell a belÃ©pÃ©shez.

    Ez a modul a "hogyan szÃ¡moljuk / ellenÅ‘rizzÃ¼k / tÃ¡roljuk" rÃ©szt Ã©s a kÃ¶telezÅ‘-e szabÃ¡lyt tartalmazza.
    A bejelentkezÃ©s (routers/auth.py + routers/mfa.py) Ã©s a security.get_current_user() a 2. fÃ¡zistÃ³l
    hasznÃ¡lja, a QR-beÃ¡llÃ­tÃ³ oldal (routers/mfa.py) a 3. fÃ¡zistÃ³l; a cÃ©ges kapcsolÃ³ felÃ¼lete (4.) Ã©s az
    elveszett eszkÃ¶z helyreÃ¡llÃ­tÃ¡sa (5.) mÃ©g kÃ©szÃ¼l. A mÅ±kÃ¶dÃ©s nem vÃ¡ltozik, amÃ­g egy cÃ©gnÃ©l be nincs kapcsolva a
    kÃ¶telezÃ©s (a cÃ©ges kapcsolÃ³ alapbÃ³l KI van).

A TERV EGYIK FÅ� ELVE
    - A cÃ©ges kapcsolÃ³t (Company.ketlepcsos_hitelesites_kotelezo) KIZÃ�RÃ“LAG a rendszeradmin Ã¡llÃ­thatja.
    - Ha egy cÃ©gnÃ©l be van kapcsolva, a cÃ©g MINDEN felhasznÃ¡lÃ³jÃ¡nak kÃ¶telezÅ‘ a 2FA.
    - Ha ki van kapcsolva, a felhasznÃ¡lÃ³ korÃ¡bbi beÃ¡llÃ­tÃ¡sa megmarad az adatbÃ¡zisban, de a belÃ©pÃ©skor
      nem kÃ©rÃ¼nk kÃ³dot (ÃºjrabekapcsolÃ¡skor ugyanaz a titok Ã©rvÃ©nyes).
    - (2. fÃ¡zis) KÃ¶telezÅ‘, ha BÃ�RMELYIK hozzÃ¡ tartozÃ³ cÃ©gnÃ©l (sajÃ¡t vagy kiosztott) be van kapcsolva - lÃ¡sd szukseges_e().
    - A rendszeradmin nem zÃ¡rhatja ki magÃ¡t: szerverrÅ‘l futtathatÃ³ vÃ©szfeloldÃ¡s az mfa_felold.py.

ADATOK (models.py, `users` tÃ¡bla)
    totp_secret        a titok TITKOSÃ�TVA (Fernet, titkosito_utils) - nyersen sehol nem tÃ¡rolÃ³dik.
                       KÃ¶tÃ¶tt formÃ¡tum: titkosÃ­tott("u<user_id>:<titok>") - az "u<id>:" elÅ‘tag miatt
                       egy mÃ¡sik felhasznÃ¡lÃ³ titkosÃ­tott titka nem mÃ¡solhatÃ³ Ã¡t (visszafejtÃ©skor
                       a user_id-nek egyeznie kell).
    totp_megerositve   True: a felhasznÃ¡lÃ³ mÃ¡r egyszer sikeresen beÃ­rt egy kÃ³dot (a beÃ¡llÃ­tÃ¡s KÃ‰SZ).
    totp_utolso_lepes  az utoljÃ¡ra elfogadott 30 mp-es idÅ‘lÃ©pÃ©s sorszÃ¡ma (visszajÃ¡tszÃ¡s elleni vÃ©delem).

BIZTONSÃ�GI DÃ–NTÃ‰SEK
    1. Ugyanaz a kÃ³d KÃ‰TSZER nem fogadhatÃ³ el: a `totp_utolso_lepes`-nÃ©l nem Ãºjabb idÅ‘lÃ©pÃ©s kÃ³djÃ¡t
       elutasÃ­tjuk. Egy lehallgatott/leshetett kÃ³d Ã­gy 30 mÃ¡sodperc alatt sem hasznÃ¡lhatÃ³ Ãºjra.
       A rÃ¶gzÃ­tÃ©s ATOMI (UPDATE ... WHERE lepes < Ãºj), mert a gunicorn 3 workerrel fut: kÃ©t pÃ¡rhuzamos
       kÃ©rÃ©s ugyanazzal a kÃ³ddal nem mehet Ã¡t mindkettÅ‘.
    2. IdÅ‘tÅ±rÃ©s: az aktuÃ¡lis lÃ©pÃ©s Ã©s a kÃ¶zvetlen szomszÃ©dai (Â±30 mp) elfogadottak (Ã³raeltÃ©rÃ©s).
    3. A kÃ³dot a maga teljes hosszÃ¡ban, idÅ‘-Ã¡llandÃ³ Ã¶sszehasonlÃ­tÃ¡ssal (hmac.compare_digest) vetjÃ¼k
       Ã¶ssze, Ã©s mindhÃ¡rom lÃ©pÃ©st kiszÃ¡moljuk (nem lÃ©pÃ¼nk ki az elsÅ‘ talÃ¡latnÃ¡l), hogy a vÃ¡laszidÅ‘
       ne Ã¡rulkodjon.
    4. A titok sosem kerÃ¼l naplÃ³ba, hibaÃ¼zenetbe, sablonba. A QR-kÃ©p az egyetlen hely, ahol a
       beÃ¡llÃ­tÃ¡s pillanatÃ¡ban megjelenik (3. fÃ¡zis) - azt az oldalt `Cache-Control: no-store`-ral kell kiszolgÃ¡lni.
    5. Ha a SECRET_KEY megvÃ¡ltozik (Ã©s nincs dedikÃ¡lt CONFIG_ENCRYPTION_KEY), a titok nem fejthetÅ‘
       vissza (titok_olvasasa() -> None). Ha a beÃ¡llÃ­tÃ¡s korÃ¡bban MEGERÅ�SÃ�TETT volt, az allapot()
       "helyreallitando"-t ad - ezt NEM szabad egyszerÅ± jelszavas ÃºjraregisztrÃ¡ciÃ³val megoldani (kÃ¼lÃ¶nben
       egy kulcscsere csendben kikapcsolnÃ¡ a 2FA-t): rendszeradmin-reset kell (5. fÃ¡zis). A visszafejtÃ©si
       hiba maga nem omlaszt: a titok_olvasasa() None-t ad. (KivÃ©tel: ha a CONFIG_ENCRYPTION_KEY formailag
       Ã©rvÃ©nytelen, a titkosito_utils HANGOSAN, RuntimeError-ral leÃ¡ll - ez szÃ¡ndÃ©kos, lÃ¡sd ott.)
    6. A kÃ³d-prÃ³bÃ¡lkozÃ¡sok korlÃ¡tozÃ¡sa: routers/mfa.py - a sikertelen kÃ³d a login_vedelem szÃ¡mlÃ¡lÃ³jÃ¡ba kerÃ¼l (ugyanaz a tiltÃ¡s).

HASZNÃ�LAT (a kÃ©sÅ‘bbi fÃ¡zisokban)
    titok = uj_titok(); titok_mentese(user, titok)             # beÃ¡llÃ­tÃ¡s kezdete
    uri = provisioning_uri(user, titok); kep = qr_png_data_uri(uri)   # QR a kÃ©pernyÅ‘re
    megerosites(db, user, kod)                                  # a felhasznÃ¡lÃ³ beÃ­rta az elsÅ‘ kÃ³dot
    kod_ellenorzese_es_rogzitese(db, user, kod)                 # belÃ©pÃ©skor
    torles(user)                                                # helyreÃ¡llÃ­tÃ¡skor (5. fÃ¡zis)
Egyik fÃ¼ggvÃ©ny sem hÃ­v `db.commit()`-ot - a hÃ­vÃ³ vÃ©gpont commitol (egy tranzakciÃ³ban az AuditLoggal).

RÃ©szletek: docs/KETLEPCSOS_HITELESITES.md
é    N)ÚdatetimeÚtimezone)ÚLock)ÚOptional)ÚERROR_CORRECT_M)ÚdeleteÚor_Úupdate)ÚSessionÚobject_session©Úflag_modified)ÚtitkositÚ
visszafejtÚEmeLOGé   é   é   z[0-9]{6}ÚkiÚbeallitandoÚhelyreallitandoÚkeszÚreturnc                  ó,   • [         R                  " 5       $ )uY   Ãšj, vÃ©letlen TOTP-titok (32 karakteres base32 = 160 bit, kriptogrÃ¡fiai vÃ©letlenbÅ‘l).)ÚpyotpÚrandom_base32© ó    Ú/var/www/website/mfa_utils.pyÚuj_titokr    g   s   € ä×ÒÓ Ð r   Úuser_idÚtitokc                 ó   • SU  SU 3$ )NÚuÚ:r   )r!   r"   s     r   Ú_kotesr&   l   s   € Øˆwˆi�q˜˜Ð Ð r   Úuserc                 ó,   • S H  n[        X5        M     g)u¸  BiztosÃ­tja, hogy a hÃ¡rom 2FA-oszlop MINDENKÃ‰PP kiÃ­rÃ³dik a commitkor. MiÃ©rt kell? Ha a
felhasznÃ¡lÃ³-objektum "lejÃ¡rt" (expired) Ã¡llapotÃº volt (pl. egy korÃ¡bbi commit utÃ¡n), az SQLAlchemy
a None-ra Ã¡llÃ­tÃ¡st nem mindig Ã©rzÃ©keli vÃ¡ltozÃ¡snak, Ã©s a rÃ©gi `totp_utolso_lepes` az
adatbÃ¡zisban maradna - az Ãºj titok mellett megmaradÃ³ "utolsÃ³ lÃ©pÃ©s" pedig jogos kÃ³dot utasÃ­tana el.
(Ezt a t_mfa.py M6 tesztje fedezte fel.)©Útotp_secretÚtotp_megerositveÚtotp_utolso_lepesNr   )r'   Úoszlops     r   Ú_kenyszeritett_irasr.   p   s   € ó KˆÜ�dÖ#ò Kr   c                 ó®   • U R                   c  [        S5      e[        [        U R                   U5      5      U l        SU l        SU l        [        U 5        g)u  BeÃ¡llÃ­tja a felhasznÃ¡lÃ³ (mÃ©g NEM megerÅ‘sÃ­tett) titkÃ¡t, titkosÃ­tva. Egy korÃ¡bbi beÃ¡llÃ­tÃ¡st
felÃ¼lÃ­r, Ã©s tÃ¶rli a megerÅ‘sÃ­tÃ©st + az utolsÃ³ lÃ©pÃ©st (Ãºj titokhoz Ãºj kezdet).

A user-nek mÃ¡r mentettnek kell lennie (van `id`-ja). Nem commitol.NuD   A felhasznÃ¡lÃ³t a titok mentÃ©se elÅ‘tt el kell menteni (nincs id).F)ÚidÚ
ValueErrorr   r&   r*   r+   r,   r.   )r'   r"   s     r   Útitok_menteser2   z   sI   € ð
 ‡w�w�ÜÐ_Ó`Ð`Ü¤ t§w¡w°Ó 6Ó7€DÔØ!€DÔØ!€DÔÜ˜Õr   Údbc           	      óö  • [        5       nU R                  [        R                  5      R	                  [        R                  R
                  U:H  [        [        R                  R                  R                  S5      [        R                  R                  R                  S5      5      5      R                  [        [        X5      5      SSS.SS9nU R                  5         U R                  5         US:X  a  U$ S$ )uJ  ATOMI beÃ¡llÃ­tÃ¡s-indÃ­tÃ¡s (kÃ¼lsÅ‘ Ã¡tnÃ©zÃ©s talÃ¡lata, 4. fÃ¡zis): Ãºj, megerÅ‘sÃ­tetlen titkot Ã­r a felhasznÃ¡lÃ³hoz, de CSAK ha a
beÃ¡llÃ­tÃ¡sa mÃ©g nincs megerÅ‘sÃ­tve - egyetlen `UPDATE ... WHERE totp_megerositve nem igaz` utasÃ­tÃ¡sban. Ã�gy egy pÃ¡rhuzamos
kÃ©rÃ©s (vagy egy elavult objektum) sosem Ã­rhat felÃ¼l egy idÅ‘kÃ¶zben megerÅ‘sÃ­tett beÃ¡llÃ­tÃ¡st. Commitol, Ã©s eldobja a
session objektum-gyorsÃ­tÃ³tÃ¡rÃ¡t (a hÃ­vÃ³ frissen olvassa Ãºjra). VisszatÃ©r az Ãºj (nyers) titokkal, vagy None-nal, ha a
beÃ¡llÃ­tÃ¡s mÃ¡r megerÅ‘sÃ­tett (vagy nincs ilyen felhasznÃ¡lÃ³).FNr)   ©Úsynchronize_sessionr   )r    ÚqueryÚmodelsÚUserÚfilterr0   r	   r+   Úis_r
   r   r&   ÚcommitÚ
expire_all)r3   r!   r"   Úsoroks       r   Útitok_inditasar?   ‡   s»   € ô ‹J€Eà
�‰”—‘Óß	‰”—‘—‘ 'Ñ)Ü”F—K‘K×0Ñ0×4Ñ4°UÓ;¼V¿[¹[×=YÑ=Y×=]Ñ=]Ð^bÓ=cÓdó
fç	‰¤¬°Ó)?Ó @ÐV[ÐrvÑwØ$)ð 
ð 
+ð	 
ð ‡I�I„KØ‡M�M„OØ˜Q“Jˆ5Ð( DÐ(r   c                 óú   • U R                   (       a  U R                  c  g[        U R                   5      nU(       d  gSU R                   S3nUR                  U5      (       d  gU[	        U5      S nU=(       d    S$ )u»   A felhasznÃ¡lÃ³ nyers titka, vagy None, ha nincs / nem fejthetÅ‘ vissza / nem az Ã¶vÃ©.

A None NEM hiba: lÃ¡sd a modul-leÃ­rÃ¡s 5. pontjÃ¡t (megvÃ¡ltozott kulcs -> Ãºjra beÃ¡llÃ­tandÃ³).Nr$   r%   )r*   r0   r   Ú
startswithÚlen)r'   ÚnyersÚelvart_elotagr"   s       r   Útitok_olvasasarE   š   so   € ð ××˜tŸw™w™ØÜ�t×'Ñ'Ó(€EÞØØ˜Ÿ™�y �N€MØ×Ñ˜M×*Ñ*ØØ”#�mÓ$Ð%Ð&€EØ�=�DÐr   c                 óÌ   • U R                   =(       d"    U R                  =(       d    SU R                   3n[        R                  " U[
        [        S9R                  U[        S9$ )u¦   Az `otpauth://totp/...` cÃ­m, amit a hitelesÃ­tÅ‘ alkalmazÃ¡s QR-bÅ‘l beolvas. A fiÃ³k neve az
e-mail cÃ­m (ez az, amit a felhasznÃ¡lÃ³ az alkalmazÃ¡sban lÃ¡tni fog).zfelhasznalo-©ÚdigitsÚinterval)ÚnameÚissuer_name)	ÚemailÚusernamer0   r   ÚTOTPÚSZAMJEGYÚLEPES_MPÚprovisioning_uriÚ	KIBOCSATO)r'   r"   Ú	fiok_neves      r   rQ   rQ   ­   sQ   € ð —
‘
×G˜dŸm™m×G°¸d¿g¹g¸YÐ/G€IÜ�:Š:�e¤H´xÑ@×QÑQØ¤Ið Rð /ð /r   Úuric                 óL  • [         R                  " [        SSS9nUR                  U 5        UR	                  SS9  UR                  SSS9n[        R                  " 5       nUR                  US	S
9  S[        R                  " UR                  5       5      R                  S5      -   $ )u­   A cÃ­m QR-kÃ³dja `data:image/png;base64,...` formÃ¡ban, kÃ¶zvetlenÃ¼l `<img src="...">`-be
Ã­rhatÃ³ (kÃ¼lÃ¶n fÃ¡jl nem kÃ©szÃ¼l a lemezen, Ã©s a sablonban nem kell `|safe`).r   é   )Úerror_correctionÚbox_sizeÚborderT)ÚfitÚblackÚwhite)Ú
fill_colorÚ
back_colorÚPNG)Úformatzdata:image/png;base64,Úascii)ÚqrcodeÚQRCoder   Úadd_dataÚmakeÚ
make_imageÚioÚBytesIOÚsaveÚbase64Ú	b64encodeÚgetvalueÚdecode)rT   ÚqrÚkepÚpuffers       r   Úqr_png_data_urirq   µ   s†   € ô 
�Š¬À!ÈAÑ	N€BØ‡K�K�ÔØ‡G�G�€GÑØ
�-‰- 7°wˆ-Ð
?€CÜ�ZŠZ‹\€FØ‡H�HˆV˜E€HÑ"Ø#¤f×&6Ò&6°v·±Ó7HÓ&I×&PÑ&PÐQXÓ&YÑYÐYr   c                 ó®   • [        U [        5      (       d  gU R                  SS5      R                  SS5      n[        R	                  U5      (       a  U$ S$ )u«   A beÃ­rt kÃ³dbÃ³l eltÃ¡volÃ­tja a szÃ³kÃ¶zt/kÃ¶tÅ‘jelet (az alkalmazÃ¡sok "123 456"-kÃ©nt mutatjÃ¡k), Ã©s
csak pontosan 6 ASCII szÃ¡mjegyet enged Ã¡t. Minden mÃ¡s -> None.NÚ Ú Ú-)Ú
isinstanceÚstrÚreplaceÚ
_KOD_MINTAÚ	fullmatch)ÚkodÚtisztas     r   Úkod_tisztitasr}   Ä   sL   € ô �cœ3×ÑØØ�[‰[˜˜bÓ!×)Ñ)¨#¨rÓ2€FÜ×)Ñ)¨&×1Ñ1ˆ6Ð;°tÐ;r   Úutolso_lepesÚmostc                 óŠ  • [        U5      nUb  U (       d  gUc  [        R                  " 5       OUn[        U[        -  5      n[        R
                  " U [        [        S9nSn[        U[        -
  U[        -   S-   5       H2  n	[        R                  " UR                  U	5      U5      (       d  M0  U	nM4     Uc  gUb  X‚::  a  gU$ )uW  TISZTA fÃ¼ggvÃ©ny (nem nyÃºl az adatbÃ¡zishoz): ha a kÃ³d Ã©rvÃ©nyes, visszaadja a hozzÃ¡ tartozÃ³
idÅ‘lÃ©pÃ©s sorszÃ¡mÃ¡t, kÃ¼lÃ¶nben None.

- `utolso_lepes`: az utoljÃ¡ra elfogadott lÃ©pÃ©s; ennÃ©l nem Ãºjabb lÃ©pÃ©s kÃ³djÃ¡t elutasÃ­tja
  (visszajÃ¡tszÃ¡s elleni vÃ©delem).
- `most`: unix idÅ‘ (tesztekhez); alapÃ©rtelmezÃ©s a mostani idÅ‘.NrG   r   )r}   ÚtimeÚintrP   r   rN   rO   ÚrangeÚIDOTURES_LEPESÚhmacÚcompare_digestÚgenerate_otp)
r"   r{   r~   r   r|   ÚmaÚaktualisÚtotpÚtalaltÚlepess
             r   Úkod_ellenorzeser�   Í   s¯   € ô ˜3Ó€FØ�~žUØØ™Œ�ŠŒ¨$€BÜ�2œ‘>Ó"€HÜ�:Š:�e¤H´xÑ@€DØ€FÜ�x¤.Ñ0°(¼^Ñ2KÈaÑ2OÖPˆä×Ò˜t×0Ñ0°Ó7¸×@Ó@ØŠFñ Qð �~ØØÑ FÓ$:ØØ€Mr   c                 óX  • [        U5      nUc  g[        XBUR                  U5      nUc  gU R                  [	        [
        R                  5      R                  [
        R                  R                  UR                  :H  [
        R                  R                  UR                  :H  [        [
        R                  R                  R                  S5      [
        R                  R                  U:  5      5      R                  US9R                  SS95      nUR                  S:w  a  gXQl        g)u  A felhasznÃ¡lÃ³ titka ellen ellenÅ‘rzi a kÃ³dot, Ã©s sikeres esetben ATOMIAN rÃ¶gzÃ­ti az elfogadott
lÃ©pÃ©st (Ã­gy ugyanaz a kÃ³d tÃ¶bbÃ© nem megy Ã¡t - mÃ©g pÃ¡rhuzamos kÃ©rÃ©snÃ©l sem).

Nem commitol: a hÃ­vÃ³nak kell, siker utÃ¡n minÃ©l hamarabb (a sorzÃ¡r a commitig tart).NF)r,   r5   r   T)rE   r�   r,   Úexecuter
   r8   r9   Úwherer0   r*   r	   r;   ÚvaluesÚexecution_optionsÚrowcount)r3   r'   r{   r   r"   rŒ   Úeredmenys          r   Úkod_ellenorzese_es_rogziteser•   ç   së   € ô
 ˜4Ó €EØ�}ØÜ˜E¨×(>Ñ(>ÀÓE€EØ�}ØØ�z‰zÜŒv�{‰{Óß	‰Œv�{‰{�~‰~ §¡Ñ(ô �{‰{×&Ñ&¨$×*:Ñ*:Ñ:Ü”6—;‘;×0Ñ0×4Ñ4°TÓ:¼F¿K¹K×<YÑ<YÐ\aÑ<aÓbó	
d÷
 
‰ %ˆÐ	(ß	Ñ	¨uÐ	Ð	5ó	€Hð ×Ñ˜AÓØØ"ÔØr   c                 ó6   • [        XX#5      (       d  gSUl        g)u–   A beÃ¡llÃ­tÃ¡s lezÃ¡rÃ¡sa: a felhasznÃ¡lÃ³ beÃ­rta az elsÅ‘ Ã©rvÃ©nyes kÃ³dot. SikernÃ©l a beÃ¡llÃ­tÃ¡s
"kÃ©sz" (totp_megerositve=True). Nem commitol.FT)r•   r+   )r3   r'   r{   r   s       r   Úmegerositesr—     s   € ô (¨°#×<Ñ<ØØ €DÔØr   c                 ó6  • SU l         SU l        SU l        [        U 5        [	        U 5      nUbk  U R
                  b]  UR                  [        [        R                  5      R                  [        R                  R                  U R
                  :H  5      5        ggg)uª   TÃ¶rli a felhasznÃ¡lÃ³ 2FA-beÃ¡llÃ­tÃ¡sÃ¡t (elveszett eszkÃ¶z - 5. fÃ¡zis). A kÃ¶vetkezÅ‘ belÃ©pÃ©skor,
ha a cÃ©gnÃ©l kÃ¶telezÅ‘, Ãºjra be kell Ã¡llÃ­tania. Nem commitol.NF)r*   r+   r,   r.   r   r0   r�   r   r8   ÚMfaMentokodr�   r!   )r'   Ú
munkamenets     r   Útorlesr›     sƒ   € ð €DÔØ!€DÔØ!€DÔÜ˜Ôô   Ó%€JØÑ $§'¡'Ñ"5Ø×Ñœ6¤&×"4Ñ"4Ó5×;Ñ;¼F×<NÑ<N×<VÑ<VÐZ^×ZaÑZaÑ<aÓbÕcð #6Ðr   é   )ÚidoÚidkc                  óx   • [            S[        S'   [        5       [        S'   SSS5        g! , (       d  f       g= f)uj   KiÃ¼rÃ­ti a gyorsÃ­tÃ³tÃ¡rat (tesztekhez, Ã©s a kapcsolÃ³ Ã¡tÃ¡llÃ­tÃ¡sa utÃ¡n a SAJÃ�T workerre azonnal).Nr�   rž   )Ú_gyorsitotar_zarÚ_gyorsitotarÚ	frozensetr   r   r   Úgyorsitotar_torlesr£   .  s'   € æ	Ø"Œ�UÑÜ'›kŒ�UÑ÷ 
×	Ö	ús   ‡+«
9Úgyorsitotarc                 ó2  • [         R                  " 5       nU(       a9  [           [        S   nUb  X#-
  [        :  a  [        S   sSSS5        $ SSS5        [        S U R                  [        R                  R                  5      R                  [        R                  R                  R                  S5      5      R                  5        5       5      n[           U[        S'   U[        S'   SSS5        U$ ! , (       d  f       N®= f! , (       d  f       U$ = f)u  Azon cÃ©gek azonosÃ­tÃ³i, ahol a kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©s kÃ¶telezÅ‘. `gyorsitotar=True`: legfeljebb
GYORSITOTAR_MASODPERC mÃ¡sodperces adat is jÃ³ (kÃ©rÃ©senkÃ©nti ellenÅ‘rzÃ©shez); a bejelentkezÃ©s Ã©s a
kapcsolÃ³-mÅ±veletek mindig friss adatot hasznÃ¡lnak.r�   Nrž   c              3   ó*   #   • U  H	  oS    v •  M     g7f)r   Nr   )Ú.0Úrs     r   Ú	<genexpr>Ú#kotelezo_ceg_idk.<locals>.<genexpr>?  s   é € ð Úx�ˆ!ŽÒxùs   ‚T)r�   Ú	monotonicr    r¡   ÚGYORSITOTAR_MASODPERCr¢   r7   r8   ÚCompanyr0   r:   Úketlepcsos_hitelesites_kotelezor;   Úall)r3   r¤   r   r�   rž   s        r   Úkotelezo_ceg_idkr°   5  sÖ   € ô �>Š>Ó€DÞÞÜ˜uÑ%ˆCØ‰ 4¡:Ô0EÓ#EÜ# EÑ*÷ ×Ñô ñ Ø—h‘hœvŸ~™~×0Ñ0Ó1×8Ñ8¼¿¹×9gÑ9g×9kÑ9kÐlpÓ9qÓr×vÑvÔxóó €Cö 
Ø"Œ�UÑØ!Œ�UÑ÷ 
ð €J÷ Õú÷ 
Ô	ð €Jús   £!C6ÃDÃ6
DÄ
Dc                 ó¦   ^• UR                   c  g[        X5      mT(       d  gUR                   T;   a  g[        U4S jUR                   5       5      $ )ur   KÃ¶telezÅ‘-e ennek a felhasznÃ¡lÃ³nak a kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©s (lÃ¡sd fent: bÃ¡rmelyik hozzÃ¡ tartozÃ³ cÃ©g).FTc              3   ó@   >#   • U  H  oR                   T;   v •  M     g 7f©N©r0   )r§   ÚcÚkotelezos     €r   r©   Úszukseges_e.<locals>.<genexpr>Q  s   øé € Ð@Ò)? A�t‰t�xÖÒ)?ùs   ƒ)Ú
company_idr°   ÚanyÚallowed_companies)r3   r'   r¤   r¶   s      @r   Úszukseges_er»   H  sF   ø€ à‡�ÑØÜ Ó0€HÞØØ‡�˜(Ó"ØÜÔ@¨×)?Ò)?Ó@Ó@Ð@r   c                 ó   • [        X5      $ )uB   Az 1. fÃ¡zis neve - ugyanaz, mint a szukseges_e() (friss adattal).)r»   ©r3   r'   s     r   Úceg_kotelezo_er¾   T  s   € ä�rÓ Ð r   c                 óT   • [        U R                  5      =(       a    [        U 5      SL$ )ud   A felhasznÃ¡lÃ³ beÃ¡llÃ­tÃ¡sa KÃ‰SZ Ã©s hasznÃ¡lhatÃ³ (megerÅ‘sÃ­tett, Ã©s a titok visszafejthetÅ‘).N)Úboolr+   rE   ©r'   s    r   Úbeallitva_erÂ   Y  s"   € ä�×%Ñ%Ó&×K¬>¸$Ó+?ÀtÐ+KÐKr   c                 óR   • [        U R                  =(       d    U R                  5      $ )uŽ   Van-e a felhasznÃ¡lÃ³nak BÃ�RMILYEN 2FA-beÃ¡llÃ­tÃ¡sa (megerÅ‘sÃ­tett, vagy megkezdett, meg nem erÅ‘sÃ­tett) - a titok Ã©rtÃ©kÃ©t nem adja ki.)rÀ   r*   r+   rÁ   s    r   Úbeallitas_vanrÄ   ^  s   € ä�× Ñ ×9 D×$9Ñ$9Ó:Ð:r   c                 ól   • [        U 5      (       a  gU R                  (       a  U R                  (       a  gg)uO  A felhasznÃ¡lÃ³ SAJÃ�T beÃ¡llÃ­tÃ¡si Ã¡llapota a cÃ©ges kapcsolÃ³tÃ³l FÃœGGETLENÃœL: "kesz" (megerÅ‘sÃ­tett Ã©s olvashatÃ³) /
"helyreallitando" (volt megerÅ‘sÃ­tett beÃ¡llÃ­tÃ¡s, de a titok nem olvashatÃ³, pl. megvÃ¡ltozott SECRET_KEY: csak a szerverrÅ‘l
Ã¡llÃ­thatÃ³ vissza) / "nincs". A rendszeradmin felÃ¼let (4. fÃ¡zis) hasznÃ¡lja.r   r   Únincs)rÂ   r+   r*   rÁ   s    r   Úbeallitasi_allapotrÇ   c  s)   € ô �4×ÑØØ×× ×!1×!1Ø Ør   c                 ó¶   • [        X5      (       d  [        $ [        U5      (       a  [        $ UR                  (       a  UR
                  (       a  [        $ [        $ )uX  A felhasznÃ¡lÃ³ 2FA-Ã¡llapota a cÃ©ge szabÃ¡lya szerint:
ALLAPOT_KI / ALLAPOT_BEALLITANDO / ALLAPOT_KESZ / ALLAPOT_HELYREALLITANDO.

MEGJEGYZÃ‰S (a 2. fÃ¡zis tervezÃ©sÃ©hez): a `company_id` nÃ©lkÃ¼li felhasznÃ¡lÃ³ra "ki" az eredmÃ©ny - ilyen
fiÃ³k a rendszerben nem vÃ¡rt; a bejelentkezÃ©snek (2. fÃ¡zis) ezt kÃ¼lÃ¶n kell kezelnie, ha szÃ¡mÃ­t.)r»   Ú
ALLAPOT_KIrÂ   ÚALLAPOT_KESZr+   r*   ÚALLAPOT_HELYREALLITANDOÚALLAPOT_BEALLITANDOr½   s     r   ÚallapotrÍ   n  sC   € ô �r× Ñ ÜÐÜ�4×ÑÜÐØ×× ×!1×!1Ü&Ð&ÜÐr   c                  ód   • [         R                  " [        R                  5      R	                  S S9$ )N)Útzinfo)r   Únowr   Úutcrx   r   r   r   Ú	_utc_mostrÒ   €  s#   € Ü�<Š<œŸ™Ó%×-Ñ-°TÐ-Ð:Ð:r   ÚcegÚertekc                 óœ   • [        UR                  5      [        U5      :X  a  g[        U5      Ul        [        5       Ul        [	        5         g)u>  A cÃ©ges "kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©s kÃ¶telezÅ‘" kapcsolÃ³ Ã¡tÃ¡llÃ­tÃ¡sa. Igaz, ha tÃ©nylegesen vÃ¡ltozott.
RÃ¶gzÃ­ti a vÃ¡ltozÃ¡s idejÃ©t, Ã©s Ã¼rÃ­ti a (sajÃ¡t worker) gyorsÃ­tÃ³tÃ¡rÃ¡t. Nem commitol.

FIGYELEM: ez NEM ellenÅ‘riz jogosultsÃ¡got Ã©s NEM vÃ©di a rendszeradmint a kizÃ¡rÃ¡stÃ³l - a hÃ­vÃ³ kÃ¶teles megtenni
(a rendszeradmin felÃ¼let, routers/rendszeradmin_mfa.py, a kizaras_vedelem()-mel meg is teszi: bekapcsolni csak akkor
lehet, ha minden Ã©rintett rendszeradmin beÃ¡llÃ­tÃ¡sa kÃ©sz). A vÃ©szfeloldÃ³ szkript (mfa_felold.py) csak KIKAPCSOLNI hasznÃ¡lja.FT)rÀ   r®   rÒ   Úmfa_politika_valtozott_atr£   )r3   rÓ   rÔ   s      r   Úceg_kapcsolo_beallitasar×   „  s=   € ô ˆC×/Ñ/Ó0´D¸³KÓ?ØÜ*.¨u«+€CÔ'Ü$-£K€CÔ!ÜÔØr   c                 óÖ  • U R                  [        R                  5      R                  [        R                  R                  S:H  [        R                  R
                  S:H  [        R                  R                  R                  S5      5      R                  [        R                  R                  5      R                  5       nU Vs/ s H  o"R                  SLd  M  UPM     sn$ s  snf )u  Az AKTÃ�V rendszeradminisztrÃ¡torok (Admin szerepkÃ¶r, company_id == 1 - ugyanaz, mint security.is_rendszeradminisztrator);
az aktivÃ¡lÃ¡sra vÃ¡rÃ³ (mÃ©g nem aktivÃ¡lt) fiÃ³k nem szÃ¡mÃ­t: Å‘ be sem tud lÃ©pni, az aktivÃ¡lÃ¡s utÃ¡n pedig belÃ©pÃ©skor beÃ¡llÃ­tja a 2FA-t.ÚAdminr   TF)r7   r8   r9   r:   Úroler¸   Úaktivr;   Úorder_byr0   r¯   Ú	aktivalva)r3   Úlistar$   s      r   Úrendszeradminokrß   ”  s—   € ð 	�‰”—‘Óß	‰”—‘× Ñ  GÑ+¬V¯[©[×-CÑ-CÀqÑ-HÌ&Ï+É+×J[ÑJ[×J_ÑJ_Ð`dÓJeÓ	fß	‰”&—+‘+—.‘.Ó	!ß	‰‹ð	 
ñ Ó9’u�!§¡°5Ð 8�A‘uÑ9Ð9ùÒ9s   ÃC&ÃC&c                 ó  • 0 nU R                  [        R                  5      R                  [        R                  R                  UR
                  :H  [        R                  R                  R                  S5      5      R                  5        H  nX2UR
                  '   M     UR                   HA  nUR                  (       d  M  UR                  c  M%  UR                  UR
                  U5        MC     [        UR                  5       S S9$ )u  Azok az AKTÃ�V felhasznÃ¡lÃ³k, akikre a cÃ©g kapcsolÃ³ja vonatkozik (vagy vonatkozna): a cÃ©g sajÃ¡t felhasznÃ¡lÃ³i Ã‰S azok, akiknek
ez a cÃ©g kiosztott cÃ©g (`allowed_companies`) - ugyanaz a szabÃ¡ly, mint a szukseges_e()-ben. Egy felhasznÃ¡lÃ³ egyszer szerepel.Tc                 ó   • U R                   $ r³   r´   )r$   s    r   Ú<lambda>Ú'erintett_felhasznalok.<locals>.<lambda>©  s   € °·²r   )Úkey)r7   r8   r9   r:   r¸   r0   rÛ   r;   r¯   Úallowed_usersÚ
setdefaultÚsortedr‘   )r3   rÓ   Úegyedir$   s       r   Úerintett_felhasznalokré      s¶   € ð €FØ�X‰X”f—k‘kÓ"×)Ñ)¬&¯+©+×*@Ñ*@ÀCÇFÁFÑ*JÌFÏKÉK×L]ÑL]×LaÑLaÐbfÓLgÓh×lÑlÖnˆØˆq�t‰t‹ñ oà×ÔˆØ�7�7‰7�q—|‘|Ó/Ø×Ñ˜aŸd™d AÖ&ñ ô �&—-‘-“/¡~Ñ6Ð6r   c                 ó  ^• / n[        U 5       Hn  nTR                  UR                  :H  =(       d    [        U4S jUR                   5       5      nU(       d  MK  [        U5      (       a  M]  UR                  U5        Mp     U$ )u§  KIZÃ�RÃ�S ELLENI VÃ‰DELEM (megrendelÅ‘i dÃ¶ntÃ©s: "a szuperadmin NEM zÃ¡rhatja ki magÃ¡t"): a cÃ©g kapcsolÃ³jÃ¡nak BEKAPCSOLÃ�SA elÅ‘tt
azon aktÃ­v rendszeradminok listÃ¡ja, akikre a kapcsolÃ³ vonatkozna, DE a 2FA-beÃ¡llÃ­tÃ¡suk mÃ©g nem KÃ‰SZ (nincs megerÅ‘sÃ­tve, vagy a
titok nem olvashatÃ³). Ãœres lista = bekapcsolhatÃ³. Nem Ã¼res = TILOS bekapcsolni, amÃ­g mindegyikÃ¼k be nem Ã¡llÃ­totta (a rendszeradmin
a sajÃ¡t beÃ¡llÃ­tÃ¡sÃ¡t a rendszeradmin felÃ¼leten elÅ‘re elvÃ©gezheti, akkor is, ha mÃ©g nem kÃ¶telezÅ‘).

Kik az Ã©rintett rendszeradminok? Az 1-es cÃ©g kapcsolÃ³jÃ¡nÃ¡l mindegyik (a sajÃ¡t cÃ©gÃ¼k); mÃ¡s cÃ©gnÃ©l csak azok, akiknek az a cÃ©g
kiosztott cÃ©gÃ¼k (`allowed_companies`). A tÃ¶bbi rendszeradminra a kapcsolÃ³ nem hat, Å‘ket nem kell ellenÅ‘rizni.

MiÃ©rt kell ez, ha a 3. fÃ¡zisban a kÃ¶telezett amÃºgy is beÃ¡llÃ­thatja magÃ¡t belÃ©pÃ©skor? Mert a beÃ¡llÃ­tÃ¡s belÃ©pÃ©skor a jelszÃ³ra
Ã©pÃ¼l, Ã©s egy hibÃ¡s kimenetel (pl. nem mÅ±kÃ¶dÅ‘ hitelesÃ­tÅ‘ alkalmazÃ¡s, rossz telefonidÅ‘) mellett a rendszeradmin mÃ¡r nem tud
belÃ©pni, hogy a hibÃ¡t kijavÃ­tsa - a vÃ©delem ezÃ©rt a kapcsolÃ³ Ã¡tbillentÃ©se ELÅ�TT megkÃ¶veteli a bizonyÃ­tottan mÅ±kÃ¶dÅ‘ beÃ¡llÃ­tÃ¡st.c              3   óT   >#   • U  H  oR                   TR                   :H  v •  M     g 7fr³   r´   )r§   rµ   rÓ   s     €r   r©   Ú"kizaras_vedelem.<locals>.<genexpr>º  s   øé € Ð2_ÒK^Àa·4±4¸3¿6¹6¶>ÒK^ùs   ƒ%()rß   r0   r¸   r¹   rº   rÂ   Úappend)r3   rÓ   Úveszelyeztetettekr$   Úerintetts    `   r   Úkizaras_vedelemrð   ¬  se   ø€ ð ÐÜ˜RÖ ˆØ—F‘F˜aŸl™lÑ*×_¬sÔ2_È1×K^ÒK^Ó2_Ó/_ˆßˆ8œK¨ŸN›NØ×$Ñ$ QÖ'ñ !ð Ðr   ÚcelÚ
vegrehajtoc                 ó˜  • UR                   UR                   :X  a  gUR                  S:X  a  UR                  S:X  a  gUR                  (       d  UR                  (       d  gUR                  (       a  SOSn[        U5        U R                  [        R                  " UR                  UR                   SU SUR                   S3S	S
95        g)uÎ  ELVESZETT MÃ�SODIK FAKTOR (megrendelÅ‘i dÃ¶ntÃ©s: "kÃ¶telezÅ‘ jelszÃ³csere, majd Ãºj QR"): amikor egy rendszergazda Ãºj jelszÃ³t Ã¡llÃ­t egy
felhasznÃ¡lÃ³nak (routers/users.py, /admin-jelszo-csere), a felhasznÃ¡lÃ³ 2FA-beÃ¡llÃ­tÃ¡sa is tÃ¶rlÅ‘dik - EGY lÃ©pÃ©sben, egy commitban a
jelszÃ³val. A felhasznÃ¡lÃ³ a kÃ¶vetkezÅ‘ belÃ©pÃ©skor az Ãºj jelszÃ³val, majd az Ãºj QR-beÃ¡llÃ­tÃ¡ssal lÃ©p be (ha a cÃ©gÃ©nÃ©l kÃ¶telezÅ‘ a 2FA).
Ã�gy a lopott jelszÃ³val nem lehet "sima" 2FA-tÃ¶rlÃ©ssel bejutni, Ã©s a nem olvashatÃ³ titok (`helyreallitando`) is megoldÃ³dik.

KIVÃ‰TELEK (kÃ¼lsÅ‘ Ã¡tnÃ©zÃ©s utÃ¡n; mindkettÅ‘ azÃ©rt, hogy egy ELLOPOTT admin-munkamenet ne tudja a 2FA-t kikapcsolni: Ãºj jelszÃ³ + tÃ¶rÃ¶lt beÃ¡llÃ­tÃ¡s
= tartÃ³s Ã¡tvÃ©tel, Ã©s a 2FA addig pont ezt akadÃ¡lyozta):
  * a SAJÃ�T beÃ¡llÃ­tÃ¡sÃ¡t a vÃ©grehajtÃ³ ezzel nem tÃ¶rÃ¶lheti;
  * egy RENDSZERADMIN beÃ¡llÃ­tÃ¡sa sem tÃ¶rÃ¶lhetÅ‘ Ã­gy (senki Ã¡ltal): az Å‘ elveszett eszkÃ¶zÃ©t a szerverrÅ‘l lehet visszaÃ¡llÃ­tani (mfa_felold.py,
    SSH-hozzÃ¡fÃ©rÃ©ssel) - ez a "szuperadmin nem zÃ¡rhatÃ³ ki" elv mÃ¡sik oldala is: egy Ã¡tvett munkamenet nem tudja egy mÃ¡sik rendszeradmin
    mÃ¡sodik faktorÃ¡t lekapcsolni. A jelszÃ³csere ilyenkor megtÃ¶rtÃ©nik, de a 2FA marad (a belÃ©pÃ©shez a telefon tovÃ¡bbra is kell).

Nem commitol (a hÃ­vÃ³ a jelszÃ³val egyÃ¼tt commitol). Igaz, ha tÃ¶rÃ¶lt valamit (volt beÃ¡llÃ­tÃ¡s, vagy megkezdett beÃ¡llÃ­tÃ¡s); utÃ¡na a hÃ­vÃ³
kÃ¼ldje el az Ã©rtesÃ­tÃ©st (ertesito_visszaallitasrol).FrÙ   r   u   megerÅ‘sÃ­tett beÃ¡llÃ­tÃ¡su-   megkezdett (meg nem erÅ‘sÃ­tett) beÃ¡llÃ­tÃ¡su   KÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sz (Ú)uH   tÃ¶rÃ¶lve jelszÃ³cserÃ©vel (a felhasznÃ¡lÃ³nak Ãºj QR-beÃ¡llÃ­tÃ¡s kell))r¸   r!   Ú
field_nameÚ	old_valueÚ	new_valueT)
r0   rÚ   r¸   r*   r+   r›   Úaddr8   ÚAuditLogrL   )r3   rñ   rò   Úvolts       r   Úvisszaallitas_jelszocserevelrû   Á  sŸ   € ð ‡v�v�—‘ÓØØ
‡x�x�7Ó˜sŸ~™~°Ó2ØØ�O�O˜s×3×3ØØ,/×,@×,@Ñ(ÐFu€DÜ
ˆ3„KØ‡F�FŒ6�?Š?Ø—>‘>Ø—‘Ø0Ø�F˜"˜SŸY™Y˜K qÐ)Ø\ñô ð r   Úcel_idÚvegrehajto_idÚ	jelszo_isÚmfa_isc                 óò  •  SSK nSSKnU R                  [        R                  U5      nU R                  [        R                  U5      nUb  UR
                  (       d  gU(       a  UR                  OSn	S n
UR                  [        5       5      nU(       a  U(       a  Su  pÍSu  pïSnSnO U(       a  S	u  pÍS
u  pïSnSnOSu  pÍSu  pïSnSn[        U 5       Vs/ s H@  nUR
                  (       d  M  UR                  UR                  U4;  d  M4  UR
                  PMB     nnU(       ay  SU
" U5       SU
" U	5       SU
" U5       SU
" UR                  5       SU
" UR
                  5       SU
" U5       S3nUR                  UUS-   USUR                  UR                  U S9  SU
" U5       SU
" UR                  5       SU
" U	5       SU
" U5       SU
" U5       SU
" U5       S 3nUR                  UR
                  /UUSUR                  UR                  U S9  U R                  5         gs  snf ! [         a>  nU R!                  5         [#        S![%        U5      R&                   S"U 35         SnAgSnAff = f)#u\  BiztonsÃ¡gi Ã©rtesÃ­tÅ‘k a 2FA-visszaÃ¡llÃ­tÃ¡srÃ³l (kÃ¼lsÅ‘ Ã¡tnÃ©zÃ©s utÃ¡n kÃ©t cÃ­mzett, mert a felhasznÃ¡lÃ³ cÃ­mÃ©t egy rosszindulatÃº admin elÅ‘bb
Ã¡tÃ­rhatta volna a sajÃ¡tjÃ¡ra):
  1. a felhasznÃ¡lÃ³nak: a jelszavÃ¡t Ã©s a 2FA-jÃ¡t rendszergazda visszaÃ¡llÃ­totta (ha NEM kÃ©rte, ebbÅ‘l Ã©szreveszi);
  2. MÃ�SOLAT a tÃ¶bbi aktÃ­v rendszeradminnak (a vÃ©grehajtÃ³t Ã©s az Ã©rintettet kivÃ©ve): ki kinek Ã¡llÃ­totta vissza - Ã­gy egy Ã¡tvett
     admin-munkamenet nem marad Ã©szrevÃ©tlen.
Nem akadÃ¡lyozhat semmit: hibÃ¡nÃ¡l csak a konzolra Ã­r. KategÃ³ria: "rendszer" (nem kapcsolhatÃ³ ki).

v26 (rendszeradmin felhasznÃ¡lÃ³kezelÃ©s): `jelszo_is` / `mfa_is` jelzi, MIT vÃ¡ltoztatott a vÃ©grehajtÃ³ (alapÃ©rtelmezÃ©s: mindkettÅ‘t, mint a
/admin-jelszo-csere esetÃ©ben) - a levÃ©l szÃ¶vege ehhez igazodik (csak jelszÃ³ / csak 2FA-tÃ¶rlÃ©s / mindkettÅ‘).r   NÚ?c                 óN   • [         R                  " U c  SSS9$ [        U 5      SS9$ )Nrt   T)Úquote)ÚhtmlÚescaperw   )Úxs    r   râ   Ú+ertesito_visszaallitasrol.<locals>.<lambda>ô  s   € ”d—k’k¨©	 "ÀTÒJ´s¸1³vÀTÒJr   )u+   KÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©s visszaÃ¡llÃ­tvauX   Ãºj jelszÃ³t Ã¡llÃ­tott, Ã©s tÃ¶rÃ¶lte a kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sÃ©t ennek a fiÃ³knak)u;   Jelszavad Ã©s kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sed visszaÃ¡llÃ­tvaul   megvÃ¡ltoztatta az EmeLOG fiÃ³kod jelszavÃ¡t, Ã©s tÃ¶rÃ¶lte a kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sed beÃ¡llÃ­tÃ¡sÃ¡t.uŠ   KÃ¶vetkezÅ‘ belÃ©pÃ©skor az Ãºj jelszavaddal lÃ©pj be, Ã©s (ha a cÃ©gednÃ©l kÃ¶telezÅ‘) Ã¡llÃ­tsd be Ãºjra a hitelesÃ­tÅ‘ alkalmazÃ¡sodat.uO   Jelszavad Ã©s kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sed visszaÃ¡llÃ­tva az EmeLOG fiÃ³kodon)u!   JelszÃ³csere rendszeradmin Ã¡ltalu(   Ãºj jelszÃ³t Ã¡llÃ­tott ennek a fiÃ³knak)u   Jelszavad megvÃ¡ltozottu-   megvÃ¡ltoztatta az EmeLOG fiÃ³kod jelszavÃ¡t.u6   KÃ¶vetkezÅ‘ belÃ©pÃ©skor az Ãºj jelszavaddal lÃ©pj be.u+   Jelszavad megvÃ¡ltozott az EmeLOG fiÃ³kodon)u%   KÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©s tÃ¶rÃ¶lveu;   tÃ¶rÃ¶lte a kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sÃ©t ennek a fiÃ³knak)u-   KÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sed visszaÃ¡llÃ­tvauM   tÃ¶rÃ¶lte az EmeLOG fiÃ³kod kÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sÃ©nek beÃ¡llÃ­tÃ¡sÃ¡t.uh   KÃ¶vetkezÅ‘ belÃ©pÃ©skor (ha a cÃ©gednÃ©l kÃ¶telezÅ‘) Ã¡llÃ­tsd be Ãºjra a hitelesÃ­tÅ‘ alkalmazÃ¡sodat.uA   KÃ©tlÃ©pcsÅ‘s hitelesÃ­tÃ©sed visszaÃ¡llÃ­tva az EmeLOG fiÃ³kodonzJ<div style="font-family:Arial,sans-serif;max-width:560px;margin:auto"><h2>u+    (mÃ¡solat a rendszeradminoknak)</h2><p><b>z</b> z: <b>z</b> (u   ).</p><p>IdÅ‘pont: <b>uy   </b></p><p style="color:#b02a37">Ha ez nem vÃ¡rt mÅ±velet, a vÃ©grehajtÃ³ fiÃ³kjÃ¡t Ã¡tvehettÃ©k - ellenÅ‘rizd!</p></div>u'    az EmeLOG-ban (rendszeradmin mÃ¡solat)Úrendszer)Ú	kategoriaÚ	prioritasr¸   r3   z</h2><p>Kedves z!</p><p>A rendszergazda (<b>z</b>) rs   u   </p><p>IdÅ‘pont: <b>ul   </b></p><p style="color:#b02a37"><b>Ha ezt nem kÃ©rted</b>, azonnal Ã©rtesÃ­tsd a rendszergazdÃ¡t!</p></div>uS   âš ï¸� A 2FA-visszaÃ¡llÃ­tÃ¡s Ã©rtesÃ­tÅ‘ levelÃ©t nem sikerÃ¼lt sorba Ã¡llÃ­tani: z: )Ú	email_sorÚlogin_vedelemÚgetr8   r9   rL   rM   Úhelyi_ido_szovegrÒ   rß   r0   Úsorba_allitÚPRIORITAS_NORMALr¸   r<   Ú	ExceptionÚrollbackÚprintÚtypeÚ__name__)r3   rü   rý   rþ   rÿ   r  r  rñ   rò   Úvegrehajto_nevÚer   ÚfejlecÚmasolat_tortentÚ
fejlec_celÚtorzs_tortentÚtorzs_teendoÚ	targy_celr$   Úmasolatot_kapÚmasolatÚtorzsÚexs                          r   Úertesito_visszaallitasrolr"  â  s¸  € ð2ÛÛØ�f‰f”V—[‘[ &Ó)ˆØ—V‘VœFŸK™K¨Ó7ˆ
Ø‰;˜cŸiŸiØÞ0:˜×,Ò,ÀˆÙJˆØ×-Ñ-¬i«kÓ:ˆÞžð 'pÑ#ˆFð )VÑ%ˆJð hˆLØi‰IÞØ&uÑ#ˆFØ(rÑ%ˆJØSˆLØE‰Ið 'MÑ#ˆFð )iÑ%ˆJð FˆLØ[ˆIÜ*9¸"Ô*=ÓqÒ*= QÀÇÅ›ÈQÏTÉTÐZ]×Z`ÑZ`ÐboÐYpÑMp›˜ŸœÑ*=ˆÐqÞðÙ˜“y�kð "Ù˜>Ó*Ð+¨5±°?Ó1CÐ0DÀEÉ!ÈCÏLÉLË/ÐIZÐZ`ÑabÐcf×clÑclÓamÐ`nð o#Ù#$ T£7 )ð ,FðFð ð ×!Ñ! -°Ð:cÑ1cÐelØ,6À)×B\ÑB\Ðil×iwÑiwÐ|~ð "ñ @ðÙ�Z“=�/ð "Ù˜3Ÿ<™<›Ð)ð *&Ù&'¨Ó&7Ð%8¸¹qÀÓ?OÐ>PÐPQÑRSÐT`ÓRaÐQbð cÙ  ›w˜ið (uð	uð 	ð 	×Ñ˜sŸy™y˜k¨9°eØ(2¸i×>XÑ>XØ),¯©¸Bð 	ñ 	@ð 	�	‰	�ùò- røô. ó Ø
�‰ŒÜÐcÔdhÐikÓdl×duÑduÐcvÐvxÐy{Ðx|Ð}×~Ñ~ûðús>   ‚AH. ÁA9H. ÃH)Ã1H)ÄH)ÄD	H. È)H. È.
I6È84I1É1I6c                 ó8   • [        U 5        [        5       U l        g)uý   Elveszett mÃ¡sodik faktor (vagy vÃ©szfeloldÃ¡s): tÃ¶rli a 2FA-beÃ¡llÃ­tÃ¡st Ã‰S Ã©rvÃ©nytelenÃ­ti a felhasznÃ¡lÃ³
minden meglÃ©vÅ‘ munkamenetÃ©t (jelszo_valtozott_at = most - a get_current_user() ezt veti Ã¶ssze a token
kiÃ¡llÃ­tÃ¡sÃ¡val). Nem commitol.N)r›   rÒ   Újelszo_valtozott_atrÁ   s    r   Úfelhasznalo_visszaallitasar%  !  s   € ô ˆ4„LÜ(›{€DÕr   )NNr³   )r   N)F)TT)PÚ__doc__rj   r…   r  rg   Úrer�   r   r   Ú	threadingr   Útypingr   r   rb   Úqrcode.constantsr   Ú
sqlalchemyr   r	   r
   Úsqlalchemy.ormr   r   Úsqlalchemy.orm.attributesr   r8   Útitkosito_utilsr   r   rR   rO   rP   r„   Úcompilery   rÉ   rÌ   rË   rÊ   rw   r    r‚   r&   r9   r.   r2   r?   rE   rQ   rq   r}   Úfloatr�   rÀ   r•   r—   r›   r¬   r¢   r¡   r    r£   r°   r»   r¾   rÂ   rÄ   rÇ   rÍ   rÒ   r­   r×   Úlistrß   ré   rð   rû   r"  r%  r   r   r   Ú<module>r2     sê  ðñ:óv Û Û Û 	Û 	Û ß 'Ý Ý ã Û Ý ,ß *Ñ *ß 2Ý 3ã ß 0ð €	ð €Ø€à€à�ZŠZ˜Ó$€
ð €
Ø#Ð Ø+Ð à€ð!�#ô !ð
!�Cð ! ð !¨ô !ð$˜fŸk™kð $¨dô $ð
˜Ÿ™ð 
¨Cð 
°Dô 
ð)�wð )¨ð )°¸#±ô )ð&˜Ÿ™ð ¨°#©ô ð&/˜6Ÿ;™;ð /¨sð /°sô /ð	Z˜ð 	Z ô 	Zð<˜( 3™-ô <ð DHØ,0ñ˜3ð °8¸C±=ð Ø" 5™/ðØ5=¸c±]õñ4 Wð °F·K±Kð ÈHÐUZÉOð Ðgkõ ñ6�Gð  6§;¡;ð ¸8ÀE¹?ð ÐVZõ ðd�—‘ð d ô dð< Ð Ø¡I£KÑ0€Ù“6Ð ô*ñ˜ð ¨tð À	õ ñ&	A�Gð 	A 6§;¡;ð 	A¸Tð 	AÈdõ 	Að!�wð ! f§k¡kð !°dô !ð
L�f—k‘kð L dô Lð
;˜Ÿ™ð ;¨ô ;ð
˜VŸ[™[ð ¨Sô ð�ð ˜vŸ{™{ð ¨sô ð$;�8ô ;ð ð ¨f¯n©nð ÀTð Èdô ð 	:˜ð 	: Dô 	:ð	7˜gð 	7¨F¯N©Nð 	7¸tô 	7ð˜ð  f§n¡nð ¸ô ð* Wð °6·;±;ð ÈFÏKÉKð Ð\`ô ñB< 'ð <°3ð <Àsð <ÐW[ð <Ðlpð <ð  }Aõ <ð~+ V§[¡[ð +°Tõ +r   