U
    ARd!*                     @   sr  d 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ZddlZddlZddlmZ ddlmZmZmZ dd	lmZ eeZejrd
ZndZedddgZedddZdejdddeed ZdZ dejddddejdddejdddd  Z!edd!d"d#Z"G d$d% d%e#Z$eed!d&d'Z%d(d) Z&d*d+ Z'd,d- Z(d.d/ Z)dS )0z(Manage the user's Streamlit credentials.    N)
namedtuple)datetime)Optional)uuid4)RequestException)env_util	file_utilutil)
get_loggerz$%userprofile%/.streamlit/config.tomlz~/.streamlit/config.toml_Activationemailis_validreturnc                  C   sP   t jjdkotj ptjd} d| r,dndt	j
dddt	j
d	d
dd S )Nzutf-8Z
WT_SESSIONu   
      {0}%(welcome)s

      If you’d like to receive helpful onboarding emails, news, offers, promotions,
      and the occasional swag, please enter your email address below. Otherwise,
      leave this field blank.

      %(email)su   👋  zWelcome to Streamlit!TboldzEmail: bluefg)Zwelcomer   )sysstdoutencodingr   
IS_WINDOWSosenvirongetformatclickstyle)Z
show_emoji r    A/tmp/pip-unpacked-wheel-b9et7o5g/streamlit/runtime/credentials.pyemail_prompt3   s    

r"   a  
  You can find our privacy policy at %(link)s

  Summary:
  - This open source library collects usage statistics.
  - We cannot see and do not store information contained inside Streamlit apps,
    such as text, charts, images, etc.
  - Telemetry data is stored in servers in the United States.
  - If you'd like to opt out, add the following to %(config)s,
    creating that file if necessary:

    [browser]
    gatherUsageStats = false
z#https://streamlit.io/privacy-policyT)Z	underline)linkconfigzT
Collecting usage statistics. To deactivate, set browser.gatherUsageStats to False.
z$
  %(start)s
  %(prompt)s %(hello)s
zGet started by typing:r   )r   r   $r   zstreamlit hellor   )startpromptZhello)r   r   c              
   C   s   | dksd| krdS ddddddd	}t   d
 }ddddditt |d| ddd| dd	}tjd|t|	 d}|
  dS )z1Send the user's email to segment.io, if submittedN@zapi.segment.ioz*/*zen-US,en;q=0.9z
text/plainzlocalhost:8501zlocalhost:8501/)	authorityacceptzaccept-languagezcontent-typeoriginZrefererz+00:00Zlibraryzanalytics-pythonz2.2.2)nameversionZsubmittedEmailZprovided_email)ZauthoremailsourcetrackZ iCkMy7ymtJ9qYzQRXkQpnAJEq7D4NyMU)	Zanonymous_idcontextZ	messageId	timestampeventZtraitstypeZuserIdZwriteKeyzhttps://api.segment.io/v1/t)headersdata)r   utcnow	isoformatstrr   requestspostjsondumpsencoderaise_for_status)r   r4   dtr5   responser    r    r!   _send_emailn   s<    	 rA   c                   @   s   e Zd ZU dZdZed  ed< edd Zdd Z	e
dd	d
ZdddddZdddZedd Zdd ZdeddddZdS )CredentialszCredentials class.N
_singletonc                 C   s   | j dkrt  tj S )zReturn the singleton instance.N)rC   rB   )clsr    r    r!   get_current   s    
zCredentials.get_currentc                 C   s*   t jdk	rtdd| _t | _| t _dS )zInitialize class.Nz;Credentials already initialized. Use .get_current() instead)rB   rC   RuntimeError
activation_get_credential_file_path
_conf_fileselfr    r    r!   __init__   s    
zCredentials.__init__r   c                 C   s
   t | S N)r	   repr_rJ   r    r    r!   __repr__   s    zCredentials.__repr__Fc              	   C   s   | j dk	rtd dS zHt| jd}t|d}W 5 Q R X |dkrNtt	|d| _ W nz t
k
r   |r| j| d Y dS tdY nH tk
r   |r|   | j| d Y dS ttd| j Y nX dS )	zLoad from toml file.Nz/Credentials already loaded. Not rereading file.rgeneralr   )show_instructionsz7Credentials not found. Please run "streamlit activate".zz
                Unable to load credentials from %s.
                Run "streamlit reset" and try again.
                )rG   LOGGERerroropenrI   tomlloadr   	Exception_verify_emailFileNotFoundErroractivaterF   resettextwrapdedent)rK   auto_resolvefr5   r    r    r!   rW      s8    

zCredentials.loadTc              
   C   s`   z|  | W n2 ttfk
r@ } ztt| W 5 d}~X Y nX | jdksT| jjs\td dS )zTCheck if streamlit is activated.

        Used by `streamlit run script.py`
        NzActivation email not valid.)rW   rX   rF   _exitr8   rG   r   )rK   r_   er    r    r!   _check_activated   s    zCredentials._check_activatedc              
   C   sT   t  }d|_zt|j W n0 tk
rN } ztd|  W 5 d}~X Y nX dS )zReset credentials by removing file.

        This is used by `streamlit activate reset` in case a user wants
        to start over.
        Nz#Error removing credentials file: %s)	rB   rE   rG   r   removerI   OSErrorrS   rT   )rD   crb   r    r    r!   r\      s    zCredentials.resetc              
   C   s   | j dkrdS tjtj| jdd d| j ji}t| jd}t	d|i| W 5 Q R X zt
| j j W n2 tk
r } ztd|  W 5 d}~X Y nX dS )z!Save to toml file and send email.NT)exist_okr   wrQ   zError saving email: )rG   r   makedirspathdirnamerI   r   rU   rV   dumprA   r   rS   rT   )rK   r5   r`   rb   r    r    r!   save   s    
zCredentials.save)rR   r   c                 C   s   z|    W n tk
r    Y nX | jrD| jjr:td qtd n`d}|stjt dddd}t|| _| jjr| 	  t
t |rt
t d}qHtd qHdS )	zCActivate Streamlit.

        Used by `streamlit activate`.
        zAlready activatedzUActivation not valid. Please run `streamlit activate reset` then `streamlit activate`Fr   )textZprompt_suffixdefaultZshow_defaultTzPlease try again.N)rW   rF   rG   r   ra   r   r'   r"   rY   rm   secho_TELEMETRY_TEXT_INSTRUCTIONS_TEXTrS   rT   )rK   rR   Z	activatedr   r    r    r!   r[     s4    



zCredentials.activate)F)T)T)__name__
__module____qualname____doc__rC   r   __annotations__classmethodrE   rL   r8   rO   rW   rc   r\   rm   boolr[   r    r    r    r!   rB      s   

"

rB   c                 C   s@   |   } t| dkr6| ddkr6td tddS t| dS )ar  Verify the user's email address.

    The email can either be an empty string (if the user chooses not to enter
    it), or a string with a single '@' somewhere in it.

    Parameters
    ----------
    email : str

    Returns
    -------
    _Activation
        An _Activation object. Its 'is_valid' property will be True only if
        the email was validated.

    r   r(      z"That doesn't look like an email :(NFT)striplencountrS   rT   r   )r   r    r    r!   rY   /  s
    

rY   c                 C   s   t |  td dS )zExit program with error.N)rS   rT   r   exit)messager    r    r!   ra   K  s    
ra   c                   C   s
   t dS )Nzcredentials.toml)r   Zget_streamlit_file_pathr    r    r    r!   rH   Q  s    rH   c                   C   s   t jt S rM   )r   rj   existsrH   r    r    r    r!   _check_credential_file_existsU  s    r   c                  C   sD   ddl m}  t s4| dr4| ds0tt dS t	 
  dS )zCheck credentials and potentially activate.

    Note
    ----
    If there is no credential file and we are in headless mode, we should not
    check, since credential would be automatically set to an empty string.

    r   r$   zserver.headlesszbrowser.gatherUsageStatsN)	streamlitr$   r   
get_optionZis_manually_setr   rp   _TELEMETRY_HEADLESS_TEXTrB   rE   rc   r   r    r    r!   check_credentialsY  s    	

r   )*rv   r;   r   r   r]   collectionsr   r   typingr   uuidr   r   r9   rV   Zrequests.exceptionsr   r   r   r   r	   Zstreamlit.loggerr
   rs   rS   r   Z_CONFIG_FILE_PATHr   r8   r"   r   rq   r   rr   rA   objectrB   rY   ra   rH   r   r   r    r    r    r!   <module>   sZ   	
+ 