diff options
Diffstat (limited to 'server/object.py')
| -rw-r--r-- | server/object.py | 95 |
1 files changed, 62 insertions, 33 deletions
diff --git a/server/object.py b/server/object.py index 5773f4f..91ec3c7 100644 --- a/server/object.py +++ b/server/object.py @@ -4,11 +4,8 @@ import hashlib import sys import os import os.path -import zlib -import datetime import fileinput import logging -import pickle logger = logging.getLogger(__name__) from permission import * @@ -18,18 +15,17 @@ class ObjectError(Exception): pass; class Object: - def __init__(self, owner, hash = None): - self.owner = owner - if hash is None: - hash = hashlib.sha1(owner).hexdigest() + def __init__(self, hash): self.hash = hash - self.owner_path = os.path.join(config.root, owner) - self.object_path = os.path.join(self.owner_path, hash[:2], hash[2:]) - + self.object_path = os.path.join(config.root, hash[:2], hash[2:]) + + def exists(self): + return os.path.exists(self.object_path) + class ObjectReader(Object): - def __init__(self, owner, hash = None): - Object.__init__(self, owner, hash) - if not os.path.exists(self.object_path): + def __init__(self, hash): + Object.__init__(self, hash) + if not self.exists(): logger.error("Object {} can't be found for user {}".format(self.hash, self.owner)) raise ObjectError @@ -70,10 +66,9 @@ class ObjectReader(Object): for line in file: name = line.rstrip('\n') try: - child = ObjectReader(self.owner, name) + child = ObjectReader(name) except ObjectError: - logger.error("Object {} can't be find for user {}".format(self.hash, - self.owner)) + logger.error('Object {} doesn\'t exist'.format(name)) else: perm, key = child.get_permission_key(user) if perm > 0: @@ -83,31 +78,65 @@ class ObjectReader(Object): return result def get_content(self, user): + """Return object content and the user key to decrypt it.""" perm, key = self.get_permission_key(user) if not perm & READ : logger.error("User {} doesn't have read access to 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 - file = open(os.path.join(self.path, "object"), 'r') - content = file.read() - file.close() - return content, key + #return content, key + return content + + +class ObjectWriter(ObjectReader): - def get_registration_data(self): - pass + def __init__(self, hash): + Object.__init__(self, hash) + #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") + file.close() + + def write(self, user, content): + perm = self.get_permission(user) + if not perm & MODIFY: + logger.error("User {} doesn't have the modify permission for object {}" + .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)) + + def append(self, user, content, parent): + parent_object = ObjectReader(parent) + perm = parent_object.get_permission(user) + if not perm & APPEND: + logger.error("User {} doesn't have the modify permission for object {}" + .format(user, parent)) + raise PermissionError + with open(os.path.join(self.object_path, 'object'), "w") as file: + for k, v in content: + 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)) + + 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 + with open(os.path.join(self.object_path, 'permissions'), "a") as file: + file.write('{} 15 xxxxxx\n'.format(user,v)) -class ObjectWriter(Object): - def __init__(self, owner, hash = None): - Object.__init__(self, owner, hash) - if not os.path.exists(self.owner_path): - logger.error("User {} is not registered".format(self.owner)) - os.makedirs(self.object_path) - for filename in ['permissions', 'childs', 'object']: - file=open(os.path.join(self.object_path, filename), "w") - file.close() - - if __name__ == '__main__': pass |
