Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / test / permissions.py @ 7e402b46

History | View | Annotate | Download (15.4 kB)

1 2b19dc94 Sofia Papagiannaki
#!/usr/bin/env python
2 2b19dc94 Sofia Papagiannaki
#coding=utf8
3 2b19dc94 Sofia Papagiannaki
4 2b19dc94 Sofia Papagiannaki
# Copyright 2011-2013 GRNET S.A. All rights reserved.
5 2b19dc94 Sofia Papagiannaki
#
6 2b19dc94 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
7 2b19dc94 Sofia Papagiannaki
# without modification, are permitted provided that the following
8 2b19dc94 Sofia Papagiannaki
# conditions are met:
9 2b19dc94 Sofia Papagiannaki
#
10 2b19dc94 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
11 2b19dc94 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
12 2b19dc94 Sofia Papagiannaki
#      disclaimer.
13 2b19dc94 Sofia Papagiannaki
#
14 2b19dc94 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
15 2b19dc94 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
16 2b19dc94 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
17 2b19dc94 Sofia Papagiannaki
#      provided with the distribution.
18 2b19dc94 Sofia Papagiannaki
#
19 2b19dc94 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 2b19dc94 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 2b19dc94 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 2b19dc94 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 2b19dc94 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 2b19dc94 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 2b19dc94 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 2b19dc94 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 2b19dc94 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 2b19dc94 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 2b19dc94 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 2b19dc94 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
31 2b19dc94 Sofia Papagiannaki
#
32 2b19dc94 Sofia Papagiannaki
# The views and conclusions contained in the software and
33 2b19dc94 Sofia Papagiannaki
# documentation are those of the authors and should not be
34 2b19dc94 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
35 2b19dc94 Sofia Papagiannaki
# or implied, of GRNET S.A.
36 2b19dc94 Sofia Papagiannaki
37 2b19dc94 Sofia Papagiannaki
from pithos.api.test import PithosAPITest
38 bc4f25c0 Sofia Papagiannaki
from pithos.api.test.util import get_random_data, get_random_name
39 2b19dc94 Sofia Papagiannaki
40 2b19dc94 Sofia Papagiannaki
from synnefo.lib import join_urls
41 2b19dc94 Sofia Papagiannaki
42 2b19dc94 Sofia Papagiannaki
43 2b19dc94 Sofia Papagiannaki
class TestPermissions(PithosAPITest):
44 2b19dc94 Sofia Papagiannaki
    def setUp(self):
45 2b19dc94 Sofia Papagiannaki
        PithosAPITest.setUp(self)
46 2b19dc94 Sofia Papagiannaki
47 2b19dc94 Sofia Papagiannaki
        # create a group
48 2b19dc94 Sofia Papagiannaki
        self.users = ['alice', 'bob', 'chuck', 'dan', 'mallory', 'oscar']
49 2b19dc94 Sofia Papagiannaki
        self.groups = {'group1': self.users[:2]}
50 2b19dc94 Sofia Papagiannaki
        kwargs = dict(('HTTP_X_ACCOUNT_GROUP_%s' % k.upper(), ','.join(v)) for
51 2b19dc94 Sofia Papagiannaki
                      k, v in self.groups.items())
52 2b19dc94 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
53 2b19dc94 Sofia Papagiannaki
        r = self.post(url, **kwargs)
54 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
55 2b19dc94 Sofia Papagiannaki
56 bc4f25c0 Sofia Papagiannaki
        self.container = get_random_name()
57 2b19dc94 Sofia Papagiannaki
        self.create_container(self.container)
58 2b19dc94 Sofia Papagiannaki
        self.object = self.upload_object(self.container)[0]
59 2b19dc94 Sofia Papagiannaki
        l = [self.object + '/', self.object + '/a', self.object + 'a',
60 2b19dc94 Sofia Papagiannaki
             self.object + 'a/']
61 2b19dc94 Sofia Papagiannaki
        for i in l:
62 2b19dc94 Sofia Papagiannaki
            self.upload_object(self.container, i)
63 2b19dc94 Sofia Papagiannaki
64 2b19dc94 Sofia Papagiannaki
    def _assert_read(self, object, authorized=None):
65 2b19dc94 Sofia Papagiannaki
        authorized = authorized or []
66 2b19dc94 Sofia Papagiannaki
        for user in self.users:
67 2b19dc94 Sofia Papagiannaki
            url = join_urls(
68 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, object)
69 2b19dc94 Sofia Papagiannaki
            r = self.head(url, user=user)
70 2b19dc94 Sofia Papagiannaki
            if user in authorized:
71 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 200)
72 2b19dc94 Sofia Papagiannaki
            else:
73 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 403)
74 2b19dc94 Sofia Papagiannaki
75 2b19dc94 Sofia Papagiannaki
            r = self.get(url, user=user)
76 2b19dc94 Sofia Papagiannaki
            if user in authorized:
77 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 200)
78 2b19dc94 Sofia Papagiannaki
            else:
79 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 403)
80 2b19dc94 Sofia Papagiannaki
81 2b19dc94 Sofia Papagiannaki
        # check inheritance
82 2b19dc94 Sofia Papagiannaki
        info = self.get_object_info(self.container, object)
83 2b19dc94 Sofia Papagiannaki
        is_directory = info['Content-Type'] in ('application/directory',
84 2b19dc94 Sofia Papagiannaki
                                                'application/folder')
85 2b19dc94 Sofia Papagiannaki
        prefix = object + '/'
86 2b19dc94 Sofia Papagiannaki
        derivatives = [o['name'] for o in self.list_objects(
87 2b19dc94 Sofia Papagiannaki
            self.container, prefix=object) if o['name'] != object]
88 2b19dc94 Sofia Papagiannaki
        for o in derivatives:
89 2b19dc94 Sofia Papagiannaki
            url = join_urls(self.pithos_path, self.user, self.container, o)
90 2b19dc94 Sofia Papagiannaki
            for user in self.users:
91 2b19dc94 Sofia Papagiannaki
                if (user in authorized and is_directory and
92 2b19dc94 Sofia Papagiannaki
                        o.startswith(prefix)):
93 2b19dc94 Sofia Papagiannaki
                    r = self.head(url, user=user)
94 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 200)
95 2b19dc94 Sofia Papagiannaki
96 2b19dc94 Sofia Papagiannaki
                    r = self.get(url, user=user)
97 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 200)
98 2b19dc94 Sofia Papagiannaki
                else:
99 2b19dc94 Sofia Papagiannaki
                    r = self.head(url, user=user)
100 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 403)
101 2b19dc94 Sofia Papagiannaki
102 2b19dc94 Sofia Papagiannaki
                    r = self.get(url, user=user)
103 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 403)
104 2b19dc94 Sofia Papagiannaki
105 2b19dc94 Sofia Papagiannaki
    def _assert_write(self, object, authorized=None):
106 2b19dc94 Sofia Papagiannaki
        authorized = authorized or []
107 2b19dc94 Sofia Papagiannaki
108 2b19dc94 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, self.container, object)
109 2b19dc94 Sofia Papagiannaki
        for user in self.users:
110 2b19dc94 Sofia Papagiannaki
            if user in authorized:
111 2b19dc94 Sofia Papagiannaki
                r = self.get(url)
112 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 200)
113 2b19dc94 Sofia Papagiannaki
                initial_data = r.content
114 2b19dc94 Sofia Papagiannaki
115 2b19dc94 Sofia Papagiannaki
                # test write access
116 2b19dc94 Sofia Papagiannaki
                data = get_random_data()
117 2b19dc94 Sofia Papagiannaki
                r = self.post(url, user=user, data=data,
118 2b19dc94 Sofia Papagiannaki
                              content_type='application/octet-stream',
119 2b19dc94 Sofia Papagiannaki
                              HTTP_CONTENT_LENGTH=str(len(data)),
120 2b19dc94 Sofia Papagiannaki
                              HTTP_CONTENT_RANGE='bytes */*')
121 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 204)
122 2b19dc94 Sofia Papagiannaki
123 2b19dc94 Sofia Papagiannaki
                # test read access
124 2b19dc94 Sofia Papagiannaki
                r = self.get(url, user=user)
125 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 200)
126 2b19dc94 Sofia Papagiannaki
                server_data = r.content
127 2b19dc94 Sofia Papagiannaki
                self.assertEqual(server_data, initial_data + data)
128 2b19dc94 Sofia Papagiannaki
            else:
129 2b19dc94 Sofia Papagiannaki
                # test write access
130 2b19dc94 Sofia Papagiannaki
                data = get_random_data()
131 2b19dc94 Sofia Papagiannaki
                r = self.post(url, user=user, data=data,
132 2b19dc94 Sofia Papagiannaki
                              content_type='application/octet-stream',
133 2b19dc94 Sofia Papagiannaki
                              HTTP_CONTENT_LENGTH=str(len(data)),
134 2b19dc94 Sofia Papagiannaki
                              HTTP_CONTENT_RANGE='bytes */*')
135 2b19dc94 Sofia Papagiannaki
                self.assertEqual(r.status_code, 403)
136 2b19dc94 Sofia Papagiannaki
137 2b19dc94 Sofia Papagiannaki
        # check inheritance
138 2b19dc94 Sofia Papagiannaki
        info = self.get_object_info(self.container, object)
139 2b19dc94 Sofia Papagiannaki
        is_directory = info['Content-Type'] in ('application/directory',
140 2b19dc94 Sofia Papagiannaki
                                                'application/folder')
141 2b19dc94 Sofia Papagiannaki
        prefix = object + '/'
142 2b19dc94 Sofia Papagiannaki
143 2b19dc94 Sofia Papagiannaki
        derivatives = [o['name'] for o in self.list_objects(
144 2b19dc94 Sofia Papagiannaki
            self.container, prefix=object) if o['name'] != object]
145 2b19dc94 Sofia Papagiannaki
146 2b19dc94 Sofia Papagiannaki
        for o in derivatives:
147 2b19dc94 Sofia Papagiannaki
            url = join_urls(self.pithos_path, self.user, self.container, o)
148 2b19dc94 Sofia Papagiannaki
            for user in self.users:
149 2b19dc94 Sofia Papagiannaki
                if (user in authorized and is_directory and
150 2b19dc94 Sofia Papagiannaki
                        o.startswith(prefix)):
151 2b19dc94 Sofia Papagiannaki
                    # get initial data
152 2b19dc94 Sofia Papagiannaki
                    r = self.get(url)
153 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 200)
154 2b19dc94 Sofia Papagiannaki
                    initial_data = r.content
155 2b19dc94 Sofia Papagiannaki
156 2b19dc94 Sofia Papagiannaki
                    # test write access
157 2b19dc94 Sofia Papagiannaki
                    data = get_random_data()
158 2b19dc94 Sofia Papagiannaki
                    r = self.post(url, user=user, data=data,
159 2b19dc94 Sofia Papagiannaki
                                  content_type='application/octet-stream',
160 2b19dc94 Sofia Papagiannaki
                                  HTTP_CONTENT_LENGTH=str(len(data)),
161 2b19dc94 Sofia Papagiannaki
                                  HTTP_CONTENT_RANGE='bytes */*')
162 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 204)
163 2b19dc94 Sofia Papagiannaki
164 2b19dc94 Sofia Papagiannaki
                    # test read access
165 2b19dc94 Sofia Papagiannaki
                    r = self.get(url, user=user)
166 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 200)
167 2b19dc94 Sofia Papagiannaki
                    server_data = r.content
168 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(server_data, initial_data + data)
169 2b19dc94 Sofia Papagiannaki
                    initial_data = server_data
170 2b19dc94 Sofia Papagiannaki
                else:
171 2b19dc94 Sofia Papagiannaki
                    # test write access
172 2b19dc94 Sofia Papagiannaki
                    data = get_random_data()
173 2b19dc94 Sofia Papagiannaki
                    r = self.post(url, user=user, data=data,
174 2b19dc94 Sofia Papagiannaki
                                  content_type='application/octet-stream',
175 2b19dc94 Sofia Papagiannaki
                                  HTTP_CONTENT_LENGTH=str(len(data)),
176 2b19dc94 Sofia Papagiannaki
                                  HTTP_CONTENT_RANGE='bytes */*')
177 2b19dc94 Sofia Papagiannaki
                    self.assertEqual(r.status_code, 403)
178 2b19dc94 Sofia Papagiannaki
179 2b19dc94 Sofia Papagiannaki
    def test_group_read(self):
180 2b19dc94 Sofia Papagiannaki
        group = self.groups.keys()[0]
181 2b19dc94 Sofia Papagiannaki
        members = self.groups[group]
182 2b19dc94 Sofia Papagiannaki
        url = join_urls(
183 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
184 2b19dc94 Sofia Papagiannaki
        r = self.post(
185 2b19dc94 Sofia Papagiannaki
            url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
186 2b19dc94 Sofia Papagiannaki
            HTTP_X_OBJECT_SHARING='read=%s:%s' % (self.user, group))
187 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
188 2b19dc94 Sofia Papagiannaki
        self._assert_read(self.object, authorized=members)
189 2b19dc94 Sofia Papagiannaki
190 2b19dc94 Sofia Papagiannaki
    def test_read_many(self):
191 2b19dc94 Sofia Papagiannaki
        l = self.users[:2]
192 2b19dc94 Sofia Papagiannaki
        url = join_urls(
193 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
194 2b19dc94 Sofia Papagiannaki
        r = self.post(
195 2b19dc94 Sofia Papagiannaki
            url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
196 2b19dc94 Sofia Papagiannaki
            HTTP_X_OBJECT_SHARING='read=%s' % ','.join(l))
197 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
198 2b19dc94 Sofia Papagiannaki
        self._assert_read(self.object, authorized=l)
199 2b19dc94 Sofia Papagiannaki
200 2b19dc94 Sofia Papagiannaki
    def test_read_by_everyone(self):
201 2b19dc94 Sofia Papagiannaki
        url = join_urls(
202 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
203 2b19dc94 Sofia Papagiannaki
        r = self.post(
204 2b19dc94 Sofia Papagiannaki
            url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
205 2b19dc94 Sofia Papagiannaki
            HTTP_X_OBJECT_SHARING='read=*')
206 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
207 2b19dc94 Sofia Papagiannaki
        self._assert_read(self.object, authorized=self.users)
208 2b19dc94 Sofia Papagiannaki
209 2b19dc94 Sofia Papagiannaki
    def test_read_directory(self):
210 2b19dc94 Sofia Papagiannaki
        url = join_urls(
211 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
212 2b19dc94 Sofia Papagiannaki
        for type in ('application/directory', 'application/folder'):
213 2b19dc94 Sofia Papagiannaki
            # change content type
214 2b19dc94 Sofia Papagiannaki
            r = self.put(url, data='', content_type=type,
215 2b19dc94 Sofia Papagiannaki
                         HTTP_X_MOVE_FROM='/%s/%s' % (
216 2b19dc94 Sofia Papagiannaki
                             self.container, self.object))
217 2b19dc94 Sofia Papagiannaki
            self.assertEqual(r.status_code, 201)
218 2b19dc94 Sofia Papagiannaki
            info = self.get_object_info(self.container, self.object)
219 2b19dc94 Sofia Papagiannaki
            self.assertEqual(info['Content-Type'], type)
220 2b19dc94 Sofia Papagiannaki
221 2b19dc94 Sofia Papagiannaki
            url = join_urls(
222 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, self.object)
223 2b19dc94 Sofia Papagiannaki
            r = self.post(
224 2b19dc94 Sofia Papagiannaki
                url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
225 2b19dc94 Sofia Papagiannaki
                HTTP_X_OBJECT_SHARING='read=*')
226 2b19dc94 Sofia Papagiannaki
            self._assert_read(self.object, self.users)
227 2b19dc94 Sofia Papagiannaki
228 2b19dc94 Sofia Papagiannaki
            url = join_urls(
229 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, self.object)
230 2b19dc94 Sofia Papagiannaki
            r = self.post(
231 2b19dc94 Sofia Papagiannaki
                url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
232 2b19dc94 Sofia Papagiannaki
                HTTP_X_OBJECT_SHARING='read=%s' % ','.join(
233 2b19dc94 Sofia Papagiannaki
                    self.users[:2]))
234 2b19dc94 Sofia Papagiannaki
            self._assert_read(self.object, self.users[:2])
235 2b19dc94 Sofia Papagiannaki
236 2b19dc94 Sofia Papagiannaki
            group = self.groups.keys()[0]
237 2b19dc94 Sofia Papagiannaki
            members = self.groups[group]
238 2b19dc94 Sofia Papagiannaki
            url = join_urls(
239 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, self.object)
240 2b19dc94 Sofia Papagiannaki
            r = self.post(
241 2b19dc94 Sofia Papagiannaki
                url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
242 2b19dc94 Sofia Papagiannaki
                HTTP_X_OBJECT_SHARING='read=%s:%s' % (self.user, group))
243 2b19dc94 Sofia Papagiannaki
            self._assert_read(self.object, members)
244 2b19dc94 Sofia Papagiannaki
245 2b19dc94 Sofia Papagiannaki
    def test_group_write(self):
246 2b19dc94 Sofia Papagiannaki
        group = self.groups.keys()[0]
247 2b19dc94 Sofia Papagiannaki
        members = self.groups[group]
248 2b19dc94 Sofia Papagiannaki
        url = join_urls(
249 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
250 2b19dc94 Sofia Papagiannaki
        r = self.post(
251 2b19dc94 Sofia Papagiannaki
            url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
252 2b19dc94 Sofia Papagiannaki
            HTTP_X_OBJECT_SHARING='write=%s:%s' % (self.user, group))
253 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
254 2b19dc94 Sofia Papagiannaki
        self._assert_write(self.object, authorized=members)
255 2b19dc94 Sofia Papagiannaki
256 2b19dc94 Sofia Papagiannaki
    def test_write_many(self):
257 2b19dc94 Sofia Papagiannaki
        l = self.users[:2]
258 2b19dc94 Sofia Papagiannaki
        url = join_urls(
259 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
260 2b19dc94 Sofia Papagiannaki
        r = self.post(
261 2b19dc94 Sofia Papagiannaki
            url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
262 2b19dc94 Sofia Papagiannaki
            HTTP_X_OBJECT_SHARING='write=%s' % ','.join(l))
263 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
264 2b19dc94 Sofia Papagiannaki
        self._assert_write(self.object, authorized=l)
265 2b19dc94 Sofia Papagiannaki
266 2b19dc94 Sofia Papagiannaki
    def test_write_by_everyone(self):
267 2b19dc94 Sofia Papagiannaki
        url = join_urls(
268 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
269 2b19dc94 Sofia Papagiannaki
        r = self.post(
270 2b19dc94 Sofia Papagiannaki
            url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
271 2b19dc94 Sofia Papagiannaki
            HTTP_X_OBJECT_SHARING='write=*')
272 2b19dc94 Sofia Papagiannaki
        self.assertEqual(r.status_code, 202)
273 2b19dc94 Sofia Papagiannaki
        self._assert_write(self.object, authorized=self.users)
274 2b19dc94 Sofia Papagiannaki
275 2b19dc94 Sofia Papagiannaki
    def test_write_directory(self):
276 2b19dc94 Sofia Papagiannaki
        url = join_urls(
277 2b19dc94 Sofia Papagiannaki
            self.pithos_path, self.user, self.container, self.object)
278 2b19dc94 Sofia Papagiannaki
        for type in ('application/directory', 'application/folder'):
279 2b19dc94 Sofia Papagiannaki
            # change content type
280 2b19dc94 Sofia Papagiannaki
            r = self.put(url, data='', content_type=type,
281 2b19dc94 Sofia Papagiannaki
                         HTTP_X_MOVE_FROM='/%s/%s' % (
282 2b19dc94 Sofia Papagiannaki
                             self.container, self.object))
283 2b19dc94 Sofia Papagiannaki
            self.assertEqual(r.status_code, 201)
284 2b19dc94 Sofia Papagiannaki
            info = self.get_object_info(self.container, self.object)
285 2b19dc94 Sofia Papagiannaki
            self.assertEqual(info['Content-Type'], type)
286 2b19dc94 Sofia Papagiannaki
287 2b19dc94 Sofia Papagiannaki
            url = join_urls(
288 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, self.object)
289 2b19dc94 Sofia Papagiannaki
            r = self.post(
290 2b19dc94 Sofia Papagiannaki
                url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
291 2b19dc94 Sofia Papagiannaki
                HTTP_X_OBJECT_SHARING='write=*')
292 2b19dc94 Sofia Papagiannaki
            self._assert_write(self.object, self.users)
293 2b19dc94 Sofia Papagiannaki
294 2b19dc94 Sofia Papagiannaki
            url = join_urls(
295 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, self.object)
296 2b19dc94 Sofia Papagiannaki
            r = self.post(
297 2b19dc94 Sofia Papagiannaki
                url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
298 2b19dc94 Sofia Papagiannaki
                HTTP_X_OBJECT_SHARING='write=%s' % ','.join(
299 2b19dc94 Sofia Papagiannaki
                    self.users[:2]))
300 2b19dc94 Sofia Papagiannaki
            self._assert_write(self.object, self.users[:2])
301 2b19dc94 Sofia Papagiannaki
302 2b19dc94 Sofia Papagiannaki
            group = self.groups.keys()[0]
303 2b19dc94 Sofia Papagiannaki
            members = self.groups[group]
304 2b19dc94 Sofia Papagiannaki
            url = join_urls(
305 2b19dc94 Sofia Papagiannaki
                self.pithos_path, self.user, self.container, self.object)
306 2b19dc94 Sofia Papagiannaki
            r = self.post(
307 2b19dc94 Sofia Papagiannaki
                url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
308 2b19dc94 Sofia Papagiannaki
                HTTP_X_OBJECT_SHARING='write=%s:%s' % (self.user, group))
309 2b19dc94 Sofia Papagiannaki
            self._assert_write(self.object, members)
310 f53483d8 Sofia Papagiannaki
311 f53483d8 Sofia Papagiannaki
    def test_not_allowed(self):
312 f53483d8 Sofia Papagiannaki
        cname = self.create_container()[0]
313 f53483d8 Sofia Papagiannaki
        oname, odata = self.upload_object(cname)[:-1]
314 f53483d8 Sofia Papagiannaki
315 f53483d8 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user)
316 f53483d8 Sofia Papagiannaki
        r = self.head(url, user='chuck')
317 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
318 f53483d8 Sofia Papagiannaki
        r = self.get(url, user='chuck')
319 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
320 f53483d8 Sofia Papagiannaki
        r = self.post(url, user='chuck', data=get_random_data())
321 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
322 f53483d8 Sofia Papagiannaki
323 f53483d8 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname)
324 f53483d8 Sofia Papagiannaki
        r = self.head(url, user='chuck')
325 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
326 f53483d8 Sofia Papagiannaki
        r = self.get(url, user='chuck')
327 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
328 f53483d8 Sofia Papagiannaki
        r = self.put(url, user='chuck', data=get_random_data())
329 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
330 f53483d8 Sofia Papagiannaki
        r = self.post(url, user='chuck', data=get_random_data())
331 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
332 f53483d8 Sofia Papagiannaki
        r = self.delete(url, user='chuck')
333 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
334 f53483d8 Sofia Papagiannaki
335 f53483d8 Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, oname)
336 f53483d8 Sofia Papagiannaki
        r = self.head(url, user='chuck')
337 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
338 f53483d8 Sofia Papagiannaki
        r = self.get(url, user='chuck')
339 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
340 f53483d8 Sofia Papagiannaki
        r = self.put(url, user='chuck', data=get_random_data())
341 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
342 f53483d8 Sofia Papagiannaki
        r = self.post(url, user='chuck', data=get_random_data())
343 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
344 f53483d8 Sofia Papagiannaki
        r = self.delete(url, user='chuck')
345 f53483d8 Sofia Papagiannaki
        self.assertEqual(r.status_code, 403)
346 84c67d8e Sofia Papagiannaki
347 84c67d8e Sofia Papagiannaki
    def test_multiple_inheritance(self):
348 84c67d8e Sofia Papagiannaki
        cname = self.container
349 84c67d8e Sofia Papagiannaki
        folder = self.create_folder(cname, HTTP_X_OBJECT_SHARING='write=*')[0]
350 84c67d8e Sofia Papagiannaki
        subfolder = self.create_folder(cname, '%s/%s' % (folder,
351 84c67d8e Sofia Papagiannaki
                                                         get_random_name()))[0]
352 84c67d8e Sofia Papagiannaki
        self.upload_object(cname, '%s/%s' % (subfolder, get_random_name()))
353 84c67d8e Sofia Papagiannaki
354 84c67d8e Sofia Papagiannaki
        self._assert_read(subfolder, self.users)
355 84c67d8e Sofia Papagiannaki
        self._assert_write(subfolder, self.users)
356 84c67d8e Sofia Papagiannaki
357 84c67d8e Sofia Papagiannaki
        # share object for read only
358 84c67d8e Sofia Papagiannaki
        url = join_urls(self.pithos_path, self.user, cname, subfolder)
359 84c67d8e Sofia Papagiannaki
        self.post(url, content_type='', HTTP_CONTENT_RANGE='bytes */*',
360 84c67d8e Sofia Papagiannaki
                  HTTP_X_OBJECT_SHARING='read=*')
361 84c67d8e Sofia Papagiannaki
362 84c67d8e Sofia Papagiannaki
        self._assert_read(subfolder, self.users)
363 84c67d8e Sofia Papagiannaki
        self._assert_write(subfolder, [])