Revision 15a96c3e
b/pithos/api/functions.py | ||
---|---|---|
537 | 537 |
objects = request.backend.list_object_meta(request.user_uniq, v_account, |
538 | 538 |
v_container, prefix, delimiter, marker, |
539 | 539 |
limit, virtual, 'pithos', keys, shared, until) |
540 |
object_permissions = {} |
|
541 |
object_public = {} |
|
542 |
if until is None: |
|
543 |
name_idx = len('/'.join((v_account, v_container, ''))) |
|
544 |
for x in request.backend.list_object_permissions(request.user_uniq, |
|
545 |
v_account, v_container, prefix): |
|
546 |
object = x[name_idx:] |
|
547 |
object_permissions[object] = request.backend.get_object_permissions( |
|
548 |
request.user_uniq, v_account, v_container, object) |
|
549 |
for k, v in request.backend.list_object_public(request.user_uniq, |
|
550 |
v_account, v_container, prefix).iteritems(): |
|
551 |
object_public[k[name_idx:]] = v |
|
540 | 552 |
except NotAllowedError: |
541 | 553 |
raise Forbidden('Not allowed') |
542 | 554 |
except NameError: |
543 | 555 |
raise ItemNotFound('Container does not exist') |
544 | 556 |
|
545 |
# object_meta = [] |
|
546 |
# for x in objects: |
|
547 |
# if x[1] is None: |
|
548 |
# # Virtual objects/directories. |
|
549 |
# object_meta.append({'subdir': x[0]}) |
|
550 |
# else: |
|
551 |
# try: |
|
552 |
# meta = request.backend.get_object_meta(request.user_uniq, v_account, |
|
553 |
# v_container, x[0], 'pithos', x[1]) |
|
554 |
# if until is None: |
|
555 |
# permissions = request.backend.get_object_permissions( |
|
556 |
# request.user_uniq, v_account, v_container, x[0]) |
|
557 |
# public = request.backend.get_object_public(request.user_uniq, |
|
558 |
# v_account, v_container, x[0]) |
|
559 |
# else: |
|
560 |
# permissions = None |
|
561 |
# public = None |
|
562 |
# except NotAllowedError: |
|
563 |
# raise Forbidden('Not allowed') |
|
564 |
# except NameError: |
|
565 |
# pass |
|
566 |
# else: |
|
567 |
# rename_meta_key(meta, 'hash', 'x_object_hash') # Will be replaced by checksum. |
|
568 |
# rename_meta_key(meta, 'checksum', 'hash') |
|
569 |
# rename_meta_key(meta, 'type', 'content_type') |
|
570 |
# rename_meta_key(meta, 'uuid', 'x_object_uuid') |
|
571 |
# rename_meta_key(meta, 'modified', 'last_modified') |
|
572 |
# rename_meta_key(meta, 'modified_by', 'x_object_modified_by') |
|
573 |
# rename_meta_key(meta, 'version', 'x_object_version') |
|
574 |
# rename_meta_key(meta, 'version_timestamp', 'x_object_version_timestamp') |
|
575 |
# m = dict([(k[14:], v) for k, v in meta.iteritems() if k.startswith('X-Object-Meta-')]) |
|
576 |
# for k in m: |
|
577 |
# del(meta['X-Object-Meta-' + k]) |
|
578 |
# if m: |
|
579 |
# meta['X-Object-Meta'] = printable_header_dict(m) |
|
580 |
# update_sharing_meta(request, permissions, v_account, v_container, x[0], meta) |
|
581 |
# update_public_meta(public, meta) |
|
582 |
# object_meta.append(printable_header_dict(meta)) |
|
583 |
# if request.serialization == 'xml': |
|
584 |
# data = render_to_string('objects.xml', {'container': v_container, 'objects': object_meta}) |
|
585 |
# elif request.serialization == 'json': |
|
586 |
# data = json.dumps(object_meta, default=json_encode_decimal) |
|
587 |
# response.status_code = 200 |
|
588 |
# response.content = data |
|
589 |
# return response |
|
590 |
|
|
591 | 557 |
object_meta = [] |
592 | 558 |
for meta in objects: |
593 | 559 |
if len(meta) == 1: |
... | ... | |
605 | 571 |
rename_meta_key(meta, 'modified_by', 'x_object_modified_by') |
606 | 572 |
rename_meta_key(meta, 'version', 'x_object_version') |
607 | 573 |
rename_meta_key(meta, 'version_timestamp', 'x_object_version_timestamp') |
574 |
permissions = object_permissions.get(meta['name'], None) |
|
575 |
if permissions: |
|
576 |
update_sharing_meta(request, permissions, v_account, v_container, meta['name'], meta) |
|
577 |
public = object_public.get(meta['name'], None) |
|
578 |
if public: |
|
579 |
update_public_meta(public, meta) |
|
608 | 580 |
object_meta.append(printable_header_dict(meta)) |
609 | 581 |
if request.serialization == 'xml': |
610 | 582 |
data = render_to_string('objects.xml', {'container': v_container, 'objects': object_meta}) |
b/pithos/backends/base.py | ||
---|---|---|
325 | 325 |
|
326 | 326 |
Same parameters with list_objects. Returned dicts have no user-defined |
327 | 327 |
metadata and, if until is not None, a None 'modified' timestamp. |
328 |
|
|
329 |
Raises: |
|
330 |
NotAllowedError: Operation not permitted |
|
331 |
|
|
332 |
NameError: Container does not exist |
|
328 | 333 |
""" |
329 | 334 |
return [] |
330 | 335 |
|
336 |
def list_object_permissions(self, user, account, container, prefix=''): |
|
337 |
"""Return a list of paths that enforce permissions under a container. |
|
338 |
|
|
339 |
Raises: |
|
340 |
NotAllowedError: Operation not permitted |
|
341 |
""" |
|
342 |
return [] |
|
343 |
|
|
344 |
def list_object_public(self, user, account, container, prefix=''): |
|
345 |
"""Return a dict mapping paths to public ids for objects that are public under a container.""" |
|
346 |
return {} |
|
347 |
|
|
331 | 348 |
def get_object_meta(self, user, account, container, name, domain, version=None): |
332 | 349 |
"""Return a dictionary with the object metadata for the domain. |
333 | 350 |
|
b/pithos/backends/lib/sqlalchemy/public.py | ||
---|---|---|
85 | 85 |
return row[0] |
86 | 86 |
return None |
87 | 87 |
|
88 |
def public_list(self, prefix): |
|
89 |
s = select([self.public.c.path, self.public.c.public_id]) |
|
90 |
s = s.where(self.xfeatures.c.path.like(self.escape_like(prefix) + '%', escape='\\')) |
|
91 |
s = s.where(self.public.c.active == True) |
|
92 |
r = self.conn.execute(s) |
|
93 |
rows = r.fetchall() |
|
94 |
r.close() |
|
95 |
return rows |
|
96 |
|
|
88 | 97 |
def public_path(self, public): |
89 | 98 |
s = select([self.public.c.path]) |
90 | 99 |
s = s.where(and_(self.public.c.public_id == public, |
b/pithos/backends/lib/sqlite/public.py | ||
---|---|---|
66 | 66 |
return row[0] |
67 | 67 |
return None |
68 | 68 |
|
69 |
def public_list(self, prefix): |
|
70 |
q = "select path, public_id from public where path like ? escape '\\' and active = 1" |
|
71 |
self.execute(q, (self.escape_like(prefix) + '%',)) |
|
72 |
return self.fetchall() |
|
73 |
|
|
69 | 74 |
def public_path(self, public): |
70 | 75 |
q = "select path from public where public_id = ? and active = 1" |
71 | 76 |
self.execute(q, (public,)) |
b/pithos/backends/modular.py | ||
---|---|---|
423 | 423 |
self._report_size_change(user, account, -size, {'action': 'container delete'}) |
424 | 424 |
|
425 | 425 |
def _list_objects(self, user, account, container, prefix, delimiter, marker, limit, virtual, domain, keys, shared, until, size_range, all_props): |
426 |
if user != account and until: |
|
427 |
raise NotAllowedError |
|
428 |
allowed = self._list_object_permissions(user, account, container, prefix, shared) |
|
429 |
path, node = self._lookup_container(account, container) |
|
430 |
allowed = self._get_formatted_paths(allowed) |
|
431 |
return self._list_object_properties(node, path, prefix, delimiter, marker, limit, virtual, domain, keys, until, size_range, allowed, all_props) |
|
432 |
|
|
433 |
def _list_object_permissions(self, user, account, container, prefix, shared): |
|
426 | 434 |
allowed = [] |
427 | 435 |
if user != account: |
428 |
if until: |
|
429 |
raise NotAllowedError |
|
430 |
allowed = self.permissions.access_list_paths(user, '/'.join((account, container))) |
|
436 |
allowed = self.permissions.access_list_paths(user, '/'.join((account, container, prefix))) |
|
431 | 437 |
if not allowed: |
432 | 438 |
raise NotAllowedError |
433 | 439 |
else: |
434 | 440 |
if shared: |
435 |
allowed = self.permissions.access_list_shared('/'.join((account, container))) |
|
441 |
allowed = self.permissions.access_list_shared('/'.join((account, container, prefix)))
|
|
436 | 442 |
if not allowed: |
437 | 443 |
return [] |
438 |
path, node = self._lookup_container(account, container) |
|
439 |
allowed = self._get_formatted_paths(allowed) |
|
440 |
return self._list_object_properties(node, path, prefix, delimiter, marker, limit, virtual, domain, keys, until, size_range, allowed, all_props) |
|
444 |
return allowed |
|
441 | 445 |
|
442 | 446 |
@backend_method |
443 | 447 |
def list_objects(self, user, account, container, prefix='', delimiter=None, marker=None, limit=10000, virtual=True, domain=None, keys=[], shared=False, until=None, size_range=None): |
... | ... | |
470 | 474 |
return objects |
471 | 475 |
|
472 | 476 |
@backend_method |
477 |
def list_object_permissions(self, user, account, container, prefix=''): |
|
478 |
"""Return a list of paths that enforce permissions under a container.""" |
|
479 |
|
|
480 |
logger.debug("list_object_permissions: %s %s %s", account, container, prefix) |
|
481 |
return self._list_object_permissions(user, account, container, prefix, True) |
|
482 |
|
|
483 |
@backend_method |
|
484 |
def list_object_public(self, user, account, container, prefix=''): |
|
485 |
"""Return a dict mapping paths to public ids for objects that are public under a container.""" |
|
486 |
|
|
487 |
logger.debug("list_object_public: %s %s %s", account, container, prefix) |
|
488 |
public = {} |
|
489 |
for path, p in self.permissions.public_list('/'.join((account, container, prefix))): |
|
490 |
public[path] = p + ULTIMATE_ANSWER |
|
491 |
return public |
|
492 |
|
|
493 |
@backend_method |
|
473 | 494 |
def get_object_meta(self, user, account, container, name, domain, version=None): |
474 | 495 |
"""Return a dictionary with the object metadata for the domain.""" |
475 | 496 |
|
Also available in: Unified diff