o
    yi                     @  sz  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	 d	Ze ZdCddZdDddZG dd deZe	ddG d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! d! Z"dEd#d$Z#ed%d& Z$dFd(d)Z%dGd.d/Z&dHd2d3Z'd4d5dId8d9Z(dJd;d<Z)dDd=d>Z*dKd?d@Z+dLdAdBZ,dS )M    )annotationsN)contextmanager)	dataclass)Path)Lock)Optionalc                   @  s   e Zd Zdd ZdS )GoogleColabStatec                 C  s   d| _ t | _d | _d S )NF)
is_checkedr   locksecretself r   G/home/livre-enfant/venv/lib/python3.10/site-packages/fal_client/auth.py__init__   s   
zGoogleColabState.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s    r   returnboolc                  C  sD   zddl m}  dt|  v W S  ty   Y dS  ty!   Y dS w )Nr   get_ipythonzgoogle.colabF)IPythonr   strModuleNotFoundError	NameErrorr   r   r   r   is_google_colab   s   r   Optional[str]c               	   C  s   t  sd S tjM tjrtjW  d    S zddlm}  W n ty.   Y W d    d S w z| d}|	 t_W n t
yG   d t_Y nw dt_tjW  d    S 1 sXw   Y  d S )Nr   )userdataFAL_KEYT)r   _colab_stater
   r	   r   google.colabr   ImportErrorgetstrip	Exception)r   tokenr   r   r   get_colab_token%   s*   

$r'   c                   @  s   e Zd ZdS )MissingCredentialsErrorN)r   r   r   r   r   r   r   r(   ;   s    r(   T)frozenc                   @  s:   e Zd ZU dZded< ded< edddZdd	d
ZdS )AuthCredentialsz)Represents an authorization header value.r   schemer&   r   c                 C  s   | j  d| j S )N )r+   r&   r   r   r   r   header_valueF   s   zAuthCredentials.header_valuedict[str, str]c                 C  s
   d| j iS )NAuthorization)r-   r   r   r   r   
as_headersJ   s   
zAuthCredentials.as_headersNr   r   )r   r.   )r   r   r   __doc____annotations__propertyr-   r0   r   r   r   r   r*   ?   s   
 r*   FAL_RUN_HOSTzfal.runFAL_QUEUE_RUN_HOSTzqueue.zauth.fal.aizhttps://z/oauth/token TwXR51Vz8JbY8GUUMy6EyuVR0fTO7N4Nauth0_tokenz
.portalockz.falr   c                   C  s   t tdtt S )NFAL_HOME_DIR)r   osgetenvr   DEFAULT_FAL_HOME
expanduserr   r   r   r   _get_fal_home_dirY   s   r>   c                  c  s    zddl } W n ty   dV  Y dS w t t }|jjddd | jjt|ddd dV  W d   dS 1 s<w   Y  dS )z%Best effort lock shared with fal-cli.r   NTparentsexist_okF   )fail_when_lockedtimeout)	portalockerr%   r>   AUTH_LOCK_FILENAMEparentmkdirutilsTemporaryFileLockr   )rE   	lock_filer   r   r   _token_lock]   s   

"rL   #tuple[Optional[str], Optional[str]]c                  C  sd   t  t } |  sdS dd |   D }|sdS |d }d }t|dkr*|d }|p-d |p0d fS )N)NNc                 S  s   g | ]
}|  r|  qS r   )r$   ).0liner   r   r   
<listcomp>t   s    z%_read_auth_tokens.<locals>.<listcomp>r      )r>   AUTH_TOKEN_FILENAMEexists	read_text
splitlineslen)pathlinesrefresh_tokenaccess_tokenr   r   r   _read_auth_tokenso   s   
r[   rY   r   rZ   Nonec                 C  sB   t  t }|jjddd | g}|r|| |d| d S )NTr?   
)r>   rR   rG   rH   append
write_textjoin)rY   rZ   rW   contentsr   r   r   _write_auth_tokens   s   

rb   r&   Optional[int]c                 C  sd   z'|  dd }dt| d  }t|| }t|d}t|dW S  t	y1   Y dS w )z?Returns exp claim in seconds since epoch or None if unreadable..rQ   =   zutf-8expN)
splitrV   base64urlsafe_b64decodejsonloadsdecodeintr#   r%   )r&   payload_segmentpaddingpayloadclaimsr   r   r   _decode_jwt_exp   s   rs   i,  )leeway_secondsrt   rn   c                C  s$   t | }|d u r
dS t | |kS )NT)rs   time)r&   rt   rg   r   r   r   _is_access_token_expired   s   rv   dictc                 C  sZ   t jtdt| ddd}z| }W n ty   i }Y nw |jdks'd|vr+td|S )NrY   )
grant_type	client_idrY      )datarD      rZ   zDFailed to refresh fal auth token. Please run `fal auth login` again.)httpxpostAUTH0_TOKEN_URLAUTH0_CLIENT_IDrk   r%   status_coder(   )rY   response
token_datar   r   r   _refresh_access_token   s$   
r   c                  C  s   t   t \} }W d   n1 sw   Y  | sdS |r$t|s$|S t| }|d| }|d }t   t|| W d   |S 1 sFw   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
    NrY   rZ   )rL   r[   rv   r   r#   rb   )rY   rZ   r   new_refresh
new_accessr   r   r   _load_bearer_token_from_login   s    	
r   c                  C  s   t jddk} | s8t d }rtd|S t d }r.t d }r.td| d| S t  }r8td|S t  }rBt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`.)r:   environr#   r;   r*   r'   r   r(   )force_user_authkeykey_idfal_key_secretcolab_tokenbearerr   r   r   fetch_auth_credentials   s   




r   c                  C  s"   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   r+   lowerr(   r&   )authr   r   r   fetch_credentials   s   r   )r   r   )r   r   )r   r   )r   rM   )rY   r   rZ   r   r   r\   )r&   r   r   rc   )r&   r   rt   rn   r   r   )rY   r   r   rw   )r   r*   r1   )-
__future__r   ri   rk   r:   ru   
contextlibr   dataclassesr   pathlibr   	threadingr   typingr   r}   r   r    r   r'   r%   r(   r*   r   r#   r5   r6   AUTH0_DOMAINr   r   rR   rF   homer<   r>   rL   r[   rb   rs   rv   r   r   r   r   r   r   r   r   <module>   sJ    







	

