aboutsummaryrefslogtreecommitdiffstats
path: root/server/object.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/object.py')
-rw-r--r--server/object.py222
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