o
    RDiG                     @  s6  d dl mZ d dlZd dlZd dlZd dlZd dl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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 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% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z, erddl(m-Z- e.e/Z0dZ1G dd de+Z2dS )    )annotationsN)
ModuleType)TYPE_CHECKINGAny   )
IS_WINDOWSparse_qs	urlencodeurlparseurlsplit)HTTP_HEADER_ACCEPTHTTP_HEADER_CONTENT_TYPEHTTP_HEADER_SERVICE_NAMEHTTP_HEADER_USER_AGENT)ER_IDP_CONNECTION_ERRORER_INVALID_VALUEER_NO_HOSTNAME_FOUNDER_UNABLE_TO_OPEN_BROWSER)OperationalError)CONTENT_TYPE_APPLICATION_JSONEXTERNAL_BROWSER_AUTHENTICATORPYTHON_CONNECTOR_USER_AGENT)is_valid_url   )Auth)AuthByPluginAuthType)SnowflakeConnectioni @  c                      s   e Zd ZdZ					dIdJ fddZdKddZedLddZedMddZdNddZ	dOd$d%Z
dPd'd(ZdQd)d*ZdRd0d1ZdSd3d4ZdTd5d6ZdUd8d9ZdVd;d<ZdWd=d>ZdXd?d@ZdYdAdBZdZdEdFZd[dGdHZ  ZS )\AuthByWebBrowserzKAuthenticates user by web browser. Only used for SAML based authentication.Napplicationstrwebbrowser_pkgModuleType | None
socket_pkgtype[socket.socket] | Noneprotocol
str | NonehostportreturnNonec                   sl   t  jdi | d| _d | _|| _d | _|d u rtn|| _|d u r%tjn|| _	|| _
|| _|| _d | _d S )NT )super__init__consent_cache_id_token_token_application
_proof_key
webbrowser_webbrowsersocket_socket	_protocol_host_port_origin)selfr   r!   r#   r%   r'   r(   kwargs	__class__r+   \/var/www/Datamplify/venv/lib/python3.10/site-packages/snowflake/connector/auth/webbrowser.pyr-   6   s   

zAuthByWebBrowser.__init__c                 C  s
   d | _ d S Nr/   r:   r+   r+   r>   reset_secretsP   s   
zAuthByWebBrowser.reset_secretsr   c                 C  s   t jS r?   )r   EXTERNAL_BROWSERrA   r+   r+   r>   type_S   s   zAuthByWebBrowser.type_c                 C  s   | j S )zReturns the token.r@   rA   r+   r+   r>   assertion_contentW   s   z"AuthByWebBrowser.assertion_contentbodydict[Any, Any]c                 C  s,   t |d d< | j|d d< | j|d d< dS )zUsed by Auth to update the request that gets sent to /v1/login-request.

        Args:
            body: existing request dictionary
        dataAUTHENTICATORTOKEN	PROOF_KEYN)r   r/   r1   )r:   rF   r+   r+   r>   update_body\   s   zAuthByWebBrowser.update_bodyconnr   authenticatorservice_nameaccountuserr;   r   c             
   K  s(  t d | tjtj}tdd dkr(t	rt 
d n	|tjtjd ztdd}z||ttd	d
f W n# tjya }	 z|	jd
 tjkr[t| d| dtd|	d}	~	ww |d
 | d }
|jrt d | |||||
|}nt d | ||
|}t d t|s| j|td| ddd W |  dS td t d td| d | j |}|rtd |stdd dkrt d | !|| n)td t"d}| #| | j$s| j|t%ddd W |  dS W |  dS W |  dS |  w ) z!Web Browser based Authentication.zauthenticating by Web Browser SNOWFLAKE_AUTH_SOCKET_REUSE_PORTFalsetruezUConfiguration SNOWFLAKE_AUTH_SOCKET_REUSE_PORT is not available in Windows. Ignoring.r   SF_AUTH_SOCKET_ADDR	localhostSF_AUTH_SOCKET_PORTr   z% is not found. Ensure /etc/hosts has z entry.)msgerrnoNz"step 1: query GS to obtain SSO urlz&step 1: constructing console login urlzValidate SSO URLzThe SSO URL provided z is invalidcodemessagerM   retz\Initiating login request with your identity provider. Press CTRL+C to abort and try again...zstep 2: open a browserzGoing to open: z to authenticate...zA browser window should have opened for you to complete the login. If you can't see it, check existing browser windows, or your OS settings.SNOWFLAKE_AUTH_FORCE_SERVERzstep 3: accept SAML tokenzWe were unable to open a browser window for you, please open the url above manually then paste the URL you are redirected to into the terminal.z-Enter the URL the SSO URL redirected you to: zKUnable to open a browser in this environment and SSO URL contained no token)&loggerdebugr5   r4   AF_INETSOCK_STREAMosgetenvlowerr   warning
setsockopt
SOL_SOCKETSO_REUSEPORTbindintgaierrorargs
EAI_NONAMEr   r   listengetsockname_disable_console_login_get_sso_url_get_console_login_urlr   _handle_failurer   closeprintr3   open_new_receive_saml_tokeninput_process_get_urlr/   r   )r:   rM   rN   rO   rP   rQ   r;   socket_connectionhostnameexcallback_portsso_urlbrowser_openedurlr+   r+   r>   preparef   s   

	



-



zAuthByWebBrowser.preparedict[str, bool]c                K  s   | |  ddiS )NsuccessT)authenticate_with_retry)r:   rM   r;   r+   r+   r>   reauthenticate   s   
zAuthByWebBrowser.reauthenticatec              	   C  s  	 zd}t  }d}d}tdd dk}tr |rtd d	}t|dkr||k r|d
7 }t|gg g \}}	}
|d dur|	 \}}z|rUt
d |ttj}n|t}W n( ty   t
d ||k r|d}t
d| d t| nt
d Y nw t|dkr||k s*|dd}| ||s| ||| W |tj |  dS W |tj |  n|tj |  w q)z%Receives SAML token from web browser.Tr   N   "SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAITfalserT   zWConfiguration SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAIT is not available in Windows. Ignoring.Fr   zcCalling socket_client.recv with MSG_DONTWAIT flag due to SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAIT env varz[BlockingIOError raised from socket.recv while attempting to retrieve callback token requestg      ?zWaiting z seconds before trying againzExceeded retry countutf-8
)	bytearrayrd   re   rf   r   r`   rg   lenselectacceptra   recvBUF_SIZEr4   MSG_DONTWAITBlockingIOErrortimesleepdecodesplit_process_options_process_receive_saml_tokenshutdown	SHUT_RDWRrv   )r:   rM   r|   attemptsraw_datasocket_clientmax_attemptsmsg_dont_waitread_sockets_write_sockets_exception_sockets_
sleep_timerH   r+   r+   r>   ry      sv   



%

z$AuthByWebBrowser._receive_saml_tokenrH   	list[str]r   socket.socketboolc                 C  s   |D ]	}| dr nqdS | | | |\}}|sdS | |s%dS || _ddtdt dd| dd	| j d
d
g}|	d
|d dS )z'Allows JS Ajax access to this endpoint.zOPTIONS FHTTP/1.1 200 OKzDate: {}z%a, %d %b %Y %H:%M:%S GMTz'Access-Control-Allow-Methods: POST, GETzAccess-Control-Allow-Headers: zAccess-Control-Max-Age: 86400Access-Control-Allow-Origin:  r   r   T)
startswith_get_user_agent_check_post_requested_validate_originr9   formatr   strftimegmtimesendalljoinencode)r:   rH   r   linerequested_headersrequested_origincontentr+   r+   r>   r   "  s2   



z!AuthByWebBrowser._process_optionsr   c                 C  sb   t |}|jd}|d }t|dkr|d n| jdkrdnd}|j| jko0|| jko0|| jkS )N:r   r   httpsi  P   )r   netlocr   r   r6   schemer7   r8   )r:   r   r^   r   host_gotport_gotr+   r+   r>   r   C  s   $z!AuthByWebBrowser._validate_originc                 C  s   |  |s| ||sd S ddg}| jr-d| ji}t|}|d| j  |d nd| j d}|dt|  |d	 || |	d

|d d S )Nr   zContent-Type: text/htmlconsentr   zVary: Accept-Encoding, Originz
<!DOCTYPE html><html><head><meta charset="UTF-8"/>
<link rel="icon" href="data:,">
<title>SAML Response for Snowflake</title></head>
<body>
Your identity was confirmed and propagated to Snowflake zR.
You can close this window now and go back where you started from.
</body></html>zContent-Length: r   r   r   )_process_get_process_postr9   r.   jsondumpsappendr0   r   r   r   r   )r:   rM   rH   r   r   rX   r+   r+   r>   r   Q  s"   



z,AuthByWebBrowser._process_receive_saml_tokentuple[str | None, str | None]c                 C  s   d }d }d }|D ]}| dr|}q| dr|}q| dr!|}q|r3|r3|r3|dd  dkr5dS |dd  d|ddd   fS )NzAccess-Control-Request-Method:zAccess-Control-Request-Headers:zOrigin:r   r   POST)NN)r   r   stripr   )r:   rH   request_lineheader_lineorigin_liner   r+   r+   r>   r   o  s,   


z&AuthByWebBrowser._check_post_requestedr   c                 C  s8   t t|j}d|vs|d d sd S |d d | _d S )Ntokenr   )r   r
   queryr/   )r:   r   parsedr+   r+   r>   r{     s   z!AuthByWebBrowser._process_get_urlc                 C  sF   |D ]}| dr|} nqdS | | | \}}}| | dS )NzGET FT)r   r   r   r{   )r:   rH   r   target_liner   r   r+   r+   r>   r     s   


zAuthByWebBrowser._process_getc                 C  s   |D ]	}| dr nq| j|tddd dS | | zt|d }|d| _|dd	| _W d	S  t	yI   t
|d d d
 | _Y d	S w )NzPOST zLInvalid HTTP request from web browser. Idp authentication could have failed.rZ   r]   Fr   r   Tr   )r   ru   r   r   r   loadsgetr/   r.   	Exceptionr   )r:   rM   rH   r   payloadr+   r+   r>   r     s*   

zAuthByWebBrowser._process_postc                 C  s6   |D ]}|  drt|  d S qtd d S )Nz
user-agentzNo User-Agent)rf   r   r`   ra   )r:   rH   r   r+   r+   r>   r     s   
z AuthByWebBrowser._get_user_agentr   rl   c                 C  s   t ttttti}|r||t< d}tj|||j|j	|j
| |j|j|j|j|j|jjjddd}	||	d d< t||	d d< td||| |jj||t|	|jjj|jjjd	}
|
d
 sf| j||
d |
d }|d }|d | _|S )zGets SSO URL from Snowflake.z/session/authenticator-requestF)use_pooling)session_managerrH   rI   BROWSER_MODE_REDIRECT_PORTz%account=%s, authenticator=%s, user=%s)timeoutsocket_timeoutr   r]   ssoUrlproofKey)r   r   r   r   r   r   r   base_auth_datar   _internal_application_name_internal_application_version
_ocsp_modecert_revocation_check_modelogin_timeoutnetwork_timeoutr   "platform_detection_timeout_secondsrestr   cloner    r`   ra   _rest_post_requestr   r   _connectionru   r1   )r:   rM   rN   rO   rP   r   rQ   headersr   rF   r^   rH   r   r+   r+   r>   rs     sN   
zAuthByWebBrowser._get_sso_urlc                 C  sJ   t tdd| _|jjd t||| jd }t	
d|  |S )N    asciiz/console/login?)
login_namebrowser_mode_redirect_port	proof_keyzConsole Log In URL: )base64	b64encodesecretstoken_bytesr   r1   r   
server_urlr	   r`   ra   )r:   rM   r(   rQ   r   r+   r+   r>   rt     s   z'AuthByWebBrowser._get_console_login_url)NNNNN)r   r    r!   r"   r#   r$   r%   r&   r'   r&   r(   r&   r)   r*   )r)   r*   )r)   r   )r)   r    )rF   rG   r)   r*   )rM   r   rN   r    rO   r&   rP   r    rQ   r    r;   r   r)   r*   )rM   r   r;   r   r)   r   )rM   r   r)   r*   )rH   r   r   r   r)   r   )r   r    r)   r   )rM   r   rH   r   r   r   r)   r*   )rH   r   r)   r   )r   r    r)   r*   )rH   r   r)   r   )rM   r   rH   r   r)   r   )rH   r   r)   r*   )rM   r   rN   r    rO   r&   rP   r    r   rl   rQ   r    r)   r    )rM   r   r(   rl   rQ   r    r)   r    )__name__
__module____qualname____doc__r-   rB   propertyrD   rE   rL   r   r   ry   r   r   r   r   r{   r   r   r   rs   rt   __classcell__r+   r+   r<   r>   r   3   s6    




n
	
E
!






5r   )3
__future__r   r   r   loggingrd   r   r   r4   r   r2   typesr   typingr   r   compatr   r   r	   r
   r   	constantsr   r   r   r   	errorcoder   r   r   r   errorsr   networkr   r   r   url_utilr   r   r   	by_pluginr   r   r   	getLoggerr   r`   r   r   r+   r+   r+   r>   <module>   s2   
