
    b                        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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Js  Jr  SSKJr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s  J$r%  SSK&J'r'  SSK(J)r)  SSK*J+r+J,r,  \+" \," SSS5      5        SSK-J.r.  \
R^                  Ra                  SS5      r1Sr2\"Rf                  " \S5      \" S5       " S S \Rh                  5      5       5       r5\"Rf                  " \S5       " S! S"\Rl                  5      5       r7\"Rf                  " \S5       " S# S$\Rp                  5      5       r9g)%zTests for signurl command.    )absolute_import)print_function)division)unicode_literalsdatetime)	timedeltaN)HAVE_OPENSSL)HAVE_CRYPTO)CommandException)
GcsJsonApi)IamcredentailsApi)ImpersonationCredentials)	SkipForS3
SkipForXML)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)unittest)client)ServiceAccountCredentials)add_moveMovedModulemockzunittest.mock)r   GSUtil test_impersonate_service_accountz$test%40developer.gserviceaccount.comzsignurl requires pyopenssl.z.Signed URLs are only supported for gs:// URLs.c                      \ rS rSrSrS rS rS rS r\	R                  " \(       + S5      S 5       r\	R                  " \S	5      S
 5       rS rS rS rS r\	R                  " \S5      \" S5      \" S5      S 5       5       5       rS rSrg)TestSignUrl9   z&Integration tests for signurl command.c                     [        U S5      (       d+  [        R                  " SS5      nU R                  US9U l        U R                  $ )Njson_ks_filegslibtests/test_data/test.jsoncontents)hasattrpkgutilget_dataCreateTempFiler!   selfr%   s     +platform/gsutil/gslib/tests/test_signurl.py_GetJSONKsFileTestSignUrl._GetJSONKsFile>   sD    4((!!'+FGh--x-@d    c                     [        U S5      (       d+  [        R                  " SS5      nU R                  US9U l        U R                  $ )Nks_filer"   tests/test_data/test.p12r$   )r&   r'   r(   r)   r1   r*   s     r,   
_GetKsFileTestSignUrl._GetKsFileE   sC    4##  !!'+EFh((((;dl<<r/   c                     U R                   (       a  SnOSnU R                  / SQSUS9nU R                   (       a  U R                  SU5        gU R                  SU5        g)	z@Tests signurl fails with out of bounds value for valid duration.      )signurl-d123dr1   gs://uriTreturn_stderrexpected_statusz&value must be less than or equal to 7dz6CommandException: Max valid duration allowed is 7 daysN)_use_gcloud_storage	RunGsUtilassertIn)r+   r>   stderrs      r,   testSignUrlInvalidDuration&TestSignUrl.testSignUrlInvalidDurationZ   s]    oo^^L*.,;  =F 
mm<fE
mmLr/   c                 N    U R                  / SQSSS9nU R                  SU5        g)z5Tests signurl with -u flag fails duration > 12 hours.)r8   r9   13h-ur;   Tr7   r<   z8CommandException: Max valid duration allowed is 12:00:00N)r@   rA   )r+   rB   s     r,   /testSignUrlInvalidDurationWithUseServiceAccount;TestSignUrl.testSignUrlInvalidDurationWithUseServiceAccounti   s2    ^^F*.,-  /F 	MMLr/   z+signurl requires crypto to decode .p12 keysc           	          U R                  5       nU R                  USS9nSSSSSU R                  5       [        U5      /nU R	                  USSS	9nU R                  S
U5        g )N   z
bucket_urir%   r8   -p
notasecret-mPUTr7   r<   zsCommandException: pyca/cryptography is not available. Either install it, or please consider using the .json keyfileCreateBucketCreateObjectr3   surir@   rA   )r+   rM   
object_uricmdrB   s        r,   ,testSignUrlRaiseErrorForP12KeysWithoutCrypto8TestSignUrl.testSignUrlRaiseErrorForP12KeysWithoutCryptoq   sy    ""$J""j4"HJ4tUZC
 ^^Cq!^DFMM  H  JP  Qr/   z,signurl requires crypto to decode .p12 keys.c           	      4   U R                  5       nU R                  USS9nSSSSSU R                  5       [        U5      /nU R	                  USS	9nU R                  S
U5        U R                  SU5        U R                  SU5        U R                  SU5        g)z=Tests signurl output of a sample object with pkcs12 keystore.rK   rL   r8   rN   rO   rP   rQ   Treturn_stdoutz1x-goog-credential=test.apps.googleusercontent.comx-goog-expires=3600%2Fus-central1%2F	PUT	NrR   r+   rM   rV   rW   stdouts        r,   testSignUrlOutputP12 TestSignUrl.testSignUrlOutputP12}   s     ""$J""j4"HJ4tUZC
 ^^Ct^4FMMEvNMM'0MM%v.MM)V$r/   c                 >   U R                  5       nU R                  USS9nSSSU R                  5       [        U5      /nU R	                  USS9nU R                  S[        -   U5        U R                  S	U5        U R                  S
U5        U R                  SU5        g)z;Tests signurl output of a sample object with JSON keystore.rK   rL   r8   rP   rQ   Tr[   x-goog-credential=r]   r^   r_   N)rS   rT   r-   rU   r@   rA   
TEST_EMAILr`   s        r,   testSignUrlOutputJSON!TestSignUrl.testSignUrlOutputJSON   s    ""$J""j4"HJdE4#6#6#8$z:J
KC^^Ct^4FMM&3V<MM'0MM%v.MM)V$r/   c                    U R                  SS9nU R                  USS9nSU R                  5       UR                  /nU R	                  USS9nU R                  S[        -   U5        U R                  SUR                  -   U5        g	)
zCTests signurl output of a sample object version with JSON keystore.T)versioning_enabledrK   rL   r8   r[   re   zgeneration=N)rS   rT   r-   version_specific_urir@   rA   rf   
generationr`   s        r,   -testSignUrlWithJSONKeyFileAndObjectGeneration9TestSignUrl.testSignUrlWithJSONKeyFileAndObjectGeneration   s    ""d";J""j4"HJd))+Z-L-L
MC^^Ct^4FMM&3V<MM-*"7"77@r/   c                 
   / SQn/ SQnU R                  [        U5      [        U5      5        SSSSSU R                  5       /nUR                  U5        U R	                  USS	9nUR                  S
5      nU R                  [        U5      [        U5      S-   5        USS  n[        XU5       HA  u  pgnU R                  Xg5        U R                  X5        U R                  S[        -   U5        MC     U R                  SU5        g )N)zgs://example.org/test 1zgs://example.org/test/test 2u'   gs://example.org/Аудиоарi хив)zEhttps://storage.googleapis.com/example.org/test%201?x-goog-signature=zJhttps://storage.googleapis.com/example.org/test/test%202?x-goog-signature=z}https://storage.googleapis.com/example.org/%D0%90%D1%83%D0%B4%D0%B8%D0%BE%D0%B0%D1%80i%20%D1%85%D0%B8%D0%B2?x-goog-signature=r8   rP   rQ   -rusTr[   
r6   r7   re   z%2Fus%2F)	assertEquallenr-   extendr@   splitziprA   rf   )	r+   objsexpected_partial_urlscmd_argsra   linesobjlinepartial_urls	            r,   %testSignUrlWithURLEncodeRequiredChars1TestSignUrl.testSignUrlWithURLEncodeRequiredChars   s    D 	SY$9 :; 	4dH OOD^^HD^9FLLESZTQ/ !"IE"%d3H"I;
mmC
mmK&
mm(3T: #J 	MM*f%r/   c           	      x   / SQn/ nU R                  5       nU H#  nUR                  U R                  UUSS95        M%     U R                  SU R	                  5       [        U5      S-   /SS9nU R                  [        UR                  S5      5      S	5        U H  nU R                  [        U5      U5        M      g )
N)test1test2test3r/   )rM   object_namer%   r8   z/*Tr[   rr      )
rS   appendrT   r@   r-   rU   rs   rt   rv   rA   )r+   rx   obj_urlsbucketobj_namera   obj_urls          r,   testSignUrlWithWildcard#TestSignUrl.testSignUrlWithWildcard   s    &DH Foo


v(0%(  *+  ^^						f		 	  F 	Sd+,a0
mmDM6* r/   z/Test requires test_impersonate_service_account.Tests only uses gs credentials.Tests only run on JSON API.c                     [        SS[        4/5         U R                  / SQSSS9u  pS S S 5        U R                  SW5        U R                  S[        -  W5        g ! , (       d  f       N:= f)NCredentialsgs_impersonate_service_account)r8   rp   us-east1rG   zgs://pubT)r\   r=   z"https://storage.googleapis.com/pubz&All API calls will be executed as [%s])r   SERVICE_ACCOUNTr@   rA   )r+   ra   rB   s      r,   testSignUrlWithServiceAccount)TestSignUrl.testSignUrlWithServiceAccount   st    
 
/O / 1 2 
3~~
9 & nf
3 	MM6?MM:_L
3 
3s   A
A,c                 j    U R                  SU R                  5       S/SS9  U R                  / SQSS9  g)z0Tests the signurl output of a non-existent file.r8   zgs://r7   )r>   )r8   zfile://tmp/abczgs://bucketN)r@   r-   r+   s    r,   testSignUrlOfNonObjectUrl%TestSignUrl.testSignUrlOfNonObjectUrl   s?    NNIt224g>#$  &NN?#$  &r/   )r!   r1   N)__name__
__module____qualname____firstlineno____doc__r-   r3   rC   rH   r   
skipUnlessr   rX   rb   rg   rm   r   r   r   r   r   r   r   __static_attributes__ r/   r,   r   r   9   s     /* ;(UV	Q W	Q {$RS% T%	%A"&H+. HJ./+, - 0J&r/   r   c                   J  ^  \ rS rSrSrSrU 4S jrS rS rS r	\
" S5      \" S	5      S
 5       5       r\
" S5      \" S	5      S 5       5       r\
" S5      \" S	5      \R                  " S5      \R                  " S5      S 5       5       5       5       rS rS rS rS rS rSrU =r$ )UnitTestSignUrl   z#Unit tests for the signurl command.Nc                 
  > [         [        U ]  5         [        R                  " SS5      n[
        R                  R                  R                  US5      u  U l	        U l
        S nU[
        R                  R                  l        g )Nr"   r2   rO   c                  "    [        SSSSSS5      $ )Nil  r7   r   r   7   r   r   r/   r,   fake_now'UnitTestSignUrl.setUp.<locals>.fake_now  s    dAq!Q++r/   )superr   setUpr'   r(   r"   commandsr8   _ReadKeystorekeyclient_emailutilssignurl_helper_NowUTC)r+   ks_contentsr   	__class__s      r,   r   UnitTestSignUrl.setUp   se    	/4&(""7,FGK"'.."8"8"F"F\##DHd, *2EKK&r/   c                 X    U R                  5       n[        UR                  S   S   S'   U$ )NapiclassgsJSON)MakeGsUtilApir   api_map)r+   mock_api_delegators     r,   _get_mock_api_delegator'UnitTestSignUrl._get_mock_api_delegator	  s5    ++- <Fz*408r/   c                 t   S[        SS94S[        SS94S[        SS94S	[        S
S94S[        SS94S[        SS94S[        SS94SS/	nU H@  u  p# [        R                  R                  R	                  U5      nU R                  XC5        MB     g ! [         a    Ub  U R                  S5         Mf   Mi  f = f)N1hr7   )hours2dr6   )days5Dr   35s#   seconds33!   22m   )minutes)z3.7N)27ZNz{0} failed to parse)r	   r"   r   r8   _DurationToTimeDeltars   r   fail)r+   testsinpexpectedtds        r,   testDurationSpec UnitTestSignUrl.testDurationSpec  s    	yq!"	ya !	ya !		"%&	yq!"	yr"#		"%&
E +^^##88=&   +
)))
*  +s   :BB76B7c                 D   [         R                  n[        SS9n[        S/5         [        R
                  R                  R                  U R                  SSSU R                  SSUU R                  S	S
S9nSSS5        U R                  UW5        g! , (       d  f       N!= f)zBTests the _GenSignedUrl function with a PUT method using Key file.  r   r   gs_hostzstorage.googleapis.comNFr   	RESUMABLEtest/test.txtus-east 
apiuse_service_accountprovider	client_idmethodgcs_pathdurationloggerregioncontent_type)sigsTEST_SIGN_PUT_SIGr	   r   r"   r   r8   _GenSignedUrlr   r   r   rs   r+   r   r   
signed_urls       r,   testSignPutUsingKeyFile'UnitTestSignUrl.testSignPutUsingKeyFile(  s    %%H&H	  : ; 
<>>))77
((#%%" 8 j
< 	Xz*
< 
<   AB
Br   r   c                    [         R                  n[        SS9nU R                  5       nUR	                  S5      n[
        R                  " [        S9nSUl        SUR                  l
        XTl        [        S/5         [        R                  R                  R!                  SUS	SU R"                  S
SUU R$                  SSS9nSSS5        U R'                  UW5        UR                  R)                  S5        g! , (       d  f       N<= f)zATests the _GenSignedUrl function PUT method with service account.r   r   r   specfake_service_account_email)fake_key   fake_signaturer   NTrQ   r   r   r   r      GOOG4-RSA-SHA256
19000101T000555Z
19000101/us-east1/storage/goog4_request
7f110b30eeca7fdd8846e876bceee85384d8e4c7388b3596544b1b503f9e2320)r   &TEST_SIGN_URL_PUT_WITH_SERVICE_ACCOUNTr	   r   _GetApir   Mockr   service_account_email	sign_blobreturn_valuecredentialsr   r"   r   r8   r   r   r   rs   assert_called_once_with)r+   r   r   r   json_apimock_credentialsr   s          r,   testSignPutUsingServiceAccount.UnitTestSignUrl.testSignPutUsingServiceAccount=  s     ::H&H557!))$/Hyy&?@-I*.M++	  : ; 
<>>))77
 "%%" 8 j
< 	Xz*66	
< 
<s   =AC99
Dc                    [         R                  n[        SS9nU R                  5       nUR	                  S5      n[
        R                  " [        R                  S9nSUl	        XTl
        [        S/5         U R                  [        [        R                  R                   R"                  SUSSU R$                  S	S
UU R&                  SSS9  SSS5        g! , (       d  f       g= f)zTests the _GenSignedUrl with incorrect account type.

Test that GenSignedUrl function with 'use_service_account' set to True
and a service account not used for credentials raises an error.
r   r   r   r   r   r   NTrQ   r   r   r   r   )r   r   r	   r   r   r   r   r   OAuth2Credentialsr   r   r   assertRaisesr   r"   r   r8   r   r   r   )r+   r   r   r   r  r  s         r,   #testSignUrlWithIncorrectAccountType3UnitTestSignUrl.testSignUrlWithIncorrectAccountType_  s     ::H&H557!))$/Hyyf&>&>?-I*+	  : ; 
<
(..<<.,0!%"&"3"3$!0!)#{{)%'  )
< 
< 
<s   6AC
C#z(gslib.iamcredentials_api.apitools_clientz*gslib.iamcredentials_api.apitools_messagesc                    [         R                  n[        SS9nU R                  5       nUR	                  S5      n[
        R                  " [        S9n[
        R                  " 5       nXR                  l	        [        [
        R                  " 5       S9n	Xl        SUl        [
        R                  " 5       n
SU
l        XR                  R                  l	        Xvl        [#        S/5         [$        R&                  R(                  R+                  S	US
SU R,                  SSUU R.                  SSS9nS	S	S	5        U R1                  UW5        UR2                  R5                  SS9  g	! , (       d  f       N:= f)zTests the _GenSignedUrl function PUT method with impersonation.

Test _GenSignedUrl function using an impersonated service account.
r   r   r   r   )r   r   r   r   NTrQ   r   r   r   r   r   )payload)r   r   r	   r   r   r   r   r   IamcredentialsV1r   r   r   service_account_id
signedBlobprojects_serviceAccountsSignBlobr   r   r"   r   r8   r   r   r   rs   SignBlobRequestr  )r+   mock_api_messagesmock_apiclientr   r   r   r  r  api_client_objmock_iam_cred_api	mock_respr   s               r,   )testSignPutUsingImersonatedServiceAccount9UnitTestSignUrl.testSignPutUsingImersonatedServiceAccount  sL    ::H&H557!))$/H yy&>?YY[N3A##0 *diikB,*F' 		I,IDM++44A+	  : ; 
<>>))77
 "%%" 8 j
< 	Xz*%%==/ > 0
< 
<s   )AE##
E1c                    [         R                  n " S S[        5      nU" 5       n[        SS9n[	        S/5         [
        R                  R                  R                  U R                  SSSU R                  S	S
UUSSS9nSSS5        U R                  UW5        U R                  UR                  5        U" 5       n[	        S/5         [
        R                  R                  R                  U R                  SSSU R                  S	S
UUSSS9nSSS5        U R                  UR                  5        g! , (       d  f       N= f! , (       d  f       N;= f)z;Tests _GenSignedUrl using key file with a RESUMABLE method.c                        \ rS rSrS rS rSrg)@UnitTestSignUrl.testSignResumableWithKeyFile.<locals>.MockLoggeri  c                     SU l         g )NFwarning_issuedr   s    r,   __init__IUnitTestSignUrl.testSignResumableWithKeyFile.<locals>.MockLogger.__init__  s
    #r/   c                     SU l         g )NTr  )r+   
unused_msgs     r,   warnEUnitTestSignUrl.testSignResumableWithKeyFile.<locals>.MockLogger.warn  s
    "r/   r  N)r   r   r   r   r   r$  r   r   r/   r,   
MockLoggerr    s    $#r/   r&  r   r   r   NFr   r   r   r   r   r   z
image/jpeg)r   TEST_SIGN_RESUMABLEobjectr	   r   r"   r   r8   r   r   r   rs   
assertTruer  assertFalse)r+   r   r&  mock_loggerr   r   mock_logger2s          r,   testSignResumableWithKeyFile,UnitTestSignUrl.testSignResumableWithKeyFile  sF   ''H#V # ,K&H	  : ; 
<>>))77
((#%%" 8 j
< 	Xz*OOK../<L	  : ; 
<>>))77
((#%%"# 8 %j
< 	\001E
< 
<&
< 
<s   AD4
AE4
E
Ec                 D   [         R                  n[        SS9n[        S/5         [        R
                  R                  R                  U R                  SSSU R                  SSUU R                  S	S
S9nSSS5        U R                  UW5        g! , (       d  f       N!= f)zFTests _GenSignedUrl using key file with a PUT method and content type.r   r   r   NFr   rQ   r   euz
text/plainr   )r   TEST_SIGN_URL_PUT_CONTENTr	   r   r"   r   r8   r   r   r   r   rs   r   s       r,   $testSignurlPutContentypeUsingKeyFile4UnitTestSignUrl.testSignurlPutContentypeUsingKeyFile  s    --H&H	  : ; 
<>>))77
((#%%"# 8 %j
< 	Xz*
< 
<r   c                 D   [         R                  n[        SS9n[        S/5         [        R
                  R                  R                  U R                  SSSU R                  SSUU R                  S	S
S9nSSS5        U R                  UW5        g! , (       d  f       N!= f)zBTests the _GenSignedUrl function using key file with a GET method.r   r   r   NFr   GETr   asiar   r   )r   TEST_SIGN_URL_GETr	   r   r"   r   r8   r   r   r   r   rs   r   s       r,   testSignurlGetUsingKeyFile*UnitTestSignUrl.testSignurlGetUsingKeyFile  s    %%H#H	  : ; 
<>>))77
((#%%" 8 j
< 	Xz*
< 
<r   c                    [         R                  n[        R                  " SS5      R	                  5       n[
        R                  R                  R                  U5      u  p4[        SS9n[        S/5         [
        R                  R                  R                  USSSUS	S
UU R                  SSS9nSSS5        U R                  UW5        g! , (       d  f       N!= f)zDTests _GenSignedUrl with a GET method and the test JSON private key.r"   r#   r   r   r   NFr   r5  r   r6  r   r   )r   TEST_SIGN_URL_GET_WITH_JSON_KEYr'   r(   decoder"   r   r8   _ReadJSONKeystorer	   r   r   r   rs   )r+   r   json_contentsr   r   r   r   s          r,   %testSignurlGetWithJSONKeyUsingKeyFile5UnitTestSignUrl.testSignurlGetWithJSONKeyUsingKeyFile  s    33H$$W%@BBH&( ..@@OC#H	  : ; 
<>>))77
# " 8 j
< 	Xz*
< 
<s   6<C
Cc                 F   [         R                  n[        SS9n[        S/5         [        R
                  R                  R                  U R                  SSSU R                  SSUU R                  S	S
SS9nSSS5        U R                  UW5        g! , (       d  f       N!= f)z4Tests the _GenSignedUrl function with a userproject.r   r   r   NFr   r5  r   r6  r   	myproject)r   r   r   r   r   r   r   r   r   r   billing_project)r   TEST_SIGN_URL_GET_USERPROJECTr	   r   r"   r   r8   r   r   r   r   rs   r   s       r,   testSignurlGetWithUserProject-UnitTestSignUrl.testSignurlGetWithUserProject+  s    11H#H	  : ; 
<>>))77
((#%%"% 8 'j
< 	Xz*
< 
<s   AB
B )r   r   )r   r   r   r   r   maxDiffr   r   r   r   r   r   r  r	  r   patchr  r-  r2  r8  r?  rE  r   __classcell__)r   s   @r,   r   r      s    + '	2+*+* ./+, - 0@ ./+,) - 0)> ./+,::89:::;00 < : - 000d02d+*+*+2+ +r/   r   c                        \ rS rSrS rS rSrg)UnitTestSignUrlWithShimiB  c                    [         R                  " SS5      nU R                  US9n[        SS/5         [	        SSS.5         U R                  S	S
SSSSSSSSSUS/SS9nSR                  UR                  S   5      nU R                  SR                  U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr"   r#   r$   r   use_gcloud_storageTruer   hidden_shim_modedry_runrO  fake_dir(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr8   r9   2mrP   r   rp   US-bproject-capplication/octet-streamgs://bucket/objectTreturn_log_handlerrr   infoaj  storage sign-url --format=csv[separator="\t"](resource:label="URL", http_verb:label="HTTP Method", expiration:label="Expiration", signed_url:label="Signed URL") --private-key-file={} --headers=x-goog-resumable=start --duration 120s --http-verb POST --region US --query-params userProject=project --headers content-type=application/octet-stream gs://bucket/object
r'   r(   r)   r   r   
RunCommandjoinmessagesrA   format)r+   key_contentskey_pathmock_log_handler
info_liness        r,   testShimTranslatesFlags/UnitTestSignUrlWithShim.testShimTranslatesFlagsE  s    ##G-HIL""L"9H	GHJ 
K 6<)" 	  ??9$k4tY&2F7
 ?C	 + D
 YY/88@A
	" #)&"2J
	@	
K 
K	 	
K 
Ks$   CAB1 C1
B?	;C
Cc                    [         R                  " SS5      nU R                  US9nSn[        SS/5         [	        SSS	.5         U R                  S
SSSSSUSSSSSSUS/SS9nSR                  UR                  S   5      nU R                  SR                  X#5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr"   r2   r$   rO   rM  rP  rO  rS  rT  r8   r9   rW  rP   r   rN   rp   rX  rY  rZ  r[  r\  r]  Tr^  rr   r`  a  storage sign-url --format=csv[separator="\t"](resource:label="URL", http_verb:label="HTTP Method", expiration:label="Expiration", signed_url:label="Signed URL") --private-key-file={} --headers=x-goog-resumable=start --duration 120s --http-verb POST --private-key-password {} --region US --query-params userProject=project --headers content-type=application/octet-stream gs://bucket/objectra  )r+   rf  rg  key_passwordrh  ri  s         r,   !testShimTranslatesFlagsWithP12Key9UnitTestSignUrlWithShim.testShimTranslatesFlagsWithP12Keya  s    ##G-GHL""L"9HL	GHJ 
K 6<)" 	  ??9$k4tT4QZ\`&2F7
 ?C	 + D
 YY/88@A

" #)&"@*	N	
K 
K	 	
K 
Ks$   CAB5$C5
C	?C
Cr   N)r   r   r   r   rj  rn  r   r   r/   r,   rK  rK  B  s    @8Nr/   rK  ):r   
__future__r   r   r   r   r   r	   osr'   botogslib.commands.signurlr"   r
   r   gslib.exceptionr   gslib.gcs_json_apir   gslib.iamcredentials_apir   gslib.impersonation_credentialsr   gslib.tests.testcaser   testcase)gslib.tests.testcase.integration_testcaser   r   gslib.tests.utilr   rU   r   r   r   gslib.tests.signurl_signaturessignurl_signaturesr   oauth2clientr   oauth2client.service_accountr   sixr   r   	six.movesr   config	get_valuer   rf   r   GsUtilIntegrationTestCaser   GsUtilUnitTestCaser   ShimUnitTestBaserK  r   r/   r,   <module>r     s:   ! & %  '   	    / . , ) 6 D ' ' M 0 1 2 % - -  B % VV_	5 6 ++''(JL3
 
\#@A
;<x&(44 x& = Bx&v 
\#@AH+h11 H+ BH+V
 
\#@A:Nh77 :N B:Nr/   