root / snf-astakos-app / astakos / api / tokens.py @ f6ff3033
History | View | Annotate | Download (4.5 kB)
1 | 7ac2131c | Sofia Papagiannaki | # Copyright 2011-2013 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | 7ac2131c | Sofia Papagiannaki | #
|
3 | 7ac2131c | Sofia Papagiannaki | # Redistribution and use in source and binary forms, with or
|
4 | 7ac2131c | Sofia Papagiannaki | # without modification, are permitted provided that the following
|
5 | 7ac2131c | Sofia Papagiannaki | # conditions are met:
|
6 | 7ac2131c | Sofia Papagiannaki | #
|
7 | 7ac2131c | Sofia Papagiannaki | # 1. Redistributions of source code must retain the above
|
8 | 7ac2131c | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
9 | 7ac2131c | Sofia Papagiannaki | # disclaimer.
|
10 | 7ac2131c | Sofia Papagiannaki | #
|
11 | 7ac2131c | Sofia Papagiannaki | # 2. Redistributions in binary form must reproduce the above
|
12 | 7ac2131c | Sofia Papagiannaki | # copyright notice, this list of conditions and the following
|
13 | 7ac2131c | Sofia Papagiannaki | # disclaimer in the documentation and/or other materials
|
14 | 7ac2131c | Sofia Papagiannaki | # provided with the distribution.
|
15 | 7ac2131c | Sofia Papagiannaki | #
|
16 | 7ac2131c | Sofia Papagiannaki | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | 7ac2131c | Sofia Papagiannaki | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | 7ac2131c | Sofia Papagiannaki | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | 7ac2131c | Sofia Papagiannaki | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | 7ac2131c | Sofia Papagiannaki | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | 7ac2131c | Sofia Papagiannaki | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | 7ac2131c | Sofia Papagiannaki | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | 7ac2131c | Sofia Papagiannaki | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | 7ac2131c | Sofia Papagiannaki | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | 7ac2131c | Sofia Papagiannaki | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | 7ac2131c | Sofia Papagiannaki | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | 7ac2131c | Sofia Papagiannaki | # POSSIBILITY OF SUCH DAMAGE.
|
28 | 7ac2131c | Sofia Papagiannaki | #
|
29 | 7ac2131c | Sofia Papagiannaki | # The views and conclusions contained in the software and
|
30 | 7ac2131c | Sofia Papagiannaki | # documentation are those of the authors and should not be
|
31 | 7ac2131c | Sofia Papagiannaki | # interpreted as representing official policies, either expressed
|
32 | 7ac2131c | Sofia Papagiannaki | # or implied, of GRNET S.A.
|
33 | 7ac2131c | Sofia Papagiannaki | |
34 | 8cb96389 | Sofia Papagiannaki | from collections import defaultdict |
35 | 7ac2131c | Sofia Papagiannaki | |
36 | f870efe2 | Sofia Papagiannaki | from django.views.decorators.csrf import csrf_exempt |
37 | 7ac2131c | Sofia Papagiannaki | |
38 | bd93595d | Sofia Papagiannaki | from snf_django.lib.api import faults, utils, api_method |
39 | 7ac2131c | Sofia Papagiannaki | |
40 | f870efe2 | Sofia Papagiannaki | from astakos.im.models import Service, AstakosUser |
41 | d29f0371 | Sofia Papagiannaki | from .util import json_response, xml_response, validate_user,\ |
42 | d29f0371 | Sofia Papagiannaki | get_content_length
|
43 | 7ac2131c | Sofia Papagiannaki | |
44 | 7ac2131c | Sofia Papagiannaki | import logging |
45 | 7ac2131c | Sofia Papagiannaki | logger = logging.getLogger(__name__) |
46 | 7ac2131c | Sofia Papagiannaki | |
47 | 7ac2131c | Sofia Papagiannaki | |
48 | f870efe2 | Sofia Papagiannaki | @csrf_exempt
|
49 | f870efe2 | Sofia Papagiannaki | @api_method(http_method="POST", token_required=False, user_required=False, |
50 | f870efe2 | Sofia Papagiannaki | logger=logger) |
51 | f870efe2 | Sofia Papagiannaki | def authenticate(request): |
52 | 336fb8fb | Sofia Papagiannaki | try:
|
53 | 336fb8fb | Sofia Papagiannaki | content_length = get_content_length(request) |
54 | 336fb8fb | Sofia Papagiannaki | except faults.LengthRequired:
|
55 | 336fb8fb | Sofia Papagiannaki | content_length = None
|
56 | 336fb8fb | Sofia Papagiannaki | |
57 | d29f0371 | Sofia Papagiannaki | public_mode = True if not content_length else False |
58 | f870efe2 | Sofia Papagiannaki | |
59 | d29f0371 | Sofia Papagiannaki | d = defaultdict(dict)
|
60 | d29f0371 | Sofia Papagiannaki | if not public_mode: |
61 | d29f0371 | Sofia Papagiannaki | req = utils.get_request_dict(request) |
62 | d29f0371 | Sofia Papagiannaki | |
63 | d29f0371 | Sofia Papagiannaki | uuid = None
|
64 | f870efe2 | Sofia Papagiannaki | try:
|
65 | d29f0371 | Sofia Papagiannaki | token_id = req['auth']['token']['id'] |
66 | f870efe2 | Sofia Papagiannaki | except KeyError: |
67 | d29f0371 | Sofia Papagiannaki | try:
|
68 | d29f0371 | Sofia Papagiannaki | token_id = req['auth']['passwordCredentials']['password'] |
69 | d29f0371 | Sofia Papagiannaki | uuid = req['auth']['passwordCredentials']['username'] |
70 | d29f0371 | Sofia Papagiannaki | except KeyError: |
71 | 11366070 | Sofia Papagiannaki | raise faults.BadRequest(
|
72 | 11366070 | Sofia Papagiannaki | 'Malformed request: missing credentials')
|
73 | 11366070 | Sofia Papagiannaki | |
74 | 11366070 | Sofia Papagiannaki | tenant = req['auth'].get('tenantName') |
75 | d29f0371 | Sofia Papagiannaki | |
76 | d29f0371 | Sofia Papagiannaki | if token_id is None: |
77 | 11366070 | Sofia Papagiannaki | raise faults.BadRequest('Malformed request: missing token') |
78 | f870efe2 | Sofia Papagiannaki | |
79 | d29f0371 | Sofia Papagiannaki | try:
|
80 | d29f0371 | Sofia Papagiannaki | user = AstakosUser.objects.get(auth_token=token_id) |
81 | d29f0371 | Sofia Papagiannaki | except AstakosUser.DoesNotExist:
|
82 | d29f0371 | Sofia Papagiannaki | raise faults.Unauthorized('Invalid token') |
83 | f870efe2 | Sofia Papagiannaki | |
84 | d29f0371 | Sofia Papagiannaki | validate_user(user) |
85 | f870efe2 | Sofia Papagiannaki | |
86 | d29f0371 | Sofia Papagiannaki | if uuid is not None: |
87 | d29f0371 | Sofia Papagiannaki | if user.uuid != uuid:
|
88 | d29f0371 | Sofia Papagiannaki | raise faults.Unauthorized('Invalid credentials') |
89 | 49005665 | Sofia Papagiannaki | |
90 | a01eb018 | Sofia Papagiannaki | if tenant:
|
91 | 11366070 | Sofia Papagiannaki | if user.uuid != tenant:
|
92 | 11366070 | Sofia Papagiannaki | raise faults.BadRequest('Not conforming tenantName') |
93 | 11366070 | Sofia Papagiannaki | |
94 | d29f0371 | Sofia Papagiannaki | d["access"]["token"] = { |
95 | d29f0371 | Sofia Papagiannaki | "id": user.auth_token,
|
96 | d29f0371 | Sofia Papagiannaki | "expires": utils.isoformat(user.auth_token_expires),
|
97 | d29f0371 | Sofia Papagiannaki | "tenant": {"id": user.uuid, "name": user.realname}} |
98 | d29f0371 | Sofia Papagiannaki | d["access"]["user"] = { |
99 | d29f0371 | Sofia Papagiannaki | "id": user.uuid, 'name': user.realname, |
100 | d29f0371 | Sofia Papagiannaki | "roles": list(user.groups.values("id", "name")), |
101 | d29f0371 | Sofia Papagiannaki | "roles_links": []}
|
102 | f870efe2 | Sofia Papagiannaki | |
103 | 8cb96389 | Sofia Papagiannaki | d["access"]["serviceCatalog"] = [] |
104 | 8cb96389 | Sofia Papagiannaki | append = d["access"]["serviceCatalog"].append |
105 | 67ef560b | Giorgos Korfiatis | for s in Service.objects.all().order_by("id").\ |
106 | 67ef560b | Giorgos Korfiatis | prefetch_related('endpoints__data').select_related('component'): |
107 | 8cb96389 | Sofia Papagiannaki | endpoints = [] |
108 | 67ef560b | Giorgos Korfiatis | for e in s.endpoints.all(): |
109 | 67ef560b | Giorgos Korfiatis | endpoint = dict((ed.key, ed.value) for ed in e.data.all()) |
110 | 07860de2 | Sofia Papagiannaki | endpoint["SNF:uiURL"] = s.component.url
|
111 | a50f99a3 | Sofia Papagiannaki | endpoint["region"] = "default" |
112 | 7f8af0e9 | Sofia Papagiannaki | if s.name == 'astakos_weblogin': |
113 | 7f8af0e9 | Sofia Papagiannaki | endpoint["SNF:webloginURL"] = endpoint["publicURL"] |
114 | 8cb96389 | Sofia Papagiannaki | endpoints.append(endpoint) |
115 | 8cb96389 | Sofia Papagiannaki | append({"name": s.name,
|
116 | 8cb96389 | Sofia Papagiannaki | "type": s.type,
|
117 | 8cb96389 | Sofia Papagiannaki | "endpoints": endpoints,
|
118 | 8cb96389 | Sofia Papagiannaki | "endpoints_links": []})
|
119 | f870efe2 | Sofia Papagiannaki | |
120 | f870efe2 | Sofia Papagiannaki | if request.serialization == 'xml': |
121 | 8cb96389 | Sofia Papagiannaki | return xml_response({'d': d}, 'api/access.xml') |
122 | f870efe2 | Sofia Papagiannaki | else:
|
123 | 8cb96389 | Sofia Papagiannaki | return json_response(d) |