o
    zsgY                     @  s  d dl mZ d dlmZ d dlmZ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mZmZ d dlmZmZ d dlmZ d	d
lmZmZmZmZ d	dlmZ d	dl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+ ddl,m-Z- ddl.m/Z/m0Z0 G dd dZ1dS )    )annotations)partial)dumpsloads)Timer)time)AnyCallableDictOptionalTupleUnioncast)parse_qsurlparse)uuid4   )COOKIE_OPTIONSDEFAULT_HEADERS
GOTRUE_URLSTORAGE_KEY)APIError)is_http_urlis_valid_jwt
model_dumpmodel_validate)AuthChangeEventCookieOptionsProviderSessionSubscriptionUserUserAttributesUserAttributesDict   )SyncGoTrueAPI)SyncMemoryStorageSyncSupportedStoragec                   @  s  e Zd Zei dde eeddddd
dzddZd{ddZ	d|ddZ
d|ddZd|d d!Zdddddd"d}d*d+Zddddddddd,d~d3d4Zdd5dd7d8Zdd:d;Zdd=d>Zdd@dAZddEdFZddGdHZddJdKZddLddNdOZd|dPdQZddSdTZddXdYZddZd[Zdd\d]Zdd_d`ZddbdcZd|dddeZd|dfdgZddhddidjZ ddmdnZ!ddpdqZ"ddrdsZ#d|dtduZ$ddxdyZ%dS )SyncGoTrueClientTNF)
urlheadersauto_refresh_tokenpersist_sessionlocal_storagecookie_optionsapireplace_default_headersverifyproxyr)   strr*   Dict[str, str]r+   boolr,   r-   r'   r.   r   r/   Optional[SyncGoTrueAPI]r0   r1   r2   Optional[str]returnNonec       
         C  s   t |std |drtd i | _d| _d| _d| _|| _|| _	|| _
|r*i nt}|i ||||	|
d}|p@tdi || _dS )aD  Create a new client

        url : str
            The URL of the GoTrue server.
        headers : Dict[str, str]
            Any additional headers to send to the GoTrue server.
        auto_refresh_token : bool
            Set to "true" if you want to automatically refresh the token before
            expiring.
        persist_session : bool
            Set to "true" if you want to automatically save the user session
            into local storage.
        local_storage : SupportedStorage
            The storage engine to use for persisting the session.
        cookie_options : CookieOptions
            The options for the cookie.
        verify: bool
            Verify SSL, True by default, False disables verification.
        proxy: str
            HTTP Proxy string or None, None by default, None disables proxy.
        #url must be a valid HTTP URL stringzhttp://z`Warning:

DO NOT USE HTTP IN PRODUCTION FOR GOTRUE EVER!
GoTrue REQUIRES HTTPS to work securely.N)r)   r*   r.   r1   r2    )r   
ValueError
startswithprintstate_change_emittersrefresh_token_timercurrent_usercurrent_sessionr+   r,   r-   r   r%   r/   )selfr)   r*   r+   r,   r-   r.   r/   r0   r1   r2   empty_or_default_headersargsr;   r;   O/var/www/html/minecraft/env/lib/python3.10/site-packages/gotrue/_sync/client.py__init__   s*   #

zSyncGoTrueClient.__init__c                 C  s   | S Nr;   rC   r;   r;   rF   	__enter__X   s   zSyncGoTrueClient.__enter__c                 C  s   |    d S rH   )close)rC   exc_texc_vexc_tbr;   r;   rF   __exit__[   s   zSyncGoTrueClient.__exit__c                 C  s   | j   d S rH   )r/   rK   rI   r;   r;   rF   rK   ^   s   zSyncGoTrueClient.closec                 C  s   |    |   dS )z/Recover the current session from local storage.N)_recover_session_recover_and_refreshrI   r;   r;   rF   init_recovera   s   zSyncGoTrueClient.init_recover)emailphonepasswordredirect_todatarS   rT   rU   rV   rW   Optional[Dict[str, Any]]Union[Session, User]c                C  s~   |    |r|r| jj||||d}n|r!|r!| jj|||d}n
|s'tdtdt|tr=| j|d | jt	j
d |S )a7  Creates a new user. If email and phone are provided, email will be
        used and phone will be ignored.

        Parameters
        ---------
        email : Optional[str]
            The user's email address.
        phone : Optional[str]
            The user's phone number.
        password : Optional[str]
            The user's password.
        redirect_to : Optional[str]
            A URL or mobile address to send the user to after they are confirmed.
        data : Optional[Dict[str, Any]]
            Optional user metadata.

        Returns
        -------
        response : Union[Session, User]
            A logged-in session if the server has "autoconfirm" ON
            A user if the server has "autoconfirm" OFF

        Raises
        ------
        APIError
            If an error occurs.
        )rS   rU   rV   rW   )rT   rU   rW   z(Password must be defined, can't be None.z3Email or phone must be defined, both can't be None.sessionevent)_remove_sessionr/   sign_up_with_emailsign_up_with_phoner<   
isinstancer   _save_session_notify_all_subscribersr   	SIGNED_IN)rC   rS   rT   rU   rV   rW   responser;   r;   rF   sign_upf   s&   $
zSyncGoTrueClient.sign_up)rS   rT   rU   refresh_tokenproviderrV   scopescreate_userrg   rh   Optional[Provider]ri   rj   Optional[Union[Session, str]]c          
      C  s   |    |r|r| j|||d}	|	S | jj||d}	|	S |r3|r)| j||d}	|	S | jj||d}	|	S |r@| j|d | j}	|	S |rL| j|||d}	|	S t	d)a.  Log in an existing user, or login via a third-party provider.
        If email and phone are provided, email will be used and phone will be ignored.

        Parameters
        ---------
        email : Optional[str]
            The user's email address.
        phone : Optional[str]
            The user's phone number.
        password : Optional[str]
            The user's password.
        refresh_token : Optional[str]
            A valid refresh token that was returned on login.
        provider : Optional[Provider]
            One of the providers supported by GoTrue.
        redirect_to : Optional[str]
            A URL or mobile address to send the user to after they are confirmed.
        scopes : Optional[str]
            A space-separated list of scopes granted to the OAuth application.

        Returns
        -------
        response : Optional[Union[Session, str]]
            If only email are provided between the email and password,
            None is returned and send magic link to email

            If email and password are provided, a logged-in session is returned.

            If only phone are provided between the phone and password,
            None is returned and send message to phone

            If phone and password are provided, a logged-in session is returned.

            If refresh_token is provided, a logged-in session is returned.

            If provider is provided, an redirect URL is returned.

            Otherwise, error is raised.

        Raises
        ------
        APIError
            If an error occurs.
        rS   rU   rV   )rS   rj   rT   rU   )rT   rj   rg   rh   rV   ri   zLEmail, phone, refresh_token, or provider must be defined, all can't be None.)
r^   _handle_email_sign_inr/   send_magic_link_email_handle_phone_sign_insend_mobile_otp_call_refresh_tokenrB   _handle_provider_sign_inr<   )
rC   rS   rT   rU   rg   rh   rV   ri   rj   re   r;   r;   rF   sign_in   sF   8 
zSyncGoTrueClient.sign_in)rV   tokenc                C  sB   |    | jj|||d}t|tr| j|d | jtjd |S )a^  Log in a user given a User supplied OTP received via mobile.

        Parameters
        ----------
        phone : str
            The user's phone number.
        token : str
            The user's OTP.
        redirect_to : Optional[str]
            A URL or mobile address to send the user to after they are confirmed.

        Returns
        -------
        response : Union[Session, User]
            A logged-in session if the server has "autoconfirm" ON
            A user if the server has "autoconfirm" OFF

        Raises
        ------
        APIError
            If an error occurs.
        )rT   rx   rV   rZ   r\   )	r^   r/   verify_mobile_otpra   r   rb   rc   r   rd   )rC   rT   rx   rV   re   r;   r;   rF   
verify_otp   s   
zSyncGoTrueClient.verify_otpOptional[User]c                 C     | j S )z4Returns the user data, if there is a logged in user.)rA   rI   r;   r;   rF   user(     zSyncGoTrueClient.userOptional[Session]c                 C  r|   )z8Returns the session data, if there is an active session.)rB   rI   r;   r;   rF   r[   ,  r~   zSyncGoTrueClient.sessionr   c                 C  s   | j std|  S )zForce refreshes the session.

        Force refreshes the session including the user data incase it was
        updated in a different session.
        Not logged in.)rB   r<   ru   rI   r;   r;   rF   refresh_session0  s   z SyncGoTrueClient.refresh_session
attributes)Union[UserAttributesDict, UserAttributes]r!   c                C  sh   | j stdt|trtdi |}n|}| jj| j j|d}|| j _| j	| j d | j
tjd |S )a  Updates user data, if there is a logged in user.

        Parameters
        ----------
        attributes : UserAttributesDict | UserAttributes
            Attributes to update, could be: email, password, email_change_token, data

        Returns
        -------
        response : User
            The updated user data.

        Raises
        ------
        APIError
            If an error occurs.
        r   )jwtr   rZ   r\   Nr;   )rB   r<   ra   dictr"   r/   update_useraccess_tokenr}   rb   rc   r   USER_UPDATED)rC   r   attributes_to_updatere   r;   r;   rF   update:  s   
zSyncGoTrueClient.updatec                C  s<   t |std | jj|d}| j|d | jtjd |S )aT  Sets the session data from refresh_token and returns current Session

        Parameters
        ----------
        refresh_token : str
            A JWT token

        Returns
        -------
        response : Session
            A logged-in session

        Raises
        ------
        APIError
            If an error occurs.
        z5refresh_token must be a valid JWT authorization tokenro   rZ   r\   )r   r<   r/   refresh_access_tokenrb   rc   r   rd   rC   rg   re   r;   r;   rF   set_session]  s   zSyncGoTrueClient.set_sessionr   c             	   C  sd   t |std t|ddddddd}| jr*| jj|_| jj|_| jj|_| jj|_| j|d |S )a}  Overrides the JWT on the current client. The JWT will then be sent in
        all subsequent network requests.

        Parameters
        ----------
        access_token : str
            A JWT token

        Returns
        -------
        response : Session
            A logged-in session

        Raises
        ------
        APIError
            If an error occurs.
        z4access_token must be a valid JWT authorization tokenbearerNr   
token_typer}   
expires_in
expires_atrg   provider_tokenrZ   )	r   r<   r   rB   r   r   rg   r   rb   )rC   r   r[   r;   r;   rF   set_authx  s$   	



zSyncGoTrueClient.set_auth)store_sessionr   c             	   C  s  t |std t|}t|j}|d}|d}|d}|d}|d}	|r3t|d d|r9|d s>td	d|rD|d sItd
d|	rO|	d sTtdd|rZ|d s_tddztt t	|d  }
W n tyx   tddw | j
j|d d}|d}t|d |	d |t	|d |
|d |r|d ndd}|r| j|d |d}| jtjd |r|d dkr| jtjd |S )a  Gets the session data from a URL string.

        Parameters
        ----------
        url : str
            The URL string.
        store_session : bool
            Optionally store the session in the browser

        Returns
        -------
        response : Session
            A logged-in session

        Raises
        ------
        APIError
            If an error occurs.
        r:   error_descriptionr   r   rg   r   r   i  zNo access_token detected.zNo refresh_token detected.zNo token_type detected.zNo expires_in detected.zInvalid expires_in.r   r   Nr   rZ   typer\   recovery)r   r<   r   r   querygetr   roundr   intr/   get_userr   rb   rc   r   rd   PASSWORD_RECOVERY)rC   r)   r   rW   r   r   r   r   rg   r   r   re   r   r[   recovery_moder;   r;   rF   get_session_from_url  sT   












	
z%SyncGoTrueClient.get_session_from_urlc                 C  sB   d}| j r	| j j}|   | jtjd |r| jj|d dS dS )zLog the user out.Nr\   r   )rB   r   r^   rc   r   
SIGNED_OUTr/   sign_out)rC   r   r;   r;   rF   r     s   zSyncGoTrueClient.sign_outidc                C  s   | j | dS )z Unsubscribe from a subscription.N)r?   pop)rC   r   r;   r;   rF   _unsubscribe  s   zSyncGoTrueClient._unsubscribecallback4Callable[[AuthChangeEvent, Optional[Session]], None]r    c                C  s0   t  }t||t| j|jdd}|| j|j< |S )a  Receive a notification every time an auth event happens.

        Parameters
        ----------
        callback : Callable[[AuthChangeEvent, Optional[Session]], None]
            The callback to call when an auth event happens.

        Returns
        -------
        subscription : Subscription
            A subscription object which can be used to unsubscribe itself.

        Raises
        ------
        APIError
            If an error occurs.
        )r   )r   r   unsubscribe)r   r    r   r   hexr?   )rC   r   	unique_idsubscriptionr;   r;   rF   on_auth_state_change  s   z%SyncGoTrueClient.on_auth_state_changec                C  s0   | j j|||d}| j|d | jtjd |S )z Sign in with email and password.rm   rZ   r\   )r/   sign_in_with_emailrb   rc   r   rd   )rC   rS   rU   rV   re   r;   r;   rF   rq     s   z&SyncGoTrueClient._handle_email_sign_inc                C  s.   | j j||d}| j|d | jtjd |S )z Sign in with phone and password.rn   rZ   r\   )r/   sign_in_with_phonerb   rc   r   rd   )rC   rT   rU   re   r;   r;   rF   rs   !  s   z&SyncGoTrueClient._handle_phone_sign_inr   c                C  s   | j j|||dS )zSign in with provider.rp   )r/   get_url_for_provider)rC   rh   rV   ri   r;   r;   rF   rv   (  s
   z)SyncGoTrueClient._handle_provider_sign_in"Optional[Tuple[Session, int, int]]c                 C  s   | j t}|s
dS t|}|d}|d}|r9t|tr;|r=t|tr?tt	|}t|}t
t }|||fS dS dS dS dS )zRecover common logicNr[   r   )r-   get_itemr   r   r   ra   r   r   r   r   r   r   )rC   jsonrW   session_rawexpires_at_rawr[   r   time_nowr;   r;   rF   _recover_common6  s&   




z SyncGoTrueClient._recover_commonc                 C  sD   |   }|sdS |\}}}||kr | j|d | jtjd dS dS )z-Attempts to get the session from LocalStorageNrZ   r\   )r   rb   rc   r   rd   rC   resultr[   r   r   r;   r;   rF   rP   I  s   
z!SyncGoTrueClient._recover_sessionc                 C  s   |   }|sdS |\}}}||k r0| jr0|jr0z
| j|jd W dS  ty/   |   Y dS w ||k s9|r9|js?|   dS | j|d | jt	j
d dS )z4Recovers the session from LocalStorage and refreshesNro   rZ   r\   )r   r+   rg   ru   r   r^   r}   rb   rc   r   rd   r   r;   r;   rF   rQ   S  s   
z%SyncGoTrueClient._recover_and_refreshro   c                C  s`   |d u r| j r| j j}ntd| jjtt|d}| j|d | jt	j
d | jt	jd |S )Nz2No current session and refresh_token not supplied.ro   rZ   r\   )rB   rg   r<   r/   r   r   r3   rb   rc   r   TOKEN_REFRESHEDrd   r   r;   r;   rF   ru   d  s   
z$SyncGoTrueClient._call_refresh_tokenr]   r   c                C  s"   | j  D ]	}||| j qdS )z0Notify all subscribers that auth event happened.N)r?   valuesr   rB   )rC   r]   valuer;   r;   rF   rc   p  s   z(SyncGoTrueClient._notify_all_subscribersr[   c                C  sl   || _ |j| _|jr$tt }|j| }|dkrdnd}| j|| d | jr2|jr4| j|d dS dS dS )zSave session to client.<   g      ?)r   rZ   N)	rB   r}   rA   r   r   r   _start_auto_refresh_tokenr,   _persist_session)rC   r[   r   	expire_inrefresh_duration_before_expiresr;   r;   rF   rb   u  s   

zSyncGoTrueClient._save_sessionc                C  s*   t ||jd}| jtt|td d S )N)r[   r   )default)r   r   r-   set_itemr   r   r3   )rC   r[   rW   r;   r;   rF   r     s   z!SyncGoTrueClient._persist_sessionc                 C  s,   d| _ d| _| jr| j  | jt dS )zRemove the session.N)rB   rA   r@   cancelr-   remove_itemr   rI   r;   r;   rF   r^     s
   
z SyncGoTrueClient._remove_sessionr   floatc                C  s>   | j r| j   |dks| jsd S t|| j| _ | j   d S )Nr   )r@   r   r+   r   ru   start)rC   r   r;   r;   rF   r     s   
z*SyncGoTrueClient._start_auto_refresh_token)r)   r3   r*   r4   r+   r5   r,   r5   r-   r'   r.   r   r/   r6   r0   r5   r1   r5   r2   r7   r8   r9   )r8   r(   )r8   r9   )rS   r7   rT   r7   rU   r7   rV   r7   rW   rX   r8   rY   )rS   r7   rT   r7   rU   r7   rg   r7   rh   rk   rV   r7   ri   r7   rj   r5   r8   rl   )rT   r3   rx   r3   rV   r7   r8   rY   )r8   r{   )r8   r   )r8   r   )r   r   r8   r!   )rg   r3   r8   r   )r   r3   r8   r   )r)   r3   r   r5   r8   r   )r   r3   r8   r9   )r   r   r8   r    )rS   r3   rU   r3   rV   r7   r8   r   )rT   r3   rU   r3   r8   r   )rh   r   rV   r7   ri   r7   r8   r3   )r8   r   )rg   r7   r8   r   )r]   r   r8   r9   )r[   r   r8   r9   )r   r   r8   r9   )&__name__
__module____qualname__r   r&   r   	parse_objr   rG   rJ   rO   rK   rR   rf   rw   rz   r}   r[   r   r   r   r   r   r   r   r   rq   rs   rv   r   rP   rQ   ru   rc   rb   r   r^   r   r;   r;   r;   rF   r(      sp    
;


@b
(




#
,
C













r(   N)2
__future__r   	functoolsr   r   r   r   	threadingr   r   typingr   r	   r
   r   r   r   r   urllib.parser   r   uuidr   	constantsr   r   r   r   
exceptionsr   helpersr   r   r   r   typesr   r   r   r   r    r!   r"   r#   r/   r%   storager&   r'   r(   r;   r;   r;   rF   <module>   s    $(
