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