Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.1 kB)

1 65bbcd43 Christos Stavrakakis
# Copyright 2011-2013 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
from django.http import HttpResponse
35 8fbfd37b Antony Chazapis
from django.views.decorators.csrf import csrf_exempt
36 f7b1d2af Antony Chazapis
37 65bbcd43 Christos Stavrakakis
from snf_django.lib import api
38 bd40abfa Christos Stavrakakis
from snf_django.lib.api import faults
39 cf441bae Antony Chazapis
40 efb1f3d3 Sofia Papagiannaki
from pithos.api.settings import UNSAFE_DOMAIN, UPDATE_MD5
41 83b4c5fa Antony Chazapis
from pithos.api.util import (put_object_headers, update_manifest_meta,
42 e30537f1 Sofia Papagiannaki
                             validate_modification_preconditions,
43 e30537f1 Sofia Papagiannaki
                             validate_matching_preconditions,
44 e30537f1 Sofia Papagiannaki
                             object_data_response, api_method,
45 46662ee6 Kostas Papadimitriou
                             split_container_object_string, restrict_to_host)
46 f7b1d2af Antony Chazapis
47 65bbcd43 Christos Stavrakakis
import logging
48 f7b1d2af Antony Chazapis
logger = logging.getLogger(__name__)
49 f7b1d2af Antony Chazapis
50 f7b1d2af Antony Chazapis
51 8fbfd37b Antony Chazapis
@csrf_exempt
52 4bf0ab85 Sofia Papagiannaki
@restrict_to_host(UNSAFE_DOMAIN)
53 bb4eafc6 Antony Chazapis
def public_demux(request, v_public):
54 f7b1d2af Antony Chazapis
    if request.method == 'HEAD':
55 bb4eafc6 Antony Chazapis
        return public_meta(request, v_public)
56 f7b1d2af Antony Chazapis
    elif request.method == 'GET':
57 bb4eafc6 Antony Chazapis
        return public_read(request, v_public)
58 f7b1d2af Antony Chazapis
    else:
59 55616866 Kostas Papadimitriou
        return api.api_method_not_allowed(request)
60 f7b1d2af Antony Chazapis
61 2715ade4 Sofia Papagiannaki
62 d630c78b Sofia Papagiannaki
@api_method(http_method="HEAD", token_required=False, user_required=False,
63 d630c78b Sofia Papagiannaki
            logger=logger)
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 d630c78b Sofia Papagiannaki
    request.user_uniq = None
71 f7b1d2af Antony Chazapis
    try:
72 2715ade4 Sofia Papagiannaki
        v_account, v_container, v_object = request.backend.get_public(
73 2715ade4 Sofia Papagiannaki
            request.user_uniq,
74 56f3c759 Sofia Papagiannaki
            v_public)
75 61efb530 Antony Chazapis
        meta = request.backend.get_object_meta(request.user_uniq, v_account,
76 2715ade4 Sofia Papagiannaki
                                               v_container, v_object, 'pithos')
77 2715ade4 Sofia Papagiannaki
        public = request.backend.get_object_public(
78 2715ade4 Sofia Papagiannaki
            request.user_uniq, v_account,
79 2715ade4 Sofia Papagiannaki
            v_container, v_object)
80 cca6c617 Antony Chazapis
    except:
81 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
82 2715ade4 Sofia Papagiannaki
83 e0f916bb Antony Chazapis
    if not public:
84 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
85 8cb45c13 Antony Chazapis
    update_manifest_meta(request, v_account, meta)
86 2715ade4 Sofia Papagiannaki
87 4a1c29ea Antony Chazapis
    response = HttpResponse(status=200)
88 4a1c29ea Antony Chazapis
    put_object_headers(response, meta, True)
89 f7b1d2af Antony Chazapis
    return response
90 f7b1d2af Antony Chazapis
91 2715ade4 Sofia Papagiannaki
92 d630c78b Sofia Papagiannaki
@api_method(http_method="GET", token_required=False, user_required=False,
93 d630c78b Sofia Papagiannaki
            logger=logger)
94 bb4eafc6 Antony Chazapis
def public_read(request, v_public):
95 f7b1d2af Antony Chazapis
    # Normal Response Codes: 200, 206
96 08de868d Antony Chazapis
    # Error Response Codes: internalServerError (500),
97 f7b1d2af Antony Chazapis
    #                       rangeNotSatisfiable (416),
98 f7b1d2af Antony Chazapis
    #                       preconditionFailed (412),
99 f7b1d2af Antony Chazapis
    #                       itemNotFound (404),
100 f7b1d2af Antony Chazapis
    #                       badRequest (400),
101 f7b1d2af Antony Chazapis
    #                       notModified (304)
102 56f3c759 Sofia Papagiannaki
103 d630c78b Sofia Papagiannaki
    request.user_uniq = None
104 f7b1d2af Antony Chazapis
    try:
105 2715ade4 Sofia Papagiannaki
        v_account, v_container, v_object = request.backend.get_public(
106 2715ade4 Sofia Papagiannaki
            request.user_uniq,
107 56f3c759 Sofia Papagiannaki
            v_public)
108 61efb530 Antony Chazapis
        meta = request.backend.get_object_meta(request.user_uniq, v_account,
109 2715ade4 Sofia Papagiannaki
                                               v_container, v_object, 'pithos')
110 2715ade4 Sofia Papagiannaki
        public = request.backend.get_object_public(
111 2715ade4 Sofia Papagiannaki
            request.user_uniq, v_account,
112 2715ade4 Sofia Papagiannaki
            v_container, v_object)
113 cca6c617 Antony Chazapis
    except:
114 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
115 2715ade4 Sofia Papagiannaki
116 e0f916bb Antony Chazapis
    if not public:
117 bd40abfa Christos Stavrakakis
        raise faults.ItemNotFound('Object does not exist')
118 8cb45c13 Antony Chazapis
    update_manifest_meta(request, v_account, meta)
119 2715ade4 Sofia Papagiannaki
120 f7b1d2af Antony Chazapis
    # Evaluate conditions.
121 f7b1d2af Antony Chazapis
    validate_modification_preconditions(request, meta)
122 f7b1d2af Antony Chazapis
    try:
123 f7b1d2af Antony Chazapis
        validate_matching_preconditions(request, meta)
124 bd40abfa Christos Stavrakakis
    except faults.NotModified:
125 f7b1d2af Antony Chazapis
        response = HttpResponse(status=304)
126 efb1f3d3 Sofia Papagiannaki
        response['ETag'] = meta['hash'] if not UPDATE_MD5 else meta['checksum']
127 f7b1d2af Antony Chazapis
        return response
128 2715ade4 Sofia Papagiannaki
129 8cb45c13 Antony Chazapis
    sizes = []
130 8cb45c13 Antony Chazapis
    hashmaps = []
131 8cb45c13 Antony Chazapis
    if 'X-Object-Manifest' in meta:
132 8cb45c13 Antony Chazapis
        try:
133 2715ade4 Sofia Papagiannaki
            src_container, src_name = split_container_object_string(
134 2715ade4 Sofia Papagiannaki
                '/' + meta['X-Object-Manifest'])
135 2715ade4 Sofia Papagiannaki
            objects = request.backend.list_objects(
136 2715ade4 Sofia Papagiannaki
                request.user_uniq, v_account,
137 2715ade4 Sofia Papagiannaki
                src_container, prefix=src_name, virtual=False)
138 cca6c617 Antony Chazapis
        except:
139 bd40abfa Christos Stavrakakis
            raise faults.ItemNotFound('Object does not exist')
140 2715ade4 Sofia Papagiannaki
141 8cb45c13 Antony Chazapis
        try:
142 8cb45c13 Antony Chazapis
            for x in objects:
143 61efb530 Antony Chazapis
                s, h = request.backend.get_object_hashmap(request.user_uniq,
144 65bbcd43 Christos Stavrakakis
                                                          v_account,
145 65bbcd43 Christos Stavrakakis
                                                          src_container,
146 65bbcd43 Christos Stavrakakis
                                                          x[0], x[1])
147 8cb45c13 Antony Chazapis
                sizes.append(s)
148 8cb45c13 Antony Chazapis
                hashmaps.append(h)
149 cca6c617 Antony Chazapis
        except:
150 bd40abfa Christos Stavrakakis
            raise faults.ItemNotFound('Object does not exist')
151 8cb45c13 Antony Chazapis
    else:
152 8cb45c13 Antony Chazapis
        try:
153 2715ade4 Sofia Papagiannaki
            s, h = request.backend.get_object_hashmap(
154 2715ade4 Sofia Papagiannaki
                request.user_uniq, v_account,
155 2715ade4 Sofia Papagiannaki
                v_container, v_object)
156 8cb45c13 Antony Chazapis
            sizes.append(s)
157 8cb45c13 Antony Chazapis
            hashmaps.append(h)
158 cca6c617 Antony Chazapis
        except:
159 bd40abfa Christos Stavrakakis
            raise faults.ItemNotFound('Object does not exist')
160 8cb45c13 Antony Chazapis
    return object_data_response(request, sizes, hashmaps, meta, True)