
    $                        d 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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 ddlZddlZddlmZ ddlZdZdZdZdZdZdZdZdZedz   ZdZdZdZ dZ!dZ" ejF                  dg d      Z$ G d dejJ                        Z& G d dejJ                        Z' G d dejJ                        Z( G d  d!ejJ                        Z) G d" d#ejJ                        Z* G d$ d%ejJ                        Z+ G d& d'ejJ                        Z,d( Z-d) Z.d* Z/d+ Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5d1 Z6d2 Z7d3 Z8d4 Z9d5 Z:d6 Z;d7 Z<d8 Z=y)9z:Utility functions for WebSocket tunnelling with Cloud IAP.    )absolute_import)division)unicode_literalsN)context_aware)
exceptions)log)
properties)http_proxy_types)parsewssztunnel.cloudproxy.appzmtls.tunnel.cloudproxy.appz/v4connect	reconnectzrelay.tunnel.cloudproxy.app      i @        IapTunnelTarget)projectzoneinstance	interfaceporturl_override
proxy_infonetworkregionhost
dest_groupc                       e Zd Zy)CACertsFileUnavailableN__name__
__module____qualname__     @lib/googlecloudsdk/api_lib/compute/iap_tunnel_websocket_utils.pyr    r    <       r&   r    c                       e Zd Zy)IncompleteDataNr!   r%   r&   r'   r*   r*   @   r(   r&   r*   c                       e Zd Zy)InvalidWebSocketSubprotocolDataNr!   r%   r&   r'   r,   r,   D   r(   r&   r,   c                       e Zd Zy)MissingTunnelParameterNr!   r%   r&   r'   r.   r.   H   r(   r&   r.   c                       e Zd Zy)UnexpectedTunnelParameterNr!   r%   r&   r'   r0   r0   L   r(   r&   r0   c                       e Zd Zy)PythonVersionMissingSNINr!   r%   r&   r'   r2   r2   P   r(   r&   r2   c                       e Zd Zy)UnsupportedProxyTypeNr!   r%   r&   r'   r4   r4   T   r(   r&   r4   c                    | j                         j                         D ]  \  }}|r	|dv st        d|z          | j                  s$| j                  s| j
                  s| j                  rP| j                         j                         D ].  \  }}|s|dv rt        d|z         |s|dv s"t        d|z          n;| j                         j                         D ]  \  }}|r	|dv st        d|z          | j                  rL| j                  j                  }|r3|t        j                  k7  rt        dt        j                  |   z         yyy)	a  Validate the parameters.

  Inspects the parameters to ensure that they are valid for either a VM
  instance-based connection, or a host-based connection.

  Args:
    tunnel_target: The argument container.

  Raises:
    MissingTunnelParameter: A required argument is missing.
    UnexpectedTunnelParameter: An unexpected argument was found.
    UnsupportedProxyType: A non-http proxy was specified.
  )r   r   z"Missing required tunnel argument: )r   r   r   )r   r   r   zUnexpected tunnel argument: )r   r   r   zUnsupported proxy type: N)_asdictitemsr.   r   r   r   r   r0   r   
proxy_typesocksPROXY_TYPE_HTTPr4   r
   REVERSE_PROXY_TYPE_MAP)tunnel_target
field_namefield_valuer8   s       r'   ValidateParametersr?   X   sw    "/!6!6!8!>!>!@j+:)<<"#G#-$. / / "A
 m33}7I7I#0#8#8#:#@#@#B
KZ+HH$%I%/&0 1 	1	'HH'(F(2)3 4 	4 $C $1#8#8#:#@#@#B
KZ+LL$%I%/&0 1 	1 $C
 ))44JzU%:%:: 
$

1
1*
=>? ? ;
 r&   c                 V   t         j                  }t        j                  j                  j
                  j                         }|r|}t        j                  j                  |      sCd}t        j                  |       |d|z  z  }| rt        j                  |       |S t        |      |S )z'Get and check that CA cert file exists.z&Unable to locate CA certificates file.z [%s])httplib2CA_CERTSr	   VALUEScorecustom_ca_certs_fileGetospathexistsr   warninginfor    )ignore_certsca_certscustom_ca_certs	error_msgs       r'   CheckCACertsFilerP      s    (%%**??CCE/H		!8IKK	8##I	hhy 
/ #9--	/r&   c                 J   | st         j                  rt        j                  dk  s#t         j                  rmt        j                  dk  rYt        dt        j                  j                  t        j                  j                  t        j                  j                  fz        y y y )N)r   r   	   )   r   r   zqPython version %d.%d.%d does not support SSL/TLS SNI needed for certificate verification on WebSocket connection.)	sixPY2sysversion_infoPY3r2   majorminormicro)rL   s    r'   CheckPythonVersionr\      s    

ww3##i/
ww3##i/
!	<					!1!1!7!7						!	!" " 0w r&   c                 p   | j                   | j                  |d}| j                  rI| j                  |d<   | j                  |d<   | j                  |d<   | j
                  r=| j
                  |d<   n-| j                  |d<   | j                  |d<   | j                  |d<   t        t        || j                        S )	z,Create Connect URL for WebSocket connection.)r   r   newWebsocketr   r   r   groupr   r   r   )r   r   r   r   r   r   r   r   r   _CreateWebSocketUrlCONNECT_ENDPOINTr   )r<   should_use_new_websocketurl_query_piecess      r'   CreateWebSocketConnectUrlrd      s     &&  .
 !.!5!5X"/"7"7Y,11V"/":":w,11V#0#9#9Z $1$;$;[!	-/?*77
9 9r&   c                     |||d}| j                   r| j                  |d<   n| j                  |d<   t        t        || j
                        S )z.Create Reconnect URL for WebSocket connection.)sidackr^   r   r   )r   r   r   r`   RECONNECT_ENDPOINTr   )r<   rf   	ack_bytesrb   rc   s        r'   CreateWebSocketReconnectUrlrj      s^     . !.!5!5X,11V	/1A*77
9 9r&   c                    t         }t        t        j                               }t	        j
                         r|rt        nt        }ndt	        j                          }t        }|r't        j                  |      }|dd \  }}}|r|dk7  r|}t        j                  |      }	|j                  d      r|| n|d| }
t        j                  |||
d|	df      S )z$Create URL for WebSocket connection.ztunnel-cloudproxy.NrS   / )
URL_SCHEMEboolr   Configr	   IsDefaultUniverseMTLS_URL_HOSTURL_HOSTGetUniverseDomainURL_PATH_ROOTr   urlparse	urlencodeendswith
urlunparse)endpointrc   r   schemeuse_mtlshostname	path_rooturl_override_partspath_overrideqsrH   s              r'   r`   r`      s    &-&&()(!!# (}hH#J$@$@$B#CDH)5&8!&<#FHm#-i'(",5,>,>s,CIx
(#X. 			68T2r2>	??r&   c                     	 t        j                  t        d      t        |       S # t         j                  $ r t        d| z        w xY w)Nz>HQzInvalid Ack [%r])structpackstrSUBPROTOCOL_TAG_ACKerrorr,   )ri   s    r'   CreateSubprotocolAckFramer      sF    J;;s5z#6	BB	 J
)*<y*H
IIJs	   #& "Ac                 v    t        j                  t        dt        |       z        t        t        |       |       S )Nz>HI%ds)r   r   r   lenSUBPROTOCOL_TAG_DATA)bytes_to_sends    r'   CreateSubprotocolDataFramer      s2    	SC$667)3}+=}
N Nr&   c                     t        |       S N_ExtractUnsignedInt64binary_datas    r'   ExtractSubprotocolAckr          	{	++r&   c                 6    t        |       \  }} t        | |      S r   _ExtractUnsignedInt32_ExtractBinaryArrayr   data_lens     r'   #ExtractSubprotocolConnectSuccessSidr          /<(K	[(	33r&   c                 6    t        |       \  }} t        | |      S r   r   r   s     r'   ExtractSubprotocolDatar      r   r&   c                     t        |       S r   r   r   s    r'   %ExtractSubprotocolReconnectSuccessAckr      r   r&   c                     t        |       S r   )_ExtractUnsignedInt16r   s    r'   ExtractSubprotocolTagr      r   r&   c                     t        |       dk  r
t               t        j                  t	        d      | d d       d   | dd  fS )Nr   z>Hr   r   r*   r   unpackr   r   s    r'   r   r     H    


--D	;r?
3A
6
ab/
 r&   c                     t        |       dk  r
t               t        j                  t	        d      | d d       d   | dd  fS )Nr   z>Ir   r   r   s    r'   r   r   	  r   r&   c                     t        |       dk  r
t               t        j                  t	        d      | d d       d   | dd  fS )N   z>Qr   r   r   s    r'   r   r     r   r&   c                     t        |       |k  r
t               t        j                  t	        d|z        | d |       d   | |d  fS )Nz%dsr   r   r   s     r'   r   r     sP     


--EH,-{9H/E
Fq
I
hi
 
" "r&   )>__doc__
__future__r   r   r   collectionsrG   r   rV   googlecloudsdk.corer   r   r   r	   googlecloudsdk.core.utilr
   rA   rT   six.moves.urllibr   r9   rn   rs   rr   ru   ra   rh   SUBPROTOCOL_NAMESUBPROTOCOL_TAG_LENSUBPROTOCOL_HEADER_LENSUBPROTOCOL_MAX_DATA_FRAME_SIZE#SUBPROTOCOL_TAG_CONNECT_SUCCESS_SID%SUBPROTOCOL_TAG_RECONNECT_SUCCESS_ACKr   r   
namedtupleIapTunnelTargetInfoErrorr    r*   r,   r.   r0   r2   r4   r?   rP   r\   rd   rj   r`   r   r   r   r   r   r   r   r   r   r   r   r%   r&   r'   <module>r      s    A &  '  	  
 - * # * 5  
 " 
",   0  ,q0 "' &, #(. %   -k,,>? Z-- Z%% j&6&6 Z-- 
 0 0 j.. :++ (?V""9.9$@*JN,4
4
,,"r&   