delegate the permission decision to the resource
authorchrysn <chrysn@fsfe.org>
Fri, 4 Apr 2014 12:19:40 +0000 (14:19 +0200)
committerJelmer Vernooń≥ <jelmer@jelmer.uk>
Sun, 10 Apr 2016 11:43:29 +0000 (11:43 +0000)
this allows sharing collections with particular users.

calypso/acl/__init__.py
calypso/acl/htpasswd.py
calypso/acl/pam.py
calypso/principal.py
calypso/webdav.py
collection-config

index 9142433..91116ac 100644 (file)
@@ -34,3 +34,19 @@ def load():
     acl_type = config.get("acl", "type").encode("utf-8")
     module = __import__("calypso.acl", fromlist=[acl_type])
     return getattr(module, acl_type)
+
+class Entity(object):
+    """Interface for resources, uses to check them against an ACL."""
+
+    owner = None
+
+    def is_personal(self):
+        return True
+
+    def has_right(self, user):
+        """Return true if a given user may access the resource"""
+
+        # this implementation is always personal; non-collection resources are
+        # not expected to be accessed by different users.
+
+        return (user == self.owner if self.owner else True) if self.is_personal() else True
index 2b1dff1..c970257 100644 (file)
@@ -63,7 +63,7 @@ def has_right(entity, user, password):
     for line in open(FILENAME).readlines():
         if line.strip():
             login, hash_value = line.strip().split(":", 1)
-            if login == user and (not entity.personal or user == entity.owner):
+            if login == user and entity.has_right(user):
                 return CHECK_PASSWORD(hash_value, password)
     return False
 
index 03ce041..41d43f7 100644 (file)
@@ -35,7 +35,7 @@ SVC = config.get("acl", "pam_service")
 def has_right(entity, user, password):
     """Check if ``user``/``password`` couple is valid."""
     LOG.debug("entity %s user %s", entity, user)
-    if entity.owner and entity.owner != user and entity.personal:
+    if not entity.has_right(user):
         return False
     def pam_conv(auth, query_list, userData):
         result = []
index c952d08..65e8d4f 100644 (file)
@@ -1,8 +1,8 @@
 import xml.etree.ElementTree as ET
-from . import config, paths
+from . import config, paths, acl
 from .xmlutils_generic import _tag
 
-class Resource(object):
+class Resource(acl.Entity):
     """Resources initially were pseudo-collections/items (so they could be
     included in the propfind loop), but currently are objects that represent
     resources on the server that are not collectons / collection items.
@@ -21,11 +21,6 @@ class Resource(object):
 
     urlpath = None # this should be present ... implement as abstract property?
 
-    owner = None # implement the interface for acls
-
-    def is_personal(self):
-        return True
-
 class Principal(Resource):
     def __init__(self, username):
         self.username = username
index b3ea38d..b80ac74 100644 (file)
@@ -38,7 +38,7 @@ import subprocess
 
 import ConfigParser
 
-from . import config, paths
+from . import config, paths, acl
 
 METADATA_FILENAME = ".calypso-collection"
 
@@ -228,7 +228,7 @@ class CalypsoError(Exception):
     def __str__(self):
         return "%s: %s" % (self.reason, self.file)
 
-class Collection(object):
+class Collection(acl.Entity):
     """Internal collection class."""
 
     def get_description(self):
@@ -632,3 +632,9 @@ class Collection(object):
             return self.metadata.getboolean('collection', 'personal')
         except (ConfigParser.NoSectionError, ConfigParser.NoOptionError, ValueError):
             return config.get('acl', 'personal')
+
+    def has_right(self, user):
+        try:
+            return user in self.metadata.get('collection', 'allowed-users').split()
+        except (ConfigParser.NoSectionError, ConfigParser.NoOptionError, ValueError):
+            return super(Collection, self).has_right(user)
index d725ceb..7ad8537 100644 (file)
@@ -21,5 +21,8 @@ is-addressbook = 0
 # Set this collection to personal, meaning that only its owner can access it.
 # Defaults to the personal setting in the Calypso configuration's acl section.
 personal = False
+# List of users that may access the resource independently of its owner or its
+# personal setting.
+allowed-users = john peter
 
 # vim:ft=cfg