try:
version_id = request.backend.update_object_hashmap(request.user_uniq,
- v_account, v_container, v_object, size, hashmap,
- content_type, 'pithos', meta, True, permissions)
+ v_account, v_container, v_object, size, content_type,
+ hashmap, 'pithos', meta, True, permissions)
except NotAllowedError:
raise Forbidden('Not allowed')
except IndexError, e:
try:
version_id = request.backend.update_object_hashmap(request.user_uniq,
- v_account, v_container, v_object, file.size, file.hashmap,
- content_type, 'pithos', meta, True)
+ v_account, v_container, v_object, file.size, content_type,
+ file.hashmap, 'pithos', meta, True)
except NotAllowedError:
raise Forbidden('Not allowed')
except NameError:
meta.update({'ETag': hashmap_md5(request, hashmap, size)}) # Update ETag.
try:
version_id = request.backend.update_object_hashmap(request.user_uniq,
- v_account, v_container, v_object, size, hashmap,
- prev_meta['type'], 'pithos', meta, replace, permissions)
+ v_account, v_container, v_object, size, prev_meta['type'],
+ hashmap, 'pithos', meta, replace, permissions)
except NotAllowedError:
raise Forbidden('Not allowed')
except NameError:
"""
return 0, []
- def update_object_hashmap(self, user, account, container, name, size, hashmap, type, domain, meta={}, replace_meta=False, permissions=None):
+ def update_object_hashmap(self, user, account, container, name, size, type, hashmap, domain, meta={}, replace_meta=False, permissions=None):
"""Create/update an object with the specified size and partial hashes and return the new version.
Parameters:
self.xfeature_destroy(path)
return
feature = self.xfeature_create(path)
- self.feature_clear(feature)
if r:
+ self.feature_clear(feature, READ)
self.feature_setmany(feature, READ, r)
if w:
+ self.feature_clear(feature, WRITE)
self.feature_setmany(feature, WRITE, w)
def access_get(self, path):
feature = self.xfeature_get(path)
if not feature:
- return False
+ return {}
permissions = self.feature_dict(feature)
if READ in permissions:
permissions['read'] = permissions[READ]
"""Return the (path, feature) inherited by the path, or None."""
q = ("select path, feature_id from xfeatures "
- "where path <= ? "
+ "where path < ? "
"and ? like path || '%' " # XXX: Escape like...
"order by path desc")
self.execute(q, (path, path))
if node is not None:
props = self.node.version_lookup(node, inf, CLUSTER_NORMAL)
if props is not None:
- # XXX: Put type in properties...
- meta = dict(self.node.attribute_get(props[self.SERIAL], 'pithos'))
- if meta['Content-Type'] == 'application/directory':
+ if props[self.TYPE] in ('application/directory', 'application/folder'):
formatted.append((p.rstrip('/') + '/', 'prefix'))
else:
formatted.append((p, 'exact'))
if p == path:
return p
else:
- if p.count('/') < 3:
- return None
+ if p.count('/') < 2:
+ continue
node = self.node.node_lookup(p)
if node is not None:
props = self.node.version_lookup(node, inf, CLUSTER_NORMAL)
if props is not None:
- # XXX: Put type in properties...
- meta = dict(self.node.attribute_get(props[self.SERIAL], 'pithos'))
- if meta['Content-Type'] == 'application/directory':
+ if props[self.TYPE] in ('application/directory', 'application/folder'):
return p
return None
def _can_read(self, user, account, container, name):
if user == account:
return True
+ path = '/'.join((account, container, name))
+ if self.permissions.access_check(path, self.READ, user) or self.permissions.access_check(path, self.WRITE, user):
+ return True
path = self._get_permissions_path(account, container, name)
+ if not path:
+ raise NotAllowedError
if not self.permissions.access_check(path, self.READ, user) and not self.permissions.access_check(path, self.WRITE, user):
raise NotAllowedError
if user == account:
return True
path = '/'.join((account, container, name))
+ if self.permissions.access_check(path, self.WRITE, user):
+ return True
+ path = self._get_permissions_path(account, container, name)
+ if not path:
+ raise NotAllowedError
if not self.permissions.access_check(path, self.WRITE, user):
raise NotAllowedError