3
b                  @   s  d dl mZmZ d dlZddlmZmZmZ ddlm	Z	 yd dl
jjZW n ek
rf   d dljZY nX ejdk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edkr
dZeeZedej  ej  edej  ej  edej  ee dS )    )absolute_importprint_functionN   )getTreeFromXmlencode_to_s3decode_from_s3)deunicodise   c               @   sD   e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )Granteez/http://acs.amazonaws.com/groups/global/AllUsersz.http://acs.amazonaws.com/groups/s3/LogDeliveryc             C   s"   d | _ d | _d | _d| _d | _d S )N )xsi_typetagnamedisplay_name
permission)self r   F/oak/stanford/groups/akundaje/marinovg/programs/s3cmd-master/S3/ACL.py__init__   s
    zGrantee.__init__c             C   s   t d| j| j| jd S )Nz0Grantee("%(tag)s", "%(name)s", "%(permission)s"))r   r   r   )reprr   r   r   )r   r   r   r   __repr__!   s    zGrantee.__repr__c             C   s   | j dko| jtjkS )NURI)r   r   r
   ALL_USERS_URI)r   r   r   r   
isAllUsers(   s    zGrantee.isAllUsersc             C   s   | j  o| jdkp| jdkS )NREADFULL_CONTROL)r   r   )r   r   r   r   
isAnonRead+   s    zGrantee.isAnonReadc             C   s   | j  o| jdkp| jdkS )NWRITEr   )r   r   )r   r   r   r   isAnonWrite.   s    zGrantee.isAnonWritec             C   sN   t jd}t j|dd| jd}t j|| j}| j|_t j|d}| j|_|S )NZGrantr
   z)http://www.w3.org/2001/XMLSchema-instance)z	xmlns:xsizxsi:type
Permission)ETElement
SubElementr   r   r   textr   )r   elgranteer   r   r   r   r   
getElement1   s    
zGrantee.getElementN)__name__
__module____qualname__r   LOG_DELIVERY_URIr   r   r   r   r   r&   r   r   r   r   r
      s   r
   c               @   s   e Zd Zdd ZdS )GranteeAnonReadc             C   s(   t j|  d| _d| _t j| _d| _d S )NGroupr   r   )r
   r   r   r   r   r   r   )r   r   r   r   r   >   s
    
zGranteeAnonRead.__init__N)r'   r(   r)   r   r   r   r   r   r+   =   s   r+   c               @   s   e Zd Zdd ZdS )GranteeLogDeliveryc             C   s(   t j|  d| _d| _t j| _|| _dS )z=
        permission must be either READ_ACP or WRITE
        r,   r   N)r
   r   r   r   r*   r   r   )r   r   r   r   r   r   F   s
    
zGranteeLogDelivery.__init__N)r'   r(   r)   r   r   r   r   r   r-   E   s   r-   c               @   s   e Zd ZdZd%ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdS )&ACLsj   <AccessControlPolicy><Owner><ID></ID></Owner><AccessControlList></AccessControlList></AccessControlPolicy>Nc             C   s@   |s
t j}g | _d| _d| _tt|}| j| | j| d S )Nr   )	r.   	EMPTY_ACLgranteesowner_id
owner_nickr   r   
parseOwnerparseGrants)r   xmltreer   r   r   r   S   s    
zACL.__init__c             C   s   |j d| _|j d| _d S )Nz.//Owner//IDz.//Owner//DisplayName)findtextr1   r2   )r   r6   r   r   r   r3   _   s    zACL.parseOwnerc             C   s   xz|j dD ]l}t }|jd}|jd |_|jdj|_x0|D ](}|jdkrX|j|_q@|j|_|j|_	q@W | j
j| qW d S )Nz.//Grantz
.//Granteez/{http://www.w3.org/2001/XMLSchema-instance}typer   ZDisplayName)findallr
   findattribr   r#   r   r   r   r   r0   append)r   r6   grantr%   gr$   r   r   r   r4   c   s    



zACL.parseGrantsc             C   sL   g }xB| j D ]8}|jr|j}n|j r,d}n|j}|j||jd qW |S )Nz*anon*)r%   r   )r0   r   r   r   r;   r   )r   aclr%   userr   r   r   getGrantListq   s    zACL.getGrantListc             C   s   | j | jdS )N)idZnick)r1   r2   )r   r   r   r   getOwner}   s    zACL.getOwnerc             C   s    x| j D ]}|j rdS qW dS )NTF)r0   r   )r   r%   r   r   r   r      s    zACL.isAnonReadc             C   s    x| j D ]}|j rdS qW dS )NTF)r0   r   )r   r%   r   r   r   r      s    zACL.isAnonWritec             C   s   | j  s| jt  d S )N)r   appendGranteer+   )r   r   r   r   grantAnonRead   s    zACL.grantAnonReadc             C   s   dd | j D | _ d S )Nc             S   s   g | ]}|j  s|qS r   )r   ).0r=   r   r   r   
<listcomp>   s    z&ACL.revokeAnonRead.<locals>.<listcomp>)r0   )r   r   r   r   revokeAnonRead   s    zACL.revokeAnonReadc             C   s   dd | j D | _ d S )Nc             S   s   g | ]}|j  s|qS r   )r   )rE   r=   r   r   r   rF      s    z'ACL.revokeAnonWrite.<locals>.<listcomp>)r0   )r   r   r   r   revokeAnonWrite   s    zACL.revokeAnonWritec             C   s   | j j| d S )N)r0   r;   )r   r%   r   r   r   rC      s    zACL.appendGranteec             C   sR   |j  }|j }x<| jD ]2}|jj  |kr|jdkr8dS |jj |krdS qW dS )Nr   TF)lowerupperr0   r   r   )r   r   r   r%   r   r   r   hasGrant   s    
zACL.hasGrantc             C   s   | j ||rd S |j }d|kr$d}d|kr8| j|d t }||_||_d|krl|jj |_d|_d|_n.d|krd|_d|_n|jj |_d	|_d
|_| j	| d S )NALLr   @ZAmazonCustomerByEmailZEmailAddressz http://acs.amazonaws.com/groups/r,   r   ZCanonicalUserZID)
rK   rJ   revoker
   r   r   rI   r   r   rC   )r   r   r   r%   r   r   r   r<      s*    z	ACL.grantc                sL    j   j dkr0 fdd| jD | _n fdd| jD | _d S )NrL   c                s6   g | ].}|j j  kp,|jd k	o,|jj  ks|qS )N)r   rI   r   )rE   r=   )r   r   r   rF      s    zACL.revoke.<locals>.<listcomp>c                sD   g | ]<}|j d k	r |j j  ks.|jj  ko:|jj ks|qS )N)r   rI   r   r   rJ   )rE   r=   )r   r   r   r   rF      s    ()rI   rJ   r0   )r   r   r   r   )r   r   r   rN      s
    z
ACL.revokec             C   sR   t tj}d|jd< |jd}| j|_|jd}x| jD ]}|j|j	  q8W |S )Nz'http://s3.amazonaws.com/doc/2006-03-01/xmlnsz.//Owner//IDz.//AccessControlList)
r   r.   r/   r:   r9   r1   r#   r0   r;   r&   )r   r6   ownerr>   r%   r   r   r   get_printable_tree   s    



zACL.get_printable_treec             C   s   t tj| j S )N)r   r    tostringrQ   )r   r   r   r   __unicode__   s    zACL.__unicode__c             C   s(   t rtj| j ddS tj| j S d S )Nunicode)encoding)PY3r    rR   rQ   )r   r   r   r   __str__   s    zACL.__str__)N)r'   r(   r)   r/   r   r3   r4   r@   rB   r   r   rD   rG   rH   rC   rK   r<   rN   rQ   rS   rW   r   r   r   r   r.   P   s$   


r.   __main__s  <?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
    <ID>12345678901234567890</ID>
    <DisplayName>owner-nickname</DisplayName>
</Owner>
<AccessControlList>
    <Grant>
        <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
            <ID>12345678901234567890</ID>
            <DisplayName>owner-nickname</DisplayName>
        </Grantee>
        <Permission>FULL_CONTROL</Permission>
    </Grant>
    <Grant>
        <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
            <URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
        </Grantee>
        <Permission>READ</Permission>
    </Grant>
</AccessControlList>
</AccessControlPolicy>
    zGrants:)r	   r   )
__future__r   r   sys	BaseUtilsr   r   r   Utilsr   xml.etree.ElementTreeetreeElementTreer    ImportErrorelementtree.ElementTreeversion_inforV   objectr
   r+   r-   r.   r'   r5   r>   printr@   rG   rD   r   r   r   r   <module>	   s,   
' 
