
    @G                        S r SSKJr  SSKJr  SSKJr  SSKrSSKrSSKrSSKrSSK	J
r
  SSK	Jr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  \" / SQ5      r\" / SQ5      r\" 5       R2                  " \\/6 rSSSSSSSS.rSSSSSSS.r\R:                  R<                  \R>                  \R:                  R@                  \RB                  0r"\R:                  R<                  \RF                  \R:                  R@                  \RH                  0r%\RL                  " S 5      r'S! r(S" r)S# r*S$ r+S% r, S3S& jr-S' r.S( r/S) r0S* r1S+ r2S, r3  S4S- jr4S. r5S/ r6S0 r7  S4S1 jr8  S4S2 jr9g)5z,Tools for making the most of S3Api metadata.    )absolute_import)division)unicode_literalsN)metadata_util)xml_metadata_field_converters)errors)storage_url)user_request_args_factory)gcs_resource_reference)resource_reference)s3_resource_reference)log)CacheControlContentDispositionContentEncodingContentLanguageContentTypeMetadata)ACLAccessControlPolicyStorageClasscache_controlcontent_dispositioncontent_encodingcontent_languagecontent_typemd5_hashstorage_class)r   r   r   r   r   
ContentMD5r   zauthenticated-readzbucket-owner-full-controlzbucket-owner-readprivatezpublic-readzpublic-read-write)authenticatedReadbucketOwnerFullControlbucketOwnerReadr    
publicReadpublicReadWritez^[a-fA-F0-9]{32}$c                    [         R                  " U 5      nUR                  SS5        UR                  (       d  U$ UR                  R                  nU(       aG  U HA  n[         R                  " U5      nUR                  S5      nUS   R                  UUS.5        MC     UR                  R                  nU(       a  [        U5      n/ n	UR                  S/ 5       Hy  n
U
R                  S0 5      n[        UR                  S5      UR                  S5      UR                  S	5      45      nUR                  U5      (       a  Mh  U	R                  U
5        M{     XS'   U$ )
aA  Returns full ACL policy object with requested changes.

Args:
  acl_dict (dict): Contains S3-format ACL policy dict for bucket or object.
    Usually of the form: "{"Grants": [...], "Owner": {...}}". See:
    https://boto3.amazonaws.com/v1/documentation/api/latest/reference
    /services/s3.html#S3.Client.get_bucket_acl
  request_config (request_config_factory._RequestConfig): Contains desired
    changes for the ACL policy.

Returns:
  dict: Deep copy of acl_dict with added and removed grants and
    removed "ResponseMetadata" field to allow for reuse in PUT API calls.
ResponseMetadataN
PermissionGrants)r(   Granteer*   EmailAddressIDURI)
copydeepcopypopresource_argsacl_grants_to_addappendacl_grants_to_removesetgetintersection)acl_dictrequest_configacl_dict_copyr2   	new_grantnew_grant_copy
permissionr4   entity_identifiers_to_removefiltered_grantsexisting_grantexisting_granteeexisting_grantee_identifierss                7lib/googlecloudsdk/api_lib/storage/xml_metadata_util.py,get_acl_policy_with_added_and_removed_grantsrD   U   sO     --)-&-		%	%$22DD&	}}Y/n!%%l3jH$$"#& 	 ' (55JJ#&';#< O'++Hb9'++Ir:%(/1A1E1Ed1K&(&)" *66
&( (~. : .(	    c                 V    U(       d  0 nU (       d  U$ U H  nX0;   d  M
  X   X'   M     U$ )zECopy fields(provided in arguments) from one metadata dict to another. )source_metadata_dictdestination_metadata_dictfieldsfields       rC   _copy_metadatarL      s8    	" "	$$e$)=)D&  
#"rE   c                 $    [        U U[        5      $ )z:Copies common S3 fields from one metadata dict to another.)rL   _COMMON_S3_METADATA_FIELDSrH   rI   s     rC   copy_object_metadatarP      s    	 
 rE   c                 $    [        U U[        5      $ )z>Copies user_metadata fields from one metadata dict to another.)rL   _USER_METADATA_FIELDSrO   s     rC   copy_user_metadata_fieldsrS      s    	
 rE   c                 r    U [         ;  a%  [        R                  " SR                  U 5      5      e[         U    $ )zTranslates Apitools predefined ACL enum key (as string) to S3 equivalent.

Args:
  predefined_acl_string (str): Value representing user permissions.

Returns:
  Translated ACL string.

Raises:
  Error: Predefined ACL translation could not be found.
zACould not translate predefined_acl_string {} to AWS-accepted ACL.)*_GCS_TO_S3_PREDEFINED_ACL_TRANSLATION_DICTr   Errorformat)predefined_acl_strings    rC   %translate_predefined_acl_string_to_s3rY      s<     "LL
,,	#V$9:  
44I	JJrE   c                 N    [         R                  " U UUUR                  S5      S9$ )aZ  Creates storage_url.CloudUrl from S3 API response.

Args:
  scheme (storage_url.ProviderPrefix): Prefix used for provider URLs.
  object_dict (dict): Dictionary representing S3 API response.
  bucket_name (str): Bucket to include in URL.
  object_name (str | None): Object to include in URL.

Returns:
  storage_url.CloudUrl populated with data.
	VersionId)schemebucket_nameresource_name
generation)r	   CloudUrlr6   )r\   object_dictr]   object_names       rC   !_get_object_url_from_xml_responserc      s,     
		-	
/ /rE   c                     SU ;   a  U R                  S5      nOSU ;   a  U S   R                  S5      nOSnU(       a=  UR                  S5      (       a'  UR                  S5      (       a  UR                  S5      $ U$ )z.Returns the cleaned-up etag value, if present.ETagCopyObjectResultN")r6   
startswithendswithstrip)ra   etags     rC   	_get_etagrl      so    {??6"D[()*..v6DD 
dooc""t}}S'9'9::c?	+rE   c                     U (       aS  [         R                  U 5      (       a9  [        R                  " [        R
                  " U 5      5      nUR                  SS9$ [        R                  " SX5        g)z6Returns base64 encoded MD5 hash, if etag is valid MD5.zutf-8)encodingzSNon-MD5 etag ("%s") present for object: %s. Data integrity checks are not possible.N)		MD5_REGEXmatchbase64	b64encodebinascii	unhexlifydecoder   debug)rk   
object_urlencoded_bytess      rC   _get_md5_hash_from_etagry      s\    	iood##$$X%7%7%=>M11II	348F 
rE   c                     U R                  S0 5      nUR                  S0 5      nUR                  SS5      R                  5       n[        R                  " SU5      nU(       a  UR	                  S5      $ g)z@Returns base64 encoded CRC32C hash from object response headers.r'   HTTPHeaderszx-goog-hash zcrc32c\=([^,]+)   N)r6   rj   researchgroup)ra   response_metadataheadershash_headerresults        rC   !_get_crc32c_hash_from_object_dictr      sf    !oo&8"=!!-4'M2.446+99'5&<<? rE   c                     [        U [        5      (       a)  SU ;   a#  U R                  5       nUR                  S5        U$ U $ )z?Returns the error string if value is error or the value itself.r'   )
isinstancedictr.   r0   )value
value_copys     rC   _get_error_or_valuer      s:    t!3u!<JNN%&	,rE   c                 ^   [        UR                  S5      5      nUS:X  a  SnOUS:X  a  Sn[        UR                  S5      5      n[        U[        5      (       a  UR                  S5      S:X  a  SnOS	n[        U    " [
        R                  " X5      [        UR                  S
5      5      [        UR                  S5      5      [        UR                  S5      5      [        UR                  S5      5      U[        UR                  S5      5      UU[        UR                  S5      5      S9
$ )aH  Creates resource_reference.S3BucketResource from S3 API response.

Args:
  scheme (storage_url.ProviderPrefix): Prefix used for provider URLs.
  bucket_dict (dict): Dictionary representing S3 API response.
  bucket_name (str): Bucket response is relevant to.

Returns:
  resource_reference.S3BucketResource populated with data.
Payer	RequesterTBucketOwnerF
VersioningStatusEnabledNr   	CORSRulesLifecycleConfigurationLoggingEnabledLocationConstraintWebsite)	aclcors_configlifecycle_configlogging_configrequester_payslocationmetadataversioning_enabledwebsite_config)r   r6   r   r   _SCHEME_TO_BUCKET_RESOURCE_DICTr	   r`   )r\   bucket_dictr]   r   r   s        rC   %get_bucket_resource_from_xml_responser     s	    '{w'?@.{"N&N*;??<+HI"D))h'94	(	06/
kooe4
5%kook&BC*
//2
35(9I)JK#";??3G#HI+()CD
F FrE   c                 r    U R                  SS5      nU(       d  gU Vs0 s H  o"S   US   _M     sn$ s  snf )zHParse object tags from object response in format of GCS object contexts.TagSetNKeyValue)r6   )ra   obj_tagstags      rC   _parse_object_tags_if_anyr   '  sH     __Xt,(	 +3
*23%j#g,(
  
s   4c           	         [        XX#=(       d    US   5      nSU;   a  UR                  S5      nOUR                  S5      nUR                  SUR                  S5      5      n[        U5      nU(       a  Un	OUR                  S5      n	U	(       a  XS'   [        U	5      n
[        U    " U40 SU
_SUR                  S	5      _S
UR                  S5      _SUR                  S5      _SUR                  S5      _SUR                  S5      _SUR                  S5      _SUR                  S5      _SUR                  S5      _SU_SU_SUR                  S5      _S[        X5      _SU_SU_SUR                  S 5      _S!UR                  S5      _6nU [        R                  R                  :X  a  [        U5      Ul
        U [        R                  R                  :X  a  [        U5      Ul        U$ )"a  Creates resource_reference.S3ObjectResource from S3 API response.

Args:
  scheme (storage_url.ProviderPrefix): Prefix used for provider URLs.
  object_dict (dict): Dictionary representing S3 API response.
  bucket_name (str): Bucket response is relevant to.
  object_name (str|None): Object if relevant to query.
  acl_dict (dict|None): Response from S3 get_object_acl API call.

Returns:
  resource_reference.S3ObjectResource populated with data.
r   SizeContentLengthServerSideEncryptionSSECustomerAlgorithmr   r   r   r   component_count
PartsCountr   r   r   r   r   r   r   r   creation_timeLastModifiedcustom_fieldsr   encryption_algorithmrk   kms_keySSEKMSKeyIdr   r   sizer   r   update_time)rc   r6   rl   r   _SCHEME_TO_OBJECT_RESOURCE_DICTry   r	   ProviderPrefixGCSr   crc32c_hashS3r   tags)r\   ra   r]   rb   r8   rw   r   r   rk   raw_acl_datar   object_resources               rC   %get_object_resource_from_xml_responser   5  s	   " 1;(I{57IK* {??6"D???+D$koo.DEG	;	$L ??5)L%L)#3F;
  OON3 "ool3	
 &//*>? #'89 #'89 ??=1  OON3  OOJ/ 0  oom, 't8   !"  OON3#$ //.1%/* {))---"CK"PO{)),,,4[AO	rE   c                 ^    US   n[         R                  " [        R                  " U UUS9US9$ )a4  Creates resource_reference.PrefixResource from S3 API response.

Args:
  scheme (storage_url.ProviderPrefix): Prefix used for provider URLs.
  prefix_dict (dict): The S3 API response representing a prefix.
  bucket_name (str): Bucket for the prefix.

Returns:
  A resource_reference.PrefixResource instance.
Prefix)r\   r]   r^   )prefix)r   PrefixResourcer	   r`   )r\   prefix_dictr]   r   s       rC   %get_prefix_resource_from_xml_responser   y  s=     x &		*	*!  
 rE   c                 j   0 nU R                   nU(       Ga  UR                  b/  UR                  [        R                  " UR                  5      5        UR
                  b/  UR                  [        R                  " UR
                  5      5        UR                  b/  UR                  [        R                  " UR                  5      5        UR                  b  UR                  US'   UR                  b/  UR                  [        R                  " UR                  5      5        UR                  b/  UR                  [        R                  " UR                  5      5        UR                  c  UR                  b:  UR                  [        R                   " UR                  UR                  5      5        U$ )z>Returns S3 bucket metadata dict fields based on RequestConfig.r   )r1   cors_file_pathupdater   process_corslabels_file_pathprocess_labelslifecycle_file_pathprocess_lifecycler   r   process_requester_pays
versioningprocess_versioningweb_error_pageweb_main_page_suffixprocess_website)r9   r   r1   s      rC   ,get_bucket_metadata_dict_from_request_configr     ss   ( ..-##/oo
'
4
4**,- %%1oo
'
6
6,,./ ((4oo
'
9
9//12 )'4'='=h#$##/oo
'
>
>**,- +oo
'
:
:&&() 	$$0**6oo
'
7
7**M,N,NPQ 
/rE   c                 F    U[         R                  :X  a  SX'   gUb  X U'   gg)z)Sets appropriate metadata based on value.N)r
   CLEAR)r   keyr   s      rC   _process_value_or_clear_flagr     s*    
'---HMSM rE   c                     U R                   nUc  gU R                  b  g[        R                  5        H  n[	        X4S5      (       d  M    g   [
        R                  " UU R                  U R                  UUS9$ )z>Checks the presence of user_metadata fields in request_config.NFTattributes_resourceknown_posix)	r1   rX   _S3_TO_GENERIC_FIELD_NAMES_valuesgetattrr   has_updated_custom_fieldspreserve_posixpreserve_symlinks)r9   r   r   r1   r   s        rC   0is_user_metadata_field_present_in_request_configr     sz     !..-))5*113e}T** 4 
	0	0##&&-
 rE   c           
      @   UR                   b  [        UR                   5      U S'   UR                  nU R                  S0 5      n[        R
                  " UUUUS9nUb  X`S'   U(       a6  [        R                  5        H  u  px[        U U[        UUS5      5        M     gg)a
  Returns S3 object metadata dict fields based on RequestConfig.

Args:
  object_metadata (dict): Existing object metadata.
  request_config (request_config): May contain data to add to object_metadata.
  attributes_resource (Resource|None): If present, used for parsing POSIX and
    symlink data from a resource for the --preserve-posix and/or
    --preserve_symlink flags. This value is ignored unless it is an instance
    of FileObjectResource.
  posix_to_set (PosixAttributes|None): Set as custom metadata on target.

Nr   r   r   )
rX   rY   r1   r6   r   get_updated_custom_fieldsr   itemsr   r   )	object_metadatar9   r   posix_to_setr1   existing_metadatacustom_fields_dictrK   r   s	            rC   /update_object_metadata_dict_from_request_configr     s    $ ))5B,,.OE !..-%))*b9$>>-	 #"4J399;"


 < rE   )N)NN):__doc__
__future__r   r   r   rq   rs   r.   r~   googlecloudsdk.api_lib.storager   r   "googlecloudsdk.command_lib.storager   r	   r
   ,googlecloudsdk.command_lib.storage.resourcesr   r   r   googlecloudsdk.corer   	frozensetrR   _NON_USER_METADATA_FIELDSunionrN   r   rU   r   r   GcsBucketResourcer   S3BucketResourcer   GcsObjectResourceS3ObjectResourcer   compilero   rD   rL   rP   rS   rY   rc   rl   ry   r   r   r   r   r   r   r   r   r   r   rG   rE   rC   <module>r      s   3 &  '    	 8 H 5 : H O K N #! #   & '   '[..67 
 $/))!#  .9**. * ""$:$L$L!!#8#I#I# 
 ""$:$L$L!!#8#I#I# 
 JJ+,	2j	#K. 37/, 	#FL" 7;37	AH("J : 	-rE   