Revision 3436eeb0 pithos/api/util.py
b/pithos/api/util.py | ||
---|---|---|
129 | 129 |
meta['Content-Disposition'] = request.META['HTTP_CONTENT_DISPOSITION'] |
130 | 130 |
if request.META.get('HTTP_X_OBJECT_MANIFEST'): |
131 | 131 |
meta['X-Object-Manifest'] = request.META['HTTP_X_OBJECT_MANIFEST'] |
132 |
if request.META.get('HTTP_X_OBJECT_PUBLIC'): |
|
133 |
meta['X-Object-Public'] = request.META['HTTP_X_OBJECT_PUBLIC'] |
|
134 | 132 |
return meta |
135 | 133 |
|
136 | 134 |
def put_object_meta(response, meta, public=False): |
... | ... | |
145 | 143 |
response['X-Object-Version-Timestamp'] = meta['version_timestamp'] |
146 | 144 |
for k in [x for x in meta.keys() if x.startswith('X-Object-Meta-')]: |
147 | 145 |
response[k.encode('utf-8')] = meta[k].encode('utf-8') |
148 |
for k in ('Content-Encoding', 'Content-Disposition', 'X-Object-Manifest', 'X-Object-Public'):
|
|
146 |
for k in ('Content-Encoding', 'Content-Disposition', 'X-Object-Manifest', 'X-Object-Sharing'):
|
|
149 | 147 |
if k in meta: |
150 | 148 |
response[k] = meta[k] |
151 | 149 |
else: |
... | ... | |
174 | 172 |
md5.update(hash) |
175 | 173 |
meta['hash'] = md5.hexdigest().lower() |
176 | 174 |
|
175 |
def format_permissions(permissions): |
|
176 |
ret = [] |
|
177 |
if 'public' in permissions: |
|
178 |
ret.append('public') |
|
179 |
if 'private' in permissions: |
|
180 |
ret.append('private') |
|
181 |
r = ','.join(permissions.get('read', [])) |
|
182 |
if r: |
|
183 |
ret.append('read=' + r) |
|
184 |
w = ','.join(permissions.get('write', [])) |
|
185 |
if w: |
|
186 |
ret.append('write=' + w) |
|
187 |
return '; '.join(ret) |
|
188 |
|
|
177 | 189 |
def validate_modification_preconditions(request, meta): |
178 | 190 |
"""Check that the modified timestamp conforms with the preconditions set.""" |
179 | 191 |
|
... | ... | |
221 | 233 |
"""Copy or move an object.""" |
222 | 234 |
|
223 | 235 |
meta = get_object_meta(request) |
236 |
permissions = get_sharing(request) |
|
224 | 237 |
# Keep previous values of 'Content-Type' (if a new one is absent) and 'hash'. |
225 | 238 |
try: |
226 | 239 |
src_meta = backend.get_object_meta(request.user, v_account, src_container, src_name) |
... | ... | |
234 | 247 |
|
235 | 248 |
try: |
236 | 249 |
if move: |
237 |
backend.move_object(request.user, v_account, src_container, src_name, dest_container, dest_name, meta, True) |
|
250 |
backend.move_object(request.user, v_account, src_container, src_name, dest_container, dest_name, meta, True, permissions)
|
|
238 | 251 |
else: |
239 | 252 |
src_version = request.META.get('HTTP_X_SOURCE_VERSION') |
240 |
backend.copy_object(request.user, v_account, src_container, src_name, dest_container, dest_name, meta, True, src_version) |
|
253 |
backend.copy_object(request.user, v_account, src_container, src_name, dest_container, dest_name, meta, True, permissions, src_version)
|
|
241 | 254 |
except NameError: |
242 | 255 |
raise ItemNotFound('Container or object does not exist') |
256 |
except ValueError: |
|
257 |
raise BadRequest('Invalid sharing header') |
|
258 |
except AttributeError: |
|
259 |
raise Conflict('Sharing already set above or below this path in the hierarchy') |
|
243 | 260 |
|
244 | 261 |
def get_int_parameter(request, name): |
245 | 262 |
p = request.GET.get(name) |
... | ... | |
341 | 358 |
length = upto - offset + 1 |
342 | 359 |
return (offset, length, total) |
343 | 360 |
|
361 |
def get_sharing(request): |
|
362 |
"""Parse an X-Object-Sharing header from the request. |
|
363 |
|
|
364 |
Raises BadRequest on error. |
|
365 |
""" |
|
366 |
|
|
367 |
permissions = request.META.get('HTTP_X_OBJECT_SHARING') |
|
368 |
if permissions is None or permissions == '': |
|
369 |
return None |
|
370 |
|
|
371 |
ret = {} |
|
372 |
for perm in (x.replace(' ','') for x in permissions.split(';')): |
|
373 |
if perm == 'public': |
|
374 |
ret['public'] = True |
|
375 |
continue |
|
376 |
elif perm == 'private': |
|
377 |
ret['private'] = True |
|
378 |
continue |
|
379 |
elif perm.startswith('read='): |
|
380 |
ret['read'] = [v.replace(' ','') for v in perm[5:].split(',')] |
|
381 |
if len(ret['read']) == 0: |
|
382 |
raise BadRequest('Bad X-Object-Sharing header value') |
|
383 |
elif perm.startswith('write='): |
|
384 |
ret['write'] = [v.replace(' ','') for v in perm[6:].split(',')] |
|
385 |
if len(ret['write']) == 0: |
|
386 |
raise BadRequest('Bad X-Object-Sharing header value') |
|
387 |
else: |
|
388 |
raise BadRequest('Bad X-Object-Sharing header value') |
|
389 |
return ret |
|
390 |
|
|
344 | 391 |
def raw_input_socket(request): |
345 | 392 |
"""Return the socket for reading the rest of the request.""" |
346 | 393 |
|
Also available in: Unified diff