Statistics
| Branch: | Tag: | Revision:

root / snf-pithos-app / pithos / api / public.py @ ccfd4e44

History | View | Annotate | Download (6.1 kB)

1 2e662088 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 2715ade4 Sofia Papagiannaki
#
3 f7b1d2af Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 f7b1d2af Antony Chazapis
# without modification, are permitted provided that the following
5 f7b1d2af Antony Chazapis
# conditions are met:
6 2715ade4 Sofia Papagiannaki
#
7 f7b1d2af Antony Chazapis
#   1. Redistributions of source code must retain the above
8 f7b1d2af Antony Chazapis
#      copyright notice, this list of conditions and the following
9 f7b1d2af Antony Chazapis
#      disclaimer.
10 2715ade4 Sofia Papagiannaki
#
11 f7b1d2af Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 f7b1d2af Antony Chazapis
#      copyright notice, this list of conditions and the following
13 f7b1d2af Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 f7b1d2af Antony Chazapis
#      provided with the distribution.
15 2715ade4 Sofia Papagiannaki
#
16 f7b1d2af Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 f7b1d2af Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 f7b1d2af Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 f7b1d2af Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 f7b1d2af Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 f7b1d2af Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 f7b1d2af Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 f7b1d2af Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 f7b1d2af Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 f7b1d2af Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 f7b1d2af Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 f7b1d2af Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 2715ade4 Sofia Papagiannaki
#
29 f7b1d2af Antony Chazapis
# The views and conclusions contained in the software and
30 f7b1d2af Antony Chazapis
# documentation are those of the authors and should not be
31 f7b1d2af Antony Chazapis
# interpreted as representing official policies, either expressed
32 f7b1d2af Antony Chazapis
# or implied, of GRNET S.A.
33 f7b1d2af Antony Chazapis
34 f7b1d2af Antony Chazapis
import logging
35 f7b1d2af Antony Chazapis
36 f7b1d2af Antony Chazapis
from django.http import HttpResponse
37 8fbfd37b Antony Chazapis
from django.views.decorators.csrf import csrf_exempt
38 f7b1d2af Antony Chazapis
39 6e147ecc Antony Chazapis
from synnefo.lib.astakos import get_user
40 cf441bae Antony Chazapis
41 7bef5750 Antony Chazapis
from pithos.api.faults import (Fault, BadRequest, ItemNotFound)
42 83b4c5fa Antony Chazapis
from pithos.api.util import (put_object_headers, update_manifest_meta,
43 2715ade4 Sofia Papagiannaki
                             validate_modification_preconditions, validate_matching_preconditions,
44 2715ade4 Sofia Papagiannaki
                             object_data_response, api_method)
45 bb4eafc6 Antony Chazapis
from pithos.api.short_url import decode_url
46 cf441bae Antony Chazapis
from pithos.api.settings import AUTHENTICATION_URL, AUTHENTICATION_USERS
47 f7b1d2af Antony Chazapis
48 f7b1d2af Antony Chazapis
49 f7b1d2af Antony Chazapis
logger = logging.getLogger(__name__)
50 f7b1d2af Antony Chazapis
51 f7b1d2af Antony Chazapis
52 8fbfd37b Antony Chazapis
@csrf_exempt
53 bb4eafc6 Antony Chazapis
def public_demux(request, v_public):
54 cf441bae Antony Chazapis
    get_user(request, AUTHENTICATION_URL, AUTHENTICATION_USERS)
55 f7b1d2af Antony Chazapis
    if request.method == 'HEAD':
56 bb4eafc6 Antony Chazapis
        return public_meta(request, v_public)
57 f7b1d2af Antony Chazapis
    elif request.method == 'GET':
58 bb4eafc6 Antony Chazapis
        return public_read(request, v_public)
59 f7b1d2af Antony Chazapis
    else:
60 f7b1d2af Antony Chazapis
        return method_not_allowed(request)
61 f7b1d2af Antony Chazapis
62 2715ade4 Sofia Papagiannaki
63 297513ba Antony Chazapis
@api_method('HEAD', user_required=False)
64 bb4eafc6 Antony Chazapis
def public_meta(request, v_public):
65 f7b1d2af Antony Chazapis
    # Normal Response Codes: 204
66 08de868d Antony Chazapis
    # Error Response Codes: internalServerError (500),
67 f7b1d2af Antony Chazapis
    #                       itemNotFound (404),
68 f7b1d2af Antony Chazapis
    #                       badRequest (400)
69 2715ade4 Sofia Papagiannaki
70 f7b1d2af Antony Chazapis
    try:
71 2715ade4 Sofia Papagiannaki
        v_account, v_container, v_object = request.backend.get_public(
72 2715ade4 Sofia Papagiannaki
            request.user_uniq,
73 2715ade4 Sofia Papagiannaki
            decode_url(v_public))
74 61efb530 Antony Chazapis
        meta = request.backend.get_object_meta(request.user_uniq, v_account,
75 2715ade4 Sofia Papagiannaki
                                               v_container, v_object, 'pithos')
76 2715ade4 Sofia Papagiannaki
        public = request.backend.get_object_public(
77 2715ade4 Sofia Papagiannaki
            request.user_uniq, v_account,
78 2715ade4 Sofia Papagiannaki
            v_container, v_object)
79 cca6c617 Antony Chazapis
    except:
80 f7b1d2af Antony Chazapis
        raise ItemNotFound('Object does not exist')
81 2715ade4 Sofia Papagiannaki
82 e0f916bb Antony Chazapis
    if not public:
83 f7b1d2af Antony Chazapis
        raise ItemNotFound('Object does not exist')
84 8cb45c13 Antony Chazapis
    update_manifest_meta(request, v_account, meta)
85 2715ade4 Sofia Papagiannaki
86 4a1c29ea Antony Chazapis
    response = HttpResponse(status=200)
87 4a1c29ea Antony Chazapis
    put_object_headers(response, meta, True)
88 f7b1d2af Antony Chazapis
    return response
89 f7b1d2af Antony Chazapis
90 2715ade4 Sofia Papagiannaki
91 297513ba Antony Chazapis
@api_method('GET', user_required=False)
92 bb4eafc6 Antony Chazapis
def public_read(request, v_public):
93 f7b1d2af Antony Chazapis
    # Normal Response Codes: 200, 206
94 08de868d Antony Chazapis
    # Error Response Codes: internalServerError (500),
95 f7b1d2af Antony Chazapis
    #                       rangeNotSatisfiable (416),
96 f7b1d2af Antony Chazapis
    #                       preconditionFailed (412),
97 f7b1d2af Antony Chazapis
    #                       itemNotFound (404),
98 f7b1d2af Antony Chazapis
    #                       badRequest (400),
99 f7b1d2af Antony Chazapis
    #                       notModified (304)
100 f7b1d2af Antony Chazapis
    try:
101 2715ade4 Sofia Papagiannaki
        v_account, v_container, v_object = request.backend.get_public(
102 2715ade4 Sofia Papagiannaki
            request.user_uniq,
103 2715ade4 Sofia Papagiannaki
            decode_url(v_public))
104 61efb530 Antony Chazapis
        meta = request.backend.get_object_meta(request.user_uniq, v_account,
105 2715ade4 Sofia Papagiannaki
                                               v_container, v_object, 'pithos')
106 2715ade4 Sofia Papagiannaki
        public = request.backend.get_object_public(
107 2715ade4 Sofia Papagiannaki
            request.user_uniq, v_account,
108 2715ade4 Sofia Papagiannaki
            v_container, v_object)
109 cca6c617 Antony Chazapis
    except:
110 f7b1d2af Antony Chazapis
        raise ItemNotFound('Object does not exist')
111 2715ade4 Sofia Papagiannaki
112 e0f916bb Antony Chazapis
    if not public:
113 f7b1d2af Antony Chazapis
        raise ItemNotFound('Object does not exist')
114 8cb45c13 Antony Chazapis
    update_manifest_meta(request, v_account, meta)
115 2715ade4 Sofia Papagiannaki
116 f7b1d2af Antony Chazapis
    # Evaluate conditions.
117 f7b1d2af Antony Chazapis
    validate_modification_preconditions(request, meta)
118 f7b1d2af Antony Chazapis
    try:
119 f7b1d2af Antony Chazapis
        validate_matching_preconditions(request, meta)
120 f7b1d2af Antony Chazapis
    except NotModified:
121 f7b1d2af Antony Chazapis
        response = HttpResponse(status=304)
122 4a1c29ea Antony Chazapis
        response['ETag'] = meta['ETag']
123 f7b1d2af Antony Chazapis
        return response
124 2715ade4 Sofia Papagiannaki
125 8cb45c13 Antony Chazapis
    sizes = []
126 8cb45c13 Antony Chazapis
    hashmaps = []
127 8cb45c13 Antony Chazapis
    if 'X-Object-Manifest' in meta:
128 8cb45c13 Antony Chazapis
        try:
129 2715ade4 Sofia Papagiannaki
            src_container, src_name = split_container_object_string(
130 2715ade4 Sofia Papagiannaki
                '/' + meta['X-Object-Manifest'])
131 2715ade4 Sofia Papagiannaki
            objects = request.backend.list_objects(
132 2715ade4 Sofia Papagiannaki
                request.user_uniq, v_account,
133 2715ade4 Sofia Papagiannaki
                src_container, prefix=src_name, virtual=False)
134 cca6c617 Antony Chazapis
        except:
135 8cb45c13 Antony Chazapis
            raise ItemNotFound('Object does not exist')
136 2715ade4 Sofia Papagiannaki
137 8cb45c13 Antony Chazapis
        try:
138 8cb45c13 Antony Chazapis
            for x in objects:
139 61efb530 Antony Chazapis
                s, h = request.backend.get_object_hashmap(request.user_uniq,
140 2715ade4 Sofia Papagiannaki
                                                          v_account, src_container, x[0], x[1])
141 8cb45c13 Antony Chazapis
                sizes.append(s)
142 8cb45c13 Antony Chazapis
                hashmaps.append(h)
143 cca6c617 Antony Chazapis
        except:
144 8cb45c13 Antony Chazapis
            raise ItemNotFound('Object does not exist')
145 8cb45c13 Antony Chazapis
    else:
146 8cb45c13 Antony Chazapis
        try:
147 2715ade4 Sofia Papagiannaki
            s, h = request.backend.get_object_hashmap(
148 2715ade4 Sofia Papagiannaki
                request.user_uniq, v_account,
149 2715ade4 Sofia Papagiannaki
                v_container, v_object)
150 8cb45c13 Antony Chazapis
            sizes.append(s)
151 8cb45c13 Antony Chazapis
            hashmaps.append(h)
152 cca6c617 Antony Chazapis
        except:
153 8cb45c13 Antony Chazapis
            raise ItemNotFound('Object does not exist')
154 2715ade4 Sofia Papagiannaki
155 bb4eafc6 Antony Chazapis
    if 'Content-Disposition' not in meta:
156 bb4eafc6 Antony Chazapis
        name = v_object.rstrip('/').split('/')[-1]
157 bb4eafc6 Antony Chazapis
        if not name:
158 bb4eafc6 Antony Chazapis
            name = v_public
159 bb4eafc6 Antony Chazapis
        meta['Content-Disposition'] = 'attachment; filename=%s' % (name,)
160 2715ade4 Sofia Papagiannaki
161 8cb45c13 Antony Chazapis
    return object_data_response(request, sizes, hashmaps, meta, True)
162 f7b1d2af Antony Chazapis
163 2715ade4 Sofia Papagiannaki
164 297513ba Antony Chazapis
@api_method(user_required=False)
165 83b4c5fa Antony Chazapis
def method_not_allowed(request, **v_args):
166 f7b1d2af Antony Chazapis
    raise ItemNotFound('Object does not exist')