From ff79cfce0fed38375b8ff459c66648ec014bf4c6 Mon Sep 17 00:00:00 2001 From: Guillaume Horel Date: Fri, 20 May 2011 01:28:09 -0400 Subject: Rewrote the objects storage engine objects are stored under each user's directory to make zaran happy. --- server/object.py | 61 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 33 insertions(+), 28 deletions(-) (limited to 'server/object.py') diff --git a/server/object.py b/server/object.py index d3bdf87..4c1e0c1 100644 --- a/server/object.py +++ b/server/object.py @@ -15,16 +15,20 @@ class ObjectError(Exception): pass; class Object: - def __init__(self, hash): - self.hash = hash - self.object_path = os.path.join(config.root, hash[:2], hash[2:]) + def __init__(self, name, owner, split_name = True): + self.hash = name + self.owner = owner + if split_name: + self.object_path = os.path.join(config.root, owner, name[:2], name[2:]) + else: + self.object_path = os.path.join(config.root, owner, name) def exists(self): return os.path.exists(self.object_path) class ObjectReader(Object): - def __init__(self, hash): - Object.__init__(self, hash) + def __init__(self, hash, owner, split_name = True): + Object.__init__(self, hash, owner, split_name) if not self.exists(): logger.error("Object {} can't be found for user {}".format(self.hash, self.owner)) @@ -66,7 +70,7 @@ class ObjectReader(Object): for line in file: name = line.rstrip('\n') try: - child = ObjectReader(name) + child = ObjectReader(name, self.owner) except ObjectError: logger.error('Object {} doesn\'t exist'.format(name)) else: @@ -85,24 +89,28 @@ class ObjectReader(Object): .format(user, self.hash)) raise PermissionError with open(os.path.join(self.object_path, 'object'), 'r') as file: - content = {} - for line in file: - k, v = line.split() - content[k] = v + content = file.read() return content, key class ObjectWriter(ObjectReader): - def __init__(self, hash): - Object.__init__(self, hash) + def __init__(self, hash, owner, split_name = True, key = None): + Object.__init__(self, hash, owner, split_name) + self.files = ('permissions', 'children', 'object') + self.__create_skeleton(key) + + def __create_skeleton(self, key): #new object if not self.exists(): os.makedirs(self.object_path) - for filename in ['permissions', 'children', 'object']: - file=open(os.path.join(self.object_path, filename), "w") + for filename in self.files: + file = open(os.path.join(self.object_path, filename), "w") file.close() - + #give all the permissions to the owner + ALLPERM = READ + MODIFY + APPEND + LIST + self.add_user(self.owner, ALLPERM, key) + def write(self, user, content): perm = self.get_permission(user) if not perm & MODIFY: @@ -110,11 +118,10 @@ class ObjectWriter(ObjectReader): .format(user, self.hash)) raise PermissionError with open(os.path.join(self.object_path, 'object'), "w") as file: - for k, v in content: - file.write('{} {}'.format(k,v)) + file.write('{}'.format(content)) def append(self, user, content, parent): - parent_object = ObjectReader(parent) + parent_object = ObjectReader(parent, self.owner) perm = parent_object.get_permission(user) if not perm & APPEND: logger.error("User {} doesn't have the modify permission for object {}" @@ -125,22 +132,20 @@ class ObjectWriter(ObjectReader): file.write('{} {}\n'.format(k,v)) #add the child hash to the parent with open(os.path.join(parent_object.object_path, 'children'), "a") as file: - file.write('{}\n'.format(self.hash)) + file.write('{} {}\n'.format(self.hash)) - def create_root_object(self, user, content): - with open(os.path.join(self.object_path, 'object'), "w") as file: - for k, v in content.iteritems(): - file.write('{} {}\n'.format(k,v)) - #give all the permissions to the user - ALLPERM = READ + MODIFY + APPEND + LIST + def add_user(self, user, perm, key = None): with open(os.path.join(self.object_path, 'permissions'), "a") as file: - file.write('{} {} xxxxxx\n'.format(user,ALLPERM)) - + if key: + file.write('{} {} {}\n'.format(user, perm, key)) + else: + file.write('{} {} None\n'.format(user, perm, key)) + if __name__ == '__main__': jid = 'thrasibule@alias.im' hash = hashlib.sha1(jid).hexdigest() config.root = '/var/lib/alias' - print ObjectReader(hash).get_content(jid) + print ObjectReader(hash, jid).get_content(jid) -- cgit v1.2.3-70-g09d2