o
    rj@cü;  ã                   @   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
r¾e* +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   ú9usr/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"   Z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   r6   r   r   r   r   r   J   s   zCrc32Checksum.updatec                 C   ó   | j jdddS ©Né   Úbig)Ú	byteorder©r6   Úto_bytesr   r   r   r   r   M   ó   zCrc32Checksum.digestN©r.   r/   r0   r7   r   r   r   r   r   r   r2   F   ó    r2   c                   @   r1   )ÚCrtCrc32Checksumc                 C   r3   r4   r5   r   r   r   r   r7   S   r8   zCrtCrc32Checksum.__init__c                 C   ó   t  || j¡}|d@ | _d S r9   )Úcrt_checksumsr   r6   ©r   r   Znew_checksumr   r   r   r   V   ó   zCrtCrc32Checksum.updatec                 C   r:   r;   r?   r   r   r   r   r   Z   rA   zCrtCrc32Checksum.digestNrB   r   r   r   r   rD   Q   ó    rD   c                   @   r1   )ÚCrtCrc32cChecksumc                 C   r3   r4   )Ú_int_crc32cr   r   r   r   r7   `   r8   zCrtCrc32cChecksum.__init__c                 C   rE   r9   )rF   Úcrc32crK   rG   r   r   r   r   c   rH   zCrtCrc32cChecksum.updatec                 C   r:   r;   )rK   r@   r   r   r   r   r   g   rA   zCrtCrc32cChecksum.digestNrB   r   r   r   r   rJ   ^   rI   rJ   c                   @   r1   )ÚSha1Checksumc                 C   ó   t ƒ | _d S r   )r   Ú	_checksumr   r   r   r   r7   l   ó   zSha1Checksum.__init__c                 C   ó   | j  |¡ d S r   ©rO   r   r   r   r   r   r   o   rA   zSha1Checksum.updatec                 C   ó
   | j  ¡ S r   ©rO   r   r   r   r   r   r   r   r8   zSha1Checksum.digestNrB   r   r   r   r   rM   k   rC   rM   c                   @   r1   )ÚSha256Checksumc                 C   rN   r   )r   rO   r   r   r   r   r7   w   rP   zSha256Checksum.__init__c                 C   rQ   r   rR   r   r   r   r   r   z   rA   zSha256Checksum.updatec                 C   rS   r   rT   r   r   r   r   r   }   r8   zSha256Checksum.digestNrB   r   r   r   r   rU   v   rC   rU   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   r7   „   s   
zAwsChunkedWrapper.__init__c                 C   s*   d| _ d| _d | _| jr|  ¡ | _d S d S )Nr$   F)Ú
_remainingÚ	_completerO   rZ   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[   rX   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$   )rc   rb   ÚlenÚ_make_chunk)r   ÚsizeZwant_more_bytesZ	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
)rX   r   r]   Úhexrh   Úencoderc   rO   r   rY   r   )r   Z	raw_chunkÚhex_lenÚnameÚchecksumr   r   r   ri   ¼   s   zAwsChunkedWrapper._make_chunkc                 c   s     | j s|  ¡ V  | j rd S d S r   )rc   ri   r   r   r   r   Ú__iter__Î   s   €
ÿzAwsChunkedWrapper.__iter__)NrW   N)r   r   )
r.   r/   r0   r\   r7   r[   r'   r   ri   rq   r   r   r   r   rV      s    
û

rV   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   )Úsuperr7   rO   Ú	_expected)r   Z
raw_streamÚcontent_lengthrp   Úexpected©Ú	__class__r   r   r7   Ô   s   
zStreamingChecksumBody.__init__Nc                    s:   t ƒ j|d}| j |¡ |d u s|s|dkr|  ¡  |S )N)Úamtr   )rs   r   rO   r   Ú_validate_checksum)r   ry   r   rw   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: rd   )rO   r   r   Ú	b64decodert   r   r   )r   re   r   r   r   rz   à   s   
ÿÿ
ûz(StreamingChecksumBody._validate_checksumr   )r.   r/   r0   r7   r   rz   Ú__classcell__r   r   rw   r   rr   Ó   s    rr   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 )NZrequestAlgorithmMemberz"Unsupported checksum algorithm: %srd   ÚheaderÚurlzhttps:Útrailerúx-amz-checksum-%s)Ú	algorithmÚinro   ro   ÚheadersÚcontextrp   Úrequest_algorithmZrequestChecksumRequiredúconditional-md5)Úhttp_checksumÚgetÚ_SUPPORTED_CHECKSUM_ALGORITHMSÚlowerr   Zhas_streaming_inputÚ
startswithZhttp_checksum_required)
r   r€   r   Úsupported_algorithmsr   Zalgorithm_memberZalgorithm_nameZ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Š   rp   r‹   rŒ   rˆ   rƒ   r…   zUnknown checksum variant: %srd   )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Š   rp   r‹   ro   r‰   r‡   r,   )rŽ   Ú_CHECKSUM_CLSr-   )r   r“   r‡   Úlocation_namer_   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Š   rp   r‹   ro   r‡   r‰   r,   ÚchunkedzTransfer-Encodingzaws-chunkedzContent-EncodingzX-Amz-TrailerzX-Amz-Decoded-Content-Length)r_   r`   )
rŽ   r—   r
   Ústrr)   r*   r+   ÚioÚBytesIOrV   )r   r“   r‡   r˜   r_   r‰   r,   ru   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 )NZrequestValidationModeMemberc                 S   s   h | ]}|  ¡ ’qS r   )r   )Ú.0Úar   r   r   Ú	<setcomp>i  s    ÿz7resolve_response_checksum_algorithms.<locals>.<setcomp>ZresponseAlgorithmsrŠ   rp   Úresponse_algorithms)r   rŽ   r   Ú_ALGORITHMS_PRIORITY_LISTÚappend)
r   r€   r   r’   r   Zmode_memberr    Z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‰   rp   r    r†   ú-r,   rŠ   Zresponse_algorithmzXSkipping checksum validation. Response did not contain one of the following algorithms: Ú.)rŽ   Zhas_streaming_outputÚ_handle_streaming_responseÚ_handle_bytes_responseÚloggerÚinfo)	Úhttp_responseÚresponserŠ   r€   r‰   r“   Z
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Ž   rr   r^   )r©   rª   r‡   r_   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: %srd   )	Úcontentr—   rŽ   r   r   r   r{   r   r   )	r©   rª   r‡   r,   r«   r_   rp   rv   re   r   r   r   r¦   ­  s   

þÿÿ
r¦   )r   r   r   )r   rL   )rL   r   r   r   r   )0Ú__doc__r   r›   ÚloggingÚbinasciir   Zhashlibr   r   Zbotocore.compatr   Zbotocore.exceptionsr   r   Zbotocore.responser   Zbotocore.utilsr	   r
   Zawscrtr   rF   Ú	getLoggerr.   r§   r   r2   rD   rJ   rM   rU   rV   rr   r‚   r}   r–   r”   r•   r~   r¬   r¥   r¦   r—   r   ÚlistÚkeysr   r¡   r   r   r   r   Ú<module>   sV   
R	
ü2"
ÿ)ýÿ