
    i8                     b   % 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
  S SKJr  S SKJr  S SKJr  S SK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  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ r   S SKJ!r!   \RD                  r"\RJ                  " \&5      r'Sr(\\)\\)\)4   4   r*\)r+\)r,S\)S\)4S jr- " S S\5      r. " S S\5      r/ " S S\/5      r0 " S  S!\5      r1S"S#S$/0r2\\)\\)   4   \3S%'   S&r4 " S' S(\5      r5g! \# a    \
\\   /\	4   r$S\$S\$4S jr" Nf = f))    N)Path)Any)Callable)Dict)List)Optional)Type)Union)	HTTPError)KeyringBackend)
properties)PasswordDeleteErrorPasswordSetError)	BaseModel)Field)AnacondaAuthConfig)TokenExpiredError)TokenNotFoundErrormethodreturnc                 @    [         R                  " [        U 5      5      $ N)r   ClassPropertyclassmethod)r   s    3lib/python3.13/site-packages/anaconda_auth/token.pyclasspropertyr   #   s    ''F(;<<    zAnaconda Cloudpayloadc                 j    [         R                  " U R                  S5      5      R                  S5      $ )z"Encode a string to a base64 stringzutf-8)base64	b64encodeencodedecode)r   s    r   _as_base64_stringr%   3   s'    GNN734;;GDDr   c                       \ rS rSrSr\S\4S j5       rS\S\S\SS4S	 jr	S\4S
 jr
S\S\S\\S4   4S jrS\S\SS4S jrSrg)NavigatorFallback8   g?r   c                 .     SS K ng! [         a     gf = f)Nr   TF)anaconda_navigatorModuleNotFoundError)clsr*   s     r   viableNavigatorFallback.viable;   s    	%" 		s    
serviceusernamepasswordNc                     [        S5      eNz!This keyring cannot set passwordsr   selfr/   r0   r1   s       r   set_passwordNavigatorFallback.set_passwordD       BCCr   c                 b    SSK Jn  SS0nUR                  SSS5      R                  S5      nX#   $ )Nr   )CONFzhttps://anaconda.cloudid.anaconda.cloudmaincloud_base_url/)anaconda_navigator.configr:   getstrip)r5   navigator_configknown_mappingr=   s       r   _get_auth_domain"NavigatorFallback._get_auth_domainG   s@    F13FG.22$&>

%* 	 ,,r   c                     SSK Jn  U R                  5       nU[        :w  a  X$:w  a  g UR                  5       nUb  SSKJn  SSKJn  [        US9nUR                  (       d   U" UR                  US9n	OUR                  n	U" U	5      n
UR                  U
UR                  S.n[         R"                  " U5      n[%        U5      n[&        R(                  " [        XM5        U$ g ! [         a     g f = f! [         a     g f = f)Nr   )NucleusToken)get_api_key)refresh_access_tokendomain)config)r0   api_keyrK   )$anaconda_navigator.api.nucleus.tokenrG   rD   ImportErrorKEYRING_NAME	from_fileanaconda_auth.actionsrH   rI   r   validrefresh_tokenr   access_tokenr0   rK   jsondumpsr%   keyringr6   )r5   r/   r0   rG   auth_domaintokenrH   rI   rL   rU   rM   
token_infor   encodeds                 r   get_passwordNavigatorFallback.get_passwordQ   s    	I//1K l"x'>&&(9B'{;F;; #7++F$L  %11!,/G!NN" --J
 jj,G'0G  {DNC  		" !   s#   C! "C1 !
C.-C.1
C>=C>c                     U R                  5       n SSKJn  U[        :w  a  X#:w  a  g  [
        R                  " U5        g ! [         a     g f = f! [         a     g f = f)Nr   )
TOKEN_FILE)rD   rN   r`   rO   rP   osremoveFileNotFoundError)r5   r/   r0   rY   navigator_token_files        r   delete_password!NavigatorFallback.delete_passwordy   se    ++-	 l"x'>		./  		 % s"   A  A  
AA
AA )__name__
__module____qualname____firstlineno__priorityr   boolr-   strr6   rD   r
   r]   re   __static_attributes__rg   r   r   r'   r'   8   s    Ht  DC D3 D# D$ D-# -&C &3 &5d;K &Ps c d r   r'   c                       \ rS rSrSr\" S5      R                  5       r\S\	4S j5       r
\S\4S j5       rS\4S jrS\SS	4S
 jrS\S\S\SS	4S jrS\S\S\\S	4   4S jrS\S\SS	4S jrSrg	)AnacondaKeyring   ztoken AnacondaKeyringz~/.anaconda/keyringr   c                     [        5       nUR                  S:X  a  gUR                  S:X  a  g[        SUR                   S35      e)Nsystemg?zanaconda-keyringg      &@ztoken_storage: z is not supported.)r   preferred_token_storage
ValueErrorr,   rL   s     r   rl   AnacondaKeyring.priority   sN    #%))X5++/AA!&"@"@!AAST r   c                      U R                   R                  R                  SSS9  U R                   R                  S5       nUR	                  5       nS S S 5        U$ ! , (       d  f       W$ = f! [
         a     gf = f)NTexist_okparentsaF)keyring_pathparentmkdiropenwritableOSError)r,   fr   s      r   r-   AnacondaKeyring.viable   sp    	##))4)F!!&&s+q::< ,O ,+O 		s/   ?A. A	A. 
A+&A. +A. .
A;:A;c                    U R                   R                  5       (       d  0 $  U R                   R                  S5       n[        R                  " U5      nS S S 5        U$ ! , (       d  f       W$ = f! [        R
                   a    0 s $ f = f)Nr)r~   existsr   rV   loadJSONDecodeError)r5   fpdatas      r   _readAnacondaKeyring._read   su      ''))I	""'',yy} -K -,K## 	I	s.   A1 A	A1 
A.)A1 .A1 1B
	B
r   Nc                     U R                   R                  R                  SSS9  U R                   R                  S5       n[        R
                  " X5        S S S 5        g ! , (       d  f       g = f)NTrz   w)r~   r   r   r   rV   dump)r5   r   r   s      r   _saveAnacondaKeyring._save   sO      &&d&C##C(BIId )((s    A  
A.r/   r0   r1   c                 f    U R                  5       nX;  a  0 XA'   X4U   U'   U R                  U5        g r   )r   r   )r5   r/   r0   r1   r   s        r   r6   AnacondaKeyring.set_password   s2    zz|DM"*Wh

4r   c                 f    U R                  5       nUR                  U0 5      R                  US 5      $ r   )r   r@   r5   r/   r0   r   s       r   r]   AnacondaKeyring.get_password   s+    zz|xx$((488r   c                     U R                  5       n UR                  U0 5      R                  U5        U R                  U5        g ! [         a    [
        ef = fr   )r   r@   popr   KeyErrorr   r   s       r   re   AnacondaKeyring.delete_password   sL    zz|	&HHWb!%%h/JJt 	&%%	&s   2A Arg   )rh   ri   rj   rk   namer   
expanduserr~   r   floatrl   rm   r-   LocalKeyringDatar   r   rn   r6   r
   r]   re   ro   rg   r   r   rq   rq      s    "D-.99;L	 	 	 t  	' 	 *  t  C 3 # $ 9C 93 95d;K 9&s &c &d &r   rq   c                   n    \ rS rSrSr\S\4S j5       rS\S\S\SS4S	 jr	S\S\SS4S
 jr
S\4S jrSrg)ConfigKeyring   ztoken ConfigKeyringr   c                 b    [        5       nUR                  (       d  UR                  (       a  S$ S$ )Ng      Y@g        )r   rM   rX   rw   s     r   rl   ConfigKeyring.priority   s!    #%&..uAcAr   r/   r0   r1   Nc                     [        S5      er3   r   r4   s       r   r6   ConfigKeyring.set_password   r8   r   c                     [        S5      e)Nz$This keyring cannot delete passwordsr   )r5   r/   r0   s      r   re   ConfigKeyring.delete_password   s    EFFr   c                 ^   [        5       nUR                  (       at  [        UR                  UR                  S9n[        R
                  " UR                  5       R                  S5      5      R                  S5      n[        UR                  U00$ UR                  (       a  UR                  $ 0 $ )N)rK   rM   ascii)r   rM   	TokenInforK   r!   r"   model_dump_jsonr#   r$   rP   rX   )r5   rL   decodedr\   s       r   r   ConfigKeyring._read   s    #%>>v}}fnnMG&&'')009fWo  !6=='":;;>>>>!	r   rg   )rh   ri   rj   rk   r   r   r   rl   rn   r6   re   r   r   ro   rg   r   r   r   r      st     DB B BDC D3 D# D$ DGs Gc Gd G' r   r   c                   8    \ rS rSr% \\S'   Sr\\S4   \S'   Sr	g)	RepoToken   rZ   Norg_namerg   )
rh   ri   rj   rk   TokenString__annotations__r   r
   OrgNamero   rg   r   r   r   r      s    %)HeGTM")r   r   zanaconda.comr;   zanaconda.cloud
MIGRATIONS   c            	       v   \ rS rSr% \" S S9r\\S'   Sr\	\S4   \S'   Sr
\	\S4   \S'   / r\\   \S'   \r\\   \S	'   \S
\S\4S j5       r\S
\S\S\SS 4S j5       r\SSS.S\\   S\SS 4S jjj5       rS S jrS S jr\S\4S j5       rS\4S jrS\S\SS4S jrS\S\4S jr S\SS4S jr!S S jr"Sr#g)!r      c                  *    [        5       R                  $ r   )r   rK   rg   r   r   <lambda>TokenInfo.<lambda>   s    0B0D0K0Kr   )default_factoryrK   NrM   r0   repo_tokensversionkeyring_datar   c                 ^    [         R                  " U5      n[        R                  " U5      nU$ r   )r!   	b64decoderV   loads)r,   r   decoded_bytesdecoded_dicts       r   _decodeTokenInfo._decode   s&    ((6zz-0r   from_domain	to_domainc                     U R                  U5      nX4S'   [        US'   [        S0 UD6nUR                  5         [        R
                  " [        U5        [        R                  SU SU S35        U$ )z3Migrate the domain and save token under new domain.rK   r   u1   🔓 Token has been migrated from legacy domain 'z' to 'u   ' 🎉rg   )	r   TOKEN_INFO_VERSIONr   saverX   re   rP   loggerdebug)r,   r   r   r   r   r[   s         r   _migrateTokenInfo._migrate  st    
 {{<0!*X"4Y..
k:?}FS\R]]cd	
 r   F)creater   c                   U=(       d    [        5       R                  n[        R                  " [        U5      nUb1  [
        R                  S5        U R                  U5      n[        S0 UD6$ [        R                  U/ 5      nU H3  n[        R                  " [        U5      nUc  M#  U R                  XvUS9s  $    U(       a  [
        R                  S5        [        US9$ [        e)a!  Load the token information from the system keyring.

Args:
    domain: The domain for which to load the token information. If
        not provided, defaults to the configuration domain.
    create: If True, create a new TokenInfo object if not found.

Returns:
    The token information.

u<   🔓 Token has been successfully retrieved from keyring 🎉)r   r   u-   🔓 Token has been successfully created 🎉rJ   rg   )r   rK   rX   r]   rP   r   r   r   r   r   r@   r   r   )r,   rK   r   r   r   legacy_domainslegacy_domainexisting_keyring_datas           r   r   TokenInfo.load  s     6-/66++L&A#LLWX;;|4L,|,, $3+M$+$8$8}$U!$0||)PV $   , LLHIF++  r   c                     U R                  SS9n[        U5      n[        R                  " [        U R
                  U5        [        R                  S5        g)z2Write the token information to the system keyring.T)exclude_noneu9   🔒 Token has been safely stored in system keychain 🎉N)r   r%   rX   r6   rP   rK   r   r   )r5   r   r\   s      r   r   TokenInfo.save9  sB    &&D&9#G,\4;;@PQr   c                      [         R                  " [        U R                  5        [        R
                  (       a)  [	        5       R                  [        U R                  5        gg! [         a    [        ef = f)z5Delete the token information from the system keyring.N)rX   re   rP   rK   r'   r-   r   r   r5   s    r   deleteTokenInfo.delete@  sU    	%##L$++> ''!#33L$++N (" 	%$$	%s   A"A& &A7c                 b   U R                   c  g[        R                  " U R                   S/SS0S9n[        R                  R                  US   5      R                  [        R                  R                  S9nU[        R                  R                  [        R                  R                  S9:  $ )	NTRS256verify_signatureF)
algorithmsoptionsexp)tzinfo)tz)
rM   jwtr$   dtdatetimefromtimestampreplacetimezoneutcnow)r5   r   expirys      r   expiredTokenInfo.expiredI  s    <<**LLgY9KU8S
 **75>:BB;;?? C 
 2;;??;;;r   c                 D   U R                   cB   [        R                  U R                  5      nUR
                  U l        UR                   U l         U R                   c   eU R                  (       a  [        S5      eU R                   $ ! [         a    Sn[	        U5      ef = f)z>Get the access token, ensuring login and refresh if necessary.z2No token found, please login with `anaconda login`zNYour login token as expired. Please login again using
  anaconda login --force)rM   r   r   rK   r   r0   r   r   )r5   new_token_infomessages      r   get_access_tokenTokenInfo.get_access_tokenV  s    <<2!*!< +33DM)11DL||'''<<#+ 
 ||! & 2N(112s   B Br   rZ   c                     U R                  US9  U R                   Vs/ s H  o3R                  U:w  d  M  UPM     snU R                  SS& U R                  R	                  [        XS95        gs  snf ! [         a     N4f = f)zSet the repo token for a specific organization.

Args:
    org_name: The organization name for which to search for a token.
    token: The token value.

)r   N)r   rZ   )get_repo_tokenr   r   r   appendr   )r5   r   rZ   ts       r   set_repo_tokenTokenInfo.set_repo_tokenm  s    
	2  ++#+azzX/E+#DQ 		8 IJ	# " 		s   A4 A/A/4
B Bc                     U R                    H!  nUR                  U:X  d  M  UR                  s  $    [        SU 35      e)a6  Return the installed repo token for a specific organization.

Args:
    org_name: The organization name for which to search for a token.

Returns:
    The repo access token associated with the requested organization.

Raises:
    TokenNotFoundError: if no token is found in the keyring for that organization.

z"Could not find repo token for org )r   r   rZ   r   )r5   r   rZ   s      r   r   TokenInfo.get_repo_token  s?     %%E~~){{" & !#EhZ!PQQr   c                     U R                    Vs/ s H  o"R                  U:w  d  M  UPM     snU R                   SS& gs  snf )z|Delete the repo token for a specific organization.

Args:
    org_name: The organization name for which to delete a token.

N)r   r   )r5   r   r   s      r   delete_repo_tokenTokenInfo.delete_repo_token  s7     +/*:*:U*:QjjH>Tq*:UUs   ==c                 "    / U R                   SS& g)zDelete all repo tokensN)r   r   s    r   delete_all_repo_tokenTokenInfo.delete_all_repo_token  s     !r   )rM   r0   r   )r   N)$rh   ri   rj   rk   r   rK   rn   r   rM   r
   r0   r   r   r   r   r   r   intr   dictr   r   rm   r   r   r   propertyr   r   r   r   r   r   r   r  ro   rg   r   r   r   r      s^   (KLFCL $GU39$!%HeCI%#%Ki%/GXc]/3 4  
 -0=@	  !!% !!(3- !!4 !!K !! !!FR% 
< 
< 
<# .Kw K{ Kt K.Rw R; R$V' Vd V!r   r   )6r!   r   r   rV   loggingra   pathlibr   typingr   r   r   r   r   r	   r
   urllib.errorr   r   rX   keyring.backendr   r   keyring.errorsr   r   pydanticr   r   anaconda_auth.configr   anaconda_auth.exceptionsr   r   r   AttributeError_KeyringClassMethod	getLoggerrh   r   rP   rn   r   r   r   r%   r'   rq   r   r   r   r   r   r   rg   r   r   <module>r     se       	         " 
  * & . +   3 6 7=,,M 
		8	$   T#s(^+, 
Es Es E
Q Qh?&n ?&DO 8*	 * (*:;$
Dd3i    n!	 n!q  ="D$8#93#>?=1 =6I ==s   D D.-D.