
                            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	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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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$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.  \R^                  (       a  \0r1\Rd                  " S\Rf                  5      r4\Rd                  " S\Rf                  5      r5\Rd                  " S \Rf                  5      r6\Rd                  " S!\Rf                  5      r7\Rd                  " S"\Rf                  5      r8\Rd                  " S#\Rf                  5      r9\Rd                  " S$\Rf                  5      r:\Rd                  " S%\Rf                  5      r;\Rd                  " S&\Rf                  5      r<\Rd                  " S'\Rf                  5      r=\Rd                  " S(\Rf                  5      r>\Rd                  " S)\Rf                  5      r?\Rd                  " S*\Rf                  5      r@\A" \4\5\6\7\8\9\:\;\<\=\>\?15      rBS+rCS,rD\+R                  R                  S-S./S/9/rG\+R                  " S0S19rIS2 rJS3 rKS4 rLSGS5 jrMSGS6 jrNS7 rO    SHS8 jrPS9 rQ SIS: jrRS; rS " S< S=\T5      rU " S> S?\T5      rVS@ rWSA rXSB rY " SC SD\T5      rZ " SE SF\T5      r[g)JzDUtility module for translating XML API objects to/from JSON objects.    )absolute_import)print_function)division)unicode_literalsN)
ParseError)decode_datetime)encoding)ACL)ALL_AUTHENTICATED_USERS)	ALL_USERS)Entries)Entry)GROUP_BY_DOMAIN)GROUP_BY_EMAIL)GROUP_BY_ID)USER_BY_EMAIL)
USER_BY_ID)Tags)TagSet)ArgumentExceptionBucketNotFoundException)NotFoundException)Preconditions)CommandException)storage_v1_messages)S3_ACL_MARKER_GUID)S3_MARKER_GUIDSz^cache-controlz^content-dispositionz^content-encodingz^content-languagez^content-md5z^content-typez^custom-timez^x-goog-api-versionz^x-goog-if-generation-matchz^x-goog-if-metageneration-matchz^x-goog-meta-(?P<header_key>.*)z^x-amz-meta-(?P<header_key>.*)z^x-amz-(?P<header_key>.*)zcustom-amz-headerzapplication/octet-streamREMOVE_CORS_CONFIG)maxAgeSecondsmethodPRIVATE_DEFAULT_OBJ_ACL)idc                    ^ 0 nU R                  5        H*  u  mn[        U4S j[         5       5      (       a  M&  X!T'   M,     U$ )Nc              3   D   >#    U  H  oR                  T5      v   M     g 7fN)match).0regexheaders     1platform/gsutil/gslib/utils/translation_helper.py	<genexpr>(GetNonMetadataHeaders.<locals>.<genexpr>y   s     H0Gu{{6""0Gs    )itemsanymetadata_header_regexes)headersarbitrary_headersvaluer+   s      @r,   GetNonMetadataHeadersr5   v   s?    }}mfeH0GHHH"' ' 
    c                    [         R                  " 5       nU R                  5        GH1  u  p#[        R	                  U5      (       a  UR                  5       Ul        M7  [        R	                  U5      (       a  UR                  5       Ul        Mh  [        R	                  U5      (       a  UR                  5       Ul
        M  [        R	                  U5      (       a  UR                  5       Ul        M  [        R	                  U5      (       a  UR                  5       Ul        M  [        R	                  U5      (       a-  U(       d  [         Ul        GM*  UR                  5       Ul        GMB  [$        R	                  U5      (       a!  ['        UR                  5       5      Ul        GM}  [*        R	                  U5      (       a  GM  [,        R	                  U5      (       a  GM  [.        R	                  U5      (       a  GM  [0        R	                  U5      n[2        R	                  U5      n[4        R	                  U5      nSnU(       a  UR7                  S5      nO8U(       a  UR7                  S5      nOU(       a  [8        UR7                  S5      -   nU(       d  GMp  UR;                  5       S:X  a  GM  UR<                  (       d#  [         R                  R?                  5       Ul        UR<                  R@                  (       d  / UR<                  l         UR<                  R@                  RC                  [         R                  R>                  RE                  XsS95        GM4     U$ )a  Creates object metadata according to the provided headers.

gsutil -h allows specifiying various headers (originally intended
to be passed to boto in gsutil v3).  For the JSON API to be compatible with
this option, we need to parse these headers into gsutil_api Object fields.

Args:
  headers: Dict of headers passed via gsutil -h

Raises:
  ArgumentException if an invalid header is encountered.

Returns:
  apitools Object with relevant fields populated from headers.
N
header_keyzx-goog-content-languagekeyr4   )#apitools_messagesObjectr/   CACHE_CONTROL_REGEXr(   stripcacheControlCONTENT_DISPOSITION_REGEXcontentDispositionCONTENT_ENCODING_REGEXcontentEncodingCONTENT_MD5_REGEXmd5HashCONTENT_LANGUAGE_REGEXcontentLanguageCONTENT_TYPE_REGEXDEFAULT_CONTENT_TYPEcontentTypeCUSTOM_TIME_REGEXr   
customTimeGOOG_API_VERSION_REGEXGOOG_GENERATION_MATCH_REGEXGOOG_METAGENERATION_MATCH_REGEXCUSTOM_GOOG_METADATA_REGEXCUSTOM_AMZ_METADATA_REGEXCUSTOM_AMZ_HEADER_REGEXgroupS3_HEADER_PREFIXlowermetadataMetadataValueadditionalPropertiesappendAdditionalProperty)r2   obj_metadatar+   r4   custom_goog_metadata_matchcustom_amz_metadata_matchcustom_amz_header_matchr8   s           r,   ObjectMetadataFromHeadersr_   ~   se     #))+,}}mf  (("'++-l	"	(	(	0	0(-l%		%	%f	-	-%*[[]l"		 	 	(	("[[]l		%	%f	-	-%*[[]l"		!	!&	)	)#7 #(;;= 		 	 	(	( / >l		%	%f	-	- 	$	*	*6	2	2	(	.	.v	6	6#=#C#CF#K ";"A"A&"I 7 = =f Ej	#/55lC
$.44\B
" '-33LAB
	!::
$$"3":":"H"H"J,
$$9979,


42299$$22EE F -	.e 'j 
r6   c                    0 nU (       d  gU R                   b4  U R                   (       d  SUS'   OU R                   R                  5       US'   U R                  (       a4  U R                  (       d  SUS'   OU R                  R                  5       US'   U R                  (       a4  U R                  (       d  SUS'   OU R                  R                  5       US'   U R                  (       a4  U R                  (       d  SUS'   OU R                  R                  5       US'   U R
                  (       a4  U R
                  (       d  SUS'   OU R
                  R                  5       US'   U R                  b4  U R                  (       d  SUS'   OU R                  R                  5       US'   U R                  b4  U R                  (       d  SUS'   OU R                  R                  5       US'   U R                  (       aD  S	nUS
:X  a  SU-   nOUS:X  a  SU-   nO[        SU-  5      eU R                  R                  5       X#'   U R                  (       Ga  U R                  R                  (       a  U R                  R                   H  nUR                  S:X  a  M  UR                  [        ;   a  M+  US
:X  a  SUR                  -   nOhUS:X  aT  UR                  R                  [        5      (       a   SUR                  [!        [        5      S -   nOSUR                  -   nO[        SU-  5      eUR"                  b  UR"                  (       d  SX#'   M  UR"                  X#'   M     U$ )zCreates a header dictionary based on existing object metadata.

Args:
  dst_obj_metadata: Object metadata to create the headers from.
  provider: Provider string ('gs' or 's3').

Returns:
  Headers dictionary.
Nzcache-controlzcontent-dispositionzcontent-encodingzcontent-languagezContent-MD5zcontent-typezcustom-timezstorage-classgszx-goog-s3zx-amz-zInvalid provider specified: %szx-goog-meta-zx-amz-meta-)r?   r>   rA   rC   rG   rE   rJ   rL   storageClassr   rV   rX   r:   r   
startswithrT   lenr4   )dst_obj_metadataproviderr2   header_nameadditional_propertys        r,   HeadersFromObjectMetadatarj      s    '	
"".((!%go!1!>!>!D!D!Fgo((..'+g#$ 
-
-
3
3
5 #$%%++$(g !$4$D$D$J$J$Lg !%%++$(g !$4$D$D$J$J$Lg !###gm/77==?gm!!-'' $gn 0 < < B B Dgn  ,&&#gm/::@@Bgm""!K4+k	T	{*k>IJJ+88>>@G44/88MM 
	 	 $6	6		 	 O	3	T	$':'>'>>t""--.>??!,005E1F1GHI+ &(;(?(??+ @8 KLL

#
#
/!''#288-  N. 
.r6   c                 V   U(       d  UR                   (       d  U R                   Ul         U(       d  UR                  (       d  U R                  Ul        U(       d  UR                  (       d  U R                  Ul        U(       d  UR                  (       d  U R                  Ul        U(       d  UR                  (       d  U R                  Ul        U(       d  UR
                  (       d  U R
                  Ul        U(       d  UR                  (       d  U R                  Ul        [        XUS9  g)aT  Copies metadata from src_obj_metadata to dst_obj_metadata.

Args:
  src_obj_metadata: Metadata from source object.
  dst_obj_metadata: Initialized metadata for destination object.
  override: If true, will overwrite metadata in destination object.
            If false, only writes metadata for values that don't already
            exist.
)overrideN)r?   rA   rC   rG   rJ   rL   rE   CopyCustomMetadata)src_obj_metadatarf   rl   s      r,   CopyObjectMetadataro     s     %22$4$A$A!%88*:*M*M'%55'7'G'G$%55'7'G'G$%11#3#?#? %00"2"="=%--/77%(Kr6   c                    U R                   (       Ga  U R                   R                  (       Ga  UR                   (       d#  [        R                  R	                  5       Ul         UR                   R                  (       d  / UR                   l        0 nUR                   R                   H  nUR
                  X4R                  '   M     U R                   R                   H  nUR                  U;   aQ  U(       aH  UR
                  b!  UR
                  (       d  SX5R                  '   MH  UR
                  X5R                  '   Mb  Md  UR
                  S:w  d  Mv  UR
                  X5R                  '   M     / UR                   l        [        R                  " U5       HP  u  pgUR                   R                  R                  [        R                  R                  R                  UUS95        MR     ggg)a[  Copies custom metadata from src_obj_metadata to dst_obj_metadata.

Args:
  src_obj_metadata: Metadata from source object.
  dst_obj_metadata: Initialized metadata for destination object.
  override: If true, will overwrite metadata in destination object.
            If false, only writes metadata for values that don't already
            exist.
N r9   )rV   rX   r;   r<   rW   r4   r:   six	iteritemsrY   rZ   )rn   rf   rl   dst_metadata_dictdst_propsrc_propkvs           r,   rm   rm   9  sz    444$$"3":":"H"H"J$$99794$--BB(0% C$--BB	*	*^^'.2ll+.6nnll+  >>R*2..,,' C 682/044;;

"
"
0
0
C
CJK D MN 1+ 5  r6   c                 4   [        5       n U R                  5        H[  u  p#[        R                  U5      (       a  [	        U5      Ul        [        R                  U5      (       d  MK  [	        U5      Ul        M]     U$ ! [         a  n[        S5      eSnAff = f)a  Creates bucket or object preconditions acccording to the provided headers.

Args:
  headers: Dict of headers passed via gsutil -h

Returns:
  gsutil Cloud API Preconditions object fields populated from headers, or None
  if no precondition headers are present.
zInvalid precondition header specified. x-goog-if-generation-match and x-goog-if-metageneration match must be specified with a positive integer value.N)
r   r/   rN   r(   long	gen_matchrO   meta_gen_match
ValueErrorr   )r2   return_preconditionsr+   r4   _s        r,   PreconditionsFromHeadersr   c  s     '
> 	$	*	*6	2	2)-e&	(	.	.v	6	6.25k+	 ) 
 
 >
 = > >>s   AA= 'A= =
BBBc                     U < SU< 3nU(       a@  U(       a9  U< SU< SU< 3nU(       a  US[        U5      -  -  n[        SU< SU< S35      $ [        SU-  5      $ )ax  Creates a NotFoundException for an object upload or copy.

This is necessary because 404s don't necessarily specify which resource
does not exist.

Args:
  dst_provider: String abbreviation of destination provider, e.g., 'gs'.
  dst_bucket_name: Destination bucket name for the write operation.
  src_provider: String abbreviation of source provider, i.e. 'gs', if any.
  src_bucket_name: Source bucket name, if any (for the copy case).
  src_object_name: Source object name, if any (for the copy case).
  src_generation: Source object generation, if any (for the copy case).

Returns:
  NotFoundException with appropriate message.
:///#%szThe source object z or the destination bucket z does not exist.zZThe destination bucket %s does not exist or the write to the destination must be restartedstrr   )dst_providerdst_bucket_namesrc_providersrc_bucket_namesrc_object_namesrc_generationdst_url_stringsrc_url_strings           r,   %CreateNotFoundExceptionForObjectWriter   |  sl    , !-o>.%1?%46NN 333n		)* * 
&(67
8 8r6   c                 (    [        U< SU< S3UU S9$ )Nr   z bucket does not exist.statusr   )coderg   bucket_names      r,   CreateBucketNotFoundExceptionr     s    	 "*K"9!,(,
. .r6   c                 f    U< SU< SU< 3nU(       a  US[        U5      -  -  n[        SU-  U S9$ )Nr   r   r   z%s does not exist.r   r   )r   rg   r   object_name
generation
uri_strings         r,   CreateObjectNotFoundExceptionr     s9    
  (kB*%#j/))J	/*<T	JJr6   c                 D    [         R                  R                  R                  [	        U5      5        [        SR                  [        R                  " SR                  X R                  5       5      5      5      5      e! [         a     Of = f[        SU < SU< 35      e)z=Checks a JSON parse exception for provided XML configuration.
a  XML {0} data provided; Google Cloud Storage {0} configuration now uses JSON format. To convert your {0}, set the desired XML ACL using 'gsutil {1} set ...' with gsutil version 3.x. Then use 'gsutil {1} get ...' with gsutil version 4 or greater to get the corresponding JSON {0}.zJSON z  data could not be loaded from: )xmletreeElementTree
fromstringr   r   jointextwrapwrapformatrU   XmlParseError)config_type_stringjson_txts     r,    CheckForXmlConfigurationAndRaiser     s    	II$$S]3
DII. /5f"$<$<$>/@	AB C C 
 		(:HF 	G Gs   A=A? ?
BBc                   h    \ rS rSrSr\S 5       r\S 5       r\S 5       r\S 5       r	\S 5       r
Srg	)
LifecycleTranslationi  zFunctions for converting between various lifecycle formats.

This class handles conversation to and from Boto Cors objects, JSON text,
and apitools Message objects.
c                 D   [         R                  R                  R                  5       nU(       Gaj  UR                   GHY  n[         R                  R                  R                  5       nUR                  (       a  UR                  R                  (       a  UR                  R                  R                  5       S:X  a*  [         R                  R                  R                  Ul        OlUR                  R                  R                  5       S:X  aD  [         R                  R                  R                  Ul        UR                  R                  Ul        UR                  (       Ga   UR                  R                  bN  [        UR                  R                  5      UR                   [         R                  R                  R"                  '   UR                  R$                  (       aN  [        UR                  R$                  5      UR                   [         R                  R                  R&                  '   UR                  R(                  b\  [        UR                  R(                  5      R                  5       UR                   [         R                  R                  R*                  '   UR                  R,                  (       a_  UR                  R,                   Vs/ s H  n[        U5      PM     snUR                   [         R                  R                  R.                  '   UR                  R0                  bN  [        UR                  R0                  5      UR                   [         R                  R                  R2                  '   UR5                  U5        GM\     U$ s  snf )z:Translates an apitools message to a boto lifecycle object.deletesetstorageclass)botora   	lifecycleLifecycleConfigruleRuleactiontyperU   DELETESET_STORAGE_CLASSrc   action_text	conditionager   
conditionsAGEcreatedBeforeCREATED_BEFOREisLiveIS_LIVEmatchesStorageClassMATCHES_STORAGE_CLASSnumNewerVersionsNUM_NEWER_VERSIONSrY   )clslifecycle_messageboto_lifecyclerule_message	boto_rulescs         r,   BotoLifecycleFromMessage-LifecycleTranslation.BotoLifecycleFromMessage  s    WW&&668N+00,GG%%**,	<#6#6#;#;  %%++-9#ww0077I""''--/3DD#ww00BBI$0$7$7$D$DI!!!!##''3;>&&**<,I  !2!2!6!67##11FI&&44G6I  !2!2!A!AB##**6 L**11288:   !2!2!:!:; ##77"."8"8"L"LM"LBB"LMI  !2!2!H!HI ##44@JM&&77K9I  !2!2!E!EFi(7 18 Ms   Nc                 
	   SnU(       Gax  [         R                  R                  5       nU GHS  n[         R                  R                  R                  5       n[         R                  R                  R                  R	                  5       Ul        UR                  (       a  UR                  [        R                  R                  R                  :X  a7  [         R                  R                  R                  R                  SS9Ul        OsUR                  [        R                  R                  R                  :X  aA  [         R                  R                  R                  R                  SUR                  S9Ul        [        R                  R                  R                  UR                  ;   aI  [!        UR                  [        R                  R                  R                     5      UR
                  l        [        R                  R                  R$                  UR                  ;   aS  [&        R)                  UR                  [        R                  R                  R$                     5      UR
                  l        [        R                  R                  R,                  UR                  ;   a  UR                  [        R                  R                  R,                     R/                  5       nUS:X  a  SUR
                  l        OUUS:X  a  S	UR
                  l        O=[3        S
UR                  [        R                  R                  R,                     -  5      e[        R                  R                  R4                  UR                  ;   a]  UR                  [        R                  R                  R4                      H(  nUR
                  R6                  R9                  U5        M*     [        R                  R                  R:                  UR                  ;   aI  [!        UR                  [        R                  R                  R:                     5      UR
                  l        UR>                  R9                  U5        GMV     U$ )z:Translates a boto lifecycle object to an apitools message.NDelete)r   SetStorageClass)r   rc   trueTfalseFzRGot an invalid Boto value for IsLive condition ("%s"), expected "true" or "false".) r;   BucketLifecycleValueRuleValueListEntryConditionValuer   r   r   ra   r   r   ActionValuer   r   r   r   intr   r   r   TranslateBotoLifecycleTimestampr   r   rU   r   r   r   r   rY   r   r   r   )r   r   r   r   lifecycle_ruleboto_is_live_strstorage_classs          r,   BotoLifecycleToMessage+LifecycleTranslation.BotoLifecycleToMessage  sG    +22AAC%)$$33FFH 	$5$<$<$K$K$6$6~~7G 	 !2!2!9!99%6%=%=%L%L%7%7.6 9D 98 ! 477#4#4#F#FF%6%=%=%L%L%7%7.?6?6K6K 9D 9M ! 77  I$8$88),""477#4#4#8#89*;.
"
"
&77++y/C/CC"BB&&tww'8'8'G'GHJ 
"
"
0 77$$	(<(<<""477#4#4#<#<=CCE '.2N$$+7*.3N$$+".$$TWW%6%6%>%>?@A A 7722i6J6JJ""477#4#4#J#JK $$88??N L77//93G3GG69""477#4#4#G#GH7J.
"
"
3%%n5S &T r6   c                 F    [        [        R                  " U5      5      S-   $ )z1Translates an apitools message to lifecycle JSON.r   )r   r	   MessageToJson)r   r   s     r,   JsonLifecycleFromMessage-LifecycleTranslation.JsonLifecycleFromMessage!  s      x%%&789D@@r6   c                      [         R                  " U5      nSU;   a  US   n[        R                  " U=(       d    0 [        R
                  R                  5      nU$ ! [         a    [        SU5         gf = f)z1Translates lifecycle JSON to an apitools message.r   N)	jsonloadsr	   DictToMessager;   r   r   r}   r   )r   r   deserialized_lifecycler   s       r,   JsonLifecycleToMessage+LifecycleTranslation.JsonLifecycleToMessage&  ss    >#zz(3
 
.	.!7!D((
 
&B(9(@(@(O(OQi >&{H=>s   AA A65A6c                 ^    [         R                   R                  US5      R                  5       $ )zDParses the timestamp from the boto lifecycle into a datetime object.z%Y-%m-%d)datetimestrptimedate)r   lifecycle_datetimes     r,   r   4LifecycleTranslation.TranslateBotoLifecycleTimestamp8  s'     %%&8*EJJLLr6    N)__name__
__module____qualname____firstlineno____doc__classmethodr   r   r   r   r   __static_attributes__r   r6   r,   r   r     sq        D / /b A A > >" M Mr6   r   c                   X    \ rS rSrSr\S 5       r\S 5       r\S 5       r\S 5       r	Sr
g)	CorsTranslationi>  zFunctions for converting between various CORS formats.

This class handles conversation to and from Boto Cors objects, JSON text,
and apitools Message objects.
c                    [         R                  R                  R                  5       n/ Ul        U GH*  n/ nUR                  (       aH  UR                  [         R                  R                  R                  [        UR                  5      45        UR                  (       a  / nUR                   H8  nUR                  [         R                  R                  R                  U45        M:     UR                  [         R                  R                  R                  U45        UR                  (       a  / nUR                   H8  nUR                  [         R                  R                  R                  U45        M:     UR                  [         R                  R                  R                  U45        UR                  (       a  / n	UR                   H8  n
U	R                  [         R                  R                  R                  U
45        M:     UR                  [         R                  R                  R                   U	45        UR                  R                  U5        GM-     U$ )z5Translates an apitools message to a boto Cors object.)r   ra   corsCorsr!   rY   	MAXAGESECr   r"   METHODMETHODSoriginORIGINORIGINSresponseHeaderHEADERHEADERS)r   cors_messager   collection_messagecollection_elementsmethod_elementsr"   origin_elementsr   header_elementsr+   s              r,   BotoCorsFromMessage#CorsTranslation.BotoCorsFromMessageE  s    77<<DDI*		)	)""WW\\##S);)I)I%JK	M		"	"(//F

 
 $'',,"5"5v!>
? 0""DGGLL$8$8/#JK		"	"(//F

 
 $'',,"5"5v!>
? 0""DGGLL$8$8/#JK		*	*(77F

 
 $'',,"5"5v!>
? 8""DGGLL$8$8/#JK
ii*+) +* Kr6   c                 ^   / nUR                   (       Ga  UR                    GH  nU(       d  M  [        R                  R                  5       nU GHD  nUS   [        R
                  R                   R                  :X  a  [        US   5      Ul        US   [        R
                  R                   R                  :X  a*  US    H!  nUR                  R                  US   5        M#     US   [        R
                  R                   R                  :X  a*  US    H!  nUR                  R                  US   5        M#     US   [        R
                  R                   R                  :X  d  GM  US    H!  nUR                  R                  US   5        M#     GMG     UR                  U5        GM     U$ )z5Translates a boto Cors object to an apitools message.r      )r   r;   r   CorsValueListEntryr   ra   r   r   r!   r   r"   rY   r   r   r  r  )	r   	boto_corsmessage_corscors_collectionr  element_tuplemethod_tupleorigin_tupleheader_tuples	            r,   BotoCorsToMessage!CorsTranslation.BotoCorsToMessagea  sQ    L~~~&^^/?077JJL
.mQ477<<#9#9914]15E1F .Q477<<#7#77"/"2,"))00aA #3Q477<<#7#77"/"2,"))00aA #3Q477<<#7#77"/"2,"1188aI #3  / 

0
1 ,  r6   c                 B   Sn [         R                  " U5      n[	        U[
        5      (       d  [        S5      e/ nU HA  nUR                  [        R                  " U[        R                  R                  5      5        MC     U$ ! [         a    [        SU5         Nf = f)a  Translates CORS JSON to an apitools message.

Args:
  json_cors: JSON string representing CORS configuration.

Raises:
  ArgumentException on invalid CORS JSON data.

Returns:
  List of apitools Bucket.CorsValueListEntry. An empty list represents
  no CORS configuration.
NCORSzdCORS JSON should be formatted as a list containing one or more JSON objects.
See "gsutil help cors".)r   r   r}   r   
isinstancelistr   rY   r	   r   r;   r   r  )r   	json_corsdeserialized_corsr   
cors_entrys        r,   JsonCorsToMessageEntries(CorsTranslation.JsonCorsToMessageEntriesx  s     :**Y/ '.../ / D'

kk

 
 !2!9!9!L!LNO ( K  :&vy9:s   B BBc                     SnUS-  nSnU H+  nU(       a  US-  nOSnU[         R                  " U5      -  nM-     US-  nU$ )z,Translates an apitools message to CORS JSON.rq   [F,Tz]
)r	   r   )r   r  	json_textprinted_oner  s        r,   MessageEntriesToJson$CorsTranslation.MessageEntriesToJson  s[     IIK"
	S	8))*55i # Ir6   r   N)r   r   r   r   r   r   r
  r  r  r&  r   r   r6   r,   r   r   >  sW      6  ,  >  r6   r   c                     U (       an  U R                   (       a\  U R                   R                  (       a@  U R                   R                   H%  nUR                  [        :X  d  M  UR                  s  $    gggg)zRetrieves GUID-marked S3 ACL from object metadata, if present.

Args:
  object_metadata: Object metadata to check.

Returns:
  S3 ACL text, if present, None otherwise.
N)rV   rX   r:   r   r4   )object_metadataprops     r,   S3MarkerAclFromObjectMetadatar+    sW     /2233((==	'	'zz > 4 3or6   c                 b   U R                   (       d#  [        R                  R                  5       U l         U R                   R                  (       d  / U R                   l        U R                   R                  R                  [        R                  R                  R                  [        US95        g)zAdds a GUID-marked S3 ACL to the object metadata.

Args:
  object_metadata: Object metadata to add the acl to.
  acl_text: S3 ACL text to add.
r9   N)rV   r;   r<   rW   rX   rY   rZ   r   )r)  acl_texts     r,   AddS3MarkerAclToObjectMetadatar.    s     
	!	!077EEGO		!	!	6	646O1//66,,??  @ 23r6   c                    [        U 5      S:w  a  [        S[        U 5      -  5      eU R                  5       S   u  p[        R                  R
                  R                  U5      n[        UR                  5       5       H4  u  pE[        R                  R
                  R                  X45      nXVl	        M6     [        R                  R
                  R                  U5      $ )al  Generates XML representation of a nested dict.

This dict contains exactly one top-level entry and an arbitrary number of
2nd-level entries, e.g. capturing a WebsiteConfiguration message.

Args:
  message: The dict encoding the message.

Returns:
  XML string representation of the input dict.

Raises:
  Exception: if dict contains more than one top-level entry.
r  z$Expected dict of size 1, got size %dr   )re   	Exceptionr/   r   r   r   Elementsorted
SubElementtexttostring)messagenamecontentelement_typeelement_propertyr4   nodes          r,   UnaryDictToXmlr<    s     	\Q
:S\I
JJ--/!$-$&&..t4,!'!899  ++LKDI "9 
			'	'	55r6   c                   \    \ rS rSrSr\S 5       r\S 5       r\S	S j5       r\S 5       r	Sr
g)
LabelTranslationi  zFunctions for converting between various Label(JSON)/Tags(XML) formats.

This class handles conversion to and from Boto Tags objects, JSON text, and
apitools LabelsValue message objects.
c                     0 nU H$  nUR                  [        S U 5       5      5        M&     U(       a  U R                  U5      $ S $ )Nc              3   P   #    U  H  oR                   UR                  4v   M     g 7fr'   r9   )r)   is     r,   r-   5LabelTranslation.BotoTagsToMessage.<locals>.<genexpr>  s     ?w!eeQWW-ws   $&)updatedictr   )r   tags
label_dicttag_sets       r,   BotoTagsToMessage"LabelTranslation.BotoTagsToMessage  sB    J?w??@ ,63Z(@D@r6   c                    [         R                  " U R                  U5      5      n[        5       n[        R
                  " U5       H  u  pEU(       d  M  UR                  XE5        M!     [        5       nUR                  U5        U$ r'   )	r   r   JsonFromMessager   rr   rs   add_tagr   add_tag_set)r   r6  rF  rG  r:   r4   rE  s          r,   BotoTagsFromMessage$LabelTranslation.BotoTagsFromMessage  sd    C//89JhGmmJ/
	# 0 6DWKr6   c                     [         R                  " U5      nU(       a+  [        R                  " [        R                  " U5      SSSS9$ U$ )NT   r#  z: 	sort_keysindent
separators)r	   r   r   dumpsr   )r   r6  pretty_printjson_strs       r,   rK   LabelTranslation.JsonFromMessage  sA    %%g.HZZ

8,"& #.0 0 Or6   c                 `    [         R                  " U[        R                  R                  5      $ r'   )r	   r   r;   r   LabelsValue)r   rF  s     r,   r   LabelTranslation.DictToMessage  s(    !!*"3":":"F"FH Hr6   r   NF)r   r   r   r   r   r   rH  rN  rK  r   r   r   r6   r,   r>  r>    s[     A A     H Hr6   r>  c                       \ rS rSrSrSSSS.rSSS	S
.r\S 5       r\S 5       r	\S 5       r
\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rSrg)AclTranslationi  zFunctions for converting between various ACL formats.

This class handles conversion to and from Boto ACL objects, JSON text,
and apitools Message objects.
READWRITEFULL_CONTROL)READERWRITEROWNERrd  re  rf  )ra  rb  rc  c                 T    [        5       nS Ul        U R                  X5      Ul        U$ r'   )r
   parentBotoEntriesFromJsonentries)r   acl_jsonacls      r,   BotoAclFromJsonAclTranslation.BotoAclFromJson  s'    
%CCJ))(8CKJr6   c                     / nU H4  nU[         :X  a    O)UR                  [        R                  " U5      5        M6     U R	                  U5      $ r'   )r#   rY   r	   MessageToDictrm  )r   acl_message	acl_dictsr6  s       r,   BotoAclFromMessage!AclTranslation.BotoAclFromMessage&  sM     I	+	+ 	x--g67  y))r6   c                 ^    [        US5      (       a  U R                  UR                  5      $ / $ )Nrj  )hasattrBotoEntriesToJsonrj  )r   rl  s     r,   BotoAclToJsonAclTranslation.BotoAclToJson2  s)    sI""3;;//Ir6   c              #      #    U R                  U5       H3  n[        R                  " U[        R                  5      nSUl        Uv   M5     g 7f)Nstorage#objectAccessControl)rx  r	   r   r;   ObjectAccessControlkindr   rl  entryr6  s       r,   BotoObjectAclToMessage%AclTranslation.BotoObjectAclToMessage8  B     ""3'&&u'8'L'LNg2glm	 (   A
Ac              #      #    U R                  U5       H3  n[        R                  " U[        R                  5      nSUl        Uv   M5     g 7f)Nzstorage#bucketAccessControl)rx  r	   r   r;   BucketAccessControlr}  r~  s       r,   BotoBucketAclToMessage%AclTranslation.BotoBucketAclToMessage@  r  r  c                 ~    [        U5      nX#l        U Vs/ s H  o@R                  U5      PM     snUl        U$ s  snf r'   )r   rh  BotoEntryFromJson
entry_list)r   rk  rh  rj  
entry_jsons        r,   ri  "AclTranslation.BotoEntriesFromJsonH  sA    foGN<D<Djj)HG Ns   :c                 b    UR                    Vs/ s H  o R                  U5      PM     sn$ s  snf r'   )r  BotoEntryToJson)r   rj  r  s      r,   rw   AclTranslation.BotoEntriesToJsonQ  s+    4;4F4FG4F5&4FGGGs   ,c                    US   nU R                   US      nUR                  5       [        R                  " 5       :X  a  [        [        US9$ UR                  5       [        R                  " 5       :X  a  [        [        US9$ UR                  S5      (       a  [        S5      eSU;   aG  UR                  S5      (       a  [        nOUR                  S5      (       a  [        n[        WUS   US	9$ S
U;   aG  UR                  S5      (       a  [        nOUR                  S5      (       a  [        n[        WUS
   US9$ SU;   a*  UR                  S5      (       a  [        n[        WUS   US9$ [        S5      e)z,Converts a JSON entry into a Boto ACL entry.entityrole)r   
permissionprojectz>XML API does not support project scopes, cannot translate ACL.emailuserrS   )r   email_addressr  entityId)r   r$   r  domain)r   r  r  z$Failed to translate JSON ACL to XML.)JSON_TO_XML_ROLESrU   r   r   r   rd   r   r   r   r   r   r   )r   r  r  r  
scope_types        r,   r   AclTranslation.BotoEntryFromJsonU  st    !F&&z&'9:J||~**	j99	288:	:/JGG			9	%	% 5 6 6	J				6	"	""
W%%#

!+G!4(* * 
z	!			6	"	"
W%% 

 ,(* * 
Z				8	$	$$

$X.(* * A
BBr6   c                 >   0 nUR                   R                  R                  5       nU[        R                  " 5       :X  a  SUS'   GOU[        R                  " 5       :X  a  SUS'   GOU[
        R                  " 5       :X  a7  SUR                   R                  -  US'   UR                   R                  US'   GOJU[        R                  " 5       :X  a6  SUR                   R                  -  US'   UR                   R                  US'   OU[        R                  " 5       :X  a6  SUR                   R                  -  US'   UR                   R                  US'   OU[        R                  " 5       :X  a6  SUR                   R                  -  US'   UR                   R                  US'   O]U[        R                  " 5       :X  a6  SUR                   R                  -  US'   UR                   R                  US	'   O[        S
U-  5      eU R                  UR                     US'   U$ )z5Converts a Boto ACL entry to a valid JSON dictionary.allUsersr  allAuthenticatedUserszuser-%sr  r  zgroup-%sz	domain-%sr  z#ACL contains invalid scope type: %sr  )scoper   rU   r   r   r   r  r   r$   r   r   r   r  r   XML_TO_JSON_ROLESr  )r   r  acl_entry_jsonscope_type_lowers       r,   r  AclTranslation.BotoEntryToJsony  s    N{{''--/9??,,!+nX	4::<	<!8nX	]002	2!*U[[-F-F!FnX % 9 9nW	Z--/	/!*U[[^^!;nX#(;;>>nZ 	^113	3!+ekk.G.G!GnX % 9 9nW	[..0	0!+ekknn!<nX#(;;>>nZ 	_224	4!,u{{/A/A!AnX!&!3!3nXC./ 0 0 !2253C3CDN6r6   c                      [         R                  " U5      n/ nU H(  nUR                  [        R                  " XR5      5        M*     U$ ! [
         a    [        SU5         gf = f)au  Converts the input JSON data into list of Object/BucketAccessControls.

Args:
  json_data: String of JSON to convert.
  message_type: Which type of access control entries to return,
                either ObjectAccessControl or BucketAccessControl.

Raises:
  ArgumentException on invalid JSON data.

Returns:
  List of ObjectAccessControl or BucketAccessControl elements.
r
   N)r   r   rY   r	   r   r}   r   )r   	json_datamessage_typedeserialized_aclrl  	acl_entrys         r,   JsonToMessageAclTranslation.JsonToMessage  sZ    9I.c')

8)))BC (j 9&ui89s   AA
 
A#"A#c                    / nUbo  U Hi  nUR                   S:X  a  SUl        SUl        SUl         SUl        SUl        SUl        SUl        UR                  [        R                  " U5      5        Mk     [        R                  " USSSS9$ )zStrips unnecessary fields from an ACL message and returns valid JSON.

Args:
  acl: iterable ObjectAccessControl or BucketAccessControl

Returns:
  ACL JSON string.
Nr{  TrQ  rR  rS  )r}  objectr   bucketr$   selfLinketagrY   r	   rp  r   rW  )r   rl  serializable_aclr  s       r,   rK  AclTranslation.JsonFromMessage  s     
)>>::!)
!%)
			!		 6 6y AB  ::& $!,. .r6   r   N)r   r   r   r   r   r  r  r   rm  rs  rx  r  r  ri  rw  r  r  r  rK  r   r   r6   r,   r`  r`    s        * *  
       H H !C !CF  > 9 90 . .r6   r`  r^  )NNNNr'   )\r   
__future__r   r   r   r   r   r   rer   xml.etree.ElementTreer   r   r   rr   apitools.base.protorpclite.utilr   apitools.base.pyr	   r   boto.gs.aclr
   r   r   r   r   r   r   r   r   r   boto.s3.taggingr   r   gslib.cloud_apir   r   r   r   gslib.exceptionr   "gslib.third_party.storage_apitoolsr   r;   gslib.utils.constantsr   r   PY3r   rz   compileIr=   r@   rB   rF   rD   rH   rK   rM   rN   rO   rP   rQ   rR   	frozensetr1   rT   rI   r   r  r    r|  r#   r5   r_   rj   ro   rm   r   r   r   r   r   r  r   r   r+  r.  r<  r>  r`  r   r6   r,   <module>r     s   K & %  '   	   = 
 ; %   / !   ' & # % "   " - 3 - ) , W 4 177	$jj!2BDD9 JJ'>E $8"$$? $8"$$? JJ5 ZZ 0"$$7 JJ5 $:BDDA  jj)GN "$**-O-/TT#3 ZZ(J(*. JJ'H"$$O **%A244H ##%    ' 1  //b8L7M 0 O  ,?? " FRTnL6'NT6 8<:>:>9="8J. .2	KG$vM6 vMrhf hV 3"64&Hv &HR~.V ~.r6   