
    Vh                     >   d dl Z d dlmZ 	 d dlmZ dZ	 d dlZd dlm	Z	 d dl
mZ d Zd	 Zd
 ZddZddZd Zd Zd Zd Zd ZddZ ej.                  dddg      d        Zd Z ej4                         d        ZddZd Zy# e$ r dZY |w xY w# e$ r Y w xY w)    N)urlparse)md5TF)to_text)AWSRetryc              #   ~   K   ||d}|r||d<   t        d|dz         D ]  }||d<    | j                  di |  y w)N)BucketKey	VersionId   
PartNumber )rangehead_object)clientpartsbucketobj	versionIdargsparts          f/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/amazon/aws/plugins/module_utils/s3.pys3_head_objectsr      sW     S)D%[a# )!\ f  (4(()s   ;=c                 l   g }t        |d      5 }t        | ||||      D ]E  }|j                  t        |j	                  t        |d                     j                                G 	 d d d        dj                  |      }	dt        |	      j                          dt        |       dS # 1 sw Y   CxY w)NrbContentLength    "-)
openr   appendr   readintdigestjoin	hexdigestlen)
r   r   r   r   r   filenamedigestsfheaddigest_squareds
             r   calculate_checksum_with_filer,   %   s    G	h	 M#FE63	J 	MDNN3qvvc$*?&@ABIIKL	MM XXg&Ns>",,./qWa@@M Ms   AB**B3c           	      (   g }d}t        | ||||      D ]C  }t        |d         }	|j                  t        ||||	z          j	                                ||	z  }E dj                  |      }
dt        |
      j                          dt        |       dS )Nr   r   r   r   r   )r   r"   r    r   r#   r$   r%   r&   )r   r   r   r   r   contentr(   offsetr*   lengthr+   s              r   calculate_checksum_with_contentr1   /   s    GFvsIF T/*+s76&6/:;BBDE&
 XXg&Ns>",,./qWa@@r   c                 V   t         sy |5d|v r1t        |dd j                  d      d         }	 t        ||||||      S d| j                  |       dS # t        j
                  j                  t        j
                  j                  f$ r}| j                  |d       Y d }~y d }~ww xY wNr   r   zFailed to get head object)msgr   )
HAS_MD5r"   splitr,   botocore
exceptionsBotoCoreErrorClientErrorfail_json_awsr   )	moduler'   etags3r   r   versionr   es	            r   calculate_etagrB   ;   s    C4KD2J$$S)!,-	E/E63QYZZ 6::h'(** ##1183F3F3R3RS 	E  (C DD	Es   A 7B(B##B(c                 f   t         sy |5d|v r1t        |dd j                  d      d         }	 t        ||||||      S dt        |      j                          dS # t        j
                  j                  t        j
                  j                  f$ r}| j                  |d       Y d }~y d }~ww xY wr3   )r6   r"   r7   r1   r8   r9   r:   r;   r<   r   r%   )	r=   r.   r>   r?   r   r   r@   r   rA   s	            r   calculate_etag_contentrD   J   s    C4KD2J$$S)!,-	E22ufc7T[\\ 3w<))+,A.. ##1183F3F3R3RS 	E  (C DD	Es   A 7B0B++B0c                    t        |       dk  ryt        |       dkD  ryt        j                  dz   t        j                  z   }| D cg c]	  }||vs| }}|ry| d   t        j                  t        j                  z   vryy c c}w )	N   z8the length of an S3 bucket must be at least 3 characters?   z6the length of an S3 bucket cannot exceed 63 charactersz.-z-invalid character(s) found in the bucket namer4   z7bucket names must begin and end with a letter or number)r&   stringascii_lowercasedigits)namelegal_characterscillegal_characterss       r   validate_bucket_namerO   Y   s    
4y1}I
4y2~G--4v}}D%)GQ6F-F!GG>Bxv--==H Hs   	BBc                 <    d}| t        |       j                  dv }|S )z0Return True if endpoint_url has scheme fakes3://F)fakes3fakes3s)r   scheme)urlresults     r   	is_fakes3rV   j   s&    F
#%%)>>Mr   c                     t        |       }d}|j                  xs d}|j                  dk(  rd}|j                  xs d}| d|j                   dt	        |       }t        |j                  dk(        }||dS )	NhttpP   rR   httpsi  z://:endpointuse_ssl)r   portrS   hostnamer   bool)rT   rQ   protocolr_   endpoint_urlr^   s         r   parse_fakes3_endpointrd   r   sz    c]FH;;"D}}	!{{!cZs6??"31WT]ODL6==I-.G$99r   c                 R    t        |       }t        |j                  dk(        }| |dS )NrZ   r\   )r   ra   rS   )rT   cephr^   s      r   parse_ceph_endpointrg   ~   s)    C=D4;;')*G00r   c                     | j                  d      }| j                  d      rdt        |      fS t        |      rdt        |      fS dd|ifS )Nrc   rf   FTr]   )getrg   rV   rd   )optionsrc   s     r   parse_s3_endpointrk      sV    ;;~.L{{6),777+L999*l+++r   c                     t        |       \  }}|s|S | j                  d      }|s|s|S i }|rd|d<   |rd|d<   ||d<   |S )N	dualstackTuse_dualstack_endpoints3v4signature_versionconfig)rk   ri   )rj   sigv4awsextra_paramsrm   rq   s         r   s3_extra_paramsru      sd    )'2CK(IUF+/'(&,"##Lr   x   NoSuchBucketOperationAborted)	max_delaycatch_extra_error_codesc                 &     | j                   di |S )Nr   )$list_bucket_inventory_configurations)r   paramss     r   %_list_bucket_inventory_configurationsr~      s    6666@@@r   c                     d}d }t        | |      }|j                  dd       }||j                  dg       S g }|:|rt        | ||      }d}|j                  |d          |j                  d      }|:|S )NF)r   	NextTokenInventoryConfigurationList)r   r   T)r~   ri   extend)r   bucket_namefirst_iteration
next_tokenresponseentriess         r   r|   r|      s    OJ4VKPHk40J||8"==G

 <VzbmnHx <=>\\+.
 
  Nr   c                    |j                         D ci c]  \  }}|	|| }}}|j                  dd        | j                  di |S | j                  d      } |j                  di |j                         S c c}}w )NMaxKeyslist_objects_v2r   )itemsri   r   get_paginatorpaginatebuild_full_result)r   r}   kv	paginators        r   _list_objects_v2r      s    %||~?tq!ad?F? zz)T".%v%%///$$%67I9''99;; @s
   
A<A<c                 r    t        | ||||      }|j                  dg       D cg c]  }|d   	 c}S c c}w )N)r   Prefix
StartAfterr   Contentsr	   )r   ri   )r   r   prefixmax_keysstart_afterr   rM   s          r   list_bucket_object_keysr      s9    vfQ\fnoH&ll:r:;AeH;;;s   4c                     | j                   j                  d      du r| j                   j                  d      S | j                  xs dS )Nrf   Tregionz	us-east-1)r}   ri   r   )r=   s    r   get_s3_bucket_locationr      s=    }} D(}}  **=='K'r   )N)F)NNN)rH   urllib.parser   hashlibr   r6   ImportErrorr8   ansible.module_utils.basicr   ;ansible_collections.amazon.aws.plugins.module_utils.retriesr   r   r,   r1   rB   rD   rO   rV   rd   rg   rk   ru   exponential_backoffr~   r|   jittered_backoffr   r   r   r   r   r   <module>r      s     !G	
 / P)A	A+/"	:1,  nVhEijA kA( < <<
({  G
  		s"   B B BBBB