
    Dh<                        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
rdd	lmZ ndZ ej,                  e      Z G d
 d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d      Z G d de      Z d Z!	 d&dZ"d Z#d Z$d Z%	 d&dZ&d  Z'd! Z(d" Z)eeed#Z*e
re*jW                  eed$        e,e*j[                               Z.g d%Z/y)'aC   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                   .    e Zd ZdZd Zd Zd Zd Zd Zy)BaseChecksum   c                      y N selfchunks     w/var/www/fastuser/data/www/generator.snapmosaic.io/flask_app/venv/lib/python3.12/site-packages/botocore/httpchecksum.pyupdatezBaseChecksum.update.           c                      y r   r   r   s    r   digestzBaseChecksum.digest1   r   r   c                 j    | j                         }t        j                  |      j                  d      S )Nascii)r   base64	b64encodedecode)r   bss     r   	b64digestzBaseChecksum.b64digest4   s)    [[]#**733r   c                      j                         }t         fdd      D ]  } j                  |        j                  |       y )Nc                  :     j                  j                        S r   )read_CHUNK_SIZE)fileobjr   s   r   <lambda>z.BaseChecksum._handle_fileobj.<locals>.<lambda>:   s    ',,t/?/?"@ r   r   )telliterr   seek)r   r(   start_positionr   s   ``  r   _handle_fileobjzBaseChecksum._handle_fileobj8   s=     @#F 	EKK	^$r   c                     t        |t        t        f      r!| j                  |       | j                         S | j	                  |       | j                         S r   )
isinstancebytes	bytearrayr   r.   r#   )r   bodys     r   handlezBaseChecksum.handle>   sI    dUI./KK ~~   &~~r   N)	__name__
__module____qualname__r'   r   r   r#   r.   r4   r   r   r   r   r   +   s     K4% r   r   c                       e Zd Zd Zd Zd Zy)Crc32Checksumc                     d| _         y Nr   
_int_crc32r   s    r   __init__zCrc32Checksum.__init__G   	    r   c                 @    t        || j                        dz  | _        y Nl    )r   r=   r   s     r   r   zCrc32Checksum.updateJ   s    t7*Dr   c                 <    | j                   j                  dd      S N   big)	byteorderr=   to_bytesr   s    r   r   zCrc32Checksum.digestM       ''U';;r   Nr5   r6   r7   r>   r   r   r   r   r   r9   r9   F   s    E<r   r9   c                       e Zd Zd Zd Zd Zy)CrtCrc32Checksumc                     d| _         y r;   r<   r   s    r   r>   zCrtCrc32Checksum.__init__S   r?   r   c                 X    t        j                  || j                        }|dz  | _        y rA   )crt_checksumsr   r=   r   r   new_checksums      r   r   zCrtCrc32Checksum.updateV   s$    $**5$//B&3r   c                 <    | j                   j                  dd      S rC   rG   r   s    r   r   zCrtCrc32Checksum.digestZ   rI   r   NrJ   r   r   r   rL   rL   Q   s    4<r   rL   c                       e Zd Zd Zd Zd Zy)CrtCrc32cChecksumc                     d| _         y r;   )_int_crc32cr   s    r   r>   zCrtCrc32cChecksum.__init__`   s
    r   c                 X    t        j                  || j                        }|dz  | _        y rA   )rO   crc32crV   rP   s      r   r   zCrtCrc32cChecksum.updatec   s'    $++E43C3CD'*4r   c                 <    | j                   j                  dd      S rC   )rV   rH   r   s    r   r   zCrtCrc32cChecksum.digestg   s    ((e(<<r   NrJ   r   r   r   rT   rT   ^   s    5=r   rT   c                       e Zd Zd Zd Zd Zy)Sha1Checksumc                 "    t               | _        y r   )r   	_checksumr   s    r   r>   zSha1Checksum.__init__l   s    r   c                 :    | j                   j                  |       y r   r]   r   r   s     r   r   zSha1Checksum.updateo       e$r   c                 6    | j                   j                         S r   r]   r   r   s    r   r   zSha1Checksum.digestr       ~~$$&&r   NrJ   r   r   r   r[   r[   k   s     %'r   r[   c                       e Zd Zd Zd Zd Zy)Sha256Checksumc                 "    t               | _        y r   )r   r]   r   s    r   r>   zSha256Checksum.__init__w   s    r   c                 :    | j                   j                  |       y r   r_   r   s     r   r   zSha256Checksum.updatez   r`   r   c                 6    | j                   j                         S r   rb   r   s    r   r   zSha256Checksum.digest}   rc   r   NrJ   r   r   r   re   re   v   s    "%'r   re   c                   @    e Zd ZdZ	 	 	 d	dZd Zd
dZddZd Zd Z	y)AwsChunkedWrapperr   Nc                 x    || _         || _        || _        | j                          || j                  }|| _        y r   )_raw_checksum_name_checksum_cls_reset_DEFAULT_CHUNK_SIZE_chunk_size)r   rawchecksum_clschecksum_name
chunk_sizes        r   r>   zAwsChunkedWrapper.__init__   s=     	+)11J%r   c                 r    d| _         d| _        d | _        | j                  r| j                         | _        y y )Nr   F)
_remaining	_completer]   rn   r   s    r   ro   zAwsChunkedWrapper._reset   s5    !//1DN r   c                     |dk7  s|dk7  rt        d      | j                          | j                  j                  d       y )Nr   z Can only seek to start of stream	error_msg)r   ro   rl   r,   )r   offsetwhences      r   r,   zAwsChunkedWrapper.seek   s:    Q;&A+(<  			qr   c                    ||dk  rd }| j                   r| j                  sy|d u xs |t        | j                        kD  }| j                   sR|rP| xj                  | j                         z  c_        |d u xs |t        | j                        kD  }| j                   s|rP|t        | j                        }| j                  d | }| j                  |d  | _        |S )Nr   r   )rx   rw   len_make_chunk)r   sizewant_more_bytes	to_returns       r   r&   zAwsChunkedWrapper.read   s    	D >>$// $,E$T__1E*E.._OOt//11O"dlIdS5I.IO .._
 <t'D OOET*	//$%0r   c                    | j                   j                  | j                        }t        t	        |            dd  j                  d      }| | _        | j                  r| j                  j                  |       | j                  rW| j                  rK| j                  j                  d      }| j                  j                         j                  d      }d||fz  S d||fz  S )N   r   s   0
%s:%s

s   %s
%s
)rl   r&   rq   hexr   encoderx   r]   r   rm   r#   )r   	raw_chunkhex_lennamechecksums        r   r   zAwsChunkedWrapper._make_chunk   s     IINN4#3#34	c)n%ab)009&>>NN!!),>>dnn&&--g6D~~//188AH(D(+;;;'9!555r   c              #   d   K   | j                   s | j                          | j                   sy y wr   )rx   r   r   s    r   __iter__zAwsChunkedWrapper.__iter__   s%     ..""$$ ..s   +00)Nzx-amz-checksumN)r   r   )
r5   r6   r7   rp   r>   ro   r,   r&   r   r   r   r   r   rj   rj      s1    %
 && 226$%r   rj   c                   0     e Zd Z fdZd fd	Zd Z xZS )StreamingChecksumBodyc                 B    t         |   ||       || _        || _        y r   )superr>   r]   	_expected)r   
raw_streamcontent_lengthr   expected	__class__s        r   r>   zStreamingChecksumBody.__init__   s     ^4!!r   c                     t         |   |      }| j                  j                  |       ||s|dkD  r| j	                          |S )N)amtr   )r   r&   r]   r   _validate_checksum)r   r   r   r   s      r   r&   zStreamingChecksumBody.read   sC    %e$;uq##%r   c                     | j                   j                         t        j                  | j                        k7  r6d| j                   d| j                   j                          }t        |      y )NExpected checksum $ did not match calculated checksum: rz   )r]   r   r   	b64decoder   r#   r   )r   r{   s     r   r   z(StreamingChecksumBody._validate_checksum   sg    >>  "f&6&6t~~&FF$T^^$4 5!^^5578:  ()<< Gr   r   )r5   r6   r7   r>   r&   r   __classcell__)r   s   @r   r   r      s    "
=r   r   c                 8    t        | ||       t        | ||       y r   )"resolve_request_checksum_algorithm$resolve_response_checksum_algorithms)requestoperation_modelparamss      r   resolve_checksum_contextr      s    &wH(/6Jr   c                    |j                   }|j                  d      }|r||v r|t        }||   j                         }||vrt	        d|z        d}|j
                  r| d   j                  d      rd}||d|z  d	}|d
   | d   v ry | d   j                  di       }	||	d<   |	| d   d<   y |j                  s|j                  d      r#| d   j                  di       }	d|	d<   |	| d   d<   y y )NrequestAlgorithmMemberz"Unsupported checksum algorithm: %srz   headerurlzhttps:trailerx-amz-checksum-%s)	algorithminr   r   headerscontextr   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_contexts
             r   r   r      sI    $11M$(()AB,6  '#A  01779!55'>O  !..u~((2 !* ('.8
	 V	 22"9-11*bA09,-)9	:&		/	/=3D3D!4 #9-11*bA0A,-)9	:&4r   c                    | j                  di       j                  di       }|j                  d      }|sy |dk(  rt        |        y |d   dk(  rt        |        y |d   dk(  rt        |        y t	        d|d   z  	      )
Nr   r   r   r   r   r   r   zUnknown checksum variant: %srz   )r   r
   _apply_request_header_checksum_apply_request_trailer_checksumr   )r   r   r   s      r   apply_request_checksumr      s    {{9b155j"E $$%89I%%#G,	4H	$&w/	4I	%'0#4yF
 	
r   c                     | j                  di       j                  di       }|j                  d      }|d   }|| d   v ry t        j                  |d         } |       j                  | d         }|| d   |<   y )Nr   r   r   r   r   r   r3   )r   _CHECKSUM_CLSr4   )r   r   r   location_namers   r   s         r   r   r   4  s    {{9b155j"E $$%89If%M	** $$Y{%;<L^""76?3F(.GI}%r   c                    | j                  di       j                  di       }|j                  d      }|d   }t        j                  |d         }| d   }| d   }||v ry d|d	<   d
|v r|d
xx   dz  cc<   nd|d
<   ||d<   t        |      }|t        |      |d<   t	        |t
        t        f      rt        j                  |      }t        |||      | d<   y )Nr   r   r   r   r   r   r3   chunkedzTransfer-EncodingzContent-Encodingz,aws-chunkedzaws-chunkedzX-Amz-TrailerzX-Amz-Decoded-Content-Length)rs   rt   )
r   r   r   strr0   r1   r2   ioBytesIOrj   )r   r   r   r   rs   r   r3   r   s           r   r   r   @  s    {{9b155j"E $$%89If%M $$Y{%;<Li G6?D#,G W$ 	"#~5#&3"#,GO-d3N! 36n2E./$	*+zz$'!#GFOr   c                 V   |j                   }|j                  d      }|r||v r|t        }|j                  dg       D ch c]  }|j                          }}g }t        D ]  }	|	|vr|	|v s|j                  |	        | d   j                  di       }
||
d<   |
| d   d<   y y y c c}w )NrequestValidationModeMemberresponseAlgorithmsr   r   response_algorithms)r   r   r   r   _ALGORITHMS_PRIORITY_LISTappend)r   r   r   r   r   mode_memberar   usable_algorithmsr   r   s              r   r   r   f  s     $11M##$ABK{f,'#A ,001ErJ
AGGI
 
 2 	4I 3300!((3		4 #9-11*bA2C./)9	:&! -{
s    B&c                 ^   |d   }|j                  di       }|j                  d      }|sy |D ]d  }d|z  }||vrd||   v r|j                  rt        | ||      |d<   nt        | ||      |d<   |d   j                  di       }||d<   ||d   d<    y  t        j                  d	| d
       y )Nr   r   r   r   -r3   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_names	            r   handle_checksum_bodyr   ~  s    y!G{{:r2!%%&;<J 	)I5g%
 '+&&//9x HV  6x HV
 $I.22:rB1:-.*:J'36 KK!!+A	/r   c                     t         j                  |      }d|z  }t        | j                  |d   j                  d       |       |d   |         S )Nr   r   zcontent-length)r   r   r   rr   )r   r   r   rs   r   s        r   r   r     sX     $$Y/L%	1K  01K(	 r   c                 "   | j                   }d|z  }t        j                  |      } |       }|j                  |       |d   |   }|j	                         t        j                  |      k7  r"d|d|j                         }t        |      |S )Nr   r   r   r   rz   )	contentr   r   r   r   r   r   r#   r   )	r   r   r   r3   r   rs   r   r   r{   s	            r   r   r     s      D%	1K $$Y/L~HOOD	";/HF,,X66 ""$ 	 $i88Kr   )r   r   r   )r   rX   )rX   r   r   r   r   )0__doc__r   r   loggingbinasciir   hashlibr   r   botocore.compatr   botocore.exceptionsr   r   botocore.responser	   botocore.utilsr
   r   awscrtr   rO   	getLoggerr5   r   r   r9   rL   rT   r[   re   rj   r   r   r   r   r   r   r   r   r   r   r   r   listkeysr   r   r   r   r   <module>r      s-    	     # M +
 1M			8	$   6<L <
<| 
<
= 
='< ''\ 'O% O%d=M =,K 	/:d
(	/#N <@:0&R(  ".?@ "&m&8&8&:!; A r   