
    i                    $   d dl m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 d dlmZ d dlZ G d d	          Z e            Zd7dZd8dZ G d de          Z e	d           G d d                      Zej                            dd          Zej                            dde           ZdZde dZdZdZdZ  ej!                    dz  Z"d9d!Z#ed"             Z$d:d$Z%d;d)Z&d<d,Z'd-d.d=d1Z(d>d3Z)d8d4Z*d?d5Z+d@d6Z,dS )A    )annotationsN)contextmanager)	dataclass)Path)Lock)Optionalc                      e Zd Zd ZdS )GoogleColabStatec                H    d| _         t                      | _        d | _        d S )NF)
is_checkedr   locksecretselfs    V/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fal_client/auth.py__init__zGoogleColabState.__init__   s    FF	%)    N)__name__
__module____qualname__r    r   r   r
   r
      s#        * * * * *r   r
   returnboolc                 |    	 ddl m}  dt           |                       v S # t          $ r Y dS t          $ r Y dS w xY w)Nr   get_ipythonzgoogle.colabF)IPythonr   strModuleNotFoundError	NameErrorr   s    r   is_google_colabr!      sm    ''''''[[]]!3!333   uu   uus   ! 
;	;;Optional[str]c                    t                      sd S t          j        5  t          j        rt          j        cd d d            S 	 ddlm}  n# t          $ r Y d d d            d S w xY w	 |                     d          }|	                                t          _        n# t          $ r d t          _        Y nw xY wdt          _        t          j        cd d d            S # 1 swxY w Y   d S )Nr   )userdataFAL_KEYT)r!   _colab_stater   r   r   google.colabr$   ImportErrorgetstrip	Exception)r$   tokens     r   get_colab_tokenr-   %   s}    t		 # #" 	'&# # # # # # # #	------- 	 	 	# # # # # # # #		'LL++E"'++--L 	' 	' 	'"&L	' #'"!# # # # # # # # # # # # # # # # # #sY   CA
	C

A#C"A##C'3BCB41C3B44CC"Cc                      e Zd ZdS )MissingCredentialsErrorN)r   r   r   r   r   r   r/   r/   ;   s        Dr   r/   T)frozenc                  H    e Zd ZU dZded<   ded<   ed
d            ZddZd	S )AuthCredentialsz)Represents an authorization header value.r   schemer,   r   c                $    | j          d| j         S )N )r3   r,   r   s    r   header_valuezAuthCredentials.header_valueF   s    +,,
,,,r   dict[str, str]c                    d| j         iS )NAuthorization)r6   r   s    r   
as_headerszAuthCredentials.as_headersJ   s    !233r   Nr   r   )r   r7   )r   r   r   __doc____annotations__propertyr6   r:   r   r   r   r2   r2   ?   s`         33KKKJJJ- - - X-4 4 4 4 4 4r   r2   FAL_RUN_HOSTzfal.runFAL_QUEUE_RUN_HOSTzqueue.zauth.fal.aizhttps://z/oauth/token TwXR51Vz8JbY8GUUMy6EyuVR0fTO7N4Nauth0_tokenz
.portalockz.falr   c                     t          t          j        dt          t                                                                        S )NFAL_HOME_DIR)r   osgetenvr   DEFAULT_FAL_HOME
expanduserr   r   r   _get_fal_home_dirrI   Y   s1    	.#.>*?*?@@AALLNNNr   c               #  2  K   	 ddl } n# t          $ r dV  Y dS w xY wt                      t          z  }|j                            dd           | j                            t          |          dd          5  dV  ddd           dS # 1 swxY w Y   dS )z%Best effort lock shared with fal-cli.r   NTparentsexist_okF   )fail_when_lockedtimeout)	portalockerr+   rI   AUTH_LOCK_FILENAMEparentmkdirutilsTemporaryFileLockr   )rQ   	lock_files     r   _token_lockrX   ]   s         "##&88I4$777			,	,I 
- 
 
   	                 s   	 :BBB#tuple[Optional[str], Optional[str]]c                    t                      t          z  } |                                 sdS d |                                                                 D             }|sdS |d         }d }t          |          dk    r|d         }|pd |pd fS )N)NNc                ^    g | ]*}|                                 |                                 +S r   )r*   ).0lines     r   
<listcomp>z%_read_auth_tokens.<locals>.<listcomp>t   s-    TTTdtzz||TTZZ\\TTTr   r      )rI   AUTH_TOKEN_FILENAMEexists	read_text
splitlineslen)pathlinesrefresh_tokenaccess_tokens       r   _read_auth_tokensri   o   s    !44D;;== zTTdnn&6&6&A&A&C&CTTTE z!HM"&L
5zzA~~Qx D,"6$66r   rg   r   rh   Nonec                    t                      t          z  }|j                            dd           | g}|r|                    |           |                    d                    |                     d S )NTrK   
)rI   r`   rS   rT   append
write_textjoin)rg   rh   re   contentss       r   _write_auth_tokensrq      ss    !44DKdT222H &%%%OODIIh''(((((r   r,   Optional[int]c                H   	 |                      d          d         }dt          |           dz  z  }t          j        ||z             }t	          j        |                    d                    }t          |                    d                    S # t          $ r Y dS w xY w)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*?W+DEEGNN733446::e$$%%%   tts   BB 
B! B!i,  )leeway_secondsr   r~   c               \    t          |           }|dS t          j                    |z   |k    S )NT)r   time)r,   r   rw   s      r   _is_access_token_expiredr      s/    
%
 
 C
{t9;;'3..r   dictc                    t          j        t          dt          | dd          }	 |                                }n# t
          $ r i }Y nw xY w|j        dk    sd|vrt          d          |S )Nrg   )
grant_type	client_idrg      )datarP      rh   zDFailed to refresh fal auth token. Please run `fal auth login` again.)httpxpostAUTH0_TOKEN_URLAUTH0_CLIENT_IDr{   r+   status_coder/   )rg   response
token_datas      r   _refresh_access_tokenr      s    z)(*
 

   H]]__

   


 s""nJ&F&F%R
 
 	
 s   < A
Ac                 h   t                      5  t                      \  } }ddd           n# 1 swxY w Y   | sdS |rt          |          s|S t          |           }|                    d|           }|d         }t                      5  t          ||           ddd           n# 1 swxY w Y   |S )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
    Nrg   rh   )rX   ri   r   r   r)   rq   )rg   rh   r   new_refresh
new_accesss        r   _load_bearer_token_from_loginr      sA    
 : :&7&9&9#|: : : : : : : : : : : : : : :  t 4\BB &}55J..-@@KN+J	 4 4;
3334 4 4 4 4 4 4 4 4 4 4 4 4 4 4 s   -11
B''B+.B+c                    t           j                            d          dk    } | st          j        d          x}rt	          d|          S t          j        d          x}r+t          j        d          x}rt	          d| d|           S t                      x}rt	          d|          S t                      x}rt	          d|          S t          d	          )
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`.)rE   environr)   rF   r2   r-   r   r/   )force_user_authkeykey_idfal_key_secretcolab_tokenbearers         r   fetch_auth_credentialsr      s     jnn%=>>#EO 7)I&&&3 	7"5#...	,///f 	7 i(8999N	7 #5V*F*Fn*F*FGGG+---[ 	7"5+666.000v 1x000
!i  r   c                     t                      } | j                                        dk    rt          d          | j        S )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   r3   lowerr/   r,   )auths    r   fetch_credentialsr      sG     "##D{e##%T
 
 	
 :r   )r   r   )r   r"   )r   r   )r   rY   )rg   r   rh   r"   r   rj   )r,   r   r   rr   )r,   r   r   r~   r   r   )rg   r   r   r   )r   r2   r;   )-
__future__r   ry   r{   rE   r   
contextlibr   dataclassesr   pathlibr   	threadingr   typingr   r   r
   r&   r!   r-   r+   r/   r2   r   r)   r?   r@   AUTH0_DOMAINr   r   r`   rR   homerG   rI   rX   ri   rq   r   r   r   r   r   r   r   r   r   <module>r      s   " " " " " "   				  % % % % % % ! ! ! ! ! !                   * * * * * * * *  !!   # # # #,	 	 	 	 	i 	 	 	 $4 4 4 4 4 4 4 4 z~~ni88Z^^$8:Q<:Q:QRR 7\7774# ! 49;;' O O O O   "7 7 7 7") ) ) )
 
 
 
 CF / / / / / /   0   8   6     r   