
    .                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSK	J
r  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKrSSKrSSKJr  SSKrSrSrSrSrSrSrSrSr\S-   r Sr!Sr"Sr#Sr$Sr%\RL                  " S/ SQ5      r'\RL                  " S/ SQ5      r( " S S\RR                  5      r* " S S \RR                  5      r+ " S! S"\RR                  5      r, " S# S$\RR                  5      r- " S% S&\RR                  5      r. " S' S(\RR                  5      r/ " S) S*\RR                  5      r0S+ r1S, r2S- r3S. r4S/ r5S0 r6S1 r7S2 r8S3 r9S4 r:S5 r;S6 r<S7 r=S8 r>S9 r?S: r@S; rAS< rBg)=z:Utility functions for WebSocket tunnelling with Cloud IAP.    )absolute_import)division)unicode_literalsN)ssh)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 @        CloudRunArgs)project_numberworkload_typedeployment_nameinstance_idcontainer_idIapTunnelTarget)projectzoneinstance	interfaceporturl_override
proxy_infonetworkregionhost
dest_groupcloud_run_argsc                       \ rS rSrSrg)CACertsFileUnavailableV    N__name__
__module____qualname____firstlineno____static_attributes__r*       @lib/googlecloudsdk/api_lib/compute/iap_tunnel_websocket_utils.pyr(   r(   V       r1   r(   c                       \ rS rSrSrg)IncompleteDataZ   r*   Nr+   r*   r1   r2   r5   r5   Z   r3   r1   r5   c                       \ rS rSrSrg)InvalidWebSocketSubprotocolData^   r*   Nr+   r*   r1   r2   r8   r8   ^   r3   r1   r8   c                       \ rS rSrSrg)MissingTunnelParameterb   r*   Nr+   r*   r1   r2   r;   r;   b   r3   r1   r;   c                       \ rS rSrSrg)UnexpectedTunnelParameterf   r*   Nr+   r*   r1   r2   r>   r>   f   r3   r1   r>   c                       \ rS rSrSrg)PythonVersionMissingSNIj   r*   Nr+   r*   r1   r2   rA   rA   j   r3   r1   rA   c                       \ rS rSrSrg)UnsupportedProxyTypen   r*   Nr+   r*   r1   r2   rD   rD   n   r3   r1   rD   c                 2   U R                   (       d  [        S5      eU R                  (       d  [        S5      eU R                  (       d  [        S5      eU R                  R
                  (       d  [        S5      eU R                  R                  (       aL  U R                  R                  [        R                  R                   Vs/ s H  oR                  PM     sn;  a  [        S5      eU R                  R                  (       d  [        S5      egs  snf )z3Validate the parameters for a Cloud Run connection.z&Missing required tunnel argument: portz(Missing required tunnel argument: regionz)Missing required tunnel argument: projectz0Missing required tunnel argument: project_numberz:Missing or invalid required tunnel argument: workload_typez1Missing required tunnel argument: deployment_nameN)r   r;   r#   r   r&   r   r   run_sshSshWorkloadTypevaluer   )tunnel_targetes     r2   _ValidateCloudRunArgsrM   r   s    			
 !I
JJ			
 !K
LL			
 !L
MM		%	%	4	4
 :  
&
&
4
4		%	%	3	3&{{7787!gg78
9 !D  
	%	%	5	5
 ;  
6 9s   Dc                 ^   U R                   (       a  [        U 5        GO,U R                  5       R                  5        H"  u  pU(       a  M  US;   d  M  [	        SU-   5      e   U R
                  (       d3  U R                  (       d"  U R                  (       d  U R                  (       a`  U R                  5       R                  5        H=  u  pU(       d  US;   a  [	        SU-   5      eU(       d  M)  US;   d  M1  [        SU-   5      e   ODU R                  5       R                  5        H"  u  pU(       a  M  US;   d  M  [	        SU-   5      e   U R                  (       aR  U R                  R                  nU(       a4  U[        R                  :w  a  [        S[        R                   U   -   5      eggg)	a  Validate the parameters.

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

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)r&   rM   _asdictitemsr;   r#   r"   r$   r%   r>   r!   
proxy_typesocksPROXY_TYPE_HTTPrD   r   REVERSE_PROXY_TYPE_MAP)rK   
field_namefield_valuerQ   s       r2   ValidateParametersrW      s    !!-(#0#8#8#:#@#@#B
[Z+>>$0:=
 	
 $C 	  ##%2%:%:%<%B%B%D
!*z-JJ&2Z?  ;:)JJ),z9  &E &3%:%:%<%B%B%D
!*{z-NN&2Z?  &E ))44JzU%:%:: 
$

1
1*
=>? ? ;
 r1   c                 x   [         R                  n[        R                  R                  R
                  R                  5       nU(       a  Un[        R                  R                  U5      (       dJ  Sn[        R                  " U5        USU-  -  nU (       a  [        R                  " U5        U$ [        U5      eU$ )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       r2   CheckCACertsFilerh      s    (%%**??CCE/H		!	!8IKK	8##I	hhy 
/ #9--	/r1   c                 l   U (       d  [         R                  (       a  [        R                  S:  d)  [         R                  (       an  [        R                  S:  aY  [        S[        R                  R                  [        R                  R                  [        R                  R                  4-  5      eg g g )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PY3rA   majorminormicro)rd   s    r2   CheckPythonVersionrt      s    

ww3##i/
ww3##i/
!	<					!1!1!7!7						!	!" " 0w r1   c                 ,   U R                   U R                  US.nU R                  (       a  U R                  R                  US'   U R                  R                  US'   U R                  R
                  US'   U R                  US'   U R                  R                  (       a  U R                  R                  US'   U R                  R                  (       a  U R                  R                  US'   OU R                  (       aN  U R                  US'   U R                  US'   U R                  US	'   U R                  (       a  U R                  US
'   O-U R                  US'   U R                  US'   U R                  US'   [        [         UU R"                  5      $ )z,Create Connect URL for WebSocket connection.)r   r   newWebsocketr   cr_workload_typecr_deployment_namer#   cr_instance_idcr_container_idr"   r$   groupr   r   r   )r   r   r&   r   r   r   r#   r   r   r$   r"   r%   r   r   r   _CreateWebSocketUrlCONNECT_ENDPOINTr    )rK   should_use_new_websocketurl_query_piecess      r2   CreateWebSocketConnectUrlr      s    &&  .
 !!$$33 %& 	$$22 '( 	$$44 )* "/!5!5X##//

&
&
2
2 '( ##00

&
&
3
3 () !.!5!5X"/"7"7Y,11V"/":":w,11V#0#9#9Z $1$;$;[!	-/?*77
9 9r1   c                     UUUS.nU R                   (       d  U R                  (       a  U R                  US'   OU R                  US'   [	        [
        UU R                  5      $ )z.Create Reconnect URL for WebSocket connection.)sidackrv   r#   r   )r&   r$   r#   r   r|   RECONNECT_ENDPOINTr    )rK   r   	ack_bytesr~   r   s        r2   CreateWebSocketReconnectUrlr   
  sf     . !!]%7%7!.!5!5X,11V	/1A*77
9 9r1   c                    [         n[        [        R                  " 5       5      n[        R
                  " 5       (       a  U(       a  [        O[        nOS[        R                  " 5        3n[        nU(       a-  [        R                  " U5      nUSS u  p5nU(       a  US:w  a  Un[        R                  " U5      n	UR                  S5      (       a  U< U < 3OU< SU < 3n
[        R                  " X5U
SU	S45      $ )z$Create URL for WebSocket connection.ztunnel-cloudproxy.Nrk   / )
URL_SCHEMEboolr   Configr
   IsDefaultUniverseMTLS_URL_HOSTURL_HOSTGetUniverseDomainURL_PATH_ROOTr   urlparse	urlencodeendswith
urlunparse)endpointr   r    schemeuse_mtlshostname	path_rooturl_override_partspath_overrideqsr`   s              r2   r|   r|     s    &-&&()(!!## (}hH#J$@$@$B#CDH)5&8!&<#Fm#-i'(",5,>,>s,C,CIx
(#X. 			6T2r2>	??r1   c                      [         R                  " [        S5      [        U 5      $ ! [         R                   a    [        SU -  5      ef = f)Nz>HQzInvalid Ack [%r])structpackstrSUBPROTOCOL_TAG_ACKerrorr8   )r   s    r2   CreateSubprotocolAckFramer   1  sF    J;;s5z#6	BB	 J
)*<y*H
IIJs	   $' #A
c                 x    [         R                  " [        S[        U 5      -  5      [        [        U 5      U 5      $ )Nz>HI%ds)r   r   r   lenSUBPROTOCOL_TAG_DATA)bytes_to_sends    r2   CreateSubprotocolDataFramer   9  s2    	SC$667)3}+=}
N Nr1   c                     [        U 5      $ N_ExtractUnsignedInt64binary_datas    r2   ExtractSubprotocolAckr   ?      	{	++r1   c                 2    [        U 5      u  p[        X5      $ r   _ExtractUnsignedInt32_ExtractBinaryArrayr   data_lens     r2   #ExtractSubprotocolConnectSuccessSidr   C      /<(	[	33r1   c                 2    [        U 5      u  p[        X5      $ r   r   r   s     r2   ExtractSubprotocolDatar   H  r   r1   c                     [        U 5      $ r   r   r   s    r2   %ExtractSubprotocolReconnectSuccessAckr   M  r   r1   c                     [        U 5      $ r   )_ExtractUnsignedInt16r   s    r2   ExtractSubprotocolTagr   Q  r   r1   c                     [        U 5      S:  a
  [        5       e[        R                  " [	        S5      U S S 5      S   U SS  4$ )Nr   z>Hr   r   r5   r   unpackr   r   s    r2   r   r   U  H    


--D	;r?
3A
6
ab/
 r1   c                     [        U 5      S:  a
  [        5       e[        R                  " [	        S5      U S S 5      S   U SS  4$ )Nr   z>Ir   r   r   s    r2   r   r   ]  r   r1   c                     [        U 5      S:  a
  [        5       e[        R                  " [	        S5      U S S 5      S   U SS  4$ )N   z>Qr   r   r   s    r2   r   r   e  r   r1   c                     [        U 5      U:  a
  [        5       e[        R                  " [	        SU-  5      U S U 5      S   XS  4$ )Nz%dsr   r   r   s     r2   r   r   m  sN     


--EH,-{9H/E
Fq
I
i
 
" "r1   )C__doc__
__future__r   r   r   collectionsr_   r   rn   googlecloudsdk.api_lib.runr   rG   googlecloudsdk.corer   r   r	   r
   googlecloudsdk.core.utilr   rY   rl   six.moves.urllibr   rR   r   r   r   r   r}   r   SUBPROTOCOL_NAMESUBPROTOCOL_TAG_LENSUBPROTOCOL_HEADER_LENSUBPROTOCOL_MAX_DATA_FRAME_SIZE#SUBPROTOCOL_TAG_CONNECT_SUCCESS_SID%SUBPROTOCOL_TAG_RECONNECT_SUCCESS_ACKr   r   
namedtupler   IapTunnelTargetInfoErrorr(   r5   r8   r;   r>   rA   rD   rM   rW   rh   rt   r   r   r|   r   r   r   r   r   r   r   r   r   r   r   r*   r1   r2   <module>r      s    A &  '  	  
 5 - * # * 5  
 " 
",   0  ,q0 "' &, #(. %  %%	 ",, &Z-- Z%% j&6&6 Z-- 
 0 0 j.. :++ 44?n""(9V9$@*JN,4
4
,,"r1   