Fix permission-based object listings (shared by me and others).
authorAntony Chazapis <chazapis@gmail.com>
Fri, 10 Feb 2012 16:35:31 +0000 (18:35 +0200)
committerAntony Chazapis <chazapis@gmail.com>
Fri, 10 Feb 2012 16:35:31 +0000 (18:35 +0200)
Refs #1984

pithos/backends/lib/sqlite/__init__.py
pithos/backends/lib/sqlite/node.py
pithos/backends/modular.py

index 58a51a7..c19bf96 100644 (file)
 # or implied, of GRNET S.A.
 
 from dbwrapper import DBWrapper
-from node import Node, ROOTNODE, SERIAL, HASH, SIZE, TYPE, MTIME, MUSER, UUID, CLUSTER
+from node import Node, ROOTNODE, SERIAL, HASH, SIZE, TYPE, MTIME, MUSER, UUID, CLUSTER, MATCH_PREFIX, MATCH_EXACT
 from permissions import Permissions, READ, WRITE
 
 __all__ = ["DBWrapper",
-           "Node", "ROOTNODE", "SERIAL", "HASH", "SIZE", "TYPE", "MTIME", "MUSER", "UUID", "CLUSTER",
+           "Node", "ROOTNODE", "SERIAL", "HASH", "SIZE", "TYPE", "MTIME", "MUSER", "UUID", "CLUSTER", "MATCH_PREFIX", "MATCH_EXACT",
            "Permissions", "READ", "WRITE"]
 
index 30d92e7..f360258 100644 (file)
@@ -42,6 +42,8 @@ ROOTNODE  = 0
 
 ( SERIAL, NODE, HASH, SIZE, TYPE, SOURCE, MTIME, MUSER, UUID, CLUSTER ) = range(10)
 
+( MATCH_PREFIX, MATCH_EXACT ) = range(2)
+
 inf = float('inf')
 
 
@@ -642,10 +644,19 @@ class Node(DBWorker):
         if not pathq:
             return None, None
         
-        subq = " and ("
-        subq += ' or '.join(("n.path like ? escape '\\'" for x in pathq))
-        subq += ")"
-        args = tuple([self.escape_like(x) + '%' for x in pathq])
+        subqlist = []
+        args = []
+        print pathq
+        for path, match in pathq:
+            if match == MATCH_PREFIX:
+                subqlist.append("n.path like ? escape '\\'")
+                args.append(self.escape_like(path) + '%')
+            elif match == MATCH_EXACT:
+                subqlist.append("n.path = ?")
+                args.append(path)
+        
+        subq = ' and (' + ' or '.join(subqlist) + ')'
+        args = tuple(args)
         
         return subq, args
     
index 8de2ba6..a211a67 100644 (file)
@@ -115,7 +115,7 @@ class ModularBackend(BaseBackend):
         for x in ['READ', 'WRITE']:
             setattr(self, x, getattr(self.db_module, x))
         self.node = self.db_module.Node(**params)
-        for x in ['ROOTNODE', 'SERIAL', 'HASH', 'SIZE', 'TYPE', 'MTIME', 'MUSER', 'UUID', 'CLUSTER']:
+        for x in ['ROOTNODE', 'SERIAL', 'HASH', 'SIZE', 'TYPE', 'MTIME', 'MUSER', 'UUID', 'CLUSTER', 'MATCH_PREFIX', 'MATCH_EXACT']:
             setattr(self, x, getattr(self.db_module, x))
         
         self.block_module = load_module(block_module)
@@ -419,7 +419,7 @@ class ModularBackend(BaseBackend):
                 if not allowed:
                     return []
         path, node = self._lookup_container(account, container)
-        # XXX: Format allowed...
+        allowed = self._get_formatted_paths(allowed)
         return self._list_objects(node, path, prefix, delimiter, marker, limit, virtual, domain, keys, until, size_range, allowed)
     
     @backend_method
@@ -436,7 +436,7 @@ class ModularBackend(BaseBackend):
                 raise NotAllowedError
         path, node = self._lookup_container(account, container)
         before = until if until is not None else inf
-        # XXX: Format allowed...
+        allowed = self._get_formatted_paths(allowed)
         return self.node.latest_attribute_keys(node, domain, before, CLUSTER_DELETED, allowed)
     
     @backend_method
@@ -936,9 +936,8 @@ class ModularBackend(BaseBackend):
                 props = self.node.version_lookup(node, inf, CLUSTER_NORMAL)
             if props is not None:
                 if props[self.TYPE] in ('application/directory', 'application/folder'):
-                    formatted.append((p.rstrip('/') + '/', 'prefix'))
-                else:
-                    formatted.append((p, 'exact'))
+                    formatted.append((p.rstrip('/') + '/', self.MATCH_PREFIX))
+                formatted.append((p, self.MATCH_EXACT))
         return formatted
     
     def _get_permissions_path(self, account, container, name):