Skip to content
This repository has been archived by the owner on Nov 4, 2018. It is now read-only.

Commit

Permalink
* S3/ACL.py: New object for handling ACL issues.
Browse files Browse the repository at this point in the history
* S3/S3.py: Moved most of S3.get_acl() to ACL class.



git-svn-id: https://s3tools.svn.sourceforge.net/svnroot/s3tools/s3cmd/trunk@327 830e0280-6d2a-0410-9c65-932aecc39d9d
  • Loading branch information
mludvig committed Jan 6, 2009
1 parent cb64ca9 commit 7f50f84
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 12 deletions.
2 changes: 2 additions & 0 deletions ChangeLog
@@ -1,5 +1,7 @@
2009-01-07 Michal Ludvig <michal@logix.cz>

* S3/ACL.py: New object for handling ACL issues.
* S3/S3.py: Moved most of S3.get_acl() to ACL class.
* S3/Utils.py: Reworked XML helpers - remove XMLNS before
parsing the input XML to avoid having all Tags prefixed
with {XMLNS} by ElementTree.
Expand Down
74 changes: 74 additions & 0 deletions S3/ACL.py
@@ -0,0 +1,74 @@
## Amazon S3 - Access Control List representation
## Author: Michal Ludvig <michal@logix.cz>
## http://www.logix.cz/michal
## License: GPL Version 2

from Utils import *

try:
import xml.etree.ElementTree as ET
except ImportError:
import elementtree.ElementTree as ET

class ACL(object):
EMPTY_ACL = """
<AccessControlPolicy>
<AccessControlList>
</AccessControlList>
</AccessControlPolicy>
"""
GRANT_PUBLIC_READ = """
<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>
"""
def __init__(self, xml = None):
if not xml:
xml = ACL.EMPTY_ACL
self.tree = getTreeFromXml(xml)

def getGrants(self):
acl = {}
for grant in self.tree.findall(".//Grant"):
grantee = grant.find(".//Grantee")
grantee = dict([(tag.tag, tag.text) for tag in grant.find(".//Grantee")])
if grantee.has_key('DisplayName'):
user = grantee['DisplayName']
elif grantee.has_key('URI'):
user = grantee['URI']
if user == 'http://acs.amazonaws.com/groups/global/AllUsers':
user = "*anon*"
else:
user = grantee[grantee.keys()[0]]
acl[user] = grant.find('Permission').text
return acl

if __name__ == "__main__":
xml = """<?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>
"""
acl = ACL(xml)
print acl.getGrants()
16 changes: 4 additions & 12 deletions S3/S3.py
Expand Up @@ -25,6 +25,7 @@
from BidirMap import BidirMap
from Config import Config
from Exceptions import *
from ACL import ACL

class S3(object):
http_methods = BidirMap(
Expand Down Expand Up @@ -250,19 +251,10 @@ def get_acl(self, uri):
request = self.create_request("OBJECT_GET", uri = uri, extra = "?acl")
else:
request = self.create_request("BUCKET_LIST", bucket = uri.bucket(), extra = "?acl")
acl = {}

response = self.send_request(request)
grants = getListFromXml(response['data'], "Grant")
for grant in grants:
if grant['Grantee'][0].has_key('DisplayName'):
user = grant['Grantee'][0]['DisplayName']
if grant['Grantee'][0].has_key('URI'):
user = grant['Grantee'][0]['URI']
if user == 'http://acs.amazonaws.com/groups/global/AllUsers':
user = "*anon*"
perm = grant['Permission']
acl[user] = perm
return acl
acl = ACL(response['data'])
return acl.getGrants()

## Low level methods
def urlencode_string(self, string):
Expand Down

0 comments on commit 7f50f84

Please sign in to comment.