diff options
| author | Zaran <zaran.krleza@gmail.com> | 2011-01-20 01:54:49 +0100 |
|---|---|---|
| committer | Thibaut Horel <thibaut.horel@gmail.com> | 2011-01-20 01:57:07 +0100 |
| commit | 63f4cc0daf8f2629e5d0296de2ae8a74f14b0dc1 (patch) | |
| tree | 750382715e252325615a3bcdb5fa963d8e971100 /server/object.py | |
| parent | 95e74be58e597776ee095790403d499b5d62467f (diff) | |
| download | alias-63f4cc0daf8f2629e5d0296de2ae8a74f14b0dc1.tar.gz | |
Simplification of the object module : now use only one class (maybe add some function back later)
Requesting the child items now works
Add a zip example of objects for testing
Diffstat (limited to 'server/object.py')
| -rw-r--r-- | server/object.py | 222 |
1 files changed, 50 insertions, 172 deletions
diff --git a/server/object.py b/server/object.py index d9cdc92..73bd96e 100644 --- a/server/object.py +++ b/server/object.py @@ -10,198 +10,76 @@ import fileinput import logging from permission import * +from config import config -class Object: - - def __get_path(self): - return self.root + self.owner + '/' + self.name[:2] + '/' + self.name[2:] - - def __create_dir(self): - if (not os.path.exists(self.__get_path())): - os.mkdirs(self.__get_path()) - - ## - # Save the object on the disk. - def save(self): - self.__create_dir() - - header = "author " + self.data['author'] + "\n" - header += "parent " + self.data['parent'] + "\n" - header += "created " + self.data['created'] + "\n" - header += "#\n" #end of header - store = header + self.data['content'] - - file = open(self.__get_path() + "/object", 'w') - file.write(zlib.compress(store)) - file.close() - os.mknod(self.path + "/childs") - os.mknod(self.path + "/permissions") - self.saved = True - - ## - # Class constructor. - def __init__(self, root, owner, init): - - self.root = root - if isinstance(init, dict): - if 'author' not in init: - init['author'] = 'None' - if 'parent' not in init: - init['parent'] = 'None' - if 'content' not in init: - init['content'] = 'None' +class ObjectError(Exception): + pass; - self.data = init - self.data['created'] = str(datetime.datetime.now()) - self.name = hashlib.sha1(str(self.data)).hexdigest() - self.saved = False - - elif isinstance(init, str): - self.name = init - if (os.path.exists(self.__get_path())): - file = open(self.__get_path() + '/object', 'r') - contentStream = StringIO.StringIO(zlib.decompress(file.read())) - data = {} - - for line in contentStream: - if (line == "#\n"): - data['content'] = contentStream.read() - break - else: - key, sep, value = line.rstrip('\n').partition(' ') - data[key] = value - - self.data = data - file.close() - else: - logging.error("Object {} root doesn't exist".format(init)) - - def append_to(self, father): - father.append_child(self) +class Object: - def append_child(self, child): - if not self.saved: - self.save() + def __init__(self, owner, hash): + self.owner = owner + self.hash = hash + owner_path = config.root + self.owner + '/' - file = open(self.path + "/childs", 'a') - file.write(child.name + "\n") - file.close() + if not os.path.exists(owner_path) : + logging.error("User {} is not registered".format(self.owner)) + raise ObjectError - @staticmethod - def get_permission_by_hash(hash, user): - path = hash[:2] + '/' + hash[2:] - try: - file = open(path + '/permissions', 'r') - except IOError: - print 'cannot open', path - else: - for line in file: - name, sep, perm = line.rstrip('\n').partition(' ') - if name == user: - return perm + self.path = owner_path + self.hash[:2] + '/' + self.hash[2:] + '/' - return 0 + if not os.path.exists(self.path) : + logging.error("Object {} can't be found for user {}".format(self.hash, + self.owner)) + raise ObjectError def get_permission(self, user): - file = open(self.__get_path() + '/permissions', 'r') + file = open(self.path + 'permissions', 'r') for line in file: name, sep, perm = line.rstrip('\n').partition(' ') if name == user: - return perm + return int(perm) return 0 - def set_permission(self, user, permission): - if not self.saved: - self.save() + def get_child_list(self, user): + perm = self.get_permission(user) + if not perm & LIST : + logging.error("User {} doesn't have the list permission for object {}" + .format(user, self.hash)) + raise PermissionError - sentinel = False - for line in fileinput.input(self.__get_path() + "/permissions", inplace = 1): - name, sep, perm = line.rstrip('\n').partition(' ') - if name == user: - sys.stdout.write(name + ' ' + str(permission) + '\n') - sentinel = True - else: - sys.stdout.write(line) - - if not sentinel: - file = open(self.__get_path() + '/permissions', 'a') - file.write(user + ' ' + str(permission) + '\n') - file.close() - -class ObjectHandler: - - def __init__(self, root, owner): - self.root = root - self.owner = owner - - def get_user_directory(self): - if os.path.exists(self.root + '/' + self.owner): - return self.root + '/' + self.owner - else: - logging.error("User {} root doesn't exist".format(self.owner)) - - def get_object_directory(self, hash): - directory = self.get_user_directory() + hash[:2] + '/' + hash[2:] - if (os.path.exists(directory)): - return directory - else: - logging.error("Object {} directory doesn't exist".format(hash)) - - def get_object(self, hash): - return Object(self.root, self.owner, hash) - - #return a list of hash, permission pairs - #for the objects the queryer has permissions on - def get_child_list(self, hash, queryer): - directory = self.get_object_directory(hash) - if directory: - result = [] - file = open(directory + "/childs", 'r') - for line in file : + file = open(self.path + "childs", 'r') + result = [] + for line in file : name = line.rstrip('\n') - result.append(name) - file.close() - return result - else: - return None - - def create_home_node(self): - pass + try: + child = Object(self.owner, name) + except ObjectError: + logging.error("Object {} can't be find for user {}".format(self.hash, + self.owner)) + else: + permission = child.get_permission(user) + if permission > 0: + result.append((name, permission)) - def get_home_node(self): - return hashlib.sha1(self.owner).hexdigest() - -if __name__ == '__main__': - config.root = os.path.abspath('object_tests') - if not(os.path.exists(config.root)): - os.mkdir(config.root) - os.chdir(config.root) - if not(os.path.exists('guillaume')): - os.mkdir('guillaume') + file.close() + return result - guillaume_stuff = ObjectHandler('guillaume') - os.chdir('guillaume') - x = Object({'parent' : 'toto', 'author' : 'Zaran'}) - x.set_permission("test", READ) - x.set_permission("toto", READ | MODIFY) - x.set_permission("toto", READ | MODIFY | APPEND) - x.set_permission("toto2", READ | MODIFY | APPEND) - print x.get_permission("toto") - print Object.get_permission_by_hash(x.name, "toto") - child = Object({'parent' : x.name, 'author' : 'Zaran'}) - child.save() + def get_content(self, user): + perm = self.get_permission(user) + if not perm & READ : + logging.error("User {} doesn't have read access to object {}" + .format(user, self.hash)) + raise PermissionError - x.append_child(child) - os.chdir(config.root) + file = open(self.path + "object", 'r') + result = file.read() + file.close() + return result - y = guillaume_stuff.get_object(x.name) - pomme = guillaume_stuff.get_child_list(x.name, None) - print pomme - print y.data['author'] - print y.data['parent'] - print y.data['content'] - print y.data['created'] +if __name__ == '__main__': + pass |
