o
    ˷e;                     @   s  d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZ e
rAdd	lmZ ndZeeZG d
d dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd deZ dd Z!	d/ddZ"dd Z#d d! Z$d"d# Z%	d/d$d%Z&d&d' Z'd(d) Z(d*d+ Z)eeed,Z*e
re*+eed- e,e*- Z.g d.Z/dS )0aC   The interfaces in this module are not intended for public use.

This module defines interfaces for applying checksums to HTTP requests within
the context of botocore. This involves both resolving the checksum to be used
based on client configuration and environment, as well as application of the
checksum to the request.
    N)crc32)sha1sha256)HAS_CRT)AwsChunkedWrapperErrorFlexibleChecksumError)StreamingBody)conditionally_calculate_md5determine_content_length)	checksumsc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )BaseChecksum   c                 C      d S N selfchunkr   r   L/var/www/ideatree/venv/lib/python3.10/site-packages/botocore/httpchecksum.pyupdate.      zBaseChecksum.updatec                 C   r   r   r   r   r   r   r   digest1   r   zBaseChecksum.digestc                 C   s   |   }t|dS )Nascii)r   base64	b64encodedecode)r   bsr   r   r   	b64digest4   s   zBaseChecksum.b64digestc                    s:      }t fdddD ]}| q | d S )Nc                      s     jS r   )read_CHUNK_SIZEr   fileobjr   r   r   <lambda>:   s    z.BaseChecksum._handle_fileobj.<locals>.<lambda>    )telliterr   seek)r   r"   start_positionr   r   r!   r   _handle_fileobj8   s   zBaseChecksum._handle_fileobjc                 C   s2   t |ttfr| | |  S | | |  S r   )
isinstancebytes	bytearrayr   r)   r   )r   bodyr   r   r   handle>   s
   

zBaseChecksum.handleN)	__name__
__module____qualname__r    r   r   r   r)   r.   r   r   r   r   r   +   s    r   c                   @   $   e Zd Zdd Zdd Zdd ZdS )Crc32Checksumc                 C   
   d| _ d S Nr   
_int_crc32r   r   r   r   __init__G      
zCrc32Checksum.__init__c                 C   s   t || jd@ | _d S Nl    )r   r7   r   r   r   r   r   J   s   zCrc32Checksum.updatec                 C      | j jdddS N   big)	byteorderr7   to_bytesr   r   r   r   r   M      zCrc32Checksum.digestNr/   r0   r1   r8   r   r   r   r   r   r   r3   F       r3   c                   @   r2   )CrtCrc32Checksumc                 C   r4   r5   r6   r   r   r   r   r8   S   r9   zCrtCrc32Checksum.__init__c                 C      t || j}|d@ | _d S r:   )crt_checksumsr   r7   r   r   new_checksumr   r   r   r   V      zCrtCrc32Checksum.updatec                 C   r;   r<   r@   r   r   r   r   r   Z   rB   zCrtCrc32Checksum.digestNrC   r   r   r   r   rE   Q       rE   c                   @   r2   )CrtCrc32cChecksumc                 C   r4   r5   )_int_crc32cr   r   r   r   r8   `   r9   zCrtCrc32cChecksum.__init__c                 C   rF   r:   )rG   crc32crM   rH   r   r   r   r   c   rJ   zCrtCrc32cChecksum.updatec                 C   r;   r<   )rM   rA   r   r   r   r   r   g   rB   zCrtCrc32cChecksum.digestNrC   r   r   r   r   rL   ^   rK   rL   c                   @   r2   )Sha1Checksumc                 C      t  | _d S r   )r   	_checksumr   r   r   r   r8   l      zSha1Checksum.__init__c                 C      | j | d S r   rQ   r   r   r   r   r   r   o   rB   zSha1Checksum.updatec                 C   
   | j  S r   rQ   r   r   r   r   r   r   r   r9   zSha1Checksum.digestNrC   r   r   r   r   rO   k   rD   rO   c                   @   r2   )Sha256Checksumc                 C   rP   r   )r   rQ   r   r   r   r   r8   w   rR   zSha256Checksum.__init__c                 C   rS   r   rT   r   r   r   r   r   z   rB   zSha256Checksum.updatec                 C   rU   r   rV   r   r   r   r   r   }   r9   zSha256Checksum.digestNrC   r   r   r   r   rW   v   rD   rW   c                   @   sL   e Zd ZdZ			dddZdd Zdd	d
ZdddZdd Zdd Z	dS )AwsChunkedWrapperr   Nx-amz-checksumc                 C   s2   || _ || _|| _|   |d u r| j}|| _d S r   )_raw_checksum_name_checksum_cls_reset_DEFAULT_CHUNK_SIZE_chunk_size)r   rawchecksum_clschecksum_name
chunk_sizer   r   r   r8      s   
zAwsChunkedWrapper.__init__c                 C   s*   d| _ d| _d | _| jr|  | _d S d S )Nr$   F)
_remaining	_completerQ   r\   r   r   r   r   r]      s   zAwsChunkedWrapper._resetr   c                 C   s2   |dks|dkrt dd|   | jd d S )Nr   z Can only seek to start of stream	error_msg)r   r]   rZ   r'   )r   offsetwhencer   r   r   r'      s   zAwsChunkedWrapper.seekc                 C   s   |d ur
|dkr
d }| j r| jsdS |d u p|t| jk}| j s;|r;|  j|  7  _|d u p5|t| jk}| j s;|s"|d u rDt| j}| jd | }| j|d  | _|S )Nr   r$   )re   rd   len_make_chunk)r   sizewant_more_bytes	to_returnr   r   r   r      s   


zAwsChunkedWrapper.readc                 C   s   | j | j}tt|dd  d}| | _| jr!| j| | jr;| jr;| j	d}| j
 d}d||f S d||f S )N   r   s   0
%s:%s

s   %s
%s
)rZ   r   r_   hexrj   encodere   rQ   r   r[   r   )r   	raw_chunkhex_lennamechecksumr   r   r   rk      s   zAwsChunkedWrapper._make_chunkc                 c   s     | j s|  V  | j rd S d S r   )re   rk   r   r   r   r   __iter__   s   
zAwsChunkedWrapper.__iter__)NrY   N)r   r   )
r/   r0   r1   r^   r8   r]   r'   r   rk   rv   r   r   r   r   rX      s    


rX   c                       s2   e Zd Z fddZd fdd	Zdd Z  ZS )	StreamingChecksumBodyc                    s   t  || || _|| _d S r   )superr8   rQ   	_expected)r   
raw_streamcontent_lengthru   expected	__class__r   r   r8      s   
zStreamingChecksumBody.__init__Nc                    s:   t  j|d}| j| |d u s|s|dkr|   |S )N)amtr   )rx   r   rQ   r   _validate_checksum)r   r   r   r}   r   r   r      s
   zStreamingChecksumBody.readc                 C   s<   | j  t| jkrd| j d| j   }t|dd S )NzExpected checksum z$ did not match calculated checksum: rf   )rQ   r   r   	b64decodery   r   r   )r   rg   r   r   r   r      s   

z(StreamingChecksumBody._validate_checksumr   )r/   r0   r1   r8   r   r   __classcell__r   r   r}   r   rw      s    rw   c                 C   s   t | || t| || d S r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms)requestoperation_modelparamsr   r   r   resolve_checksum_context   s   r   c           
      C   s   |j }|d}|rY||v rY|d u rt}||  }||vr%td| dd}|jr3| d dr3d}||d| d	}|d
 | d v rEd S | d di }	||	d< |	| d d< d S |jsa|dru| d di }	d|	d< |	| d d< d S d S )NrequestAlgorithmMemberz"Unsupported checksum algorithm: %srf   headerurlzhttps:trailerx-amz-checksum-%s)	algorithminrt   rt   headerscontextru   request_algorithmrequestChecksumRequiredconditional-md5)http_checksumget_SUPPORTED_CHECKSUM_ALGORITHMSlowerr   has_streaming_input
startswithhttp_checksum_required)
r   r   r   supported_algorithmsr   algorithm_memberalgorithm_namelocation_typer   checksum_contextr   r   r   r      s<   

r   c                 C   s|   |  di  di }| d}|sd S |dkrt|  d S |d dkr)t|  d S |d dkr5t|  d S td|d  d	)
Nr   ru   r   r   r   r   r   zUnknown checksum variant: %srf   )r   r	   _apply_request_header_checksum_apply_request_trailer_checksumr   )r   r   r   r   r   r   apply_request_checksum   s   

r   c                 C   sd   |  di  di }| d}|d }|| d v rd S t |d }| | d }|| d |< d S )Nr   ru   r   rt   r   r   r-   )r   _CHECKSUM_CLSr.   )r   r   r   location_namera   r   r   r   r   r   4  s   
r   c                 C   s   |  di  di }| d}|d }t |d }| d }| d }||v r(d S d|d	< d
|d< ||d< t|}|d urBt||d< t|ttfrNt|}t	|||d| d< d S )Nr   ru   r   rt   r   r   r-   chunkedzTransfer-Encodingzaws-chunkedzContent-EncodingzX-Amz-TrailerzX-Amz-Decoded-Content-Length)ra   rb   )
r   r   r
   strr*   r+   r,   ioBytesIOrX   )r   r   r   r   ra   r   r-   r{   r   r   r   r   @  s*   

r   c           
      C   s   |j }|d}|rH||v rJ|d u rt}dd |dg D }g }tD ]}||vr*q#||v r3|| q#| d di }	||	d< |	| d d< d S d S d S )NrequestValidationModeMemberc                 S   s   h | ]}|  qS r   )r   ).0ar   r   r   	<setcomp>i  s    z7resolve_response_checksum_algorithms.<locals>.<setcomp>responseAlgorithmsr   ru   response_algorithms)r   r   r   _ALGORITHMS_PRIORITY_LISTappend)
r   r   r   r   r   mode_memberr   usable_algorithmsr   r   r   r   r   r   a  s&   


r   c           	      C   s   |d }| di }| d}|sd S |D ]:}d| }||vr qd|| v r'q|jr3t| |||d< nt| |||d< |d  di }||d< ||d d<  d S td	| d
 d S )Nr   ru   r   r   -r-   r   response_algorithmzXSkipping checksum validation. Response did not contain one of the following algorithms: .)r   has_streaming_output_handle_streaming_response_handle_bytes_responseloggerinfo)	http_responseresponser   r   r   r   
algorithmsr   header_namer   r   r   handle_checksum_bodyy  s6   

r   c                 C   s6   t |}d| }t| j|d d| |d | S )Nr   r   zcontent-length)r   r   rw   r`   )r   r   r   ra   r   r   r   r   r     s   

r   c           	      C   sd   | j }d| }t|}| }|| |d | }| t|kr0d|| f }t|d|S )Nr   r   z:Expected checksum %s did not match calculated checksum: %srf   )	contentr   r   r   r   r   r   r   r   )	r   r   r   r-   r   ra   ru   r|   rg   r   r   r   r     s   


r   )r   r   r   )r   rN   )rN   r   r   r   r   )0__doc__r   r   loggingbinasciir   hashlibr   r   botocore.compatr   botocore.exceptionsr   r   botocore.responser   botocore.utilsr	   r
   awscrtr   rG   	getLoggerr/   r   r   r3   rE   rL   rO   rW   rX   rw   r   r   r   r   r   r   r   r   r   r   r   listkeysr   r   r   r   r   r   <module>   sV   
R	
2"
)