Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.7 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

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

    
46

    
47
@csrf_exempt
48
@api_method(http_method="POST", token_required=False, user_required=False,
49
            logger=logger)
50
def authenticate(request):
51
    req = utils.get_request_dict(request)
52

    
53
    uuid = None
54
    try:
55
        token_id = req['auth']['token']['id']
56
    except KeyError:
57
        try:
58
            token_id = req['auth']['passwordCredentials']['password']
59
            uuid = req['auth']['passwordCredentials']['username']
60
        except KeyError:
61
            raise faults.BadRequest('Malformed request')
62

    
63
    if token_id is None:
64
        raise faults.BadRequest('Malformed request')
65

    
66
    try:
67
        user = AstakosUser.objects.get(auth_token=token_id)
68
    except AstakosUser.DoesNotExist:
69
        raise faults.Unauthorized('Invalid token')
70

    
71
    validate_user(user)
72

    
73
    if uuid is not None:
74
        if user.uuid != uuid:
75
            raise faults.Unauthorized('Invalid credentials')
76

    
77
    d = defaultdict(dict)
78
    d["access"]["token"] = {
79
        "id": user.auth_token,
80
        "expires": utils.isoformat(user.auth_token_expires),
81
        "tenant": {"id": user.uuid, "name": user.realname}}
82
    d["access"]["user"] = {
83
        "id": user.uuid, 'name': user.realname,
84
        "roles": list(user.groups.values("id", "name")),
85
        "roles_links": []}
86
    d["access"]["serviceCatalog"] = []
87
    append = d["access"]["serviceCatalog"].append
88
    for s in Service.objects.all().order_by("id"):
89
        endpoints = []
90
        for l in [e.data.values('key', 'value') for e in s.endpoints.all()]:
91
            endpoint = dict((d['key'], d['value']) for d in l)
92
            endpoints.append(endpoint)
93
        append({"name": s.name,
94
                "type": s.type,
95
                "SNF:uiURL": s.component.url,
96
                "endpoints": endpoints,
97
                "endpoints_links": []})
98

    
99
    if request.serialization == 'xml':
100
        return xml_response({'d': d}, 'api/access.xml')
101
    else:
102
        return json_response(d)