
    _j                       S SK J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r " S S	5      r\" 5       rS)S
 jrS*S jr " S S\5      r\	" SS9 " S S5      5       r\R0                  R3                  SS5      r\R0                  R3                  SS\ 35      rSrS\ S3rSrSrSr \RB                  " 5       S-  r"S+S jr#\S 5       r$S,S jr%S-S  jr&S.S! jr'S"S#.S/S$ jjr(S0S% jr)S*S& jr*S1S' jr+S2S( jr,g)3    )annotationsN)contextmanager)	dataclass)Path)Lock)Optionalc                      \ rS rSrS rSrg)GoogleColabState   c                >    SU l         [        5       U l        S U l        g )NF)
is_checkedr   locksecretselfs    D/home/rurouni/.local/lib/python3.13/site-packages/fal_client/auth.py__init__GoogleColabState.__init__   s    F	%)    )r   r   r   N)__name__
__module____qualname____firstlineno__r   __static_attributes__ r   r   r
   r
      s    *r   r
   c                 l     SSK Jn   S[        U " 5       5      ;   $ ! [         a     g[         a     gf = f)Nr   get_ipythonzgoogle.colabF)IPythonr   strModuleNotFoundError	NameErrorr   s    r   is_google_colabr#      s9    '[]!333  s    
3	33c                    [        5       (       d  g [        R                     [        R                  (       a  [        R                  sS S S 5        $  SSKJn    U R                  S5      nUR                  5       [        l        S[        l        [        R                  sS S S 5        $ ! [         a     S S S 5        g f = f! [         a    S [        l         NSf = f! , (       d  f       g = f)Nr   )userdataFAL_KEYT)r#   _colab_stater   r   r   google.colabr%   ImportErrorgetstrip	Exception)r%   tokens     r   get_colab_tokenr.   %   s    			""&& 
		-	'LL+E"'++-L #'""! 
	  	 
		  	'"&L	' 
	sM   %CB&*B>C&
B;0C:B;;C>CCCC
C'c                      \ rS rSrSrg)MissingCredentialsError;   r   N)r   r   r   r   r   r   r   r   r0   r0   ;   s    r   r0   T)frozenc                  L    \ rS rSr% SrS\S'   S\S'   \S
S j5       rSS jrSr	g	)AuthCredentials?   z)Represents an authorization header value.r    schemer-   c                8    U R                    SU R                   3$ )N )r6   r-   r   s    r   header_valueAuthCredentials.header_valueF   s    ++a

|,,r   c                    SU R                   0$ )NAuthorization)r9   r   s    r   
as_headersAuthCredentials.as_headersJ   s    !2!233r   r   Nreturnr    )r@   zdict[str, str])
r   r   r   r   __doc____annotations__propertyr9   r=   r   r   r   r   r4   r4   ?   s&    3KJ- -4r   r4   FAL_RUN_HOSTzfal.runFAL_QUEUE_RUN_HOSTzqueue.zauth.fal.aizhttps://z/oauth/token TwXR51Vz8JbY8GUUMy6EyuVR0fTO7N4Nauth0_tokenz
.portalockz.falc                 x    [        [        R                  " S[        [        5      5      5      R                  5       $ )NFAL_HOME_DIR)r   osgetenvr    DEFAULT_FAL_HOME
expanduserr   r   r   _get_fal_home_dirrN   Y   s'    		.#.>*?@ALLNNr   c               #    #     SSK n [        5       [        -  nUR                  R                  SSS9  U R                  R                  [        U5      SSS9   Sv   SSS5        g! [         a    Sv    gf = f! , (       d  f       g= f7f)z%Best effort lock shared with fal-cli.r   NTparentsexist_okF   )fail_when_lockedtimeout)	portalockerr,   rN   AUTH_LOCK_FILENAMEparentmkdirutilsTemporaryFileLockr    )rV   	lock_files     r   _token_lockr]   ]   s     
 "#&88I4$7				,	,I 
- 
 	
 
  
 
s@   B
A% AB
A9	B
%A63B
5A66B
9
BB
c                 p   [        5       [        -  n U R                  5       (       d  gU R                  5       R	                  5        Vs/ s H)  oR                  5       (       d  M  UR                  5       PM+     nnU(       d  gUS   nS n[        U5      S:  a  US   nU=(       d    S U=(       d    S 4$ s  snf )N)NNr      )rN   AUTH_TOKEN_FILENAMEexists	read_text
splitlinesr+   len)pathlinelinesrefresh_tokenaccess_tokens        r   _read_auth_tokensrj   o   s    !44D;;==&*nn&6&A&A&CT&Cdzz|\TZZ\&CET!HM"&L
5zA~Qx D,"6$66 Us   B3$B3c                    [        5       [        -  nUR                  R                  SSS9  U /nU(       a  UR	                  U5        UR                  SR                  U5      5        g )NTrP   
)rN   r`   rX   rY   append
write_textjoin)rh   ri   re   contentss       r   _write_auth_tokensrq      sR    !44DKKdT2H%OODIIh'(r   c                    U R                  S5      S   nS[        U5      * S-  -  n[        R                  " X-   5      n[        R
                  " UR                  S5      5      n[        UR                  S5      5      $ ! [         a     gf = f)z?Returns exp claim in seconds since epoch or None if unreadable..r_   =   zutf-8expN)
splitrd   base64urlsafe_b64decodejsonloadsdecodeintr*   r,   )r-   payload_segmentpaddingpayloadclaimss        r   _decode_jwt_expr      s    ++c*1-#o..23**?+DEGNN7346::e$%% s   A<A? ?
BBi,  )leeway_secondsc               V    [        U 5      nUc  g[        R                  " 5       U-   U:  $ )NT)r   time)r-   r   rv   s      r   _is_access_token_expiredr      s*    
%
 C
{99;'3..r   c                    [         R                  " [        S[        U S.SS9n UR	                  5       nUR                  S:w  d  SU;  a  [        S5      eU$ ! [
         a    0 n N1f = f)Nrh   )
grant_type	client_idrh      )datarU      ri   zDFailed to refresh fal auth token. Please run `fal auth login` again.)httpxpostAUTH0_TOKEN_URLAUTH0_CLIENT_IDrz   r,   status_coder0   )rh   response
token_datas      r   _refresh_access_tokenr      s{    zz)(*

 H]]_
 s"nJ&F%R
 	
   
s   A A&%A&c                 L   [        5          [        5       u  pSSS5        W (       d  gW(       a  [        U5      (       d  U$ [        U 5      nUR	                  SU 5      nUS   n[        5          [        X45        SSS5        U$ ! , (       d  f       Nq= f! , (       d  f       U$ = f)z
Try to reuse tokens created by `fal auth login`.

We share the same file layout as fal-cli:
- refresh token on first line
- optional cached access token on second line
Nrh   ri   )r]   rj   r   r   r*   rq   )rh   ri   r   new_refresh
new_accesss        r   _load_bearer_token_from_loginr      s     
&7&9# 
 4\BB&}5J..-@KN+J	;3 
 ! 
 
 s   B-B
B
B#c                    [         R                  R                  S5      S:H  n U (       d  [         R                  " S5      =n(       a  [	        SU5      $ [         R                  " S5      =n(       a.  [         R                  " S5      =n(       a  [	        SU SU 35      $ [        5       =n(       a  [	        SU5      $ [        5       =n(       a  [	        SU5      $ [        S	5      e)
z
Return credentials using this priority:
1) FAL_KEY / FAL_KEY_ID+FAL_KEY_SECRET / Colab secret (unless FAL_FORCE_AUTH_BY_USER=1)
2) Tokens saved by `fal auth login`
FAL_FORCE_AUTH_BY_USER1r&   Key
FAL_KEY_IDFAL_KEY_SECRET:Bearerz_No credentials found. Set FAL_KEY (or FAL_KEY_ID/FAL_KEY_SECRET) or login via `fal auth login`.)rJ   environr*   rK   r4   r.   r   r0   )force_user_authkeykey_idfal_key_secretcolab_tokenbearers         r   fetch_auth_credentialsr      s     jjnn%=>#EO))I&&3&"5#..		,//f/ ii(899N9"5VHAn5E*FGG+--[-"5+66.00v0x00
!i r   c                     [        5       n U R                  R                  5       S:w  a  [        S5      eU R                  $ )z
Legacy helper kept for backwards compatibility.

It only returns Key-based credentials; user-based auth (Bearer) will raise
MissingCredentialsError so callers don't accidentally send it as a key.
r   zFKey credentials not found. Set FAL_KEY (or FAL_KEY_ID/FAL_KEY_SECRET).)r   r6   lowerr0   r-   )auths    r   fetch_credentialsr      s=     "#D{{e#%T
 	
 ::r   )r@   bool)r@   Optional[str])r@   r   )r@   z#tuple[Optional[str], Optional[str]])rh   r    ri   r   r@   None)r-   r    r@   zOptional[int])r-   r    r   r}   r@   r   )rh   r    r@   dict)r@   r4   r?   )-
__future__r   rx   rz   rJ   r   
contextlibr   dataclassesr   pathlibr   	threadingr   typingr   r   r
   r'   r#   r.   r,   r0   r4   r   r*   rD   rE   AUTH0_DOMAINr   r   r`   rW   homerL   rN   r]   rj   rq   r   r   r   r   r   r   r   r   r   <module>r      s   "   	  % !    * *  !#,	i 	 $4 4 4 zz~~ni8ZZ^^$8F<.:QR \N,74# ! 99;' O  "7")
 CF /086r   