aboutsummaryrefslogtreecommitdiffstats
path: root/alias_server/object.py
diff options
context:
space:
mode:
authorGuillaume Horel <guillaume.horel@gmail.com>2012-01-18 12:27:37 -0500
committerGuillaume Horel <guillaume.horel@gmail.com>2012-01-18 12:27:37 -0500
commitf70165ef6229a92bf8cfa6f16eff980a4a7491fe (patch)
treee2954759f71c0b4c482334ba9b278a4224e97197 /alias_server/object.py
parent0ce9f4fb84693f34113630c59610b47a082ae71a (diff)
downloadalias-f70165ef6229a92bf8cfa6f16eff980a4a7491fe.tar.gz
Added setup.py and big reorg of the source tree
this should fix tickets #10 and #11
Diffstat (limited to 'alias_server/object.py')
-rw-r--r--alias_server/object.py151
1 files changed, 151 insertions, 0 deletions
diff --git a/alias_server/object.py b/alias_server/object.py
new file mode 100644
index 0000000..8dd91a2
--- /dev/null
+++ b/alias_server/object.py
@@ -0,0 +1,151 @@
+# -*- coding: utf-8 -*-
+#import StringIO
+import hashlib
+#import sys
+#import os
+import os.path
+#import fileinput
+import logging
+logger = logging.getLogger(__name__)
+
+from permission import *
+from config import config
+
+class ObjectError(Exception):
+ pass;
+
+class Object:
+ 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, 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))
+ raise ObjectError
+
+ def get_permission(self, user):
+ with open(os.path.join(self.object_path, 'permissions'), 'r') as file:
+ for line in file:
+ name, perm, key = line.split()
+ if name == user:
+ return int(perm)
+ return None
+
+ def get_key(self, user):
+ with open(os.path.join(self.object_path, 'permissions'), 'r') as file:
+ for line in file:
+ name, perm, key = line.split()
+ if name == user:
+ return key
+ return None
+
+ def get_permission_key(self, user):
+ with open(os.path.join(self.object_path, 'permissions'), 'r') as file:
+ for line in file:
+ name, perm, key = line.split()
+ if name == user:
+ return (int(perm), key)
+ return (None, None)
+
+ def get_children_list(self, user):
+ perm = self.get_permission(user)
+ if not perm or (not perm & LIST):
+ logger.error("User {} doesn't have the list permission for object {}"
+ .format(user, self.hash))
+ raise PermissionError
+
+ file = open(os.path.join(self.object_path, 'childs'), 'r')
+ result = []
+ for line in file:
+ name = line.rstrip('\n')
+ try:
+ child = ObjectReader(name, self.owner)
+ except ObjectError:
+ logger.error('Object {} doesn\'t exist'.format(name))
+ else:
+ perm, key = child.get_permission_key(user)
+ if perm > 0:
+ result.append((name, perm, key))
+
+ file.close()
+ 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 or (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 = file.read()
+
+ return content, key
+
+class ObjectWriter(ObjectReader):
+
+ 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 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 or (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:
+ file.write('{}'.format(content))
+
+ def append(self, user, content, parent):
+ parent_object = ObjectReader(parent, self.owner)
+ perm = parent_object.get_permission(user)
+ if not perm or (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 add_user(self, user, perm, key = None):
+ with open(os.path.join(self.object_path, 'permissions'), "a") as file:
+ 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, jid).get_content(jid)
+
+
+