Revision f870efe2 snf-astakos-app/astakos/api/tokens.py
b/snf-astakos-app/astakos/api/tokens.py | ||
---|---|---|
34 | 34 |
from urlparse import urlunsplit, urlsplit |
35 | 35 |
|
36 | 36 |
from django.http import urlencode |
37 |
from django.views.decorators.csrf import csrf_exempt |
|
37 | 38 |
|
38 |
from snf_django.lib import api
|
|
39 |
from snf_django.lib.api import faults, utils, api_method, get_token
|
|
39 | 40 |
|
40 |
from astakos.im.models import Service |
|
41 |
|
|
42 |
from .util import user_from_token, rename_meta_key, json_response, xml_response |
|
41 |
from astakos.im.models import Service, AstakosUser |
|
42 |
from .util import user_from_token, json_response, xml_response |
|
43 | 43 |
|
44 | 44 |
import logging |
45 | 45 |
logger = logging.getLogger(__name__) |
46 | 46 |
|
47 | 47 |
|
48 |
@api.api_method(http_method="GET", token_required=True, user_required=False,
|
|
49 |
logger=logger)
|
|
48 |
@api_method(http_method="GET", token_required=True, user_required=False, |
|
49 |
logger=logger) |
|
50 | 50 |
@user_from_token # Authenticate user!! |
51 | 51 |
def get_endpoints(request, token): |
52 |
if token != api.get_token(request):
|
|
53 |
raise api.faults.Forbidden()
|
|
52 |
if token != get_token(request): |
|
53 |
raise faults.Forbidden() |
|
54 | 54 |
|
55 | 55 |
belongsTo = request.GET.get('belongsTo') |
56 | 56 |
if belongsTo and belongsTo != request.user.uuid: |
57 |
raise api.faults.BadRequest()
|
|
57 |
raise faults.BadRequest() |
|
58 | 58 |
|
59 | 59 |
marker = request.GET.get('marker', 0) |
60 | 60 |
limit = request.GET.get('limit', 10000) |
61 | 61 |
|
62 |
endpoints = list(Service.objects.all().order_by('id').\
|
|
63 |
filter(id__gt=marker)[:limit].\
|
|
64 |
values('name', 'url', 'api_url', 'id', 'type')) |
|
62 |
endpoints = list(Service.objects.all().order_by('id'). |
|
63 |
filter(id__gt=marker)[:limit].
|
|
64 |
values('name', 'url', 'api_url', 'id', 'type'))
|
|
65 | 65 |
for e in endpoints: |
66 |
e['api_url'] = e['api_url'] or e['url']
|
|
67 |
e['internalURL'] = e['url']
|
|
66 |
e['publicURL'] = e['admiURL'] = e['internalURL'] = e['api_url']
|
|
67 |
e['SNF:uiURL'] = e['url']
|
|
68 | 68 |
e['region'] = e['name'] |
69 |
rename_meta_key(e, 'api_url', 'adminURL') |
|
70 |
rename_meta_key(e, 'url', 'publicURL') |
|
69 |
e.pop('api_url') |
|
71 | 70 |
|
72 | 71 |
if endpoints: |
73 | 72 |
parts = list(urlsplit(request.path)) |
... | ... | |
83 | 82 |
return xml_response(result, 'api/endpoints.xml') |
84 | 83 |
else: |
85 | 84 |
return json_response(result) |
85 |
|
|
86 |
|
|
87 |
@csrf_exempt |
|
88 |
@api_method(http_method="POST", token_required=False, user_required=False, |
|
89 |
logger=logger) |
|
90 |
def authenticate(request): |
|
91 |
req = utils.get_request_dict(request) |
|
92 |
|
|
93 |
uuid = None |
|
94 |
try: |
|
95 |
token_id = req['auth']['token']['id'] |
|
96 |
except KeyError: |
|
97 |
try: |
|
98 |
token_id = req['auth']['passwordCredentials']['password'] |
|
99 |
uuid = req['auth']['passwordCredentials']['username'] |
|
100 |
except KeyError: |
|
101 |
raise faults.BadRequest('Malformed request') |
|
102 |
|
|
103 |
if token_id is None: |
|
104 |
raise faults.BadRequest('Malformed request') |
|
105 |
|
|
106 |
try: |
|
107 |
user = AstakosUser.objects.get(auth_token=token_id) |
|
108 |
except AstakosUser.DoesNotExist: |
|
109 |
raise faults.Unauthorized('Invalid token') |
|
110 |
|
|
111 |
if uuid is not None: |
|
112 |
if user.uuid != uuid: |
|
113 |
raise faults.Unauthorized('Invalid credentials') |
|
114 |
|
|
115 |
access = {} |
|
116 |
access['token'] = {'id': user.auth_token, |
|
117 |
'expires': utils.isoformat(user.auth_token_expires), |
|
118 |
'tenant': {'id': user.uuid, 'name': user.realname}} |
|
119 |
access['user'] = {'id': user.uuid, 'name': user.realname, |
|
120 |
'roles': list(user.groups.values('id', 'name')), |
|
121 |
'roles_links': []} |
|
122 |
access['serviceCatalog'] = [] |
|
123 |
append = access['serviceCatalog'].append |
|
124 |
for s in Service.objects.all().order_by('id'): |
|
125 |
append({'name': s.name, 'type': s.type, |
|
126 |
'endpoints': [{'adminURL': s.api_url, |
|
127 |
'publicURL': s.api_url, |
|
128 |
'internalUrl': s.api_url, |
|
129 |
'SNF:uiURL': s.url, |
|
130 |
'region': s.name}]}) |
|
131 |
|
|
132 |
if request.serialization == 'xml': |
|
133 |
return xml_response(access, 'api/access.xml') |
|
134 |
else: |
|
135 |
return json_response(access) |
Also available in: Unified diff