Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / api / tokens.py @ d29f0371

History | View | Annotate | Download (4 kB)

1
# Copyright 2011-2013 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
from collections import defaultdict
35

    
36
from django.views.decorators.csrf import csrf_exempt
37

    
38
from snf_django.lib.api import faults, utils, api_method
39

    
40
from astakos.im.models import Service, AstakosUser
41
from .util import json_response, xml_response, validate_user,\
42
    get_content_length
43

    
44
import logging
45
logger = logging.getLogger(__name__)
46

    
47

    
48
@csrf_exempt
49
@api_method(http_method="POST", token_required=False, user_required=False,
50
            logger=logger)
51
def authenticate(request):
52
    content_length = get_content_length(request)
53
    public_mode = True if not content_length else False
54

    
55
    d = defaultdict(dict)
56
    if not public_mode:
57
        req = utils.get_request_dict(request)
58

    
59
        uuid = None
60
        try:
61
            token_id = req['auth']['token']['id']
62
        except KeyError:
63
            try:
64
                token_id = req['auth']['passwordCredentials']['password']
65
                uuid = req['auth']['passwordCredentials']['username']
66
            except KeyError:
67
                raise faults.BadRequest('Malformed request')
68

    
69
        if token_id is None:
70
            raise faults.BadRequest('Malformed request')
71

    
72
        try:
73
            user = AstakosUser.objects.get(auth_token=token_id)
74
        except AstakosUser.DoesNotExist:
75
            raise faults.Unauthorized('Invalid token')
76

    
77
        validate_user(user)
78

    
79
        if uuid is not None:
80
            if user.uuid != uuid:
81
                raise faults.Unauthorized('Invalid credentials')
82

    
83
        d["access"]["token"] = {
84
            "id": user.auth_token,
85
            "expires": utils.isoformat(user.auth_token_expires),
86
            "tenant": {"id": user.uuid, "name": user.realname}}
87
        d["access"]["user"] = {
88
            "id": user.uuid, 'name': user.realname,
89
            "roles": list(user.groups.values("id", "name")),
90
            "roles_links": []}
91

    
92
    d["access"]["serviceCatalog"] = []
93
    append = d["access"]["serviceCatalog"].append
94
    for s in Service.objects.all().order_by("id"):
95
        endpoints = []
96
        for l in [e.data.values('key', 'value') for e in s.endpoints.all()]:
97
            endpoint = dict((d['key'], d['value']) for d in l)
98
            endpoints.append(endpoint)
99
        append({"name": s.name,
100
                "type": s.type,
101
                "SNF:uiURL": s.component.url,
102
                "endpoints": endpoints,
103
                "endpoints_links": []})
104

    
105
    if request.serialization == 'xml':
106
        return xml_response({'d': d}, 'api/access.xml')
107
    else:
108
        return json_response(d)