Revision adce84cd
b/snf-pithos-app/pithos/api/test/objects.py | ||
---|---|---|
136 | 136 |
self.assertEqual(len(l3), len(l2) + 1) |
137 | 137 |
self.assertEqual(l3[:-1], l2) |
138 | 138 |
|
139 |
def test_get_version(self): |
|
140 |
c = 'c1' |
|
141 |
o = self.objects[c][0] |
|
142 |
url = join_urls(self.pithos_path, self.user, c, o) |
|
143 |
|
|
144 |
# Update metadata |
|
145 |
meta = {'HTTP_X_OBJECT_META_QUALITY': 'AAA'} |
|
146 |
r = self.post(url, content_type='', **meta) |
|
147 |
self.assertEqual(r.status_code, 202) |
|
148 |
|
|
149 |
url = join_urls(self.pithos_path, self.user, c, o) |
|
150 |
r = self.get('%s?version=list&format=json' % url) |
|
151 |
self.assertEqual(r.status_code, 200) |
|
152 |
l = json.loads(r.content)['versions'] |
|
153 |
self.assertEqual(len(l), 2) |
|
154 |
|
|
155 |
r = self.head('%s?version=%s' % (url, l[0][0])) |
|
156 |
self.assertEqual(r.status_code, 200) |
|
157 |
self.assertTrue('X-Object-Meta-Quality' not in r) |
|
158 |
|
|
159 |
r = self.head('%s?version=%s' % (url, l[1][0])) |
|
160 |
self.assertEqual(r.status_code, 200) |
|
161 |
self.assertTrue('X-Object-Meta-Quality' in r) |
|
162 |
|
|
163 |
# test invalid version |
|
164 |
r = self.head('%s?version=-1' % url) |
|
165 |
self.assertEqual(r.status_code, 404) |
|
166 |
|
|
167 |
other_name, other_data, r = self.upload_object(c) |
|
168 |
self.assertTrue('X-Object-Version' in r) |
|
169 |
other_version = r['X-Object-Version'] |
|
170 |
|
|
171 |
self.assertTrue(o != other_name) |
|
172 |
|
|
173 |
r = self.get('%s?version=%s' % (url, other_version)) |
|
174 |
self.assertEqual(r.status_code, 403) |
|
175 |
|
|
176 |
r = self.head('%s?version=%s' % (url, other_version)) |
|
177 |
self.assertEqual(r.status_code, 403) |
|
178 |
|
|
139 | 179 |
def test_objects_with_trailing_spaces(self): |
140 | 180 |
# create object |
141 | 181 |
oname = self.upload_object('c1')[0] |
b/snf-pithos-backend/pithos/backends/lib/sqlalchemy/__init__.py | ||
---|---|---|
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 | 34 |
from dbwrapper import DBWrapper |
35 |
from node import (Node, ROOTNODE, SERIAL, HASH, SIZE, TYPE, MTIME, MUSER, UUID,
|
|
36 |
CHECKSUM, CLUSTER, MATCH_PREFIX, MATCH_EXACT) |
|
35 |
from node import (Node, ROOTNODE, SERIAL, NODE, HASH, SIZE, TYPE, MTIME, MUSER,
|
|
36 |
UUID, CHECKSUM, CLUSTER, MATCH_PREFIX, MATCH_EXACT)
|
|
37 | 37 |
from permissions import Permissions, READ, WRITE |
38 | 38 |
from config import Config |
39 | 39 |
from quotaholder_serials import QuotaholderSerial |
40 | 40 |
|
41 | 41 |
__all__ = ["DBWrapper", |
42 |
"Node", "ROOTNODE", "SERIAL", "HASH", "SIZE", "TYPE", "MTIME",
|
|
43 |
"MUSER", "UUID", "CHECKSUM", "CLUSTER", "MATCH_PREFIX", |
|
42 |
"Node", "ROOTNODE", "NODE", "SERIAL", "HASH", "SIZE", "TYPE",
|
|
43 |
"MTIME", "MUSER", "UUID", "CHECKSUM", "CLUSTER", "MATCH_PREFIX",
|
|
44 | 44 |
"MATCH_EXACT", "Permissions", "READ", "WRITE", "Config", |
45 | 45 |
"QuotaholderSerial"] |
b/snf-pithos-backend/pithos/backends/lib/sqlite/__init__.py | ||
---|---|---|
32 | 32 |
# or implied, of GRNET S.A. |
33 | 33 |
|
34 | 34 |
from dbwrapper import DBWrapper |
35 |
from node import (Node, ROOTNODE, SERIAL, HASH, SIZE, TYPE, MTIME, MUSER, UUID,
|
|
36 |
CHECKSUM, CLUSTER, MATCH_PREFIX, MATCH_EXACT) |
|
35 |
from node import (Node, ROOTNODE, SERIAL, NODE, HASH, SIZE, TYPE, MTIME, MUSER,
|
|
36 |
UUID, CHECKSUM, CLUSTER, MATCH_PREFIX, MATCH_EXACT)
|
|
37 | 37 |
from permissions import Permissions, READ, WRITE |
38 | 38 |
from config import Config |
39 | 39 |
from quotaholder_serials import QuotaholderSerial |
40 | 40 |
|
41 | 41 |
__all__ = ["DBWrapper", |
42 |
"Node", "ROOTNODE", "SERIAL", "HASH", "SIZE", "TYPE", "MTIME",
|
|
43 |
"MUSER", "UUID", "CHECKSUM", "CLUSTER", "MATCH_PREFIX", |
|
42 |
"Node", "ROOTNODE", "SERIAL", "NODE", "HASH", "SIZE", "TYPE",
|
|
43 |
"MTIME", "MUSER", "UUID", "CHECKSUM", "CLUSTER", "MATCH_PREFIX",
|
|
44 | 44 |
"MATCH_EXACT", "Permissions", "READ", "WRITE", "Config", |
45 | 45 |
"QuotaholderSerial"] |
b/snf-pithos-backend/pithos/backends/modular.py | ||
---|---|---|
203 | 203 |
for x in ['READ', 'WRITE']: |
204 | 204 |
setattr(self, x, getattr(self.db_module, x)) |
205 | 205 |
self.node = self.db_module.Node(**params) |
206 |
for x in ['ROOTNODE', 'SERIAL', 'HASH', 'SIZE', 'TYPE', 'MTIME',
|
|
207 |
'MUSER', 'UUID', 'CHECKSUM', 'CLUSTER', 'MATCH_PREFIX',
|
|
208 |
'MATCH_EXACT']: |
|
206 |
for x in ['ROOTNODE', 'SERIAL', 'NODE', 'HASH', 'SIZE', 'TYPE',
|
|
207 |
'MTIME', 'MUSER', 'UUID', 'CHECKSUM', 'CLUSTER',
|
|
208 |
'MATCH_PREFIX', 'MATCH_EXACT']:
|
|
209 | 209 |
setattr(self, x, getattr(self.db_module, x)) |
210 | 210 |
|
211 | 211 |
self.block_module = load_module(block_module) |
... | ... | |
915 | 915 |
self.permissions.public_unset(path) |
916 | 916 |
else: |
917 | 917 |
self.permissions.public_set( |
918 |
path, self.public_url_security, self.public_url_alphabet |
|
919 |
) |
|
918 |
path, self.public_url_security, self.public_url_alphabet) |
|
920 | 919 |
|
921 | 920 |
@debug_method |
922 | 921 |
def get_object_hashmap(self, user, account, container, name, version=None): |
... | ... | |
925 | 924 |
self._can_read(user, account, container, name) |
926 | 925 |
path, node = self._lookup_object(account, container, name) |
927 | 926 |
props = self._get_version(node, version) |
927 |
if props[self.HASH] is None: |
|
928 |
return 0, () |
|
928 | 929 |
hashmap = self.store.map_get(binascii.unhexlify(props[self.HASH])) |
929 | 930 |
return props[self.SIZE], [binascii.hexlify(x) for x in hashmap] |
930 | 931 |
|
... | ... | |
1368 | 1369 |
except ValueError: |
1369 | 1370 |
raise VersionNotExists('Version does not exist') |
1370 | 1371 |
props = self.node.version_get_properties(version) |
1372 |
if props is not None and node != props[self.NODE]: |
|
1373 |
raise NotAllowedError('Version does not belong to this path') |
|
1371 | 1374 |
if props is None or props[self.CLUSTER] == CLUSTER_DELETED: |
1372 | 1375 |
raise VersionNotExists('Version does not exist') |
1373 | 1376 |
return props |
Also available in: Unified diff