
    Ā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d)d
Zd*dZ G d de      Z e	d       G d d             Zej0                  j3                  dd      Zej0                  j3                  dde       ZdZde dZdZdZdZ  ejB                         dz  Z"d+dZ#ed        Z$d,dZ%d-d Z&d.d!Z'd"d#d/d$Z(d0d%Z)d*d&Z*d1d'Z+d2d(Z,y)3    )annotationsN)contextmanager)	dataclass)Path)Lock)Optionalc                      e Zd Zd Zy)GoogleColabStatec                >    d| _         t               | _        d | _        y )NF)
is_checkedr   locksecretselfs    S/var/www/html/content-pipeline/venv/lib/python3.12/site-packages/fal_client/auth.py__init__zGoogleColabState.__init__   s    F	%)    N)__name__
__module____qualname__r    r   r   r
   r
      s    *r   r
   c                 f    	 ddl m}  dt         |              v S # t        $ r Y yt        $ r Y yw xY w)Nr   get_ipythonzgoogle.colabF)IPythonr   strModuleNotFoundError	NameErrorr   s    r   is_google_colabr      s9    '[]!333  s    	000c                    t               sy t        j                  5  t        j                  rt        j                  cd d d        S 	 ddlm}  	 | j                  d      }|j                         t        _        dt        _        t        j                  cd d d        S # t        $ r Y d d d        y w xY w# t        $ r d t        _        Y Qw xY w# 1 sw Y   y xY w)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*B38C	B0%C/B00C3C
C	C

CCc                      e Zd Zy)MissingCredentialsErrorN)r   r   r   r   r   r   r,   r,   ;   s    r   r,   T)frozenc                  @    e Zd ZU dZded<   ded<   edd       Zd	dZy)
AuthCredentialsz)Represents an authorization header value.r   schemer)   c                8    | j                    d| j                   S )N )r0   r)   r   s    r   header_valuezAuthCredentials.header_valueF   s    ++a

|,,r   c                    d| j                   iS )NAuthorization)r3   r   s    r   
as_headerszAuthCredentials.as_headersJ   s    !2!233r   Nreturnr   )r8   zdict[str, str])r   r   r   __doc____annotations__propertyr3   r6   r   r   r   r/   r/   ?   s&    3KJ- -4r   r/   FAL_RUN_HOSTzfal.runFAL_QUEUE_RUN_HOSTzqueue.zauth.fal.aizhttps://z/oauth/token TwXR51Vz8JbY8GUUMy6EyuVR0fTO7N4Nauth0_tokenz
.portalockz.falc                 v    t        t        j                  dt        t                          j                         S )NFAL_HOME_DIR)r   osgetenvr   DEFAULT_FAL_HOME
expanduserr   r   r   _get_fal_home_dirrF   Y   s'    		.#.>*?@ALLNNr   c               #    K   	 ddl } t               t        z  }|j                  j                  dd       | j                  j                  t        |      dd      5  d ddd       y# t        $ r d Y yw xY w# 1 sw Y   yxY ww)z%Best effort lock shared with fal-cli.r   NTparentsexist_okF   )fail_when_lockedtimeout)	portalockerr(   rF   AUTH_LOCK_FILENAMEparentmkdirutilsTemporaryFileLockr   )rN   	lock_files     r   _token_lockrU   ]   s     
 "#&88I4$7				,	,I 
- 
  	    s@   B
A+ AB
A>"	B
+A;8B
:A;;B
>BB
c                 6   t               t        z  } | j                         sy| j                         j	                         D cg c]#  }|j                         s|j                         % }}|sy|d   }d }t        |      dkD  r|d   }|xs d |xs d fS c c}w )N)NNr      )rF   AUTH_TOKEN_FILENAMEexists	read_text
splitlinesr'   len)pathlinelinesrefresh_tokenaccess_tokens        r   _read_auth_tokensrb   o   s    !44D;;=&*nn&6&A&A&CTdtzz|TZZ\TET!HM"&L
5zA~Qx D,"6$66 Us   BBc                    t               t        z  }|j                  j                  dd       | g}|r|j	                  |       |j                  dj                  |             y )NTrH   
)rF   rX   rP   rQ   append
write_textjoin)r`   ra   r]   contentss       r   _write_auth_tokensri      sR    !44DKKdT2H%OODIIh'(r   c                   	 | j                  d      d   }dt        |       dz  z  }t        j                  ||z         }t	        j
                  |j                  d            }t        |j                  d            S # t        $ r Y yw xY w)z?Returns exp claim in seconds since epoch or None if unreadable..rW   =   zutf-8expN)
splitr\   base64urlsafe_b64decodejsonloadsdecodeintr&   r(   )r)   payload_segmentpaddingpayloadclaimss        r   _decode_jwt_exprz      s    ++c*1-#o..23**?W+DEGNN7346::e$%% s   A;A> >	B
	B
i,  )leeway_secondsc               R    t        |       }|yt        j                         |z   |k\  S )NT)rz   time)r)   r{   rn   s      r   _is_access_token_expiredr~      s*    
%
 C
{99;'3..r   c                    t        j                  t        dt        | dd      }	 |j	                         }|j                  dk7  sd|vrt        d      |S # t
        $ r i }Y -w xY w)Nr`   )
grant_type	client_idr`      )datarM      ra   zDFailed to refresh fal auth token. Please run `fal auth login` again.)httpxpostAUTH0_TOKEN_URLAUTH0_CLIENT_IDrr   r(   status_coder,   )r`   response
token_datas      r   _refresh_access_tokenr      s{    zz)(*

 H]]_
 s"nJ&F%R
 	
   
s   A A$#A$c                    t               5  t               \  } }ddd        syrt        |      s|S t        |       }|j	                  d|       }|d   }t               5  t        ||       ddd       |S # 1 sw Y   ^xY w# 1 sw Y   |S xY w)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
    Nr`   ra   )rU   rb   r~   r   r&   ri   )r`   ra   r   new_refresh
new_accesss        r   _load_bearer_token_from_loginr      s     
 :&7&9#|: 4\B&}5J..-@KN+J	 4;
34 !: :4 s   A6B6A?Bc                    t         j                  j                  d      dk(  } | szt        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`.)rB   environr&   rC   r/   r*   r   r,   )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                 ~    t               } | j                  j                         dk7  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   r0   lowerr,   r)   )auths    r   fetch_credentialsr      s=     "#D{{e#%T
 	
 ::r   )r8   bool)r8   Optional[str])r8   r   )r8   z#tuple[Optional[str], Optional[str]])r`   r   ra   r   r8   None)r)   r   r8   zOptional[int])r)   r   r{   ru   r8   r   )r`   r   r8   dict)r8   r/   r7   )-
__future__r   rp   rr   rB   r}   
contextlibr   dataclassesr   pathlibr   	threadingr   typingr   r   r
   r#   r   r*   r(   r,   r/   r   r&   r<   r=   AUTH0_DOMAINr   r   rX   rO   homerD   rF   rU   rb   ri   rz   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# ! 499;' O  "7")
 CF /086r   