U
    d/e>                     @   s$  d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ dd	lmZ dd
lmZmZmZmZ dZdZdZdZdZdZdZdZdZdZG dd deZG dd dZG dd dZ G dd dZ!G dd dZ"dd  Z#G d!d" d"Z$G d#d$ d$e$Z%G d%d& d&e$Z&G d'd( d(Z'dS ))z1Common request/response configuration of S3 APIs.    )absolute_importN)ABCMeta   )MinioException)quote)SseCustomerKey)to_http_header)
SubElementfindfindallfindtextCOPYREPLACEZDisabledZEnabled
GOVERNANCE
COMPLIANCE      
   2   c                       sZ   e Zd ZdZd fdd	Z fddZedd Zed	d
 Zedd Z	dd Z
  ZS )Tagsz$dict extended to bucket/object tags.Fc                    s   || _ t   d S N)_for_objectsuper__init__)selfZ
for_object	__class__ 6/tmp/pip-unpacked-wheel-xery97c7/minio/commonconfig.pyr   .   s    zTags.__init__c                    s   | j r
tnt}t| |kr>| j r$dnd}td| d| d|rVt|tksVd|krftd| d|d kst|tksd|krtd	| dt || d S )
NobjectZbucketzonly  z tags are allowed&zinvalid tag key ''zinvalid tag value ')	r   _MAX_OBJECT_TAG_COUNT_MAX_TAG_COUNTlen
ValueError_MAX_KEY_LENGTH_MAX_VALUE_LENGTHr   __setitem__)r   keyvaluelimitZtag_typer   r   r   r)   2   s    zTags.__setitem__c                 C   s   |  S )zCreate new bucket tags.r   clsr   r   r   new_bucket_tags=   s    zTags.new_bucket_tagsc                 C   s   | dS )zCreate new object tags.Tr   r-   r   r   r   new_object_tagsB   s    zTags.new_object_tagsc                 C   s>   t |d}|  }|D ]$}t|dd}t|dd}|||< q|S /Create new object with values from XML element.TagKeyTValue)r   r   )r.   elementelementsobjtagr*   r+   r   r   r   fromxmlG   s    

zTags.fromxmlc                 C   s8   |   D ]*\}}t|d}t|d| t|d| q|S Convert to XML.r3   r4   r5   )itemsr	   )r   r6   r*   r+   r9   r   r   r   toxmlR   s
    
z
Tags.toxml)F)__name__
__module____qualname____doc__r   r)   classmethodr/   r0   r:   r>   __classcell__r   r   r   r   r   +   s   



r   c                   @   sD   e Zd ZdZdd Zedd Zedd Zedd	 Z	d
d Z
dS )r3   zTag.c                 C   s,   |st d|d krt d|| _|| _d S )Nzkey must be providedzvalue must be provided)r&   _key_value)r   r*   r+   r   r   r   r   ^   s    zTag.__init__c                 C   s   | j S )zGet key.)rE   r   r   r   r   r*   f   s    zTag.keyc                 C   s   | j S )z
Get value.)rF   rG   r   r   r   r+   k   s    z	Tag.valuec                 C   s,   t |d}t|dd}t|dd}| ||S r1   )r
   r   )r.   r6   r*   r+   r   r   r   r:   p   s    
zTag.fromxmlc                 C   s*   t |d}t |d| j t |d| j |S r;   )r	   rE   rF   r   r6   r   r   r   r>   x   s    
z	Tag.toxmlN)r?   r@   rA   rB   r   propertyr*   r+   rC   r:   r>   r   r   r   r   r3   [   s   


r3   c                   @   sF   e Zd ZdZdddZedd Zedd Zed	d
 Z	dd Z
dS )AndOperatorzAND operator.Nc                 C   s$   |d kr|st d|| _|| _d S )Nz(at least prefix or tags must be provided)r&   _prefix_tags)r   prefixtagsr   r   r   r      s    zAndOperator.__init__c                 C   s   | j S zGet prefix.rK   rG   r   r   r   rM      s    zAndOperator.prefixc                 C   s   | j S )z	Get tags.)rL   rG   r   r   r   rN      s    zAndOperator.tagsc                 C   s:   t |d}t|d}t |ddkr&dnt|}| ||S )r2   AndPrefixr3   N)r
   r   r   r:   )r.   r6   rM   rN   r   r   r   r:      s    

zAndOperator.fromxmlc                 C   s<   t |d}| jdk	r"t |d| j | jdk	r8| j| |S )r<   rQ   NrR   )r	   rK   rL   r>   rH   r   r   r   r>      s    


zAndOperator.toxml)NN)r?   r@   rA   rB   r   rI   rM   rN   rC   r:   r>   r   r   r   r   rJ      s   




rJ   c                   @   sR   e Zd ZdZdddZedd Zedd Zed	d
 Ze	dd Z
dd ZdS )FilterzLifecycle rule filter.Nc                 C   s:   |d k	|d k	A |d k	A }|s$t d|| _|| _|| _d S )Nz/only one of and, prefix or tag must be provided)r&   _and_operatorrK   _tag)r   and_operatorrM   r9   Zvalidr   r   r   r      s    zFilter.__init__c                 C   s   | j S )zGet AND operator.)rT   rG   r   r   r   rV      s    zFilter.and_operatorc                 C   s   | j S rO   rP   rG   r   r   r   rM      s    zFilter.prefixc                 C   s   | j S )zGet tag.)rU   rG   r   r   r   r9      s    z
Filter.tagc                 C   sX   t |d}t |ddkrdnt|}t|d}t |ddkrBdnt|}| |||S )r2   rS   rQ   NrR   r3   )r
   rJ   r:   r   r3   )r.   r6   rV   rM   r9   r   r   r   r:      s    

zFilter.fromxmlc                 C   sN   t |d}| jr| j| | jdk	r4t |d| j | jdk	rJ| j| |S )r<   rS   NrR   )r	   rT   r>   rK   rU   rH   r   r   r   r>      s    


zFilter.toxml)NNN)r?   r@   rA   rB   r   rI   rV   rM   r9   rC   r:   r>   r   r   r   r   rS      s   




rS   c                   @   sJ   e Zd ZdZeZdddZedd Zedd Z	e
d	d
 Zdd ZdS )BaseRulez.Base rule class for Replication and Lifecycle.Nc                 C   s@   |d k	r0|  }|stdt|dkr0td|| _|| _d S )Nz rule ID must be non-empty string   z&rule ID must not exceed 255 characters)stripr&   r%   _rule_filter_rule_id)r   rule_filterrule_idr   r   r   r      s    zBaseRule.__init__c                 C   s   | j S )zGet replication rule filter.)rZ   rG   r   r   r   r\      s    zBaseRule.rule_filterc                 C   s   | j S )zGet rule ID.)r[   rG   r   r   r   r]      s    zBaseRule.rule_idc                 C   s&   t | ddkrdnt| t| dfS )z#Parse XML and return filter and ID.rS   NID)r
   rS   r:   r   )r6   r   r   r   parsexml   s    zBaseRule.parsexmlc                 C   s.   | j r| j | | jdk	r*t|d| j |S )r<   Nr^   )rZ   r>   r[   r	   rH   r   r   r   r>      s
    
zBaseRule.toxml)NN)r?   r@   rA   rB   r   __metaclass__r   rI   r\   r]   staticmethodr_   r>   r   r   r   r   rW      s   




rW   c                 C   s   | t tfkrtddS )zValidate status.z&status must be 'Enabled' or 'Disabled'N)ENABLEDDISABLEDr&   )statusr   r   r   check_status  s    re   c                	   @   s   e Zd ZdZeZdddZedd Zedd Z	ed	d
 Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zdd ZdS )ObjectConditionalReadArgszBBase argument class holds condition properties for reading object.Nc                 C   s   |d k	rt |tstd|d k	r2|dk r2td|d k	rJ|dkrJtd|d k	rb|dkrbtd|	d k	rz|	dkrztd|
d k	rt |
tjstd|d k	rt |tjstd	|| _|| _|| _|| _|| _|| _	|| _
|| _|	| _|
| _|| _d S )
Nz ssec must be SseCustomerKey typer   z offset should be zero or greaterz"length should be greater than zero zmatch_etag must not be emptyz not_match_etag must not be emptyz-modified_since must be datetime.datetime typez/unmodified_since must be datetime.datetime type)
isinstancer   r&   datetime_bucket_name_object_name_region_version_id_ssec_offset_length_match_etag_not_match_etag_modified_since_unmodified_sincer   bucket_nameobject_nameregion
version_idssecoffsetlength
match_etagnot_match_etagmodified_sinceunmodified_sincer   r   r   r     s>    

z"ObjectConditionalReadArgs.__init__c                 C   s   | j S )zGet bucket name.)rj   rG   r   r   r   rv   6  s    z%ObjectConditionalReadArgs.bucket_namec                 C   s   | j S zGet object name.rk   rG   r   r   r   rw   ;  s    z%ObjectConditionalReadArgs.object_namec                 C   s   | j S )zGet region.)rl   rG   r   r   r   rx   @  s    z ObjectConditionalReadArgs.regionc                 C   s   | j S )zGet version ID.)rm   rG   r   r   r   ry   E  s    z$ObjectConditionalReadArgs.version_idc                 C   s   | j S )z
Get SSE-C.)rn   rG   r   r   r   rz   J  s    zObjectConditionalReadArgs.ssecc                 C   s   | j S )zGet offset.)ro   rG   r   r   r   r{   O  s    z ObjectConditionalReadArgs.offsetc                 C   s   | j S zGet length.rp   rG   r   r   r   r|   T  s    z ObjectConditionalReadArgs.lengthc                 C   s   | j S )zGet match ETag condition.)rq   rG   r   r   r   r}   Y  s    z$ObjectConditionalReadArgs.match_etagc                 C   s   | j S )zGet not-match ETag condition.)rr   rG   r   r   r   r~   ^  s    z(ObjectConditionalReadArgs.not_match_etagc                 C   s   | j S )zGet modified since condition.)rs   rG   r   r   r   r   c  s    z(ObjectConditionalReadArgs.modified_sincec                 C   s   | j S )zGet unmodified since condition.)rt   rG   r   r   r   r   h  s    z*ObjectConditionalReadArgs.unmodified_sincec                 C   s   t d| j d | j }| jr0|dt | j 7 }d|i}| jrN|| j  | jr^| j|d< | jrn| j|d< | j	rt
| j	|d< | jrt
| j|d< |S )zGenerate copy source headers./?versionId=zx-amz-copy-sourcex-amz-copy-source-if-matchzx-amz-copy-source-if-none-matchz#x-amz-copy-source-if-modified-sincez%x-amz-copy-source-if-unmodified-since)r   rj   rk   rm   rn   updateZcopy_headersrq   rr   rs   r   rt   )r   Zcopy_sourceheadersr   r   r   gen_copy_headersm  s"    

z*ObjectConditionalReadArgs.gen_copy_headers)	NNNNNNNNN)r?   r@   rA   rB   r   r`   r   rI   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   rf     sD               
%










rf   c                   @   s   e Zd ZdZedd ZdS )
CopySourcez2A source object definition for copy_object method.c                 C   s2   | |j |j|j|j|j|j|j|j|j|j	|j
S )z&Create CopySource from another source.rv   rw   rx   ry   rz   r{   r|   r}   r~   r   r   r.   srcr   r   r   of  s            zCopySource.ofN)r?   r@   rA   rB   rC   r   r   r   r   r   r     s   r   c                	       sV   e Zd ZdZd fdd	Zdd Zdd Zed	d
 Zedd Z	e
dd Z  ZS )ComposeSourcez5A source object definition for compose_object method.Nc                    s0   t  |||||||||	|
| d | _d | _d S r   )r   r   _object_size_headersru   r   r   r   r     s             zComposeSource.__init__c                    sz    fdd}j dk	r.j  kr.|dj jdk	rvj krN|djj pVd}|j  krv|d|j dS )z,Validate object size with offset and length.c                    sB   j rdj  nd}tdj dj | d|  d| d  S )Nr   rg   zSource r   z: r    z is beyond object size )rm   r&   rj   rk   )namer+   verobject_sizer   r   r   
make_error  s    (z0ComposeSource._validate_size.<locals>.make_errorNr{   r|   r   zcompose size)ro   rp   r|   )r   r   r   r{   r   r   r   _validate_size  s    


zComposeSource._validate_sizec                 C   s0   |  | || _|  }| jp ||d< || _dS )zBuild headers.r   N)r   r   r   rq   r   )r   r   etagr   r   r   r   build_headers  s
    
zComposeSource.build_headersc                 C   s   | j dkrtd| j S )zGet object size.N>build_headers() must be called prior to this method invocation)r   r   rG   r   r   r   r     s
    
zComposeSource.object_sizec                 C   s   | j dkrtd| j  S )zGet headers.Nr   )r   r   copyrG   r   r   r   r     s
    
zComposeSource.headersc                 C   s2   | |j |j|j|j|j|j|j|j|j|j	|j
S )z)Create ComposeSource from another source.r   r   r   r   r   r     s            zComposeSource.of)	NNNNNNNNN)r?   r@   rA   rB   r   r   r   rI   r   r   rC   r   rD   r   r   r   r   r     s$               
	
	r   c                   @   sV   e Zd ZdZdddZedd Zedd Zed	d
 Zedd Z	edd Z
dS )SnowballObjectz>A source object definition for upload_snowball_objects method.Nc                 C   sX   || _ |d k	|d k	A r*|| _|| _|| _ntd|d k	rNt|tjsNtd|| _d S )Nz-only one of filename or data must be providedz'mod_time must be datetime.datetime type)rk   	_filename_datarp   r&   rh   ri   	_mod_time)r   rw   filenamedatar|   mod_timer   r   r   r     s    
zSnowballObject.__init__c                 C   s   | j S r   r   rG   r   r   r   rw     s    zSnowballObject.object_namec                 C   s   | j S )zGet filename.)r   rG   r   r   r   r     s    zSnowballObject.filenamec                 C   s   | j S )z	Get data.)r   rG   r   r   r   r     s    zSnowballObject.datac                 C   s   | j S r   r   rG   r   r   r   r|     s    zSnowballObject.lengthc                 C   s   | j S )zGet modification time.)r   rG   r   r   r   r     s    zSnowballObject.mod_time)NNNN)r?   r@   rA   rB   r   rI   rw   r   r   r|   r   r   r   r   r   r     s     




r   )(rB   
__future__r   ri   abcr   errorr   Zhelpersr   Zsser   timer   xmlr	   r
   r   r   r   r   rc   rb   r   r   r'   r(   r#   r$   dictr   r3   rJ   rS   rW   re   rf   r   r   r   r   r   r   r   <module>   s8   0%(6)xF