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