Revision aa153e99

/dev/null
1
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or
4
# without modification, are permitted provided that the following
5
# conditions are met:
6
#
7
#   1. Redistributions of source code must retain the above
8
#      copyright notice, this list of conditions and the following
9
#      disclaimer.
10
#
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.
15
#
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.
28
#
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.
33

  
34
import logging
35

  
36
import urlparse
37

  
38
from django.http import (
39
    HttpResponseNotFound, HttpResponseRedirect, HttpResponse)
40
from django.utils.http import urlencode
41
from django.views.decorators.csrf import csrf_exempt
42
from django.utils import simplejson as json
43

  
44
from pithos.api.settings import ASTAKOS_URL
45

  
46
from astakosclient import AstakosClient
47
from astakosclient.errors import AstakosClientException
48

  
49
logger = logging.getLogger(__name__)
50

  
51
USER_CATALOG_URL = "/astakos/api/user_catalogs"
52
USER_FEEDBACK_URL = "/astakos/api/feedback"
53
USER_LOGIN_URL = urlparse.urljoin(ASTAKOS_URL, "login")
54

  
55

  
56
def delegate_to_login_service(request):
57
    url = USER_LOGIN_URL
58
    if not url:
59
        return HttpResponseNotFound()
60

  
61
    p = urlparse.urlparse(url)
62
    if request.is_secure():
63
        proto = 'https://'
64
    else:
65
        proto = 'http://'
66
    params = dict([(k, v) for k, v in request.GET.items()])
67
    uri = proto + p.netloc + p.path + '?' + urlencode(params)
68
    return HttpResponseRedirect(uri)
69

  
70

  
71
@csrf_exempt
72
def delegate_to_feedback_service(request):
73
    token = request.META.get('HTTP_X_AUTH_TOKEN')
74
    body = request.raw_post_data
75
    method = request.method
76
    astakos = AstakosClient(ASTAKOS_URL, retry=2, use_pool=True, logger=logger)
77
    try:
78
        data = astakos._call_astakos(token, USER_FEEDBACK_URL, None, body,
79
                                     method)
80
        status = 200
81
    except AstakosClientException, e:
82
        status = e.status
83
        details = json.loads(e.details)
84
        _, d = details.popitem()
85
        data = d.get('message')
86
    return HttpResponse(data, status=status)
87

  
88

  
89
@csrf_exempt
90
def delegate_to_user_catalogs_service(request):
91
    token = request.META.get('HTTP_X_AUTH_TOKEN')
92
    headers = {'content-type': 'application/json'}
93
    body = request.raw_post_data
94
    method = request.method
95
    astakos = AstakosClient(ASTAKOS_URL, retry=2, use_pool=True, logger=logger)
96
    try:
97
        data = astakos._call_astakos(token, USER_CATALOG_URL, headers, body,
98
                                     method)
99
        data = json.dumps(data)
100
        status = 200
101
    except AstakosClientException, e:
102
        status = e.status
103
        details = json.loads(e.details)
104
        _, d = details.popitem()
105
        data = d.get('message')
106
    return HttpResponse(data, status=status)
b/snf-pithos-app/pithos/api/urls.py
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33 33

  
34
from functools import partial
35

  
34 36
from django.conf.urls.defaults import include, patterns
37
from django.views.decorators.csrf import csrf_exempt
38

  
39
from snf_django.lib.api.proxy import proxy
35 40

  
36 41
import pithos.api.settings as settings
37 42

  
43
astakos_proxy = partial(proxy, target=settings.ASTAKOS_URL)
44

  
38 45
# TODO: This only works when in this order.
39 46
api_urlpatterns = patterns(
40 47
    'pithos.api.functions',
......
54 61
if settings.PROXY_USER_SERVICES:
55 62
    urlpatterns += patterns(
56 63
        '',
57
        (r'^login/?$', 'pithos.api.delegate.delegate_to_login_service'),
58
        (r'^feedback/?$', 'pithos.api.delegate.delegate_to_feedback_service'),
59
        (r'^user_catalogs/?$', 'pithos.api.delegate.delegate_to_user_catalogs_service'))
64
        (r'^login/?$', csrf_exempt(astakos_proxy)),
65
        (r'^feedback/?$', csrf_exempt(astakos_proxy)),
66
        (r'^user_catalogs/?$', csrf_exempt(astakos_proxy)),
67
        (r'^astakos/api/', csrf_exempt(astakos_proxy))
68
    )

Also available in: Unified diff