1 # Copyright 2011-2012 GRNET S.A. All rights reserved.
3 # Redistribution and use in source and binary forms, with or
4 # without modification, are permitted provided that the following
7 # 1. Redistributions of source code must retain the above
8 # copyright notice, this list of conditions and the following
11 # 2. Redistributions in binary form must reproduce the above
12 # copyright notice, this list of conditions and the following
13 # disclaimer in the documentation and/or other materials
14 # provided with the distribution.
16 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 # POSSIBILITY OF SUCH DAMAGE.
29 # The views and conclusions contained in the software and
30 # documentation are those of the authors and should not be
31 # interpreted as representing official policies, either expressed
32 # or implied, of GRNET S.A.
36 from django.http import HttpResponse
37 from django.views.decorators.csrf import csrf_exempt
39 from synnefo.lib.astakos import get_user
41 from pithos.api.faults import (Fault, BadRequest, ItemNotFound)
42 from pithos.api.util import (put_object_headers, update_manifest_meta,
43 validate_modification_preconditions, validate_matching_preconditions,
44 object_data_response, api_method)
45 from pithos.api.short_url import decode_url
46 from pithos.api.settings import AUTHENTICATION_URL, AUTHENTICATION_USERS
49 logger = logging.getLogger(__name__)
53 def public_demux(request, v_public):
54 get_user(request, AUTHENTICATION_URL, AUTHENTICATION_USERS)
55 if request.method == 'HEAD':
56 return public_meta(request, v_public)
57 elif request.method == 'GET':
58 return public_read(request, v_public)
60 return method_not_allowed(request)
62 @api_method('HEAD', user_required=False)
63 def public_meta(request, v_public):
64 # Normal Response Codes: 204
65 # Error Response Codes: internalServerError (500),
70 v_account, v_container, v_object = request.backend.get_public(request.userid,
72 meta = request.backend.get_object_meta(request.userid, v_account,
73 v_container, v_object, 'pithos')
74 public = request.backend.get_object_public(request.userid, v_account,
75 v_container, v_object)
77 raise ItemNotFound('Object does not exist')
80 raise ItemNotFound('Object does not exist')
81 update_manifest_meta(request, v_account, meta)
83 response = HttpResponse(status=200)
84 put_object_headers(response, meta, True)
87 @api_method('GET', user_required=False)
88 def public_read(request, v_public):
89 # Normal Response Codes: 200, 206
90 # Error Response Codes: internalServerError (500),
91 # rangeNotSatisfiable (416),
92 # preconditionFailed (412),
98 v_account, v_container, v_object = request.backend.get_public(request.userid,
100 meta = request.backend.get_object_meta(request.userid, v_account,
101 v_container, v_object, 'pithos')
102 public = request.backend.get_object_public(request.userid, v_account,
103 v_container, v_object)
105 raise ItemNotFound('Object does not exist')
108 raise ItemNotFound('Object does not exist')
109 update_manifest_meta(request, v_account, meta)
111 # Evaluate conditions.
112 validate_modification_preconditions(request, meta)
114 validate_matching_preconditions(request, meta)
116 response = HttpResponse(status=304)
117 response['ETag'] = meta['ETag']
122 if 'X-Object-Manifest' in meta:
124 src_container, src_name = split_container_object_string('/' + meta['X-Object-Manifest'])
125 objects = request.backend.list_objects(request.userid, v_account,
126 src_container, prefix=src_name, virtual=False)
128 raise ItemNotFound('Object does not exist')
132 s, h = request.backend.get_object_hashmap(request.userid,
133 v_account, src_container, x[0], x[1])
137 raise ItemNotFound('Object does not exist')
140 s, h = request.backend.get_object_hashmap(request.userid, v_account,
141 v_container, v_object)
145 raise ItemNotFound('Object does not exist')
147 if 'Content-Disposition' not in meta:
148 name = v_object.rstrip('/').split('/')[-1]
151 meta['Content-Disposition'] = 'attachment; filename=%s' % (name,)
153 return object_data_response(request, sizes, hashmaps, meta, True)
155 @api_method(user_required=False)
156 def method_not_allowed(request, **v_args):
157 raise ItemNotFound('Object does not exist')