root / snf-astakos-app / astakos / api / tokens.py @ 8cb96389
History | View | Annotate | Download (5.1 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 | 7ac2131c | Sofia Papagiannaki | from urlparse import urlunsplit, urlsplit |
35 | 8cb96389 | Sofia Papagiannaki | from collections import defaultdict |
36 | 7ac2131c | Sofia Papagiannaki | |
37 | 7ac2131c | Sofia Papagiannaki | from django.http import urlencode |
38 | f870efe2 | Sofia Papagiannaki | from django.views.decorators.csrf import csrf_exempt |
39 | 7ac2131c | Sofia Papagiannaki | |
40 | bd93595d | Sofia Papagiannaki | from snf_django.lib.api import faults, utils, api_method |
41 | 7ac2131c | Sofia Papagiannaki | |
42 | f870efe2 | Sofia Papagiannaki | from astakos.im.models import Service, AstakosUser |
43 | bd93595d | Sofia Papagiannaki | from .util import user_from_token, json_response, xml_response, validate_user |
44 | 7ac2131c | Sofia Papagiannaki | |
45 | 7ac2131c | Sofia Papagiannaki | import logging |
46 | 7ac2131c | Sofia Papagiannaki | logger = logging.getLogger(__name__) |
47 | 7ac2131c | Sofia Papagiannaki | |
48 | 7ac2131c | Sofia Papagiannaki | |
49 | f870efe2 | Sofia Papagiannaki | @api_method(http_method="GET", token_required=True, user_required=False, |
50 | f870efe2 | Sofia Papagiannaki | logger=logger) |
51 | 7ac2131c | Sofia Papagiannaki | @user_from_token # Authenticate user!! |
52 | 7ac2131c | Sofia Papagiannaki | def get_endpoints(request, token): |
53 | bd93595d | Sofia Papagiannaki | if token != request.user.auth_token:
|
54 | f870efe2 | Sofia Papagiannaki | raise faults.Forbidden()
|
55 | 7ac2131c | Sofia Papagiannaki | |
56 | 7ac2131c | Sofia Papagiannaki | belongsTo = request.GET.get('belongsTo')
|
57 | 7ac2131c | Sofia Papagiannaki | if belongsTo and belongsTo != request.user.uuid: |
58 | f870efe2 | Sofia Papagiannaki | raise faults.BadRequest()
|
59 | 7ac2131c | Sofia Papagiannaki | |
60 | 7ac2131c | Sofia Papagiannaki | marker = request.GET.get('marker', 0) |
61 | 7ac2131c | Sofia Papagiannaki | limit = request.GET.get('limit', 10000) |
62 | 7ac2131c | Sofia Papagiannaki | |
63 | f870efe2 | Sofia Papagiannaki | endpoints = list(Service.objects.all().order_by('id'). |
64 | f870efe2 | Sofia Papagiannaki | filter(id__gt=marker)[:limit]. |
65 | f870efe2 | Sofia Papagiannaki | values('name', 'url', 'api_url', 'id', 'type')) |
66 | 7ac2131c | Sofia Papagiannaki | for e in endpoints: |
67 | f870efe2 | Sofia Papagiannaki | e['publicURL'] = e['admiURL'] = e['internalURL'] = e['api_url'] |
68 | f870efe2 | Sofia Papagiannaki | e['SNF:uiURL'] = e['url'] |
69 | 7ac2131c | Sofia Papagiannaki | e['region'] = e['name'] |
70 | f870efe2 | Sofia Papagiannaki | e.pop('api_url')
|
71 | 7ac2131c | Sofia Papagiannaki | |
72 | 7ac2131c | Sofia Papagiannaki | if endpoints:
|
73 | 7ac2131c | Sofia Papagiannaki | parts = list(urlsplit(request.path))
|
74 | 7ac2131c | Sofia Papagiannaki | params = {'marker': endpoints[-1]['id'], 'limit': limit} |
75 | 7ac2131c | Sofia Papagiannaki | parts[3] = urlencode(params)
|
76 | 7ac2131c | Sofia Papagiannaki | next_page_url = urlunsplit(parts) |
77 | 7ac2131c | Sofia Papagiannaki | endpoint_links = [{'href': next_page_url, 'rel': 'next'}] |
78 | 7ac2131c | Sofia Papagiannaki | else:
|
79 | 7ac2131c | Sofia Papagiannaki | endpoint_links = [] |
80 | 7ac2131c | Sofia Papagiannaki | |
81 | 7ac2131c | Sofia Papagiannaki | result = {'endpoints': endpoints, 'endpoint_links': endpoint_links} |
82 | 7ac2131c | Sofia Papagiannaki | if request.serialization == 'xml': |
83 | 7ac2131c | Sofia Papagiannaki | return xml_response(result, 'api/endpoints.xml') |
84 | 7ac2131c | Sofia Papagiannaki | else:
|
85 | 7ac2131c | Sofia Papagiannaki | return json_response(result)
|
86 | f870efe2 | Sofia Papagiannaki | |
87 | f870efe2 | Sofia Papagiannaki | |
88 | f870efe2 | Sofia Papagiannaki | @csrf_exempt
|
89 | f870efe2 | Sofia Papagiannaki | @api_method(http_method="POST", token_required=False, user_required=False, |
90 | f870efe2 | Sofia Papagiannaki | logger=logger) |
91 | f870efe2 | Sofia Papagiannaki | def authenticate(request): |
92 | f870efe2 | Sofia Papagiannaki | req = utils.get_request_dict(request) |
93 | f870efe2 | Sofia Papagiannaki | |
94 | f870efe2 | Sofia Papagiannaki | uuid = None
|
95 | f870efe2 | Sofia Papagiannaki | try:
|
96 | f870efe2 | Sofia Papagiannaki | token_id = req['auth']['token']['id'] |
97 | f870efe2 | Sofia Papagiannaki | except KeyError: |
98 | f870efe2 | Sofia Papagiannaki | try:
|
99 | f870efe2 | Sofia Papagiannaki | token_id = req['auth']['passwordCredentials']['password'] |
100 | f870efe2 | Sofia Papagiannaki | uuid = req['auth']['passwordCredentials']['username'] |
101 | f870efe2 | Sofia Papagiannaki | except KeyError: |
102 | f870efe2 | Sofia Papagiannaki | raise faults.BadRequest('Malformed request') |
103 | f870efe2 | Sofia Papagiannaki | |
104 | f870efe2 | Sofia Papagiannaki | if token_id is None: |
105 | f870efe2 | Sofia Papagiannaki | raise faults.BadRequest('Malformed request') |
106 | f870efe2 | Sofia Papagiannaki | |
107 | f870efe2 | Sofia Papagiannaki | try:
|
108 | f870efe2 | Sofia Papagiannaki | user = AstakosUser.objects.get(auth_token=token_id) |
109 | f870efe2 | Sofia Papagiannaki | except AstakosUser.DoesNotExist:
|
110 | f870efe2 | Sofia Papagiannaki | raise faults.Unauthorized('Invalid token') |
111 | f870efe2 | Sofia Papagiannaki | |
112 | bd93595d | Sofia Papagiannaki | validate_user(user) |
113 | 49005665 | Sofia Papagiannaki | |
114 | f870efe2 | Sofia Papagiannaki | if uuid is not None: |
115 | f870efe2 | Sofia Papagiannaki | if user.uuid != uuid:
|
116 | f870efe2 | Sofia Papagiannaki | raise faults.Unauthorized('Invalid credentials') |
117 | f870efe2 | Sofia Papagiannaki | |
118 | 8cb96389 | Sofia Papagiannaki | d = defaultdict(dict)
|
119 | 8cb96389 | Sofia Papagiannaki | d["access"]["token"] = { |
120 | 8cb96389 | Sofia Papagiannaki | "id": user.auth_token,
|
121 | 8cb96389 | Sofia Papagiannaki | "expires": utils.isoformat(user.auth_token_expires),
|
122 | 8cb96389 | Sofia Papagiannaki | "tenant": {"id": user.uuid, "name": user.realname}} |
123 | 8cb96389 | Sofia Papagiannaki | d["access"]["user"] = { |
124 | 8cb96389 | Sofia Papagiannaki | "id": user.uuid, 'name': user.realname, |
125 | 8cb96389 | Sofia Papagiannaki | "roles": list(user.groups.values("id", "name")), |
126 | 8cb96389 | Sofia Papagiannaki | "roles_links": []}
|
127 | 8cb96389 | Sofia Papagiannaki | d["access"]["serviceCatalog"] = [] |
128 | 8cb96389 | Sofia Papagiannaki | append = d["access"]["serviceCatalog"].append |
129 | 8cb96389 | Sofia Papagiannaki | for s in Service.objects.all().order_by("id"): |
130 | 8cb96389 | Sofia Papagiannaki | endpoints = [] |
131 | 8cb96389 | Sofia Papagiannaki | for l in [e.data.values('key', 'value') for e in s.endpoints.all()]: |
132 | 8cb96389 | Sofia Papagiannaki | endpoint = dict((d['key'], d['value']) for d in l) |
133 | 8cb96389 | Sofia Papagiannaki | endpoints.append(endpoint) |
134 | 8cb96389 | Sofia Papagiannaki | append({"name": s.name,
|
135 | 8cb96389 | Sofia Papagiannaki | "type": s.type,
|
136 | 8cb96389 | Sofia Papagiannaki | "SNF:uiURL": s.component.url,
|
137 | 8cb96389 | Sofia Papagiannaki | "endpoints": endpoints,
|
138 | 8cb96389 | Sofia Papagiannaki | "endpoints_links": []})
|
139 | f870efe2 | Sofia Papagiannaki | |
140 | f870efe2 | Sofia Papagiannaki | if request.serialization == 'xml': |
141 | 8cb96389 | Sofia Papagiannaki | return xml_response({'d': d}, 'api/access.xml') |
142 | f870efe2 | Sofia Papagiannaki | else:
|
143 | 8cb96389 | Sofia Papagiannaki | return json_response(d) |