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, []) |