
    g                       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	m
Z
mZmZmZmZ d dlmZmZmZ d dlmZ d	d
lmZmZmZmZmZmZ d	dlmZmZmZm Z m!Z! d	dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d	dl.m/Z/ d	dl0m1Z1 d	dl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZW ddlXmYZY ddlZm[Z[ ddl\m]Z] ddl^m_Z_m`Z`  G d de[      Zay)    )annotations)suppress)partial)loads)time)CallableDictListOptionalTuple)parse_qs	urlencodeurlparse)uuid4   )DEFAULT_HEADERSEXPIRY_MARGIN
GOTRUE_URLMAX_RETRIESRETRY_INTERVALSTORAGE_KEY)AuthApiErrorAuthImplicitGrantRedirectErrorAuthInvalidCredentialsErrorAuthRetryableErrorAuthSessionMissingError)decode_jwt_payloadgenerate_pkce_challengegenerate_pkce_verifier
model_dumpmodel_dump_jsonmodel_validateparse_auth_otp_responseparse_auth_responseparse_link_identity_responseparse_sso_responseparse_user_response)AsyncClient)Timer)%AuthChangeEventAuthenticatorAssuranceLevelsAuthFlowTypeAuthMFAChallengeResponseAuthMFAEnrollResponse-AuthMFAGetAuthenticatorAssuranceLevelResponseAuthMFAListFactorsResponseAuthMFAUnenrollResponseAuthMFAVerifyResponseAuthOtpResponseAuthResponseCodeExchangeParamsDecodedJWTDictIdentitiesResponseMFAChallengeAndVerifyParamsMFAChallengeParamsMFAEnrollParamsMFAUnenrollParamsMFAVerifyParamsOAuthResponseOptionsProviderResendCredentialsSessionSignInAnonymouslyCredentialsSignInWithIdTokenCredentialsSignInWithOAuthCredentialsSignInWithPasswordCredentials!SignInWithPasswordlessCredentialsSignInWithSSOCredentialsSignOutOptionsSignUpWithPasswordCredentialsSubscriptionUserAttributesUserIdentityUserResponseVerifyOtpParams   )AsyncGoTrueAdminAPI)AsyncGoTrueBaseAPI)AsyncGoTrueMFAAPI)AsyncMemoryStorageAsyncSupportedStoragec                  ~   e Zd Zddddddddddd
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7dZddd8dZd9dZd:d	Z	 d;	 	 	 d<d
Z	 	 	 	 d=dZ	 	 	 	 d>dZ		 	 	 	 d?dZ
d@dZ	 	 	 	 dAdZ	 	 	 	 dAdZd ZdBdZ	 	 	 	 dCdZ	 	 	 	 dDdZdEdZdFdZdGdZd;dHdZdIdZdJdZ	 d;	 	 	 dKdZddifdLdZ	 	 	 	 dMdZi fdNd Zi f	 	 	 	 	 dNd!ZdOd"ZdPd#Z	 	 	 	 dQd$ZdRd%Z dSd&Z!dTd'Z"	 	 dUd(Z#d9d)Z$	 	 	 	 dVd*Z%d9d+Z&dWd,Z'dXd-Z(dYd.Z)dZd/Z*	 	 	 	 	 	 d[d0Z+	 	 	 	 d\d1Z,	 	 	 	 	 	 d]d2Z-d^d3Z.	 	 	 	 	 	 	 	 d_d4Z/d`d5Z0dad6Z1y)bAsyncGoTrueClientNTimplicit)
urlheadersstorage_keyauto_refresh_tokenpersist_sessionstoragehttp_client	flow_typeverifyproxyc       
           t        j                  | |xs t        |xs t        ||	|
       |xs t        | _        || _        || _        |xs
 t               | _	        d | _
        d | _        d| _        i | _        || _        t        | j                   | j"                  | j$                        | _        t)               | _        | j,                  | j*                  _        | j0                  | j*                  _        | j4                  | j*                  _        | j8                  | j*                  _        | j<                  | j*                  _        | j@                  | j*                  _!        | jD                  | j*                  _#        y )N)rX   rY   r^   r`   ra   r   )rX   rY   r^   )$rQ   __init__r   r   r   _storage_key_auto_refresh_token_persist_sessionrS   _storage_in_memory_session_refresh_token_timer_network_retries_state_change_emitters
_flow_typerP   _url_headers_http_clientadminrR   mfa
_challenge	challenge_challenge_and_verifychallenge_and_verify_enrollenroll"_get_authenticator_assurance_level!get_authenticator_assurance_level_list_factorslist_factors	_unenrollunenroll_verifyr`   )selfrX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   s              P/var/www/openai/venv/lib/python3.12/site-packages/gotrue/_async/gotrue_client.pyrc   zAsyncGoTrueClient.__init__W   s,    	##!z.#	
 (6;#5  /7#5#75959! !?A##(		MM))


 %&!__(,(B(B%,,33 	2 !% 2 2 NN,,    )rX   c                  K   |r+| j                  |      r| j                  |       d {    y | j                          d {    y 7 7 wN)_is_implicit_grant_flowinitialize_from_urlinitialize_from_storage)r   rX   s     r   
initializezAsyncGoTrueClient.initialize   sE     4//4**3///..000 00s!   (AA	AAAAc                >   K   | j                          d {   S 7 wr   )_recover_and_refreshr   s    r   r   z)AsyncGoTrueClient.initialize_from_storage   s     ..0000s   c                P  K   	 | j                  |      r`| j                  |       d {   \  }}| j                  |       d {    | j                  d|       |dk(  r| j                  d|       y y y 7 L7 2# t        $ r }| j                          d {  7   |d }~ww xY ww)N	SIGNED_INrecoveryPASSWORD_RECOVERY)r   _get_session_from_url_save_session_notify_all_subscribers	Exception_remove_session)r   rX   sessionredirect_typees        r   r   z%AsyncGoTrueClient.initialize_from_url   s     		++C0/3/I/I#/N)N&((111,,['B J.001DgN /	 1)N1  	&&(((G	sV   B&%A: A6A: A8-A: 3B&6A: 8A: :	B#BBBB##B&c                  K   | j                          d{    |di i}|j                  di       }|j                  d      xs i }|j                  d      }| j                  dd|d|idt               d{   }|j                  r?| j                  |j                         d{    | j                  d	|j                         |S 7 7 S7 &w)
z/
        Creates a new anonymous user.
        Noptionsdatacaptcha_tokenPOSTsignup)r   gotrue_meta_securitybodyxformr   r   get_requestr$   r   r   r   )r   credentialsr   r   r   responses         r   sign_in_anonymouslyz%AsyncGoTrueClient.sign_in_anonymously   s      ""$$$$b/K//)R0{{6"(bO4#]) & ' 

 

 $$X%5%5666((h6F6FG) 	%

 7s4   CCA#C:C;.C)C*#CCCc           
       K   | j                          d{    |j                  d      }|j                  d      }|j                  d      }|j                  di       }|j                  d      xs |j                  d      }|j                  d      xs i }|j                  d	d
      }|j                  d      }	|r*| j                  dd|||d|	id|t               d{   }
n7|r*| j                  dd||||d|	idt               d{   }
nt	        d      |
j
                  r?| j                  |
j
                         d{    | j                  d|
j
                         |
S 7 V7 7 b7 )w)z%
        Creates a new user.
        Nemailphonepasswordr   redirect_toemail_redirect_tor   channelsmsr   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   ?You must provide either an email or phone number and a passwordr   r   r   r   r$   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   s              r   sign_upzAsyncGoTrueClient.sign_up   s     ""$$$((??:.//)R0kk-0TGKK@S4T{{6"(b++i/O4!]]" ( '-	 () +  H !]]" ( &'- * +  H .Q  $$X%5%5666((h6F6FG] 	%& 7sF   E5E,CE5"E/#+E5E1:E5	E3
#E5/E51E53E5c           	       K   | j                          d{    |j                  d      }|j                  d      }|j                  d      }|j                  di       }|j                  d      xs i }|j                  d      }|r,| j                  dd	|||d|id
ddit               d{   }n9|r,| j                  dd	|||d|idddit               d{   }nt	        d      |j
                  r?| j                  |j
                         d{    | j                  d|j
                         |S 7 $7 7 b7 )w)zN
        Log in an existing user with an email or phone and password.
        Nr   r   r   r   r   r   r   tokenr   
grant_typer   queryr   )r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   s	            r   sign_in_with_passwordz'AsyncGoTrueClient.sign_in_with_password   su     ""$$$((??:.//)R0{{6"(bO4!]]" ( '-	 !* * +  H  !]]" ( '-	 !* * +  H" .Q  $$X%5%5666((h6F6FGa 	%"* 7sF   ED:BE.D=/-ED?:EE#E=E?EEc           
       K   | j                          d{    |j                  d      }|j                  d      }|j                  d      }|j                  d      }|j                  di       }|j                  d      }| j                  dd||||d|id	d
dit               d{   }|j                  r?| j                  |j                         d{    | j                  d|j                         |S 7 7 S7 &w)z}
        Allows signing in with an OIDC ID token. The authentication provider used should be enabled and configured.
        Nproviderr   access_tokennoncer   r   r   )r   id_tokenr   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   s	            r   sign_in_with_id_tokenz'AsyncGoTrueClient.sign_in_with_id_token,  s     ""$$$??:.("~6(//)R0O4$! ,#]) j & ' 
 
$ $$X%5%5666((h6F6FG; 	%
& 7s4   DC;BD)C=*.DC?#D=D?Dc                  K   | j                          |j                  d      }|j                  d      }|j                  di       }|j                  d      }|j                  d      }|j                  dd      }|r | j                  dd	||d|id
|t              S |r | j                  dd	||d|id|t              S t	        d      w)a  
        Attempts a single-sign on using an enterprise Identity Provider. A
        successful SSO attempt will redirect the current page to the identity
        provider authorization page. The redirect URL is implementation and SSO
        protocol specific.

        You can use it by providing a SSO domain. Typically you can extract this
        domain by asking users for their email address. If this domain is
        registered on the Auth instance the redirect will use that organization's
        currently active SSO Identity Provider for the login.
        If you have built an organization-specific login page, you can use the
        organization's SSO Identity Provider UUID directly instead.
        provider_iddomainr   r   r   skip_http_redirectTr   sso)r   r   r   r   )r   r   r   z/You must provide either a domain or provider_id)r   r   r   r&   r   )r   r   r   r   r   r   r   r   s           r   sign_in_with_ssoz"AsyncGoTrueClient.sign_in_with_ssoR  s      	!oom4*//)R0kk-0O4 %[[)=tD==$*<'- (( !   ==#.*<'- (( !   *=
 	
s   CC
c                v  K   | j                          d{    |j                  d      }|j                  di       }|j                  d      }|j                  d      }|j                  di       }|r||d<   |r||d<   | j                  | j                   d||       d{   }t	        ||      S 7 7 w)	zE
        Log in an existing user via a third-party provider.
        Nr   r   r   scopesquery_paramsz
/authorizer   rX   )r   r   _get_url_for_providerrm   r=   )r   r   r   r   r   r   paramsrX   s           r   sign_in_with_oauthz$AsyncGoTrueClient.sign_in_with_oauth  s      ""$$$??:.//)R0kk-0X&^R0$/F=!%F8..yyk$h
 
 hC88 	%
s"   B9B5BB9#B7$B97B9c                  K   |j                  d      }|j                  di       }|j                  d      }|j                  d      }|j                  di       }|r||d<   |r||d<   d|d<   | j                  d||       d {   }| j                          d {   }|s
t               | j	                  d	||j
                  t        
       d {   }	t        ||	j                        S 7 j7 T7 w)Nr   r   r   r   r   truer   zuser/identities/authorizeGET)methodpathjwtr   r   )	r   r   get_sessionr   r   r   r%   r=   rX   )
r   r   r   r   r   r   r   rX   r   r   s
             r   link_identityzAsyncGoTrueClient.link_identity  s      ??:.//)R0kk-0X&^R0$/F=!%F8'-#$..'6
 
 ((**)++$$.	 ' 
 
 hHLLAA
 +
s6   BC4C.C4C06C4C2C40C42C4c                   K   | j                          d {   }|j                  r t        |j                  j                        S t	               S 7 :w)N)
identities)get_useruserr7   r   r   )r   r   s     r   get_user_identitiesz%AsyncGoTrueClient.get_user_identities  sH     ( }} (--*B*BC	
 )*	
 )s   AA;Ac                   K   | j                          d {   }|s
t               | j                  dd|j                   |j                         d {   S 7 C7 w)NDELETEzuser/identities/)r   )r   r   r   identity_idr   )r   identityr   s      r   unlink_identityz!AsyncGoTrueClient.unlink_identity  sf     ((**)++]]x3345$$ # 
 
 	
	 +
s!   AA>AAAAc           
       K   | j                          d{    |j                  d      }|j                  d      }|j                  di       }|j                  d      }|j                  dd      }|j                  d      }|j                  d	d
      }|j                  d      }	|r)| j                  dd|||d|	id|t               d{   S |r)| j                  dd||||d|	idt               d{   S t	        d      7 7 <7 w)a  
        Log in a user using magiclink or a one-time password (OTP).

        If the `{{ .ConfirmationURL }}` variable is specified in
        the email template, a magiclink will be sent.

        If the `{{ .Token }}` variable is specified in the email
        template, an OTP will be sent.

        If you're using phone sign-ins, only an OTP will be sent.
        You won't be able to send a magiclink for phone sign-ins.
        Nr   r   r   r   should_create_userTr   r   r   r   r   otp)r   r   create_userr   r   )r   r   r   r   r   r   0You must provide either an email or phone number)r   r   r   r#   r   )
r   r   r   r   r   r   r   r   r   r   s
             r   sign_in_with_otpz"AsyncGoTrueClient.sign_in_with_otp  sB      ""$$$((//)R0#KK(;<$[[)=tD{{6"++i/O4" #5'-	 .- '    " #5&'- . '    *>
 	
O 	%s4   DDB5DD	*D7D8D	DDc                  K   |j                  d      }|j                  d      }|j                  d      }|j                  di       }|j                  d      }|j                  d      }|d|id}||t        d	      |j                  |rd|ind|i       | j                  d
d||r|ndt               d{   S 7 w)zq
        Resends an existing signup confirmation email, email change email, SMS OTP or phone change OTP.
        r   r   typer   r   r   )r   r   Nr   r   resendr   )r   r   updater   r#   )	r   r   r   r   r   r   r   r   r   s	            r   r   zAsyncGoTrueClient.resend  s      ((v&//)R0#KK(;<O4%
 =U]-B  	We$GU3CD]]-2)) # 
 
 	
 
s   B8C:B?;Cc           
       K   | j                          d{    | j                  dddd|j                  di       j                  d      ii||j                  di       j                  d      t               d{   }|j                  r?| j                  |j                         d{    | j                  d	|j                         |S 7 7 S7 &w)
zN
        Log in a user given a User supplied OTP received via mobile.
        Nr   r`   r   r   r   r   r   r   )r   r   r   r$   r   r   r   r   r   r   s      r   
verify_otpzAsyncGoTrueClient.verify_otp0  s      ""$$$&#VZZ	2%>%B%B?%S) 	 

9b155mD% ' 
 
 $$X%5%5666((h6F6FG! 	%
 7s4   CCA%C<C=.C+C,#CCCc                   K   | j                          d {   }|s
t               | j                  dd|j                  t               d {   S 7 ;7 w)Nr   reauthenticater   r   )r   r   r   r   r$   )r   r   s     r   r   z AsyncGoTrueClient.reauthenticateF  s[     ((**)++]]$$%	 # 
 
 	
	 +
s!   AA6AAAAc                  K   d}| j                   rY| j                  j                  | j                         d{   }| j	                  |      }|s%| j                          d{    n| j                  }|syt        t                     }|j                  r|j                  |t        z   k  nd}|r#| j                  |j                         d{   S |S 7 7 t7 
w)z
        Returns the session, refreshing it if necessary.

        The session returned can be null if the session is not detected which
        can happen in the event a user is not signed-in or has logged out.
        NF)rf   rg   get_itemrd   _get_valid_sessionr   rh   roundr   
expires_atr   _call_refresh_tokenrefresh_token)r   current_sessionmaybe_sessiontime_nowhas_expireds        r   r   zAsyncGoTrueClient.get_sessionR  s      .2  "&--"8"89J9J"KKM"55mDO"**,,,"55O= )) &&(]*BB 	  **?+H+HII	
 !	
 L - Js4   7CC*C$C%A+CCCCCc                   K   |s(| j                          d{   }|r|j                  }ny| j                  dd|t               d{   S 7 57 w)z
        Gets the current user details if there is an existing session.

        Takes in an optional access token `jwt`. If no `jwt` is provided,
        `get_user()` will attempt to get the `jwt` from the current session.
        Nr   r   r   )r   r   r   r'   )r   r   r   s      r   r   zAsyncGoTrueClient.get_usero  sT       ,,..G**]]5&cAT]UUU /
 Vs!   AA0A	A
AAc                2  K   | j                          d{   }|s
t               | j                  dd||j                  t               d{   }|j
                  |_        | j                  |       d{    | j                  d|       |S 7 z7 D7 w)zB
        Updates user data, if there is a logged in user.
        NPUTr   r   r   r   USER_UPDATED)r   r   r   r   r'   r   r   r   )r   
attributesr   r   s       r   update_userzAsyncGoTrueClient.update_user~  s      ((**)++$$% ' 
 
  }}  )))$$^W= +
 	*s3   BB7BB)B8B9BBBc                b  K   t        t                     }|}d}d}|rH|j                  d      d   r4| j                  |      }|j	                  d      }|rt        |      }||k  }|rH|s
t               | j                  |       d{   }	|	j                  s
t               S |	j                  }n7| j                  |       d{   }	t        |||	j                  d||z
  |      }| j                  |       d{    | j                  d|       t        ||	j                  	      S 7 7 f7 1w)
a;  
        Sets the session data from the current session. If the current session
        is expired, `set_session` will take care of refreshing it to obtain a
        new session.

        If the refresh token in the current session is invalid and the current
        session has expired, an error will be thrown.

        If the current session does not contain at `expires_at` field,
        `set_session` will use the exp claim defined in the access token.

        The current session that minimally contains an access token,
        refresh token and a user.
        TN.rO   expbearer)r   r   r   
token_type
expires_inr   TOKEN_REFRESHEDr   r   )r   r   split_decode_jwtr   intr   _refresh_access_tokenr   r4   r   rA   r   r   r   )
r   r   r   r   r   r   r   payloadr  r   s
             r   set_sessionzAsyncGoTrueClient.set_session  s)     =
%)L..s3A6&&|4G++e$C X
(H4 -//!77FFH###~%&&G!]]<88H)+]]#%0%G   )))$$%6@G(--@@! G
 9 	*s6   BD/D)	;D/D+6D/;D-<.D/+D/-D/c                   K   |s&| j                          d{   }|r|j                  }|s
t               | j                  |       d{   }t	        ||j
                        S 7 N7 w)a'  
        Returns a new session, regardless of expiry status.

        Takes in an optional current session. If not passed in, then refreshSession()
        will attempt to retrieve it from getSession(). If the current session's
        refresh token is invalid, an error will be thrown.
        Nr  )r   r   r   r   r4   r   )r   r   r   s      r   refresh_sessionz!AsyncGoTrueClient.refresh_session  sf       ,,..G ' 5 5)++00??G',,?? /
 @s!   A+A'2A+A)A+)A+scopeglobalc                f  K   t        t              5  | j                          d{   }|r|j                  nd}|r'| j                  j                  ||d          d{    |d   dk7  r*| j                          d{    | j                  dd       ddd       y7 x7 A7 ## 1 sw Y   yxY ww)a	  
        Inside a browser context, `sign_out` will remove the logged in user from the
        browser session and log them out - removing all items from localstorage and
        then trigger a `"SIGNED_OUT"` event.

        For server-side management, you can revoke all refresh tokens for a user by
        passing a user's JWT through to `api.sign_out`.

        There is no way to revoke a user's access token jwt until it expires.
        It is recommended to set a shorter expiry on the jwt for this reason.
        Nr  others
SIGNED_OUT)r   r   r   r   rp   sign_outr   r   )r   r   r   r   s       r   r  zAsyncGoTrueClient.sign_out  s      l# ,,..G3:7//Ljj)),8HIIIw8+**,,,,,\4@ $#. J - $#sP   B1B%B8B%B! B%?B# B%	B1B%!B%#B%%B.*B1c                x     t        t                     d fd}t        ||      }| j                  <   |S )zJ
        Receive a notification every time an auth event happens.
        c                 <     j                   j                         y r   )rk   pop)r   	unique_ids   r   _unsubscribez<AsyncGoTrueClient.on_auth_state_change.<locals>._unsubscribe  s    ''++I6r   )idcallbackunsubscribereturnNone)strr   rJ   rk   )r   r  r  subscriptionr  s   `   @r   on_auth_state_changez&AsyncGoTrueClient.on_auth_state_change  sB     L		7 $$

 2>##I.r   c           	        K   | j                  dd|d|j                  d      id|j                  d             d{    y7 w)E
        Sends a password reset request to an email address.
        r   recoverr   )r   r   r   )r   r   N)r   r   r   r   r   s      r   reset_password_for_emailz*AsyncGoTrueClient.reset_password_for_email  sR      mm#W[[%A)  M2  

 
	
 
	
s   <AAAc                D   K   | j                  ||       d{    y7 w)r&  N)r)  r(  s      r   reset_password_emailz&AsyncGoTrueClient.reset_password_email  s      ++E7;;;s     c           
       K   | j                          d {   }|s
t               |d   |d   d}|d   dk(  r	|d   |d<   n|d   |d<   | j                  dd||j                  t	        t
        t                     d {   }|d   d	k(  r>|j                  j                  r(d
|j                  j                   |j                  _        |S 7 7 Nw)Nfriendly_namefactor_type)r-  r.  r   issuerr   factorsr   totpzdata:image/svg+xml;utf-8,)	r   r   r   r   r   r"   r.   r1  qr_code)r   r   r   r   r   s        r   rv   zAsyncGoTrueClient._enroll  s     ((**)++ $O4!-0

 - G+"7ODM#H-DN$$.*?@ ' 
 
 - F*x}}/D/D&?@U@U?V$WHMM!/ +
s#   CCA)C CACCc           
       K   | j                          d {   }|s
t               | j                  dd|j                  d       dd|j                  d      i|j                  t        t        t                     d {   S 7 n7 w)Nr   factors/	factor_idz
/challenger   r   )r   r   r   r   r   r   r"   r-   r   r   r   s      r   rr   zAsyncGoTrueClient._challenge2  s     ((**)++]]vzz+./z:VZZ	23$$.*BC # 
 
 	
 +
s"   B	BA)B	 BB	B	c                   K   | j                  d|j                  d      i       d {   }| j                  |j                  d      |j                  |j                  d      d       d {   S 7 I7 w)Nr5  code)r5  challenge_idr8  )rr   r   r~   r  r   s      r   rt   z'AsyncGoTrueClient._challenge_and_verify>  su      VZZ4
 

 \\#ZZ4 (

6*
 
 	



s"   &A6A2AA6-A4.A64A6c           
       K   | j                          d {   }|s
t               | j                  dd|j                  d       d||j                  t        t        t                     d {   }t        t        t        |            }| j                  |       d {    | j                  d|       |S 7 7 L7 w)Nr   r4  r5  z/verifyr   MFA_CHALLENGE_VERIFIED)r   r   r   r   r   r   r"   r2   rA   r    r   r   )r   r   r   r   s       r   r~   zAsyncGoTrueClient._verifyO  s     ((**)++vzz+./w7$$.*?@ ' 
 
 !*X*>?  )))$$%=wG +
 	*s4   C B:AC /B<01C !B>"C <C >C c           	        K   | j                          d {   }|s
t               | j                  dd|j                  d       |j                  t        t        t                     d {   S 7 [7 w)Nr   r4  r5  r   )r   r   r   r   r   r   r1   r"   r6  s      r   r|   zAsyncGoTrueClient._unenroll_  st     ((**)++]]vzz+./0$$1>B	 # 
 
 	
 +
s"   A6A2AA6-A4.A64A6c                ^  K   | j                          d {   }|j                  j                  xs g }|D cg c]$  }|j                  dk(  s|j                  dk(  s#|& }}|D cg c]$  }|j                  dk(  s|j                  dk(  s#|& }}t        |||      S 7 c c}w c c}w w)Nr1  verifiedr   )allr1  r   )r   r   r0  r.  statusr0   )r   r   r?  fr1  r   s         r   rz   zAsyncGoTrueClient._list_factorsj  s     (mm##)rU3a!--6"9ahh*>T3UWCq1==G#;J@VCW)cEJJ	 )UWsD   B-B!"B-B#B#B#"B-(B(=B(B(B-#
B-c                  K   | j                          d {   }|st        d d g       S | j                  |j                        }d }|j	                  d      r|j	                  d      }|j
                  j                  xs g D cg c]  }|j                  dk(  s| }}|rdn|}|j	                  d      xs g }t        |||      S 7 c c}w w)N)current_level
next_levelcurrent_authentication_methodsaalr>  aal2amr)r   r/   r
  r   r   r   r0  r@  )r   r   r  rC  rA  verified_factorsrD  rE  s           r   rx   z4AsyncGoTrueClient._get_authenticator_assurance_levelq  s      ((**@"/1 
 ""7#7#78@D;;u#KK.M||++1r1
1!QXX5KA1 	 
  0V]
)0U);)Ar&<'!+I
 	
! +
s(   CC
A/CCC,CCc                   K   | j                   r.| j                  j                  | j                         d {    nd | _        | j
                  r"| j
                  j                          d | _        y y 7 ;wr   )rf   rg   remove_itemrd   rh   ri   cancelr   s    r   r   z!AsyncGoTrueClient._remove_session  sb       --++D,=,=>>>&*D#$$%%,,.(,D% % ?s   5A5A3<A5c           
     t  K   | j                  |      st        d      t        |      }t        |j                        }| j                  |d      }|rM| j                  |d      }| j                  |d      }|st        d      |st        d      t        |||d      | j                  |d      }| j                  |d	      }| j                  |d
      }	|	st        d      | j                  |d      }
|
st        d      | j                  |d      }|st        d      | j                  |d      }|st        d      t        t                     }|t        |
      z   }| j                  |	       d {   }t        |||	t        |
      ||||j                        }| j                  |d      }||fS 7 @w)Nz$Not a valid implicit grant flow url.error_description
error_codeerrorzNo error_code detected.zNo error detected.)r8  rP  provider_tokenprovider_refresh_tokenr   zNo access_token detected.r  zNo expires_in detected.r   zNo refresh_token detected.r  zNo token_type detected.)rQ  rR  r   r  r   r   r  r   r   )r   r   r   r   r   
_get_paramr   r   r  r   rA   r   )r   rX   resultr   rN  rO  rP  rQ  rR  r   r  r   r  r   r   r   r   r   s                     r   r   z'AsyncGoTrueClient._get_session_from_url  s     ++C001WXX#&,,' OOF4GH>JOOFG4E45NOO45IJJ0!#e4  1AB!%9Q!Rv~>01LMM__V\:
01JKK@01MNN__V\:
01JKK=J/
]]<00)#9%:!'!	
 7%% 1s   E3F85F66AF8c                  K   | j                   j                  | j                         d {   }| j                  |      }|s|r| j	                          d {    y t        t                     }|j                  }|ru||t        z   k  ri|j                  }| j                  r8|r6| xj                  dz  c_        	 | j                  |       d {    d| _        | j	                          d {    y | j.                  r| j1                  |       d {    | j3                  d|       y 7 7 7 a# t        $ r}t        |t              r| j                  t         k  rt| j"                  r| j"                  j%                          t'        t(        | j                  dz  z  | j*                        | _        | j"                  j-                          Y d }~y Y d }~d }~ww xY w7 7 ͭw)NrO   r   d   r   )rg   r   rd   r   r   r   r   r   r   r   re   rj   r   r   
isinstancer   r   ri   rL  r)   r   r   startrf   r   r   )r   raw_sessionr   r   r   r   r   s          r   r   z&AsyncGoTrueClient._recover_and_refresh  s     MM2243D3DEE11+>**,,,=$//
*x-'??+99M''M%%*%22=AAA,-D) &&(((  $$_555$$[/BA F - B  "1&89 11K?44 55<<>49+0E0E0KL 5551 11779 ) 6s}   )G$D,,G$D/A!G$;D3 D1D3 G$.G /%G$G"G$/G$1D3 3	G<BG
G$GG$"G$c                  K   |s
t               | j                  |       d {   }|j                  s
t               | j                  |j                         d {    | j	                  d|j                         |j                  S 7 e7 .w)Nr  )r   r  r   r   r   )r   r   r   s      r   r   z%AsyncGoTrueClient._call_refresh_token  s     )++33MBB)++  !1!1222$$%68H8HI C 	3s!   !BB	8BB-BBc                Z   K   | j                  ddddid|it               d {   S 7 w)Nr   r   r   r   )r   r   r   )r   r$   )r   r   s     r   r  z'AsyncGoTrueClient._refresh_access_token  s?     ]]1!=1% # 
 
 	
 
s   "+)+c                  K   | j                   s|| _        |j                  }|rJt        t	                     }||z
  }|t
        kD  rt
        nd}||z
  dz  }| j                  |       d {    | j                   rE|j                  r8| j                  j                  | j                  t        |             d {    y y y 7 V7 	w)Ng      ?i  )rf   rh   r   r   r   r   _start_auto_refresh_tokenrg   set_itemrd   r!   )r   r   	expire_atr   	expire_inrefresh_duration_before_expiresvalues          r   r   zAsyncGoTrueClient._save_session  s     $$&-D#&&	TV}H!H,I!*]!: , !@@DHE00777  W%7%7--(():):OG<TUUU &8  8Us%   A'C)C *AC8C9CCc                    K    j                   r! j                   j                          d  _         |dk  s j                  sy  fd}t        ||       _          j                   j	                          y w)Nr   c                   K   xj                   dz  c_         	 j                          d {   } | r+j                  | j                         d {    d_         y y 7 27 # t        $ re}t        |t              rKj                   t        k  r3j                  t        j                   dz  z         d {  7   Y d }~y Y d }~y Y d }~y d }~ww xY ww)NrO   r   rV  )
rj   r   r   r   r   rW  r   r   r]  r   )r   r   r   s     r   refresh_token_functionzKAsyncGoTrueClient._start_auto_refresh_token.<locals>.refresh_token_function  s     !!Q&! $ 0 0 222273H3HIII,-D)  3I q"45--;88&4+@+@3+FG   < 6s]   CA$ A $A$ A"A$ C A$ "A$ $	C-AC8B;9C>CCC)ri   rL  re   r)   rX  )r   rb  re  s   `  r   r]  z+AsyncGoTrueClient._start_auto_refresh_token  se     $$%%,,.(,D%A:T55	  %*%1G$H!!!'')s   A1A4c                f    | j                   j                         D ]  }|j                  ||        y r   )rk   valuesr  )r   eventr   r#  s       r   r   z)AsyncGoTrueClient._notify_all_subscribers&  s.    
 !77>>@L!!%1 Ar   c                   |sy t        |      }|sy |j                  d      sy |j                  d      sy |j                  d      sy 	 t        |d         }||d<   	 t	        t
        |      S # t        $ r Y y w xY w# t        $ r Y y w xY w)Nr   r   r   )r   r   r  
ValueErrorr"   rA   r   )r   rY  r   r   s       r   r   z$AsyncGoTrueClient._get_valid_session.  s     [!xx'xx(xx%	T,/0J!+D	!'400  		  		s$   	A- A< -	A98A9<	BBc                    ||v r||   d   S d S )Nr    )r   r   names      r   rS  zAsyncGoTrueClient._get_paramG  s     
 )-(<|D!!$F$Fr   c                V    t        |      }t        |j                        }d|v xs d|v S )Nr   rN  )r   r   r   )r   rX   rT  r   s       r   r   z)AsyncGoTrueClient._is_implicit_grant_flowN  s/    #&,,''H+>&+HHr   c                  K   | j                   dk(  rYt               }t        |      }| j                  j	                  | j
                   d|       d {    ||k(  rdnd}||d<   ||d<   ||d<   t        |      }| d| S 7 .w)	Npkce-code-verifierplains256code_challengecode_challenge_methodr   ?)rl   r   r   rg   r^  rd   r   )r   rX   r   r   code_verifierrt  ru  r   s           r   r   z'AsyncGoTrueClient._get_url_for_providerS  s      ??f$24M4]CN--(($$%^4m   )N: " (6F#$.CF*+%z&!aws   ABB/Bc                    t        |      S )zD
        Decodes a JWT (without performing any validation).
        )r   )r   r   s     r   r
  zAsyncGoTrueClient._decode_jwti  s     "#&&r   c                   K   |j                  d      xs0 | j                  j                  | j                   d       d {   }| j	                  dd|j                  d      |d|j                  d      t
               d {   }| j                  j                  | j                   d       d {    |j                  r?| j                  |j                         d {    | j                  d	|j                         |S 7 7 7 U7 (w)
Nrw  rq  r   ztoken?grant_type=pkce	auth_code)rz  rw  r   r   r   )
r   rg   r   rd   r   r$   rK  r   r   r   )r   r   rw  r   s       r   exchange_code_for_sessionz+AsyncGoTrueClient.exchange_code_for_sessiono  s    

?3 
T]]=S=S  !0>
 8
 ##ZZ4!. 

=1% ' 	
 	
 mm''4+<+<*=^(LMMM$$X%5%5666((h6F6FG#8
	
 	N6sH   ?DDADD/D4D
5.D#D$#DD
DD)rX   Optional[str]rY   zOptional[Dict[str, str]]rZ   r|  r[   boolr\   r}  r]   zOptional[AsyncSupportedStorage]r^   zOptional[AsyncClient]r_   r,   r`   r}  ra   r|  r   r!  )rX   r|  r   r!  r  )rX   r"  r   r!  r   )r   z&Optional[SignInAnonymouslyCredentials]r   r4   )r   rI   r   r4   )r   rE   r   r4   )r   rC   r   r4   )r   rG   )r   rD   r   r=   )r   rL   )r   rF   r   r3   )r   r@   r   r3   )r   rN   r   r4   )r   r4   )r   Optional[Session])r   r|  r   zOptional[UserResponse])r   rK   r   rM   )r   r"  r   r"  r   r4   )r   r|  r   r4   )r   rH   r   r!  )r  z4Callable[[AuthChangeEvent, Optional[Session]], None]r   rJ   )r   r"  r   r>   r   r!  )r   r:   r   r.   )r   r9   r   r-   )r   r8   r   r2   )r   r<   r   r2   )r   r;   r   r1   )r   r0   )r   r/   )rX   r"  r   zTuple[Session, Optional[str]])r   r"  r   rA   )r   r"  r   r4   )r   rA   r   r!  )rb  floatr   r!  )rh  r*   r   r~  r   r!  )rY  r|  r   r~  )r   zDict[str, List[str]]rm  r"  r   r|  )rX   r"  r   r}  )rX   r"  r   r?   r   zDict[str, str]r   r"  )r   r"  r   r6   )r   r5   )2__name__
__module____qualname__rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r$  r)  r+  rv   rr   rt   r~   r|   rz   rx   r   r   r   r   r  r   r]  r   r   rS  r   r   r
  r{  rl  r   r   rV   rV   V   s$    ",0%)#' $37-1",#.' .' *	.'
 #.' !.' .' 1.' +.'  .' .' .' 
.'d 8< 11
 EIA	8525 
5n727 
7r$1$ 
$L7
r9/9 
9.B5B	B:
	
9
69
 
9
v!
&!
 
!
F,


:V&,A^ .2@*@	@& 9@7J A,F 
( MO 
& << < 
	<4


+
 

" 	
K
	6
6-0&0& 
'0&d!CF 
V*422 #2 
	2" 
2G*G G 
	GI
     	 
 
 ,'r   rV   N)b
__future__r   
contextlibr   	functoolsr   jsonr   r   typingr   r	   r
   r   r   urllib.parser   r   r   uuidr   	constantsr   r   r   r   r   r   errorsr   r   r   r   r   helpersr   r   r   r    r!   r"   r#   r$   r%   r&   r'   http_clientsr(   timerr)   typesr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   gotrue_admin_apirP   gotrue_base_apirQ   gotrue_mfa_apirR   r]   rS   rT   rV   rl  r   r   <module>r     s    "     8 8 6 6       ' & & & & & & & & & &N 2 / - >k* kr   