
    K                        S 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rSSK	J
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\R*                  R-                  SS5      S/0rSSS/0rSS0rSrSrSr\\-   rSrS\-  r\\-   r \\-   r!Sr"Sr#Sr$Sr%Sr&Sr'Sr(\RR                  (       a  SOS r*\RV                  RY                  S!5      \RV                  R[                  S!5       " S" S#\R\                  5      5       5       r/\R`                  \RV                  RY                  S!5      \RV                  R[                  S!5       " S$ S%\R\                  5      5       5       5       r1g)&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                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)TestPemFileParser~   z-Test PEM-format certificate parsing for mTLS.c                     [         R                  " [        U R                  5      nU R	                  US   [
        5        U R	                  US   [        5        g 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_beginning9TestPemFileParser.test_pem_file_with_comment_at_beginning   sG    66&5HXm,l;X568MN    c                     [         R                  " [        U R                  5      nU R	                  US   [
        5        U R	                  US   [        5        g r   )r   r   CERT_KEY_WITH_COMMENT_AT_ENDr   r   r   r   r   s     r!   !test_pem_file_with_comment_at_end3TestPemFileParser.test_pem_file_with_comment_at_end   sG    66$dkk3HXm,l;X568MNr$   c                     [         R                  " [        U R                  5      nU R	                  US   [
        5        U R	                  US   [        5        g r   )r   r    CERT_KEY_WITH_COMMENT_IN_BETWEENr   r   r   r   r   s     r!   %test_pem_file_with_comment_in_between7TestPemFileParser.test_pem_file_with_comment_in_between   sG    66($++7HXm,l;X568MNr$   c                     [         R                  " [        U R                  5      nU R	                  UR                  S5      5        U R                  UR                  S5      [        5        g r   )r   r   BAD_CERT_KEY_EMBEDDED_SECTIONr   assertIsNonegetr   r   r   s     r!   .test_pem_file_with_bad_format_embedded_section@TestPemFileParser.test_pem_file_with_bad_format_embedded_section   sO    66%t{{4Hhll=12X\\"9:*,r$   c                     [         R                  " [        U R                  5      nU R	                  UR                  S5      [        5        U R                  UR                  S5      5        g r   )r   r   BAD_CERT_KEY_MISSING_ENDr   r   r0   r   r/   r   s     r!   ,test_pem_file_with_bad_format_missing_ending>TestPemFileParser.test_pem_file_with_bad_format_missing_ending   sN    667O7;{{DHX\\-0,?hll#:;<r$   c                     [         R                  " [        U R                  5      nU R	                  UR                  S5      5        U R                  UR                  S5      [        5        g r   )r   r   BAD_CERT_KEY_MISSING_BEGINr   r/   r0   r   r   r   s     r!   /test_pem_file_with_bad_format_missing_beginningATestPemFileParser.test_pem_file_with_bad_format_missing_beginning   sO    66"DKK1Hhll=12X\\"9:*,r$   c                     [         R                  " [        U R                  5      nU R	                  UR                  S5      5        U R	                  UR                  S5      5        g r   )r   r   BAD_CERT_KEY_MISMATCHr   r/   r0   r   s     r!   .test_pem_file_with_bad_format_section_mismatch@TestPemFileParser.test_pem_file_with_bad_format_section_mismatch   sL    667L7;{{DHhll=12hll#:;<r$    N)__name__
__module____qualname____firstlineno____doc__r"   r'   r+   r1   r5   r9   r=   __static_attributes__r?   r$   r!   r   r   ~   s-     6OOO,=,=r$   r   c                     ^  \ rS rSrSrU 4S jrU 4S jrS r\R                  R                  \S5      S 5       r\R                  " S\R                  " S	S
9S9\R                  R                  \SS	S9\R                  R                  \SS	S9\R                  " \\R                   S9S 5       5       5       5       r\R                  " S\R                  " S	S
9S9\R                  R                  \SS	S9\R                  R                  \SS	S9\R                  " \\R                   S9S 5       5       5       5       r\R                  " S\R                  " S	S
9S9\R                  R                  \SS	S9\R                  " \\R                   S9S 5       5       5       r\R                  " S\R                  " SS
9S9S 5       r\R                  R                  \SS	S9\R                  " S\R                  " S	S
9S9\R                  " \\R                   S9S 5       5       5       r\R                  R                  \SS	S9S 5       r\R                  R                  \S5      S 5       r\R                  R                  \S5      S 5       r\R                  R                  \S5      S 5       r\R                  R                  \S5      S 5       r\R                  R                  \S5      S 5       r\R                  R                  \S5      S 5       r\R                  " \\R                   S9\R                  R                  \S5      \R                  R                  \S5      S 5       5       5       r\R                  " \\R                   S9\R                  R                  \S5      \R                  R                  \S5      S 5       5       5       rSr U =r!$ ) TestContextConfig   z(Test the global ContextConfig singleton.c                    > [         [        U ]  5         [        R                  U l        S [        l        [        R                  " 5       U l        g N)	superrG   setUpr   _singleton_config_old_context_configr   Mockmock_loggerr   	__class__s    r!   rL   TestContextConfig.setUp   s5    	
T(*-??D'+N$yy{Dr$   c                 T   > [         [        U ]  5         U R                  [        l        g rJ   )rK   rG   tearDownrN   r   rM   rQ   s    r!   rU   TestContextConfig.tearDown   s    	
T+-'+'?'?N$r$   c                 B   [         R                  " U R                  5      nU R                  [         R                  5         [         R                  " U R                  5        S S S 5        [         R
                  " 5       nU R                  X5        g ! , (       d  f       N5= frJ   )r   create_context_configrP   assertRaises(ContextConfigSingletonAlreadyExistsErrorget_context_configr   )r   firstseconds      r!   "test_context_config_is_a_singleton4TestContextConfig.test_context_config_is_a_singleton   su    001A1ABE			??
A**4+;+;<
A ..0FU#
A 
As    !B
BPopenc                 d    [         R                  " U R                  5        UR                  5         g rJ   )r   rX   rP   assert_not_calledr   
mock_Popens     r!   :test_does_not_provision_if_use_client_certificate_not_trueLTestContextConfig.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           
         [         /Ul        [        S/5         U R                  [        5         [
        R                  " U R                  5        UR                  [
        R                  5        UR                  [        R                  R                  [        R                  R                  SS5      5      SS5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NCredentialsuse_client_certificateTruer   r   r   --with_passphrase)#DEFAULT_CERT_PROVIDER_FILE_CONTENTSside_effectr   rY   
ValueErrorr   rX   rP   assert_called_with_DEFAULT_METADATA_PATHassert_called_once_withospathrealpathjoinr   	mock_openrd   mock_json_loads       r!   0test_executes_provider_command_from_default_fileBTestContextConfig.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                    [         /Ul        [        SS/5         U R                  [        5         [
        R                  " U R                  5        UR                  [
        R                  5        UR                  [        R                  R                  S5      SS5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrm   rn   r   Nzcert helperr   rq   ).DEFAULT_CERT_PROVIDER_FILE_CONTENTS_WITH_SPACErs   r   rY   rt   r   rX   rP   ru   rv   rw   rx   ry   rz   r|   s       r!   ;test_executes_provider_command_with_space_from_default_fileMTestContextConfig.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#   CA0B1 C1
B?	;C
Cc                 0   [         Ul        [        SS/5         [        R                  " U R
                  5        UR                  [        R                  5        U R
                  R                  R                  S5        S S S 5        g ! , (       d  f       g = f)Nrm   r   zVFailed to provision client certificate: Client certificate provider command not found.)
%DEFAULT_CERT_PROVIDER_FILE_NO_COMMANDrg   r   r   rX   rP   ru   rv   errorrw   r   r}   r~   s      r!   &test_default_provider_no_command_error8TestContextConfig.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                     [        SSSSU R                  5       4/5         [        R                  " U R                  5        U R                  R
                  R                  S5        S S S 5        g ! , (       d  f       g = f)Nrm   r   GSUtil	state_dirzSFailed to provision client certificate: Client certificate provider file not found.)r   CreateTempDirr   rX   rP   r   rw   )r   s    r!   %test_default_provider_not_found_error7TestContextConfig.test_default_provider_not_found_error
  sm    	96	; 2 2 45	 
 **4+;+;<
4489
 
 
s   AA//
A=c                 :   [        S5      Ul        [        SS/5         [        R                  " U R
                  5        UR                  [        R                  5        U R
                  R                  R                  S5        S S S 5        g ! , (       d  f       g = f)N
valueErrorrm   r   z2Failed to provision client certificate: valueError)
rt   rs   r   r   rX   rP   ru   rv   r   rw   r   s      r!   3test_raises_cert_provision_error_on_json_load_errorETestContextConfig.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                    [        SS/5         U R                  [        5         [        R                  " U R
                  5        UR                  [        R                  R                  S5      [        R                  [        R                  S9  S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrm   rn   r   	some/pathr   )stdoutstderr)r   rY   rt   r   rX   rP   rw   rx   ry   rz   
subprocessPIPErc   s     r!   6test_executes_custom_provider_command_from_boto_configHTestContextConfig.test_executes_custom_provider_command_from_boto_config&  s    	9= 

 Z(,,T-=-=>**277+;+;K+H2<//2<// 	+ 	C )
 

 )(
 
s#   B1A+B B1 
B.	*B11
B?c                 4   [         R                  " 5       nSUR                  l        X!l        [	        SS/5         [
        R                  " U R                  5        U R                  R                  R                  S5        S S S 5        g ! , (       d  f       g = f)N)Nzoh norm   r   z-Failed to provision client certificate: oh no)
r   rO   communicaterg   r   r   rX   rP   r   rw   )r   rd   mock_command_processs      r!   Gtest_converts_and_logs_provisioning_cert_provider_unexpected_exit_errorYTestContextConfig.test_converts_and_logs_provisioning_cert_provider_unexpected_exit_error4  s{      99;4C$$12	9= 
 **4+;+;<
44
9;
 
 
s   AB		
Bc                     [        S5      Ul        [        SS/5         [        R                  " U R
                  5        U R
                  R                  R                  S5        S S S 5        g ! , (       d  f       g = fNfoobarrm   r   z.Failed to provision client certificate: foobar)OSErrorrs   r   r   rX   rP   r   rw   rc   s     r!   ,test_converts_and_logs_provisioning_os_error>TestContextConfig.test_converts_and_logs_provisioning_os_errorC  se    $X.J	9= 
 **4+;+;<
44
:<
 
 
s   AA--
A;c                    [         R                  " S5      Ul        [        SS/5         [        R
                  " U R                  5        U R                  R                  R                  S5        S S S 5        g ! , (       d  f       g = fr   )	r	   ExternalBinaryErrorrs   r   r   rX   rP   r   rw   rc   s     r!   9test_converts_and_logs_provisioning_external_binary_errorKTestContextConfig.test_converts_and_logs_provisioning_external_binary_errorO  sm     '::8DJ	9= 
 **4+;+;<
44
:<
 
 
s   AA88
Bc                 4   [        S5      Ul        [        SS/5         [        R                  " U R
                  5        [        R                  (       a  SOSnU R
                  R                  R                  SU-   5        S S S 5        g ! , (       d  f       g = f)Nr   rm   r   z'foobar'z	u'foobar'z\Failed to provision client certificate: Invalid output format from certificate provider, no )
KeyErrorrs   r   r   rX   rP   sixPY3r   rw   )r   rd   unicode_escaped_error_strings      r!   -test_converts_and_logs_provisioning_key_error?TestContextConfig.test_converts_and_logs_provisioning_key_error\  s     &h/J	9= 
 **4+;+;<3677Z"
44B
&'(
 
 
s   A"B		
Bremovec                     [         R                  " U R                  5        [         R                  R	                  5         UR                  5         g rJ   )r   rX   rP   rM   _unprovision_client_certrb   r   mock_removes     r!   2test_does_not_unprovision_if_no_client_certificateDTestContextConfig.test_does_not_unprovision_if_no_client_certificaten  s4    (()9)9:$$==?!!#r$   c                    [        S5      Ul        [        R                  " U R                  5        S[        R
                  l        [        R
                  R                  5         U R                  R                  R                  S5        g )Nnor   z'Failed to remove client certificate: no)
r   rs   r   rX   rP   rM   client_cert_pathr   r   rw   r   s     r!   -test_handles_and_logs_unprovisioning_os_error?TestContextConfig.test_handles_and_logs_unprovisioning_os_errort  s_    %dmK(()9)9:8CN$$5$$==?2213r$   c                    [         R                  " 5       nSUl        [        R	                  5       S 4UR
                  l        XAl        [        SS/5         [        R                  " [         R                  " 5       5      nUR                  [         R                  " UR                  S5      [         R                  " 5       R                  [        5      [         R                  " 5       R                  [        5      /SS9  U R!                  [        R"                  R$                  [&        5        [        R"                  R)                  5         UR+                  UR                  5        S S S 5        g ! , (       d  f       g = f)Nr   rm   rn   r   zpath --print_certificatew+T	any_order)r   rO   
returncodeFULL_ENCRYPTED_CERTencoder   rg   r   r   rX   assert_has_callscallr   writer   r   r   rM   client_cert_passwordPASSWORDr   rw   r   rd   r   r}   r   test_configs         r!   Mtest_writes_and_deletes_encrypted_certificate_file_storing_password_to_memory_TestContextConfig.test_writes_and_deletes_encrypted_certificate_file_storing_password_to_memory  s   
  99;&'#""$d5,$$12	9L 

 #88Ek   
))K00$
7
))+

L
)
))+

1
2"
 ,0 ! 1 ~77LL! &&??A))+*F*FG-
 
 
   DE--
E;c                    [         R                  " 5       nSUl        [        R	                  5       S4UR
                  l        XAl        [        SS/5         [        R                  " [         R                  " 5       5      nUR                  [         R                  " UR                  S5      [         R                  " 5       R                  [        5      [         R                  " 5       R                  [        5      /SS9  U R!                  [        R"                  R$                  [&        5        [        R"                  R)                  5         UR+                  UR                  5        SSS5        g! , (       d  f       g= f)z-This is the format used by gcloud by default.r   Nrm   r   r   Tr   )r   rO   r   	FULL_CERTr   r   rg   r   r   rX   r   r   r   r   r   KEY_SECTIONr/   rM   r   r   r   rw   r   s         r!   Mtest_writes_and_deletes_unencrypted_certificate_file_without_storing_password_TestContextConfig.test_writes_and_deletes_unencrypted_certificate_file_without_storing_password  s     99;&'#5>5E5E5G4N$$12	9L 

 #88Ek   
))K00$
7
))+

L
)
))+

K
("
 ,0 ! 1 88MM " &&??A))+*F*FG-
 
 
r   )rN   rP   )"r@   rA   rB   rC   rD   rL   rU   r^   r   patchobjectr   re   rO   jsonOPEN_TO_PATCHr}   r   r   r   r   r   r   r   r   r   r   rx   r   r   r   r   rE   __classcell__)rR   s   @r!   rG   rG      s    1#@$ ::Z)# *#
 ::DII4$@A::T6D1::Z48::m$..98 : 9 2 B8 ::DII4$@A::T6D1::Z48::m$..9@ : 9 2 B@" ::DII4$@A::T6D1::m$..9< : 2 B< ::DII5$AB9 C9 ::T6D1::DII4$@A::m$..9	@ : B 2	@ ::Z48C 9C ::Z); *; ::Z)	< *	< ::Z)
< *
< ::Z)( *(" ::R"$ #$
 ::R"3 #3 ::m$..9::R"::Z)H * # :H@ ::m$..9::R"::Z)H * # :Hr$   rG   )2rD   
__future__r   r   r   r   r   rx   r   unittestr   r   gslibr   r	   gslib.testsr
   gslib.tests.testcaser   gslib.tests.utilr   ry   r{   rr   r   r   r   r   r   CERT_ENCRYPTED_KEY_SECTIONr   PASSWORD_SECTIONr   r   r.   r4   r8   r<   r   r&   r*   PY2r   integration_testcase	SkipForS3
SkipForXMLGsUtilUnitTestCaser   NotParallelizablerG   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$   