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