
    ɯeiG                    V   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rddl(m-Z-  ej\                  e/      Z0dZ1 G d de+      Z2y)    )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                  J    e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZedd       Zedd       ZddZ		 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ
	 	 	 	 	 	 ddZdd	Zdd
ZddZ	 	 	 	 	 	 	 	 ddZd dZd!dZd"dZd#dZd$dZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 d%dZ	 	 	 	 	 	 	 	 d&dZ xZS )'AuthByWebBrowserzKAuthenticates user by web browser. Only used for SAML based authentication.c                    t        |   di | d| _        d | _        || _        d | _        |t        n|| _        |t        j                  n|| _	        || _
        || _        || _        d | _        y )NT )super__init__consent_cache_id_token_token_application
_proof_key
webbrowser_webbrowsersocket_socket	_protocol_host_port_origin)	selfapplicationwebbrowser_pkg
socket_pkgprotocolhostportkwargs	__class__s	           e/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/snowflake/connector/auth/webbrowser.pyr$   zAuthByWebBrowser.__init__6   sz     	"6"&*#"&'(0Jn 	 (/FMMZ 	 "

    c                    d | _         y Nr&   r1   s    r:   reset_secretszAuthByWebBrowser.reset_secretsP   s	    r;   c                "    t         j                  S r=   )r   EXTERNAL_BROWSERr?   s    r:   type_zAuthByWebBrowser.type_S   s    (((r;   c                    | j                   S )zReturns the token.r>   r?   s    r:   assertion_contentz"AuthByWebBrowser.assertion_contentW   s     {{r;   c                d    t         |d   d<   | j                  |d   d<   | j                  |d   d<   y)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&   r(   )r1   bodys     r:   update_bodyzAuthByWebBrowser.update_body\   s7     )GV_% $VW$(OOV[!r;   c          	        t         j                  d       | j                  t        j                  t        j
                        }t        j                  dd      j                         dk(  rKt        rt         j                  d       n/|j                  t        j                  t        j                  d       	 t        j                  dd      }	 |j                  |t        t        j                  d	d
            f       |j+                  d
       |j-                         d   }
|j.                  r,t         j                  d       | j1                  |||||
|      }n(t         j                  d       | j3                  ||
|      }t         j                  d       t5        |      s0| j7                  |t8        d| dd       	 |j;                          yt=        d       t         j                  d       t=        d| d       | j>                  jA                  |      }|rt=        d       |s't        j                  dd      j                         dk(  r(t         j                  d       | jC                  ||       n_t=        d       tE        d      }| jG                  |       | jH                  s,| j7                  |tJ        dd       	 |j;                          y|j;                          y# t        j                   $ r>}	|	j"                  d
   t        j$                  k(  rt'        | d| dt(              |	d}	~	ww xY w# |j;                          w xY 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conn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debugr,   r+   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printr*   open_new_receive_saml_tokeninput_process_get_urlr&   r   )r1   rZ   authenticatorservice_nameaccountuserr8   socket_connectionhostnameexcallback_portsso_urlbrowser_openedurls                 r:   preparezAuthByWebBrowser.preparef   s     	45 !LL9K9KL997AGGIVSk ",,V->->@S@SUVWT	&yy!6DH!&& BII&;Q?@ $$Q'-99;A>M**AB++-wt EF55dM4PLL+,($$ 0&;G9K$P %  Z ##%W n LL12OG9,?@A!--66w?N+ 99:GDJJLPVV89((/@AC
 KL%%c*{{ ((!$=!= ) 	 ##%##%W ?? 771:!2!22*'j(M#*G-2  HV ##%s8   7L> 0K* >CL> C5L> *L;=9L66L;;L> >Mc               ,    |j                  |        ddiS )NsuccessT)authenticate_with_retry)r1   rZ   r8   s      r:   reauthenticatezAuthByWebBrowser.reauthenticate   s     	$$T*4  r;   c                   	 	 d}t               }d}d}t        j                  dd      j                         dk(  }t        r|rt
        j                  d       d}t        |      dk(  r||k  r|d	z  }t        j                  |gg g       \  }}	}
|d   e|j                         \  }}	 |r:t
        j                  d
       |j                  t        t        j                        }n|j                  t              }t        |      dk(  r||k  r|j%                  d      j'                  d      }| j)                  ||      sD| j+                  |||       	 |j-                  t        j.                         |j1                          y	 |j-                  t        j.                         |j1                          # t        $ rd t
        j                  d       ||k  r1d}t
        j                  d| d       t!        j"                  |       nt
        j                  d       Y (w xY w# j-                  t        j.                         |j1                          w xY w)z%Receives SAML token from web browser.r   N   "SNOWFLAKE_AUTH_SOCKET_MSG_DONTWAITfalserP   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
)	bytearrayra   rb   rc   r   r]   rd   lenselectacceptr^   recvBUF_SIZEr+   MSG_DONTWAITBlockingIOErrortimesleepdecodesplit_process_options_process_receive_saml_tokenshutdown	SHUT_RDWRrs   )r1   rZ   r}   attemptsraw_datasocket_clientmax_attemptsmsg_dont_waitread_sockets_write_sockets_exception_sockets_
sleep_timerG   s                 r:   rv   z$AuthByWebBrowser._receive_saml_token   s@   @&$; $! IIBGLRRT  $u %*M (mq(X-DMHGM}}*+RHDL.2D $A2+<+C+C+E(qE, !' %J!" ,9+=+=$,f.A.A," ,9+=+=h+G- (mq(X-DJ  w/55f=,,T=A44T4O &&v'7'78##% B
 &&v'7'78##%C X  / E"LL }  (,6-1
 &&.zl:V$W!" !%

: 6 &-C DE( &&v'7'78##%s9   B"H# &AF3 7H# AH# 3A)H H# H  H# #1Ic                   |D ]  }|j                  d      s n y| j                  |       | j                  |      \  }}|sy| j                  |      sy|| _        ddj                  t        j                  dt        j                                     dd| dd	| j                   d
d
g}|j                  dj                  |      j                  d             y)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_originr0   formatr   strftimegmtimesendalljoinencode)r1   rG   r   linerequested_headersrequested_origincontents          r:   r   z!AuthByWebBrowser._process_options"  s     	Dz*	 T".2.H.H.N++ $$%56'94;;=I 6,->,?@++DLL>:
 	fkk'299'BCr;   c                   t        |      }|j                  j                  d      }|d   }t        |      dkD  r|d   n| j                  dk(  rdnd}|j
                  | j                  k(  xr  || j                  k(  xr || j                  k(  S )N:r   r   httpsi  P   )r   netlocr   r   r-   schemer.   r/   )r1   r   r[   r   host_gotport_gots         r:   r   z!AuthByWebBrowser._validate_originC  s    '(!!#&!9VqF1Idnn6OsUW 	
 JJ$..( 'DJJ&'DJJ&	
r;   c                   | j                  |      s| j                  ||      sy ddg}| j                  rSd| j                  i}t	        j
                  |      }|j                  d| j                          |j                  d       nd| j                   d}|j                  dt        |              |j                  d	       |j                  |       |j                  d
j                  |      j                  d             y )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_postr0   r%   jsondumpsappendr'   r   r   r   r   )r1   rZ   rG   r   r   rT   s         r:   r   z,AuthByWebBrowser._process_receive_saml_tokenQ  s       &t/A/A$/M %
 <<t::;D**T"CNN:4<<.IJNN:;9
 :>9J9J8K LC 	)#c(45rsfkk'299'BCr;   c                   d }d }d }|D ]>  }|j                  d      r|}|j                  d      r|}+|j                  d      s=|}@ |r)|r'|r%|j                  d      d   j                         dk7  ry|j                  d      d   j                         dj                  |j                  d      dd        j                         fS )NzAccess-Control-Request-Method:zAccess-Control-Request-Headers:zOrigin:r   r   POST)NN)r   r   stripr   )r1   rG   request_lineheader_lineorigin_liner   s         r:   r   z&AuthByWebBrowser._check_post_requestedo  s     	#D?@#!BC"+"	# !!#&q)//1V; c"1%++-HH[&&s+AB/0668
 	
r;   c                t    t        t        |      j                        }d|vs|d   d   sy |d   d   | _        y )Ntokenr   )r	   r   queryr&   )r1   r   parseds      r:   rx   z!AuthByWebBrowser._process_get_url  s<    (3---.& w(:Woa(r;   c                    |D ]  }|j                  d      s|} n y| j                  |       |j                         \  }}}| j                  |       y)NzGET FT)r   r   r   rx   )r1   rG   r   target_liner   r   s         r:   r   zAuthByWebBrowser._process_get  s]     	Dv&"	
 T"%%'	3c"r;   c                l   |D ]  }|j                  d      s n | j                  |t        dd       y| j                  |       	 t	        j
                  |d         }|j                  d      | _        |j                  dd	      | _        y	# t        $ r t        |d         d   d
   | _        Y y	w xY w)NzPOST zLInvalid HTTP request from web browser. Idp authentication could have failed.rV   rY   Fr   r   Tr   )r   rr   r   r   r   loadsgetr&   r%   	Exceptionr	   )r1   rZ   rG   r   payloads        r:   r   zAuthByWebBrowser._process_post  s     	Dw'	   3 8 !  T"	9jjb*G!++g.DK*1++i*FD'   	9"48,W5a8DK	9s   AB "B32B3c                    |D ]8  }|j                         j                  d      s#t        j                  |        y  t        j                  d       y )Nz
user-agentzNo User-Agent)rc   r   r]   r^   )r1   rG   r   s      r:   r   z AuthByWebBrowser._get_user_agent  sB     	*Dzz|&&|4T"	*
 LL)r;   c                >   t         t        t        t        t        t        i}|r	||t
        <   d}t        j                  |||j                  |j                  |j                  |j                         |j                  |j                  |j                  |j                  |j                   |j"                  j$                  j'                  d            }	||	d   d<   t)        |      |	d   d<   t*        j-                  d|||       |j.                  j1                  ||t3        j4                  |	      |j.                  j6                  j                  |j.                  j6                  j                  	      }
|
d
   s| j9                  ||
       |
d   }|d   }|d   | _        |S )zGets SSO URL from Snowflake.z/session/authenticator-requestF)use_pooling)session_managerrG   rH   BROWSER_MODE_REDIRECT_PORTz%account=%s, authenticator=%s, user=%s)timeoutsocket_timeoutr   rY   ssoUrlproofKey)r   r   r   r   r   r   r   base_auth_datar2   _internal_application_name_internal_application_version
_ocsp_modecert_revocation_check_modelogin_timeoutnetwork_timeoutr   "platform_detection_timeout_secondsrestr   clonestrr]   r^   _rest_post_requestr   r   _connectionrr   r(   )r1   rZ   ry   rz   r{   r   r|   headersr   rK   r[   rG   r   s                r:   rp   zAuthByWebBrowser._get_sso_url  s    %&C ="$?

 0<G,-.""++..OO++  33 II55;;;N
 )6V_%585GV123WmT	
 jj&&JJtJJ**88::11?? ' 
 9~  d 46{x.z*r;   c                   t        j                  t        j                  d            j	                  d      | _        |j                  j                  dz   t        ||| j
                  d      z   }t        j                  d|        |S )N    asciiz/console/login?)
login_namebrowser_mode_redirect_port	proof_keyzConsole Log In URL: )base64	b64encodesecretstoken_bytesr   r(   r   
server_urlr
   r]   r^   )r1   rZ   r7   r|   r   s        r:   rq   z'AuthByWebBrowser._get_console_login_url  s     !**7+>+>r+BCJJ7SJJ!! "&26!% 	 	+C512
r;   )NNNNN)r2   r   r3   zModuleType | Noner4   ztype[socket.socket] | Noner5   
str | Noner6   r   r7   r   returnNone)r   r  )r   r   )r   r   )rK   zdict[Any, Any]r   r  )rZ   r   ry   r   rz   r   r{   r   r|   r   r8   r   r   r  )rZ   r   r8   r   r   zdict[str, bool])rZ   r   r   r  )rG   	list[str]r   socket.socketr   bool)r   r   r   r  )rZ   r   rG   r  r   r  r   r  )rG   r  r   ztuple[str | None, str | None])r   r   r   r  )rG   r  r   r  )rZ   r   rG   r  r   r  )rG   r  r   r  )rZ   r   ry   r   rz   r   r{   r   r   ri   r|   r   r   r   )rZ   r   r7   ri   r|   r   r   r   )__name__
__module____qualname____doc__r$   r@   propertyrC   rE   rL   r   r   rv   r   r   r   r   rx   r   r   r   rp   rq   __classcell__)r9   s   @r:   r    r    3   s   U
 -115# * /	
    
4 ) )  4l& "l& 	l&
 !l& l& l& l& 
l&\! "! 	!
 
!C&JB
D'D/8DIVD	D<
2)4*3!3 3 !	3
 3 3 3 
3j'/2:=	r;   r    )3
__future__r   r   r   loggingra   r   r   r+   r   r)   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:   <module>r     s    "    	       % H H   & 
 $  -&			8	$O| Or;   