
    K                        d 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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ej*                  j-                  dd      dgiZdddgiZddiZdZdZdZeez   ZdZdez  Zeez   Z eez   Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(ejR                  rdnd Z*ejV                  jY                  d!      ejV                  j[                  d!       G d" d#ej\                                      Z/ej`                  ejV                  jY                  d!      ejV                  j[                  d!       G d$ d%ej\                                             Z1y)&zTests for context_config.py.    )absolute_import)print_function)division)unicode_literalsN)mock)context_config)	exception)testcase)base)SetBotoConfigForTestcert_provider_commandsomehelper--print_certificatezsome helperfoozv-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----END CERTIFICATE-----
z|-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END ENCRYPTED PRIVATE KEY-----
zh-----BEGIN PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END PRIVATE KEY-----
z##invalid-password##z8
-----BEGIN PASSPHRASE-----
%s
-----END PASSPHRASE-----
z-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END ENCRYPTED PRIVATE KEY-----
-----END CERTIFICATE-----
z-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
z-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END ENCRYPTED PRIVATE KEY-----
z-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----END ENCRYPTED PRIVATE KEY-----
zSOMECOMMENTS
-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END ENCRYPTED PRIVATE KEY-----
z-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END ENCRYPTED PRIVATE KEY-----
SOMECOMMENT
z-----BEGIN CERTIFICATE-----
LKJHLSDJKFHLEUIORWUYERWEHJHL
KLJHGFDLSJKH(@#*&$)@*#KJHFLKJDSFSD
-----END CERTIFICATE-----
SOMECOMMENT
-----BEGIN ENCRYPTED PRIVATE KEY-----
LKJWE:RUWEORIU)(#*&$@(#$KJHLKDJHF(I*F@YLFHSLDKJFS
-----END ENCRYPTED PRIVATE KEY-----
z__builtin__.openzbuiltins.openzmTLS only runs on GCS JSON API.c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
TestPemFileParserz-Test PEM-format certificate parsing for mTLS.c                     t        j                  t        | j                        }| j	                  |d   t
               | j	                  |d   t               y NCERTIFICATEzENCRYPTED PRIVATE KEY)r   _split_pem_into_sectionsCERT_KEY_WITH_COMMENT_AT_BEGINloggerassertEqualCERT_SECTIONENCRYPTED_KEY_SECTIONselfsectionss     2platform/gsutil/gslib/tests/test_context_config.py'test_pem_file_with_comment_at_beginningz9TestPemFileParser.test_pem_file_with_comment_at_beginning   sG    66&5HXm,l;X568MN    c                     t        j                  t        | j                        }| j	                  |d   t
               | j	                  |d   t               y r   )r   r   CERT_KEY_WITH_COMMENT_AT_ENDr   r   r   r   r   s     r    !test_pem_file_with_comment_at_endz3TestPemFileParser.test_pem_file_with_comment_at_end   sG    66$dkk3HXm,l;X568MNr"   c                     t        j                  t        | j                        }| j	                  |d   t
               | j	                  |d   t               y r   )r   r    CERT_KEY_WITH_COMMENT_IN_BETWEENr   r   r   r   r   s     r    %test_pem_file_with_comment_in_betweenz7TestPemFileParser.test_pem_file_with_comment_in_between   sG    66($++7HXm,l;X568MNr"   c                     t        j                  t        | j                        }| j	                  |j                  d             | j                  |j                  d      t               y r   )r   r   BAD_CERT_KEY_EMBEDDED_SECTIONr   assertIsNonegetr   r   r   s     r    .test_pem_file_with_bad_format_embedded_sectionz@TestPemFileParser.test_pem_file_with_bad_format_embedded_section   sO    66%t{{4Hhll=12X\\"9:*,r"   c                     t        j                  t        | j                        }| j	                  |j                  d      t               | j                  |j                  d             y r   )r   r   BAD_CERT_KEY_MISSING_ENDr   r   r,   r   r+   r   s     r    ,test_pem_file_with_bad_format_missing_endingz>TestPemFileParser.test_pem_file_with_bad_format_missing_ending   sN    667O7;{{DHX\\-0,?hll#:;<r"   c                     t        j                  t        | j                        }| j	                  |j                  d             | j                  |j                  d      t               y r   )r   r   BAD_CERT_KEY_MISSING_BEGINr   r+   r,   r   r   r   s     r    /test_pem_file_with_bad_format_missing_beginningzATestPemFileParser.test_pem_file_with_bad_format_missing_beginning   sO    66"DKK1Hhll=12X\\"9:*,r"   c                     t        j                  t        | j                        }| j	                  |j                  d             | j	                  |j                  d             y r   )r   r   BAD_CERT_KEY_MISMATCHr   r+   r,   r   s     r    .test_pem_file_with_bad_format_section_mismatchz@TestPemFileParser.test_pem_file_with_bad_format_section_mismatch   sL    667L7;{{DHhll=12hll#:;<r"   N)__name__
__module____qualname____doc__r!   r%   r(   r-   r0   r3   r6    r"   r    r   r   ~   s-     6OOO,=,=r"   r   c                        e Zd ZdZ fdZ fdZd Zej                  j                  e
d      d        Z ej                  d ej                  d	      
      ej                  j                  edd      ej                  j                  e
dd       ej                  eej                        d                             Z ej                  d ej                  d	      
      ej                  j                  edd      ej                  j                  e
dd       ej                  eej                        d                             Z ej                  d ej                  d	      
      ej                  j                  edd       ej                  eej                        d                      Z ej                  d ej                  d	      
      d        Zej                  j                  edd       ej                  d ej                  d	      
       ej                  eej                        d                      Zej                  j                  e
dd      d        Zej                  j                  e
d      d        Zej                  j                  e
d      d        Zej                  j                  e
d      d        Zej                  j                  e
d      d        Zej                  j                  ed      d        Zej                  j                  ed      d        Z ej                  eej                        ej                  j                  ed      ej                  j                  e
d      d                      Z ej                  eej                        ej                  j                  ed      ej                  j                  e
d      d                      Z xZS )TestContextConfigz(Test the global ContextConfig singleton.c                     t         t        |           t        j                  | _        d t        _        t        j                         | _        y N)	superr=   setUpr   _singleton_config_old_context_configr   Mockmock_loggerr   	__class__s    r    rA   zTestContextConfig.setUp   s5    	
T(*-??D'+N$yy{Dr"   c                 T    t         t        |           | j                  t        _        y r?   )r@   r=   tearDownrC   r   rB   rF   s    r    rI   zTestContextConfig.tearDown   s    	
T+-'+'?'?N$r"   c                 4   t        j                  | j                        }| j                  t         j                        5  t        j                  | j                         d d d        t        j
                         }| j                  ||       y # 1 sw Y   0xY wr?   )r   create_context_configrE   assertRaises(ContextConfigSingletonAlreadyExistsErrorget_context_configr   )r   firstseconds      r    "test_context_config_is_a_singletonz4TestContextConfig.test_context_config_is_a_singleton   sw    001A1ABE			??
A**4+;+;<
A ..0FUF#
A 
As    BBPopenc                 b    t        j                  | j                         |j                          y r?   )r   rK   rE   assert_not_calledr   
mock_Popens     r    :test_does_not_provision_if_use_client_certificate_not_truezLTestContextConfig.test_does_not_provision_if_use_client_certificate_not_true   s$     (()9)9:  "r"   zos.path.existsT)return_value)newload)autospec)new_callablec           
         t         g|_        t        dg      5  | j                  t              5  t        j                  | j                         |j                  t
        j                         |j                  t        j                  j                  t        j                  j                  dd            dd       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NCredentialsuse_client_certificateTruer   r   r   --with_passphrase)#DEFAULT_CERT_PROVIDER_FILE_CONTENTSside_effectr   rL   
ValueErrorr   rK   rE   assert_called_with_DEFAULT_METADATA_PATHassert_called_once_withospathrealpathjoinr   	mock_openrV   mock_json_loads       r    0test_executes_provider_command_from_default_filezBTestContextConfig.test_executes_provider_command_from_default_file   s     #F!FN	P   
! Z(,,T-=-=>$$^%J%JK**GGRWW\\&(;<!#6	8	 )
! 
! )(
! 
!s#   CBC<CC	CC"c                    t         g|_        t        ddg      5  | j                  t              5  t        j                  | j                         |j                  t
        j                         |j                  t        j                  j                  d      dd       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr^   r_   r   Nzcert helperr   rb   ).DEFAULT_CERT_PROVIDER_FILE_CONTENTS_WITH_SPACErd   r   rL   re   r   rK   rE   rf   rg   rh   ri   rj   rk   rm   s       r    ;test_executes_provider_command_with_space_from_default_filezMTestContextConfig.test_executes_provider_command_with_space_from_default_file   s     	7"N 
  (MO 
P Z(,,T-=-=>$$^%J%JK**277+;+;M+J+@+>	@	 )	
P 
P )(	
P 
Ps#   B<A/B0B<0B9	5B<<Cc                 $   t         |_        t        ddg      5  t        j                  | j
                         |j                  t        j                         | j
                  j                  j                  d       d d d        y # 1 sw Y   y xY w)Nr^   rr   zVFailed to provision client certificate: Client certificate provider command not found.)
%DEFAULT_CERT_PROVIDER_FILE_NO_COMMANDrX   r   r   rK   rE   rf   rg   errorrh   r   rn   ro   s      r    &test_default_provider_no_command_errorz8TestContextConfig.test_default_provider_no_command_error   s     #HN	  (MO 
P **4+;+;<"">#H#HI
44;<
P 
P 
Ps   A$BBFc                     t        dddd| j                         fg      5  t        j                  | j                         | j                  j
                  j                  d       d d d        y # 1 sw Y   y xY w)Nr^   rr   GSUtil	state_dirzSFailed to provision client certificate: Client certificate provider file not found.)r   CreateTempDirr   rK   rE   rw   rh   )r   s    r    %test_default_provider_not_found_errorz7TestContextConfig.test_default_provider_not_found_error
  sm    	96	; 2 2 45	 
 **4+;+;<
4489
 
 
s   AA..A7c                 .   t        d      |_        t        ddg      5  t        j                  | j
                         |j                  t        j                         | j
                  j                  j                  d       d d d        y # 1 sw Y   y xY w)N
valueErrorr^   rr   z2Failed to provision client certificate: valueError)
re   rd   r   r   rK   rE   rf   rg   rw   rh   rx   s      r    3test_raises_cert_provision_error_on_json_load_errorzETestContextConfig.test_raises_cert_provision_error_on_json_load_error  s    
 ",L!9N	  (MO 
P **4+;+;<"">#H#HI
44
>@
P 
P 
Ps   A$BBc                 t   t        ddg      5  | j                  t              5  t        j                  | j
                         |j                  t        j                  j                  d      t        j                  t        j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr^   r_   r   	some/pathr   )stdoutstderr)r   rL   re   r   rK   rE   rh   ri   rj   rk   
subprocessPIPErU   s     r    6test_executes_custom_provider_command_from_boto_configzHTestContextConfig.test_executes_custom_provider_command_from_boto_config&  s    	9= 

 Z(,,T-=-=>**277+;+;K+H2<//2<// 	+ 	C )
 

 )(
 
s#   B.A-B"B."B+	'B..B7c                 (   t        j                         }d|j                  _        ||_        t	        ddg      5  t        j                  | j                         | j                  j                  j                  d       d d d        y # 1 sw Y   y xY w)N)Nzoh nor^   r   z-Failed to provision client certificate: oh no)
r   rD   communicaterX   r   r   rK   rE   rw   rh   )r   rV   mock_command_processs      r    Gtest_converts_and_logs_provisioning_cert_provider_unexpected_exit_errorzYTestContextConfig.test_converts_and_logs_provisioning_cert_provider_unexpected_exit_error4  s}      99;4C$$12J	9= 
 **4+;+;<
44
9;
 
 
s   ABBc                     t        d      |_        t        ddg      5  t        j                  | j
                         | j
                  j                  j                  d       d d d        y # 1 sw Y   y xY wNfoobarr^   r   z.Failed to provision client certificate: foobar)OSErrorrd   r   r   rK   rE   rw   rh   rU   s     r    ,test_converts_and_logs_provisioning_os_errorz>TestContextConfig.test_converts_and_logs_provisioning_os_errorC  se    $X.J	9= 
 **4+;+;<
44
:<
 
 
s   AA,,A5c                    t        j                  d      |_        t        ddg      5  t	        j
                  | j                         | j                  j                  j                  d       d d d        y # 1 sw Y   y xY wr   )	r	   ExternalBinaryErrorrd   r   r   rK   rE   rw   rh   rU   s     r    9test_converts_and_logs_provisioning_external_binary_errorzKTestContextConfig.test_converts_and_logs_provisioning_external_binary_errorO  sm     '::8DJ	9= 
 **4+;+;<
44
:<
 
 
s   AA66A?c                    t        d      |_        t        ddg      5  t        j                  | j
                         t        j                  rdnd}| j
                  j                  j                  d|z          d d d        y # 1 sw Y   y xY w)Nr   r^   r   z'foobar'z	u'foobar'z\Failed to provision client certificate: Invalid output format from certificate provider, no )
KeyErrorrd   r   r   rK   rE   sixPY3rw   rh   )r   rV   unicode_escaped_error_strings      r    -test_converts_and_logs_provisioning_key_errorz?TestContextConfig.test_converts_and_logs_provisioning_key_error\  s     &h/J	9= 
 **4+;+;<3677Z"
44B
&'(
 
 
s   ABBremovec                     t        j                  | j                         t         j                  j	                          |j                          y r?   )r   rK   rE   rB   _unprovision_client_certrT   r   mock_removes     r    2test_does_not_unprovision_if_no_client_certificatezDTestContextConfig.test_does_not_unprovision_if_no_client_certificaten  s4    (()9)9:$$==?!!#r"   c                    t        d      |_        t        j                  | j                         dt        j
                  _        t        j
                  j                          | j                  j                  j                  d       y )Nnor   z'Failed to remove client certificate: no)
r   rd   r   rK   rE   rB   client_cert_pathr   rw   rh   r   s     r    -test_handles_and_logs_unprovisioning_os_errorz?TestContextConfig.test_handles_and_logs_unprovisioning_os_errort  s_    %dmK(()9)9:8CN$$5$$==?2213r"   c                    t        j                         }d|_        t        j	                         d f|j
                  _        ||_        t        ddg      5  t        j                  t        j                               }|j                  t        j                  |j                  d      t        j                         j                  t              t        j                         j                  t              gd       | j!                  t        j"                  j$                  t&               t        j"                  j)                          |j+                  |j                         d d d        y # 1 sw Y   y xY w)Nr   r^   r_   r   zpath --print_certificatew+T	any_order)r   rD   
returncodeFULL_ENCRYPTED_CERTencoder   rX   r   r   rK   assert_has_callscallr   writer   r   r   rB   client_cert_passwordPASSWORDr   rh   r   rV   r   rn   r   test_configs         r    Mtest_writes_and_deletes_encrypted_certificate_file_storing_password_to_memoryz_TestContextConfig.test_writes_and_deletes_encrypted_certificate_file_storing_password_to_memory  s    
  99;&'#""$d5,$$12J	9L 

 #88Ek   
))K00$
7
))+

L
)
))+

1
2"
 ,0 ! 1 ~77LL! &&??A))+*F*FG-
 
 
   DE++E4c                    t        j                         }d|_        t        j	                         df|j
                  _        ||_        t        ddg      5  t        j                  t        j                               }|j                  t        j                  |j                  d      t        j                         j                  t              t        j                         j                  t              gd       | j!                  t        j"                  j$                  t&               t        j"                  j)                          |j+                  |j                         ddd       y# 1 sw Y   yxY w)z-This is the format used by gcloud by default.r   Nr^   r   r   Tr   )r   rD   r   	FULL_CERTr   r   rX   r   r   rK   r   r   r   r   r   KEY_SECTIONr+   rB   r   r   r   rh   r   s         r    Mtest_writes_and_deletes_unencrypted_certificate_file_without_storing_passwordz_TestContextConfig.test_writes_and_deletes_unencrypted_certificate_file_without_storing_password  s     99;&'#5>5E5E5G4N$$12J	9L 

 #88Ek   
))K00$
7
))+

L
)
))+

K
("
 ,0 ! 1 88MM " &&??A))+*F*FG-
 
 
r   ) r7   r8   r9   r:   rA   rI   rQ   r   patchobjectr   rW   rD   jsonOPEN_TO_PATCHrn   rp   rt   ry   r~   r   r   r   r   r   r   ri   r   r   r   r   __classcell__)rG   s   @r    r=   r=      s    1#@$ ::Z)# *#
 4::IDII4$@A::T6D1::Z484::m$..98 : 9 2 B8 4::IDII4$@A::T6D1::Z484::m$..9@ : 9 2 B@" 4::IDII4$@A::T6D14::m$..9< : 2 B< 4::IDII5$AB9 C9 ::T6D14::IDII4$@A4::m$..9	@ : B 2	@ ::Z48C 9C ::Z); *; ::Z)	< *	< ::Z)
< *
< ::Z)( *(" ::R"$ #$
 ::R"3 #3 4::m$..9::R"::Z)H * # :H@ 4::m$..9::R"::Z)H * # :Hr"   r=   )2r:   
__future__r   r   r   r   r   ri   r   unittestr   r   gslibr   r	   gslib.testsr
   gslib.tests.testcaser   gslib.tests.utilr   rj   rl   rc   rs   rv   r   r   r   CERT_ENCRYPTED_KEY_SECTIONr   PASSWORD_SECTIONr   r   r*   r/   r2   r5   r   r$   r'   PY2r   integration_testcase	SkipForS3
SkipForXMLGsUtilUnitTestCaser   NotParallelizabler=   r;   r"   r    <module>r      s   # & %  '  	   
      % 1 
VX&(=' # m-BC2 . */ %
  *,AA ! 	 
 13CC ;&	!   
 
"   $   '*gg"? 
(()JK	))*KL-=33 -= M L-=b 	(()JK	))*KLOH33 OH M L OHr"   