S3/ACL.py
7f50f846
 ## 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()