Ë
    :vžj…  ã                   ó    — 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 ddlmZmZ dZdd„Zd	„ Ze	dd
„«       Zdd„Zy)z-
Password generation for the Jupyter Server.
é    N)Úcontextmanager)Újupyter_config_dir)ÚConfig)ÚConfigFileNotFoundÚJSONFileConfigLoaderé   c                 ó`  — | €gt        d«      D ]L  }t        j                  d«      }t        j                  d«      }||k(  r|}  n&t        j                  dd¬«       ŒN d}t	        |«      ‚|d	k(  r0d
dl}|j                  ddd¬«      }|j                  | «      }|› d|› �S t        j                  |«      }	dt        t        «      z   dz   t        j                  dt        z  «      z  }
|	j                  | j                  d«      |
j                  d«      z   «       |› d|
› d|	j!                  «       › �S )a§  Generate hashed password and salt for use in server configuration.

    In the server configuration, set `c.ServerApp.password` to
    the generated string.

    Parameters
    ----------
    passphrase : str
        Password to hash.  If unspecified, the user is asked to input
        and verify a password.
    algorithm : str
        Hashing algorithm to use (e.g, 'sha1' or any argument supported
        by :func:`hashlib.new`, or 'argon2').

    Returns
    -------
    hashed_passphrase : str
        Hashed password, in the format 'hash_algorithm:salt:passphrase_hash'.

    Examples
    --------
    >>> passwd("mypassword")  # doctest: +ELLIPSIS
    'argon2:...'

    Né   zEnter password: zVerify password: zPasswords do not match.é   ©Ú
stacklevelz'No matching passwords found. Giving up.Úargon2r   i (  é
   é   )Úmemory_costÚ	time_costÚparallelismÚ:z%0Úxé   úutf-8Úascii)ÚrangeÚgetpassÚwarningsÚwarnÚ
ValueErrorr   ÚPasswordHasherÚhashÚhashlibÚnewÚstrÚsalt_lenÚrandomÚgetrandbitsÚupdateÚencodeÚ	hexdigest)Ú
passphraseÚ	algorithmÚ_Úp0Úp1Úmsgr   ÚphÚh_phÚhÚsalts              úm/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server/auth/security.pyÚpasswdr4      s&  € ð4 ÐÜ�q–ˆAÜ—‘Ð!3Ó4ˆBÜ—‘Ð!4Ó5ˆBØ�RŠxØ�
ÙÜ�M‰MÐ3ÀÖBð ð <ˆCÜ˜S“/Ð!à�HÒÛà×"Ñ"ØØØð #ó 
ˆð
 �w‰w�zÓ"ˆà�˜A˜d˜VÐ$Ð$ä�‰�IÓ€AØ”3”x“=Ñ  3Ñ&¬&×*<Ñ*<¸QÄ¹\Ó*JÑJ€DØ‡H�HˆZ×Ñ˜wÓ'¨$¯+©+°gÓ*>Ñ>Ô?àˆ[˜˜$˜˜q §¡£ Ð0Ð0ó    c                 ó  — | j                  d«      r.ddl}ddl}|j                  «       }	 |j	                  | dd |«      S 	 | j                  dd«      \  }}}	 t        j                  |«      }t        |«      dk(  ry|j                  |j                  d«      |j                  d	«      z   «       |j                  «       |k(  S # |j
                  j                  $ r Y yw xY w# t        t        f$ r Y yw xY w# t        $ r Y yw xY w)
a`  Verify that a given passphrase matches its hashed version.

    Parameters
    ----------
    hashed_passphrase : str
        Hashed password, in the format returned by `passwd`.
    passphrase : str
        Passphrase to validate.

    Returns
    -------
    valid : bool
        True if the passphrase matches the hash.

    Examples
    --------
    >>> myhash = passwd("mypassword")
    >>> passwd_check(myhash, "mypassword")
    True

    >>> passwd_check(myhash, "otherpassword")
    False

    >>> passwd_check("sha1:0e112c3ddfce:a68df677475c2b47b6e86d0467eec97ac5f4b85a", "mypassword")
    True
    zargon2:r   Né   Fr   r   r   r   )Ú
startswithr   Úargon2.exceptionsr   ÚverifyÚ
exceptionsÚVerificationErrorÚsplitr   Ú	TypeErrorr    r!   Úlenr&   r'   r(   )Úhashed_passphraser)   r   r/   r*   r2   Ú	pw_digestr1   s           r3   Úpasswd_checkrB   P   s  € ð6 ×#Ñ# IÔ.ÛÛ à×"Ñ"Ó$ˆð	Ø—9‘9Ð.¨q¨rÐ2°JÓ?Ð?ðØ%6×%<Ñ%<¸SÀ!Ó%DÑ"ˆ	�4˜ðÜ�K‰K˜	Ó"ˆô ˆ9ƒ~˜ÒØà‡H�HˆZ×Ñ˜wÓ'¨$¯+©+°gÓ*>Ñ>Ô?à�;‰;‹=˜IÑ%Ð%øð% × Ñ ×2Ñ2ò 	Ùð	ûô
 œ	Ð"ò Ùðûô
 ò Ùðús5   «C ÁC  ÁC5 ÃCÃCÃ C2Ã1C2Ã5	DÄ Dc              #   óú  K  — | €(t         j                  j                  t        «       d«      } t        j                  t         j                  j                  | «      d¬«       t        t         j                  j                  | «      t         j                  j                  | «      «      }	 |j                  «       }|–— t        | dd¬«      5 }|j                  t        j                  |d¬	«      «       ddd«       	 t        j                  | |«       y# t        $ r t        «       }Y Œnw xY w# 1 sw Y   Œ:xY w# t         $ r9 t#        j$                  «       }t'        j(                  d
| › d|› �t*        d¬«       Y yw xY w­w)z¾Context manager that can be used to modify a config object

    On exit of the context manager, the config will be written back to disk,
    by default with user-only (600) permissions.
    Nzjupyter_server_config.jsonT)Úexist_okÚwÚutf8)Úencodingr   )ÚindentzFailed to set permissions on z:
r   )ÚosÚpathÚjoinr   ÚmakedirsÚdirnamer   ÚbasenameÚload_configr   r   ÚopenÚwriteÚjsonÚdumpsÚchmodÚ	ExceptionÚ	tracebackÚ
format_excr   r   ÚRuntimeWarning)Úconfig_fileÚmodeÚloaderÚconfigÚfÚtbs         r3   Úpersist_configr_   ˆ   s!  è ø€ ð ÐÜ—g‘g—l‘lÔ#5Ó#7Ð9UÓVˆä‡K�K”—‘—‘ Ó,°tÕ<ä!¤"§'¡'×"2Ñ"2°;Ó"?ÄÇÁÇÁÐQ\ÓA]Ó^€FðØ×#Ñ#Ó%ˆð ‚Lä	ˆk˜3¨Õ	0°AØ	�‰”—
‘
˜6¨!Ô,Ô-÷ 
1ð
Ü
�‰�˜dÕ#øô ò Ü“Šðú÷
 
1Ð	0ûô
 ò 
Ü×!Ñ!Ó#ˆÜ�‰Ø+¨K¨=¸¸B¸4Ð@Ä.Ð]^÷	
ð
üsf   ‚B%E;Â(D Â8E;Ã
'D*Ã1E;Ã:D6 ÄE;ÄD'Ä$E;Ä&D'Ä'E;Ä*D3Ä/E;Ä6?E8Å5E;Å7E8Å8E;c                 ó€   — t        | «      }t        |«      5 }||j                  _        ddd«       |S # 1 sw Y   |S xY w)z:Ask user for password, store it in JSON configuration fileN)r4   r_   ÚIdentityProviderÚhashed_password)ÚpasswordrY   rb   r\   s       r3   Úset_passwordrd   ©   s=   € ô ˜XÓ&€Oä	˜Ô	$¨Ø2Aˆ×ÑÔ/÷ 
%àÐ÷ 
%àÐús   —3³=)Nr   )Ni€  )NN)Ú__doc__r   r    rR   rI   r$   rV   r   Ú
contextlibr   Újupyter_core.pathsr   Útraitlets.configr   Útraitlets.config.loaderr   r   r#   r4   rB   r_   rd   © r5   r3   Ú<module>rk      sZ   ðñó Û Û Û 	Û Û Û Ý %å 1Ý #ß Lð €ó61òr5&ðp ò
ó ð
ô@r5   