HEX
Server: nginx/1.30.4
System: Linux d-twindigital-web-1.host-ed.eu 4.18.0-553.141.2.el8_10.x86_64 #1 SMP Wed Jul 8 10:28:18 EDT 2026 x86_64
User: u_twindigital_html (1009)
PHP: 8.3.30
Disabled: NONE
Upload Files
File: //lib/python3.6/site-packages/S3/__pycache__/S3.cpython-36.opt-1.pyc
3

@tJ[�E�(@s�ddlmZmZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZddl
mZddlmZmZmZmZddlmZyddlmZWn ek
r�ddlmZYnXddlZyddlmZWn ek
r�ddlmZYnXd	d
lTd	dlmZd	dlmZd	d
l m Z m!Z!d	dl"m"Z"d	dl#m#Z#d	d
l$Td	dl%m&Z&d	dl'm'Z'd	dl(m(Z(d	dl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/y�ddl0m1Z1ddl2Z2ye2j3dd�Z4dd�Z5Wn�e6k
�ry e2j7e2j8�Z4e4j9�dd�Z5Wn,e:k
�re2j3e2j8d�Z4dd�Z5YnXYn2e:k
�rNe2j7e2j8�Z4e4j9�dd�Z5YnXWn\ee;fk
�r�Z<z:e=e<�Z>de>k�r�dZ?nde>Z?e?d 7Z?d!a@d"d�Z5WYddZ<[<XnXd#d$�ZAd%ZBgZCGd&d'�d'eD�ZEGd(d)�d)eD�ZFeCjGd)�d*d+�ZHd,d-�ZIdS).�)�absolute_import�divisionN)�saxutils)�timeout)�debug�info�warning�error)�ST_SIZE)�urlparse)�md5�)�*)�
SortedDict)�	AccessLog)�ACL�GranteeLogDelivery)�BidirMap)�Config)�MultiPartUpload)�S3Uri)�ConnMan)�sign_request_v2�sign_request_v4�checksum_sha256_file�checksum_sha256_buffer�s3_quote�format_param_str)�
ArgumentErrorT)ZmimecCs
tj|�S)N)�magic_Z	from_file)�file�r!�/usr/lib/python3.6/S3.py�mime_magic_file9sr#c
Cs4y
tj|�Stttfk
r.tjt|��SXdS)N)rr �UnicodeDecodeError�UnicodeEncodeErrorr�deunicodise)r r!r!r"r#Fs
)�flagscCs
tj|�S)N)rZid_filename)r r!r!r"r#PscCstjt|��S)N)rr r&)r r!r!r"r#Ys�magicz%Module python-magic is not available.z'Module python-magic can't be used (%s).z. Guessing MIME types based on file extensions.FcCststt�datj|�dS)NTr)�magic_warnedr�
magic_message�	mimetypes�
guess_type)r r!r!r"r#dscCsjdd�}||�}|dk	rZt|t�rZd|krR|jd�\}}|td�d�}||f}n|df}|dkrfd}|S)NcSst|�}|S)N)r#)r Z	magictyper!r!r"�_mime_magicmszmime_magic.<locals>._mime_magic�;�charset)NN)�
isinstance�str�split�len)r r-�resultZmimetyper/r!r!r"�
mime_magicks

r5�c@sFeZdZiZiZddd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dS)�	S3RequestNcCsn||_t|pidd�|_t|jjj�dkrF|jjj�|jjj|jd<||_||_|pXi|_	||_
|j�dS)NT)�ignore_caserzx-amz-security-token)�s3r�headersr3�configZaccess_tokenZrole_refresh�resource�
method_string�params�body�requester_pays)�selfr9r=r<r:r?r>r!r!r"�__init__�s
zS3Request.__init__cCs"|jjjr|jdkrd|jd<dS)N�GET�POST�PUT�HEADZ	requesterzx-amz-request-payer)rCrDrErF)r9r;r@r=r:)rAr!r!r"r@�szS3Request.requester_payscCs,d|jkr|jd=tjdtj��|jd<dS)N�datez%a, %d %b %Y %H:%M:%S +0000z
x-amz-date)r:�time�strftime�gmtime)rAr!r!r"�update_timestamp�s
zS3Request.update_timestampcCsD|jjrdS|jddks<t|jd�s<|jjjs<|jjr@dSdS)NF�bucketT)r9�endpoint_requires_signature_v4r<Z check_bucket_name_dns_conformityr;Zsignature_v2�fallback_to_signature_v2)rAr!r!r"�use_signature_v2�s
0zS3Request.use_signature_v2cCs
|jjd�}|j�rVtd�|r4d||jdf}n
|jd}t|j||j|j�|_n�td�|jj	|jd�}|r�|t
jkr�t
jj|d�jd|�s�|t
jkr�t
t�j|�r�d||jdf}n
|jd}t
jj|jdt�j�}t|j|||j||j|j�|_dS)NrLzUsing signature v2z/%s%s�urizUsing signature v4�z%s.)r<�getrOrrr=r>r:r9�get_hostnamer7�	redir_map�
startswith�check_bucket_name_dns_supportr�host_bucket�
region_map�bucket_locationrr?)rA�bucket_nameZresource_uri�hostnameZ
bucket_regionr!r!r"�sign�s&



zS3Request.signcCsT|j�|j�t|j�}t|dddd�|d<|dt|j�7<|j||jfS)NrPFT)Zquote_backslashes�unicode_output)	rKr\�dictr<rrr>r=r:)rAr<r!r!r"�get_triplet�s
zS3Request.get_triplet)N)�__name__�
__module__�__qualname__rXrTrBr@rKrOr\r_r!r!r!r"r7�s

!r7c@seZdZeddddddd�Zedd	d
ddd
�ZedededBededBededBededBededBededBededBededBededBededBd�Zdddd�ZdZdd�Z	d d!�Z
d"d#�Zd$d%�Zd�d'd(�Z
d)d*�Zd�d+d,�Zd�d-d.�Zd�d/d0�Zd�d1d2�Zd3d4�Zd�d6d7�Zd8d9�Zd:d;�Zd�d<d=�Zd�d>d?�Zd�d@dA�Zd�dBdC�Zd�dDdE�ZdFdG�ZdHdI�ZdJdK�Zd�dLdM�ZdNdO�Z d�dQdR�Z!d�dSdT�Z"dUdV�Z#dWdX�Z$dYdZ�Z%d[d\�Z&d]d^�Z'd�d_d`�Z(d�dadb�Z)d�dcdd�Z*dedf�Z+dgdh�Z,didj�Z-dkdl�Z.dmdn�Z/dodp�Z0dqdr�Z1dsdt�Z2dudv�Z3dwdx�Z4dydz�Z5d{d|�Z6d}d~�Z7dd��Z8d�d��Z9d�d��Z:d�d��Z;d�d��Z<d�d�d��Z=d�d�d��Z>d�d��Z?d�d��Z@d�d��ZAd�d��ZBefd�d��ZCdPdedd�d&fd�d��ZDd�d�d��ZEdefd�d��ZFd&S)��S3r
r6����)rCrErF�DELETErD�MASK�iiii)�SERVICE�BUCKET�OBJECT�BATCHrirrkrCrlrErhrmrFrDrn)ZUNDFINED�LIST_ALL_BUCKETS�
BUCKET_CREATE�BUCKET_LIST�
BUCKET_DELETE�
OBJECT_PUT�
OBJECT_GET�OBJECT_HEAD�
OBJECT_DELETE�OBJECT_POST�BATCH_DELETEzBucket '%s' does not existz Access to bucket '%s' was deniedzBucket '%s' already exists)ZNoSuchBucket�AccessDeniedZBucketAlreadyExists�cCs||_d|_d|_d|_dS)NF)r;rNrM�expect_continue_not_supported)rAr;r!r!r"rB�szS3.__init__cCs(d}|jjdkr|jjS|jjr$d}|S)NZSTANDARDrQZREDUCED_REDUNDANCY)r;�
storage_classZreduced_redundancy)rA�clsr!r!r"r|szS3.storage_classcCsV|r|tjkrtj|}n(|r6t|jj|�r6t|�}n|jjj�}td||f�|S)Nzget_hostname(%s): %s)	r7rTrVr;rWZgetHostnameFromBucket�	host_base�lowerr)rArL�hostr!r!r"rSs
zS3.get_hostnamecCs|j�tj|<dS)N)rr7rT)rArL�redir_hostnamer!r!r"�set_hostnameszS3.set_hostnameNcCs�|jd�}|r^|tjkr2tjj|d�jd|�sL|tjkr^t|jj|�r^d||df}n|d}|rvd||f}|jjdkr�|jjr�d|j	|�|f}t
d|�|S)	NrLrQz%s.z/%s%srPz%s%szhttp://%s%szformat_uri(): )rRr7rTrUrVr;rWZ
proxy_hostZ	use_httpsrSr)rAr<�	base_pathrZrPr!r!r"�
format_uris


z
S3.format_uricCs*|jd�}|j|�}t|dd�|d<|S)Nro�dataZBucket�list)�create_request�send_request�getListFromXml)rA�request�responser!r!r"�list_all_buckets,s

zS3.list_all_bucketscCs^g}g}x4|j|||||�D]\}}	}
|j|
�|j|	�qWi}||d<||d<||d<|S)Nr�Zcommon_prefixes�	truncated)�bucket_list_streaming�extend)rArL�prefix�	recursive�
uri_params�limitZ	item_list�prefixesr��dirsZobjectsr�r!r!r"�bucket_list2s
zS3.bucket_listc#s.dd�}dd�}dd�}�fdd�}	|r0|j�p2i}d	}
g}d
}d
}
|}x�|
�r(|j|||||��|�d�}|�d�}|t|�7}|
t|�7}
|||
kr�|||
}|�d�}
|
�r|dks�||
|k�r|r�|	�d|�|d
<n|dd|d
<td|d
�n|
||fVP|
||fVqJWdS)ze Generator that produces <dir_list>, <object_list> pairs of groups of content of a specified bucket. cSst|d�pd}|j�dkS)Nz.//IsTruncatedZfalse)�getTextFromXmlr)r�Zis_truncatedr!r!r"�_list_truncatedAsz1S3.bucket_list_streaming.<locals>._list_truncatedcSs
t|d�S)NZContents)r�)r�r!r!r"�
_get_contentsFsz/S3.bucket_list_streaming.<locals>._get_contentscSs
t|d�S)NZCommonPrefixes)r�)r�r!r!r"�_get_common_prefixesIsz6S3.bucket_list_streaming.<locals>._get_common_prefixescst�dd�p|ddS)Nr�Z
NextMarkerr
ZKey���)r�)r��current_list)r�r!r"�_get_next_markerLsz2S3.bucket_list_streaming.<locals>._get_next_markerTrr�r
ZmarkerZPrefixzListing continues after '%s'Nr�r�)�copy�bucket_list_noparser3r)rArLr�r�r�r�r�r�r�r�r�r�Znum_objectsZnum_prefixes�max_keysr�Zcurrent_prefixesr!)r�r"r�?s8zS3.bucket_list_streamingcCsb|dkri}|r||d<|jjr0|r0d|d<|dkrDt|�|d<|jd||d�}|j|�}|S)	Nr��/�	delimiterr
zmax-keysrq)rLr�r�)r;r�r1r�r�)rArLr�r�r�r�r�r�r!r!r"r�ls
zS3.bucket_list_noparsecCs�tdd�}d}|r�|j�j�dkr�|j�j�dkr�|j�}|j�dkrP|j�}n|j�}d}||7}|d7}td	|�t|dd
�nt|dd
�|jjr�d|d
<|jd|||d�}|j	|�}|S)NT)r8rQ�USz	us-east-1�EUz/<CreateBucketConfiguration><LocationConstraint>z1</LocationConstraint></CreateBucketConfiguration>zbucket_location: )Z
dns_strictFzpublic-readz	x-amz-aclrp)rLr:r?)
r�strip�upperrrZcheck_bucket_namer;�
acl_publicr�r�)rArLrYr:r?r�r�r!r!r"�
bucket_createzs$
$

zS3.bucket_createcCs|jd|d�}|j|�}|S)Nrr)rL)r�r�)rArLr�r�r!r!r"�
bucket_delete�s
zS3.bucket_deleteFc	Cs�|j�}|jd|j�ddid�}tjj|d�}tjj|d�}z4|rd|oH|rd|jjtj|<dtj|<|j|�}Wd||kr�|tj|<n|tjkr�tj|=||kr�|tj|<n|tjkr�tj|=Xt	|dd�}|s�|dkr�d}n|d	kr�d
}|S)Nrq�location)rLr�rQz	us-east-1r�ZLocationConstraintr�r�z	eu-west-1)rQr�)
rLr�r7rTrRrXr;r~r�r�)	rArP�force_us_defaultrLr�Zsaved_redir_mapZsaved_region_mapr�r�r!r!r"�get_bucket_location�s0



zS3.get_bucket_locationcCs4|jd|j�ddid�}|j|�}t|dd�}|S)Nrq�requestPayment)rLr�r�ZPayer)r�rLr�r�)rArPr�r�Zpayerr!r!r"�get_bucket_requester_pays�s

zS3.get_bucket_requester_payscCsTi}|j|�|d<y|j|�|d<Wn*tk
rN}zd|d<WYdd}~XnX|S)Nzbucket-locationzrequester-paysZnone)r�r��S3Error)rArPr��er!r!r"�bucket_info�szS3.bucket_infocCs�|j�}|jd|ddid�}yR|j|�}t|dd�|d<t|dd�|d<|jj|j�|j|�d	�|d
<|Stk
r�}z|jdkr�t	d�dS�WYdd}~XnXdS)
Nrq�website)rLr�r�z.//IndexDocument//SuffixZindex_documentz.//ErrorDocument//KeyZerror_document)rLr��website_endpointi�zICould not get /?website - website probably not configured for this bucket)
rLr�r�r�r;r�r�r��statusr)rArPrYrLr�r�r�r!r!r"�website_info�s 

zS3.website_infocCs�|j�}d}|d7}|d|jj7}|d7}|jjrT|d7}|d|jj7}|d7}|d7}|jd	||d
did�}|j|�}td|�|S)
NzF<WebsiteConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">z  <IndexDocument>z    <Suffix>%s</Suffix>z  </IndexDocument>z  <ErrorDocument>z    <Key>%s</Key>z  </ErrorDocument>z</WebsiteConfiguration>rpr�)rLr?r�zReceived response '%s')rLr;Z
website_indexZ
website_errorr�r�r)rArPrYrLr?r�r�r!r!r"�website_create�s

zS3.website_createcCsN|j�}|jd|ddid�}|j|�}td|�|ddkrJtd|��|S)Nrrr�)rLr�zReceived response '%s'r���zExpected status 204: %s)rLr�r�r�S3ResponseError)rArPrYrLr�r�r!r!r"�website_delete�s
zS3.website_deletecCs�|j�}|jd|ddid�}yD|j|�}t|dd�|d<t|dd�|d<t|dd	�|d
<|Stk
r�}z4|jdkr�td�dS|jd
kr�td�dS�WYdd}~XnXdS)Nrq�	lifecycle)rLr�r�z.//Rule//Prefixr�z.//Rule//Expiration//DaterGz.//Rule//Expiration//DaysZdaysi�zMCould not get /?lifecycle - lifecycle probably not configured for this bucketi�zKCould not get /?lifecycle - lifecycle support not implemented by the server)rLr�r�r�r�r�r)rArPrYrLr�r�r�r!r!r"�expiration_info�s"


zS3.expiration_infocCs�|jjr|jjrtd��|jjp&|jjs^|jjr8td��td�|j�}|jd|ddid�}n
|j|�}|j	|�}td|�|S)Nz+Expect either --expiry-day or --expiry-datezdel bucket lifecyclerrr�)rLr�zReceived response '%s')
r;�expiry_date�expiry_days�ParameterError�
expiry_prefixrrLr��_expiration_setr�)rArPrYrLr�r�r!r!r"�expiration_sets

zS3.expiration_setcCs�td�d}|d7}|d|jj7}|d7}|d7}|jjrN|d|jj7}n|jjrf|d|jj7}|d	7}|d
7}|d7}tdd
�}t|�|d<|j�}|jd|||ddid�}|S)Nzput bucket lifecyclez<LifecycleConfiguration>z  <Rule>z    <Prefix>%s</Prefix>z    <Status>Enabled</Status>z    <Expiration>z    <Date>%s</Date>z    <Days>%s</Days>z    </Expiration>z	  </Rule>z</LifecycleConfiguration>T)r8zcontent-md5rpr�)rLr:r?r�)	rr;r�r�r�r�compute_content_md5rLr�)rArPr?r:rLr�r!r!r"r�s(
zS3._expiration_setcCs�|jj}d}|dkr&|jjr&td��|jjrn|jjrJttjjt	|���}|jj
r`t|�\}}ntj
|�\}}|sz|jj}||fS)N�-zRYou must specify --mime-type or --default-mime-type for files uploaded from stdin.)r;�default_mime_typer�Zguess_mime_type�follow_symlinksZ	unicodise�os�path�realpathr&Zuse_mime_magicr5r+r,)rA�filename�content_type�content_charsetr!r!r"�_guess_content_type5szS3._guess_content_typecCs,|jj}|s|jj}|d|jjj�7}|S)Nz
; charset=)r;�	mime_typer��encodingr�)rAr�r!r!r"�stdin_content_typeGs
zS3.stdin_content_typecCsb|jj}d}|dkr|j�S|s.|j|�\}}|s>|jjj�}|j||�r^|dk	r^|d|}|S)Nr�z
; charset=)r;r�r�r�r�r��add_encoding)rAr�r�r�r!r!r"r�OszS3.content_typecCsbd|krdS|jjjd�}|ddkr*dS|jdd�}t|�dkrFdS|d}||krZd	SdSdS)
Nzcharset=F�,rrQ�.r6r
T)r;Zadd_encoding_extsr2�rsplitr3)rAr�r�Zexts�parts�extr!r!r"r�aszS3.add_encodingrQcCs�|jdkrtd|j��|dkr:tjjt|��r:td��yX|dkrftjt	j
j�ddd�}d|_d	}n*tjt|�dd
�}||_tj
t|��t}Wn4ttfk
r�}ztd|j��WYdd}~XnXtdd
�}|r�|j|�|jjr�d|d<|jj�rd|d<|jj|d<|j|d�|d<|jj�r0d|d<|j�|d<d}	|jj�r^|dk�r^td��|jj�r�||jjddk�s�|dk�r�d}	||jj|jjddk�r�td|jj|jjf��|	�r�|j|||||�S|jj�r�y|j |�}
Wnd}
YnX|
dk	�r�t!|
dd�}|
ddj"d�}||k�r|t#d|d	||jj$�}
||
k�rht%d|�dSt%d ||
|f�nt%d!|||f�t&|�|d<|j'd"||d#�}||j(�|d$�}|j)|||�}|S)%Nr9z Expected URI type 's3', got '%s'r�zNot a regular file�rbF)�mode�closefdz<stdin>r)r�z%sT)r8�AES256zx-amz-server-side-encryptionzaws:kmsz+x-amz-server-side-encryption-aws-kms-key-id)r�zcontent-typezpublic-readz	x-amz-aclzx-amz-storage-classz2Multi-part upload is required to upload from stdinizZChunk size %d MB results in more than %d chunks. Please increase --multipart-chunk-size-mbr:zcontent-length�etagz"'rQz,Put: size and md5sum match for %s, skipping.zBMultiPart: checksum (%s vs %s) does not match for %s, reuploading.z>MultiPart: size (%d vs %d) does not match for %s, reuploading.rs)rPr:)�source�destination�extra)*�type�
ValueErrorr�r��isfiler&ZInvalidFileError�io�open�sys�stdin�fileno�stream_name�statr
�IOError�OSError�strerrorr�updater;�server_side_encryption�kms_keyr�r�r|Zenable_multipartr�Zmultipart_chunk_size_mbZmultipart_max_chunks�send_file_multipartZput_continue�object_info�intr�ZcalculateChecksum�
send_chunkrr1r�rP�	send_file)rAr�rP�
extra_headers�extra_labelZ
src_stream�sizer�r:Z	multipartrZremote_sizeZremote_checksumZchecksumr��labelsr�r!r!r"�
object_putpsv
 




 




z
S3.object_putc	CsJ|jdkrtd|j��|jd|d�}|j�||d�}|j||||�}|S)Nr9z Expected URI type 's3', got '%s'rt)rP)r�r�r�)r�r�r�rP�	recv_file)	rArP�streamZ	dest_name�start_positionr�r�r�r�r!r!r"�
object_get�s
z
S3.object_getcs �fdd��D�}|j|�dS)z" Batch delete given a remote_list csg|]}�|d�qS)Zobject_uri_strr!)�.0�item)�remote_listr!r"�
<listcomp>�sz*S3.object_batch_delete.<locals>.<listcomp>N)�object_batch_delete_uri_strs)rAr��urisr!)r�r"�object_batch_delete�szS3.object_batch_deletec	Csvdd�}|}t|�dkr td��t|d�j�}|||�}tt|�dd�dd�}|jd	|||d
did�}|j|�}|S)
z* Batch delete given a list of object uris cSs�d}xn|D]f}t|�}|jdkr.td|j��|j�sBtd|��|j�|krVtd��tj|j��}|d|7}q
W|d7}t|�}|S)Nz.<?xml version="1.0" encoding="UTF-8"?><Delete>r9z Expected URI type 's3', got '%s'zURI '%s' has no objectz2The batch should contain keys from the same bucketz<Object><Key>%s</Key></Object>z	</Delete>)	rr�r��
has_objectrLr�escape�object�encode_to_s3)rLZkey_listr?�keyrPrr!r!r"�compose_batch_del_xml�s

z>S3.object_batch_delete_uri_strs.<locals>.compose_batch_del_xmlrzKey list is emptyzapplication/xml)zcontent-md5zcontent-typeT)r8rx�deleteN)rLr:r?r�)r3r�rrLrr�r�r�)	rArr�batchrLZrequest_bodyr:r�r�r!r!r"r�s

zS3.object_batch_delete_uri_strscCs4|jdkrtd|j��|jd|d�}|j|�}|S)Nr9z Expected URI type 's3', got '%s'rv)rP)r�r�r�r�)rArPr�r�r!r!r"�
object_delete�s


zS3.object_deletecCs�|jdkrtd|j��|jjdkr,td��|jjdkr@td��d	}|d
|jj7}|d7}|d|jj7}|d
7}|d7}|jd||ddid�}|j|�}td|�|S)Nr9z Expected URI type 's3', got '%s'r
z*You must restore a file for 1 or more days�Standard�	Expedited�Bulkz7Valid restoration priorities: bulk, standard, expeditedz><RestoreRequest xmlns="http://s3.amazonaws.com/doc/2006-3-01">z  <Days>%s</Days>z  <GlacierJobParameters>z    <Tier>%s</Tier>z  </GlacierJobParameters>z</RestoreRequest>rwZrestore)rPr?r�zReceived response '%s')rr
r)	r�r�r;Zrestore_daysr�Zrestore_priorityr�r�r)rArPr?r�r�r!r!r"�object_restore�s"


zS3.object_restorecCsLddddddddd	d
ddg}x*||jjD]}|j�|kr*||j�=q*W|S)
NrGzcontent-lengthz
last-modifiedzcontent-md5zx-amz-version-idzx-amz-delete-markerz
accept-ranges�
connectionr�Zserverz
x-amz-id-2zx-amz-request-id)r;Zremove_headersr)rAr:Z	to_remove�hr!r!r"�_sanitize_headers
s zS3._sanitize_headersc	Cs�|jdkrtd|j��|jdkr0td|j��|jjdkr�y|j|�}Wn4tk
r~}z|jdkrj|�d}WYdd}~XnXtdd�}d|j�t	|j
�dd�f|d<d	|d
<|jjr�d|d<|j�|d
<|jjr�d|d<|jj
r�d|d<|jj
|d<|�r
|j|�|jd||d�}|j|�}|d�rXt|d�dk�rXd|d<td�t|��|jjdk�r�|�r�y|j||�Wn4tk
�r�}z|jdk�r�|�WYdd}~XnX|S)Nr9z Expected URI type 's3', got '%s'i�T)r8z/%s/%s)r]zx-amz-copy-sourceZCOPYzx-amz-metadata-directivezpublic-readz	x-amz-aclzx-amz-storage-classr�zx-amz-server-side-encryptionzaws:kmsz+x-amz-server-side-encryption-aws-kms-key-idrs)rPr:r��Errori�r�zHServer error during the COPY operation. Overwrite response status to 500)r�r�r;r��get_aclr�r�rrL�urlencode_stringrr|r�r�r�r�r��getRootTagNamer	�set_acl)	rA�src_uri�dst_urir��acl�excr:r�r�r!r!r"�object_copy$sL





zS3.object_copyc
Cs�|jdkrtd|j��|jdkr0td|j��|j|�}|d}|j|�}y|j|�}Wn4tk
r�}z|jdkrz|�d}WYdd}~XnXd|j�t|j	�dd�f|d<d	|d
<|j
jr�d|d<|j
jr�d
|d<|j
j|d<|r�|j
|�|j
j�r|j
j|d<|jd||d�}|j|�}	|	d�rVt|	d�dk�rVd|	d<td�t|	��|dk�r�y|j||�Wn4tk
�r�}z|jdk�r�|�WYdd}~XnX|	S)Nr9z Expected URI type 's3', got '%s'r:i�z/%s/%sT)r]zx-amz-copy-sourceZREPLACEzx-amz-metadata-directiver�zx-amz-server-side-encryptionzaws:kmsz+x-amz-server-side-encryption-aws-kms-key-idzcontent-typers)rPr:r�ri�r�zJServer error during the MODIFY operation. Overwrite response status to 500)r�r�r�rrr�r�rLrrr;r�r�r�r�r�r�rr	r)
rArrr�Z
info_responser:rrr�r�r!r!r"�
object_modifyZsL








zS3.object_modifycCs\|j|||�}td||f�|ds8t|d�dkrN|j|�td|�n
td|�|S)NzObject %s copied to %sr�ZCopyObjectResultzObject '%s' deletedzHObject '%s' NOT deleted because of an unexepected response data content.)rrrr)rArrr�Z
response_copyr!r!r"�object_move�s

zS3.object_movecCs|jd|d�}|j|�}|S)Nru)rP)r�r�)rArPr�r�r!r!r"r��s
zS3.object_infocCsP|j�r|jd|ddid�}n|jd|j�ddid�}|j|�}t|d�}|S)Nrtr)rPr�rq)rLr�r�)rr�rLr�r)rArPr�r�rr!r!r"r�s
z
S3.get_aclcCs�d|jjkrddiSd|}td||f�tddidd	�}|j�r^|jd
|||ddid�}n|jd
|j�||ddid�}|j|�}|S)Nzobjects.dreamhost.comr�i�z%szset_acl(%s): acl-xml: %szcontent-typezapplication/xmlT)r8rsr)rPr:r?r�rp)rLr:r?r�)r;r~rrrr�rLr�)rArPrr?r:r�r�r!r!r"r�s
z
S3.set_aclcCs*|jd|j�ddid�}|j|�}|dS)Nrq�policy)rLr�r�)r�rLr�)rArPr�r�r!r!r"�
get_policy�s
z
S3.get_policycCs8tdd�}d|d<|jd|||ddid�}|j|�}|S)NT)r8zapplication/jsonzcontent-typerpr)rPr:r?r�)rr�r�)rArPrr:r�r�r!r!r"�
set_policy�s

z
S3.set_policycCs.|jd|ddid�}td|�|j|�}|S)Nrrr)rPr�zdelete_policy(%s))r�rr�)rArPr�r�r!r!r"�
delete_policy�s

zS3.delete_policycCs*|jd|j�ddid�}|j|�}|dS)Nrq�cors)rLr�r�)r�rLr�)rArPr�r�r!r!r"�get_cors�s
zS3.get_corscCsDtdd�}d|d<t|�|d<|jd|||ddid�}|j|�}|S)	NT)r8zapplication/xmlzcontent-typezcontent-md5rpr#)rPr:r?r�)rr�r�r�)rArPr#r:r�r�r!r!r"�set_cors�s

zS3.set_corscCs.|jd|ddid�}td|�|j|�}|S)Nrrr#)rPr�zdelete_cors(%s))r�rr�)rArPr�r�r!r!r"�delete_cors�s

zS3.delete_corscCsLtdd�}t|�|d<|jd|||ddid�}td||f�|j|�}|S)NT)r8zcontent-md5rpr�)rPr:r?r�z(set_lifecycle_policy(%s): policy-xml: %s)rr�r�rr�)rArPrr:r�r�r!r!r"�set_lifecycle_policy�s

zS3.set_lifecycle_policycCs\tdd�}d|d<d}|jjr(|d7}n|d7}|d7}|jd	||d
did�}|j|�}|S)NT)r8zapplication/xmlzcontent-typezN<RequestPaymentConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
z<Payer>Requester</Payer>
z<Payer>BucketOwner</Payer>
z</RequestPaymentConfiguration>
rpr�)rPr?r�)rr;r@r�r�)rArPr:r?r�r�r!r!r"�	set_payers



zS3.set_payercCsB|jd|j�ddid�}td|�|j|�}td|d�|S)Nrqr�)rLr�zget_lifecycle_policy(%s)z%s: Got Lifecycle Policyr�)r�rLrr�)rArPr�r�r!r!r"�get_lifecycle_policys
zS3.get_lifecycle_policycCs.|jd|ddid�}td|�|j|�}|S)Nrrr�)rPr�zdelete_lifecycle_policy(%s))r�rr�)rArPr�r�r!r!r"�delete_lifecycle_policys

zS3.delete_lifecycle_policycCs&|jd|j�ddid�}|j|�}|S)NrqZuploads)rLr�)r�rLr�)rArPr�r�r!r!r"�
get_multiparts
zS3.get_multipartcCs"|jd|d|id�}|j|�}|S)Nrv�uploadId)rPr�)r�r�)rArP�idr�r�r!r!r"�abort_multipart$s
zS3.abort_multipartcCs"|jd|d|id�}|j|�}|S)Nrtr,)rPr�)r�r�)rArPr-r�r�r!r!r"�list_multipart*s
zS3.list_multipartcCs2|jd|j�ddid�}|j|�}t|d�}|S)Nrq�logging)rLr�r�)r�rLr�r)rArPr�r��	accesslogr!r!r"�
get_accesslog0s

zS3.get_accesslogcCs^|j|�}td|j�|f�|jtd��|jtd��td|j�|f�|j||�dS)NzCurrent ACL(%s): %sZREAD_ACPZWRITEzUpdated ACL(%s): %s)rrrPZ
appendGranteerr)rArPrr!r!r"�set_accesslog_acl7s
zS3.set_accesslog_aclc
Cs�t�}|r |j|�|j|�n|j�d|}td||f�|jd|j�|ddid�}y|j|�}Wn\tk
r�}	z@|	j	ddkr�t	d�|j
td	|j���|j|�}n�WYdd}	~	XnX||fS)
Nz%sz$set_accesslog(%s): accesslog-xml: %srpr0)rLr?r��CodeZInvalidTargetBucketForLoggingz.Setting up log-delivery ACL for target bucket.zs3://%s)rZ
enableLoggingZsetAclPublicZdisableLoggingrr�rLr�r�rr3r)
rArP�enableZlog_target_prefix_urir�r1r?r�r�r�r!r!r"�
set_accesslog?s$
zS3.set_accesslogcCs�ddd�}|r|s|rtd��|r>|j�}|j�r:|j�p<d}|rZ||d<|rZd||d<tjjtj|tjd@�}	t||	||||�}
t	d|d�|
S)Nr�)rLrPz>Both 'uri' and either 'bucket' or 'object' parameters suppliedrLrPrizCreateRequest: resource[uri]=%s)
r�rLrrrc�http_methodsZgetkey�
operationsr7r)rAZ	operationrPrLrr:r?r�r<r=r�r!r!r"r�Ws
zS3.create_requestcCs|j|ddS)Nr
�)�_max_retries)rA�retriesr!r!r"�
_fail_waitmsz
S3._fail_waitc
Os0|djd�}d|krzt|d�dkrzt|dd�}t|dd�}|j||�td|�|rp|tj|<td|�|||�S|jd	k�r$|djd
�}	|	�r|	jd�r�|	dd�}	n|	jd
�r�|	dd�}	t	d
|	�j
}	|jd}|j||	�td|	�|�r|tj|<td|�|||�Std|�t
|��dS)Nr:zx-amz-bucket-regionr�rz	.//Bucketz.//EndpointzRedirected to: %szRedirected to region: %srFr�zhttp://�zhttps://rerLz�Redirection error: No info provided by the server to where should be forwarded the request (HEAD request). (Hint target region: %s))rRr3r�r�rr7rXr=rUrr[r<rr�)
rAr�r��fn�args�kwargsZredir_regionZredir_bucketr�Zlocation_urlr!r!r"�_http_redirection_handlerqs6











zS3._http_redirection_handlerc	Osd|kr�t|d�dkr�t|dd�}|dkrrt|dd�}|dk	rh|tj|jd<td|�|||�Std	�nj|d
kr�t|dd�}|dkr�td
�d|_|||�Sn2|dkr�|j	�r�|j
r�td�d|_
|||�Sn,|j	�o�|j
�r
td�d|_
|||�SdS)zR
        Returns None if no handler available for the specific error code
        r�rr4ZAuthorizationHeaderMalformedZRegionNrLzForwarding request to %szVCould not determine bucket the location. Please consider using the --region parameter.ZInvalidRequest�Messagez\The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.zEndpoint requires signature v4TZInvalidArgumentzFalling back to signature v2)r3r�r7rXr<rrrrMrOrN)	rAr�r�r>r?r@�failureCode�region�messager!r!r"�_http_400_handler�s2



zS3._http_400_handlercOszd|krnt|d�dkrnt|dd�}|dkrnt|dd�}|dkrn|j�rn|jrntd�d|_|||�St|��dS)	Nr�rr4ryrBz=AWS authentication requires a valid Date or x-amz-date headerzFalling back to signature v2T)r3r�rOrNrr�)rAr�r�r>r?r@rCrEr!r!r"�_http_403_handler�s
zS3._http_403_handlerc!Cs`|jjd�r�|j�r�tjj|jdt�j�dkr�td�yFtd|jd�}|j	|dd�}|dk	rt|tj|jd<td|�Wn,t
k
r�}ztd|�WYdd}~XnXt|j�|_|j
}|j�\}}}i}	td	�d}
y�tj|j|d��}
|j||
j�}td
|||t|j�pd�f�|
jj|||j|�|
jj�}|j|	d<|j|	d
<t|j��|	d<|j�|	d<d|	dk�r�t|	dd�}
|
|	d<tj|
�W�n$tt
fk
�r�}z�tdtj |	��t!|d��r�|j"�r�|j"t"j#t"j$t"j%fk�sdt&|�k�sdt&|�k�r&t'|t(��r&�|
�r>tj)|
_*tj|
�|�r�t+d|d|f�t+d|j,|��t-j.|j,|��|j/||d�St0d|d��WYdd}~Xn tdtj |	���YnXtdtj |	��|	dd)k�r�|j1||	|j/|�S|	ddk�r�|j2||	|j/|�}|�r&|St3|	�}|�r�|j4d*k�r�t+d|d|f�t+d|j,|��t-j.|j,|��|j/||d�S|�|	dd"k�r�|j5||	|j/|�S|	dd#k�r�t3|	��|	dd$k�r8t3|	�}|	dd%k�r�d&}|�r4t+d|d|f�t+d|j,|��t-j.|j,|��|j/||d�S|�|	dd'k�sT|	dd(k�r\t3|	��|	S)+NrLr�zE===== Send_request inner request to determine the bucket region =====zs3://T)r�zN===== END send_request inner request to determine the bucket region (%r) =====z#Error getlocation inner request: %sz"Processing request, please wait...zESending request method_string=%r, uri=%r, headers=%r, body=(%i bytes)rQr��reasonr:r�zx-amz-meta-s3cmd-attrszs3cmd-attrsz
Response:
�errnoz[Errno 104]z
[Errno 32]z Retrying failed request: %s (%s)rPzWaiting %d sec...r
zRequest failed for: %s�-�3i��	BadDigest�OperationAborted�TokenRefreshRequired�RequestTimeouti�i�i�i�r��i+)rJrK)rLrMrNrO)6r<rRrOr7rXrrYrrr��	Exceptionrr?r:r_rrSr�r�r3�cr��getresponser�rH�convertHeaderTupleListToDict�
getheaders�read�parse_attrs_header�putr��pprint�pformat�hasattrrI�EPIPE�
ECONNRESET�	ETIMEDOUTr1r0�SocketTimeoutException�conn_max_counter�counterrr<rH�sleepr�ZS3RequestErrorrArFr��coderG)rAr�r;�s3_urirDrr:r=r<r��connrP�
http_response�attrsr��
handler_fn�errr!r!r"r��s�

 



 
zS3.send_requestc
,:CsP	|jjd�r�|j�r�tjj|jdt�j�dkr�td�yFtd|jd�}
|j	|
dd�}|dk	rt|tj|jd<td|�Wn,t
k
r�}ztd|�WYdd}~XnX|	dkr�|jj}	|j
r�|	r�d	}	|j}
t|
d
�}}|j}|jj�r
d|d<|jj||�}ntd
|�tj�}|�r2t|||�}nt|||�}||_|	�r^|�sVd	}	nd|
d<|j�\}}}
yhtj|j|d��}|jj||j||j��x,|
j�D] }|jj t!|�t!|
|���q�W|jj"�Wn�t#k
�r�}z�WYdd}~Xn�t
k
�r�}z�|jj�r |j$d�|�rxt%d|d|f�t%d|j&|��tj'|j&|��|j(||||||d||�St)d|d��WYdd}~XnX|dk�r�|j*|�t+�}�y�d}|	�rt,j,|jj-gggt.�\}}}|�r�|jj/�}n$|�r|�rt%dt.�d|_
d	}	|	�s0|�r<|j0tj1k�r<|�rH|j2�tj3|j_4x�|dk�r(t5|jj6|�}|dk�rx|j2|�}n|}|jj7dk�r�tj�} |j8|�|jj9|�|jj�r�|j8t:|�d�|t:|�8}|}!|jj7dk�r
tj�| }"t;|�|jj7}#t<|#|"|!�}!|!�rJtj't5|!|jj=���qJW|j>�}$|jj/�}i}%|j0|%d<|j?|%d<t@|jA��|%d<|j2�|%d<||%d<tjB|�tdtCjD|%��W�n�t#k
�r�}z�WYdd}~X�nzt
k
�r8}�zZ|jj�r�|j$d�|�rd	}&tE|d ��r|jF�r|jFtFjGtFjHtFjIfk�s:d!tJ|�k�s:d"tJ|�k�r�tK|tL��r�yN|jj/�}i}%|j0|%d<|j?|%d<t@|jA��|%d<|j2�|%d<||%d<d}&WntMd#�YnX|&�s(t%d$|d|f�t%d|j&|��tj'|j&|��|j(||||||d|||	�	Sn td%||f�t)d|d��WYdd}~XnXtj�}'|'||%d&<|%d&�rnt;|%d�|%d&�ptt;dD�|%d'<|jj�r�|j8�|j$d(�|%ddEk�r�|jN||%|j(|||||||	d+�
S|%dd,k�r|jO||%|j(|||||||	d+�
}(|(�r�|(StP|%�})|)jQdFk�r|)�|%dd1k�rB|jR||%|j(|||||||	d+�
S|%dd2k�r||�r|d|_
|j(||||||d||d	d3�	Sd4|%dk�r�d|%dd4<|%dd5k�s�|%dd6k�r�d	}*|%dd7k�r�d}*|%dd8k�r|�r�|d9�p�d:}n&|%dd,k�rtP|%�})|)jQdGk�rd}*|*�r�|�r�t%d$|dtP|%�f�|�rHt%d;|�t%d|j&|��tj'|j&|��|j(||||||d|||	�	St%d<|�t)�tP|%��td=|$|%djd4d�jSd>�f�|%djd4d�jSd>�}+d?|+k�	rL|+|j>�k�	rL|%djd@�dAk�	rLt%dB�|�	r<t%dC|�|j(||||||d|||	�	St%d<|�t)�|%S)HNrLr�zB===== Send_file inner request to determine the bucket region =====zs3://T)r�zK===== END Send_file inner request to determine the bucket region (%r) =====z#Error getlocation inner request: %sFzcontent-length�upload�actionz!Sending file '%s', please wait...z100-continue�expect�failedz Retrying failed request: %s (%s)rPzWaiting %d sec...r
zUpload failed for: %srQzQHTTP Expect Continue feature disabled because of no reply of the server in %.2fs.r)�delta_positionr�rHr:r�r�z
Response:
rIz[Errno 104]z
[Errno 32]zXCannot retrieve any response status before encountering an EPIPE or ECONNRESET exceptionzUpload failed: %s (%s)zGiving up on '%s' %s�elapsed�speed�done�-�3)�offset�
chunk_size�use_expect_continuei�rLrMrNrOi�i�)rvr�rPi+i�i�rzg{�G�z�?z(Retrying on lower speed (throttle=%0.2f)z$Too many failures. Giving up on '%s'z"MD5 sums: computed=%s, received=%sz"'r�zx-amz-server-side-encryptionzaws:kmszMD5 Sums don't match!zRetrying upload of %sr�)rrrs)rLrMrNrO)rLrMrNrO)Tr<rRrOr7rXrrYrrr�rQr;Zuse_http_expectr{r:r�r��progress_meter�progress_classrrHrrr?r_rrSrR�
putrequestr�r��keys�	putheaderr�
endheadersr�rqrr<rbr��
S3UploadError�seekr�select�sock�EXPECT_CONTINUE_TIMEOUTrSr�ZCONTINUErVZ_CS_REQ_SENTZ_HTTPConnection__state�minr��	limitrater�Zwrapper_send_bodyr3�float�maxZthrottle_max�	hexdigestrHrTrUrXrYrZr[rIr\r]r^r1r0r_r	rArFr�rcrGr�),rAr�r�r��bufferZthrottler;rtrurvrdrDrr:�	size_left�
size_totalr��progress�timestamp_startZsha256_hashr=r<re�headerr��md5_hashrf�readable�writableZexceptional�lr��
start_timeZlimitrate_throttle�
real_duration�expected_durationZmd5_computedr�Zknown_error�
timestamp_endrhriZ	try_retry�md5_from_s3r!r!r"r�Asx



 

"















",

",zS3.send_filec
Cs�tj�}t||||�}|j|�|j�}tj�}	|	||d<||d<|dr`t|d�|dpftd�|d<|dr�t|d�dkr�tt|dd���|S)	Nror�r
rpr�rrBr�)rHrZupload_all_partsZcomplete_multipart_uploadr�rr}r�)
rAr�r:rPr�r�r�rjr�r�r!r!r"r�@s
(zS3.send_file_multipartc!FCs�|jjd�r�|j�r�tjj|jdt�j�dkr�td�yFtd|jd�}|j	|dd�}|dk	rt|tj|jd<td|�Wn,t
k
r�}ztd|�WYdd}~XnX|j�\}	}
}|j}|j
jr�d	|d
<|j
j|d�}
ntd|�tj�}d}y�tj|j|
d��}|jj|	|j|
|j��x,|j�D] }|jjt|�t||���q2W|dk�r~td
|�|jjdd|�|jj�i}|jj�}|j|d<|j|d<t|j ��|d<d|dk�r�t!|dd�}||d<tdt"j#|��W�nZt$k
�r}z�WYdd}~X�n4t%k
�rD}z�WYdd}~X�nt&t
fk
�rP}z�|j
j�rn|
j'd�t(|d��r�|j)�r�|j)t)j*t)j+t)j,fk�s�dt-|�k�s�dt-|�k�r�t.|t/��rƂ|�r�tj0|_1tj2|�|�r0t3d|
d|f�t3d|j4|��tj5|j4|��|j6|||||d�St7d|
d��WYdd}~XnX|dd<k�r�|j8�|d!<|j9|||j6||||�S|dd"k�r�|j8�|d!<|j:|||j6||||�}|�r�|St;|��|dd#k�r�|j8�|d!<|j<|||j6||||�S|dd$k�r|j8�|d!<t;|��|dd%k�s8|dd&k�rL|j8�|d!<t;|��|dk�r\t=�}t>|dd'�}||}|}|j
j�r�||
_?||
_@||
_A�y|dk�r�|j8d�}x�||k�r�||j
jBk�r�|j
jB�p�|}|j
jCdk�r�tj�}|j8|�}tD|�dk�r
tEd(��|j
jCdk�rLtj�|}tF|�|j
jC}||k�rLtj5||�|jG|�|dk�rj|jH|�|tD|�7}|j
j�r�|
jHtD|�d)��q�Wtj2|�W�n t%k
�r��Y�nt&t
fk
�r�}z�|j
j�r�|
j'd�t(|d��r|j)�r|j)t)j*t)j+t)j,fk�s0dt-|�k�s0dt-|�k�r@t.|t/��r@�tj0|_1tj2|�|�r�t3d|
d|f�t3d|j4|��tj5|j4|��|j6|||||d�St7d|
d��WYdd}~XnX|jI�tj�}|j
j�r�|
jH�|
j'd*�|djd+d,�jJd-�} d.|dk�r>y|dd/} WntKk
�r<YnXd0| k�r�|dk�r`|jL�|d/<n\ytM|�|d/<WnJt&k
�r�}z,|j)t)jNk�r�t3d1||f�t3d2�WYdd}~XnX|jd/�| k|d3<|||d4<||d5<|d4�rtF|d5�|d4�ptFd=�|d6<|d5|t>|dd'�k�rPt3d7|t>|dd'�|d5f�td8|jd/��d0| k�r�|d3�r�|djd9�d:k�r�t3d;|jd/�| f�|S)>NrLr�zB===== Recv_file inner request to determine the bucket region =====zs3://T)r�zK===== END recv_file Inner request to determine the bucket region (%r) =====z#Error getlocation inner request: %sZdownloadrkrz#Receiving file '%s', please wait...zRequesting Range: %d .. endZRangez	bytes=%d-r�rHr:zx-amz-meta-s3cmd-attrszs3cmd-attrsz
Response:
rmrIz[Errno 104]z
[Errno 32]z Retrying failed request: %s (%s)rPzWaiting %d sec...r
zDownload failed for: %s�-�3r�i�i�i�rPi+zcontent-lengthzEOF from S3!)rnrqr�rQz"'zx-amz-meta-s3tools-gpgencrr�zUnable to open file: %s: %sz(Unable to verify MD5. Assume it matches.Zmd5matchror�rpz4Reported size (%s) does not match received size (%s)zReceiveFile: Computed MD5 = %szx-amz-server-side-encryptionzaws:kmsz5MD5 signatures do not match: computed=%s, received=%s)r�r�r�)Or<rRrOr7rXrrYrrr�rQr_r�r;rwrxrrHrrSrRryr�r�rzr{rr|rSr�rHrTrUrWrYrZr�r�r�rqr[rIr\r]r^r1r0r_r`rarXrr<rbr�ZS3DownloadErrorrVrArFr�rGrr�Z
total_sizeZinitial_position�current_positionZ
recv_chunkr�r3r�r��writer��flushr��KeyErrorr�Z
hash_file_md5�ENOENT)!rAr�r�r�r�r;rdrDrr=r<r:r�r�r�rer�r�rfrgr�rhr�r�r�r�r�Z
this_chunkr�r�r�r�r�r!r!r"r�PsH

 







"













"



, *zS3.recv_file)Nr�)NNNr�r�)NNNr�r�)NNNr�)N)F)N)N)N)N)N)N)NrQ)rrQ)N)N)N)NF)NNNNrQNr�)rQ)Gr`rarbrr7Ztargetsr8Zcodesr:rBr|rSr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrr�rrr r!r"r$r%r&r'r(r)r*r+r.r/r2r3r6r�r<rArFrGr�r�r�r�r!r!r!r"rc�s�




-


!	






W

6
=



	

%*s~
rccCs2i}x(|jd�D]}|jd�\}}|||<qW|S)Nr��:)r2)Zattrs_headerrg�attrr�valr!r!r"rW(s
rWcCsBtt|��}tj|j��}t|�}|ddkr:|dd�}t|�S)Nr
�
rr�r�)rr�base64Zencodestring�digestZdecode_from_s3)r?�mZ	base64md5r!r!r"r�/sr�)JZ
__future__rrr�r�rHrIr�r+r�rYZxml.saxr�socketrr_r0rrrr	r�r
r�ImportErrorZurllib.parser�hashlibrZUtilsrrrrrrZ
ExceptionsZ	MultiPartrrrZCryptorrrrrrZctypesrr(ZMagicrr#�	TypeErrorr�Z
MAGIC_MIME�load�AttributeErrorr�r�r1Z	error_strr*r)r5r��__all__rr7rc�appendrWr�r!r!r!r"�<module>	s� 
Q_