aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--server/object.py62
-rw-r--r--server/plugin.py7
-rwxr-xr-xserver/server.py2
3 files changed, 35 insertions, 36 deletions
diff --git a/server/object.py b/server/object.py
index 7209cd2..d9cdc92 100644
--- a/server/object.py
+++ b/server/object.py
@@ -10,19 +10,15 @@ import fileinput
import logging
from permission import *
-from config import config
class Object:
def __get_path(self):
- return self.name[:2] + '/' + self.name[2:]
+ return self.root + self.owner + '/' + self.name[:2] + '/' + self.name[2:]
def __create_dir(self):
- if (not os.path.exists(self.name[:2])):
- os.mkdir(self.name[:2])
-
- if (not os.path.exists(self.path)):
- os.mkdir(self.path)
+ if (not os.path.exists(self.__get_path())):
+ os.mkdirs(self.__get_path())
##
# Save the object on the disk.
@@ -35,7 +31,7 @@ class Object:
header += "#\n" #end of header
store = header + self.data['content']
- file = open(self.path + "/object", 'w')
+ file = open(self.__get_path() + "/object", 'w')
file.write(zlib.compress(store))
file.close()
os.mknod(self.path + "/childs")
@@ -44,8 +40,9 @@ class Object:
##
# Class constructor.
- def __init__(self, init):
-
+ def __init__(self, root, owner, init):
+
+ self.root = root
if isinstance(init, dict):
if 'author' not in init:
init['author'] = 'None'
@@ -57,14 +54,12 @@ class Object:
self.data = init
self.data['created'] = str(datetime.datetime.now())
self.name = hashlib.sha1(str(self.data)).hexdigest()
- self.path = self.__get_path()
self.saved = False
elif isinstance(init, str):
self.name = init
- self.path = self.__get_path()
- if (os.path.exists(self.path)):
- file = open(self.path + '/object', 'r')
+ if (os.path.exists(self.__get_path())):
+ file = open(self.__get_path() + '/object', 'r')
contentStream = StringIO.StringIO(zlib.decompress(file.read()))
data = {}
@@ -108,7 +103,7 @@ class Object:
return 0
def get_permission(self, user):
- file = open(self.path + '/permissions', 'r')
+ file = open(self.__get_path() + '/permissions', 'r')
for line in file:
name, sep, perm = line.rstrip('\n').partition(' ')
if name == user:
@@ -121,7 +116,7 @@ class Object:
self.save()
sentinel = False
- for line in fileinput.input(self.path + "/permissions", inplace = 1):
+ 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')
@@ -130,34 +125,35 @@ class Object:
sys.stdout.write(line)
if not sentinel:
- file = open(self.path + '/permissions', 'a')
+ file = open(self.__get_path() + '/permissions', 'a')
file.write(user + ' ' + str(permission) + '\n')
file.close()
class ObjectHandler:
- def __init__(self, root, user):
- self.user = user
- self.root_object = hashlib.sha1(user).hexdigest()
-
- if not os.path.exists(root + '/' + self.user):
- logging.error("User {} root doesn't exist".format(self.user))
+ 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.user + '/' + hash[:2] + '/' + hash[2:]
+ directory = self.get_user_directory() + hash[:2] + '/' + hash[2:]
if (os.path.exists(directory)):
return directory
else:
- return None
+ logging.error("Object {} directory doesn't exist".format(hash))
def get_object(self, hash):
- os.chdir(self.user)
- temp = Object(hash)
- os.chdir('..')
- return temp
+ return Object(self.root, self.owner, hash)
- #return a list of hash,permission pairs
- def get_child_list(self, hash, user):
+ #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 = []
@@ -167,14 +163,14 @@ class ObjectHandler:
result.append(name)
file.close()
return result
- else :
+ else:
return None
def create_home_node(self):
pass
def get_home_node(self):
- return self.root_object
+ return hashlib.sha1(self.owner).hexdigest()
if __name__ == '__main__':
config.root = os.path.abspath('object_tests')
diff --git a/server/plugin.py b/server/plugin.py
index df05908..62ae958 100644
--- a/server/plugin.py
+++ b/server/plugin.py
@@ -44,9 +44,12 @@ class AliasPlugin(base.base_plugin):
self.xmpp.plugin['xep_0030'].add_feature("alias:query")
def handle_alias_query(self, iq):
- callee = base64.b64decode(iq['to'].user)
+ try:
+ callee = base64.b64decode(iq['to'].user)
+ except TypeError:
+ logging.error("callee field not base64 encoded")
caller = iq['alias']['from']
- handler = object.ObjectHandler(callee)
+ handler = object.ObjectHandler(self.config['root'],callee)
node = iq['alias']['node']
if not node:
node = handler.get_home_node()
diff --git a/server/server.py b/server/server.py
index c6ddf2b..fcddfe8 100755
--- a/server/server.py
+++ b/server/server.py
@@ -13,7 +13,7 @@ class ObjectComponent(ComponentXMPP):
def __init__(self, jid, secret, server, port, root):
ComponentXMPP.__init__(self, jid, secret, server, port)
self.register_plugin('xep_0030')
- self.register_plugin("AliasPlugin", module = "plugin")
+ self.register_plugin("AliasPlugin", module = "plugin", pconfig={'root': root})
self.add_event_handler("session_start", self.start)
self.add_event_handler("presence_probe", self.presence_probe)
self.add_event_handler("message", self.message)