aboutsummaryrefslogtreecommitdiffstats
path: root/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 /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 'server/object.py')
-rw-r--r--server/object.py151
1 files changed, 0 insertions, 151 deletions
diff --git a/server/object.py b/server/object.py
deleted file mode 100644
index 8dd91a2..0000000
--- a/server/object.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# -*- 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)
-
-
-