Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / api.py @ cb79e2ed

History | View | Annotate | Download (6.3 kB)

1 aba1e498 Antony Chazapis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 7a0c3713 Kostas Papadimitriou
#
3 64cd4730 Antony Chazapis
# Redistribution and use in source and binary forms, with or
4 64cd4730 Antony Chazapis
# without modification, are permitted provided that the following
5 64cd4730 Antony Chazapis
# conditions are met:
6 7a0c3713 Kostas Papadimitriou
#
7 64cd4730 Antony Chazapis
#   1. Redistributions of source code must retain the above
8 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
9 64cd4730 Antony Chazapis
#      disclaimer.
10 7a0c3713 Kostas Papadimitriou
#
11 64cd4730 Antony Chazapis
#   2. Redistributions in binary form must reproduce the above
12 64cd4730 Antony Chazapis
#      copyright notice, this list of conditions and the following
13 64cd4730 Antony Chazapis
#      disclaimer in the documentation and/or other materials
14 64cd4730 Antony Chazapis
#      provided with the distribution.
15 7a0c3713 Kostas Papadimitriou
#
16 64cd4730 Antony Chazapis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 64cd4730 Antony Chazapis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 64cd4730 Antony Chazapis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 64cd4730 Antony Chazapis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 64cd4730 Antony Chazapis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 64cd4730 Antony Chazapis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 64cd4730 Antony Chazapis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 64cd4730 Antony Chazapis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 64cd4730 Antony Chazapis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 64cd4730 Antony Chazapis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 64cd4730 Antony Chazapis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 64cd4730 Antony Chazapis
# POSSIBILITY OF SUCH DAMAGE.
28 7a0c3713 Kostas Papadimitriou
#
29 64cd4730 Antony Chazapis
# The views and conclusions contained in the software and
30 64cd4730 Antony Chazapis
# documentation are those of the authors and should not be
31 64cd4730 Antony Chazapis
# interpreted as representing official policies, either expressed
32 64cd4730 Antony Chazapis
# or implied, of GRNET S.A.
33 64cd4730 Antony Chazapis
34 81f840be Sofia Papagiannaki
import logging
35 81f840be Sofia Papagiannaki
36 64cd4730 Antony Chazapis
from traceback import format_exc
37 64cd4730 Antony Chazapis
from time import time, mktime
38 1ae97c83 Sofia Papagiannaki
from urllib import quote
39 1ae97c83 Sofia Papagiannaki
from urlparse import urlparse
40 1ae97c83 Sofia Papagiannaki
41 64cd4730 Antony Chazapis
from django.conf import settings
42 64cd4730 Antony Chazapis
from django.http import HttpResponse
43 64cd4730 Antony Chazapis
from django.utils import simplejson as json
44 1ae97c83 Sofia Papagiannaki
from django.core.urlresolvers import reverse
45 64cd4730 Antony Chazapis
46 863193cb Sofia Papagiannaki
from astakos.im.faults import BadRequest, Unauthorized, InternalServerError
47 0905ccd2 Sofia Papagiannaki
from astakos.im.models import AstakosUser
48 1ae97c83 Sofia Papagiannaki
from astakos.im.settings import CLOUD_SERVICES, INVITATIONS_ENABLED
49 64cd4730 Antony Chazapis
50 81f840be Sofia Papagiannaki
logger = logging.getLogger(__name__)
51 81f840be Sofia Papagiannaki
52 64cd4730 Antony Chazapis
def render_fault(request, fault):
53 a5676ab6 Antony Chazapis
    if isinstance(fault, InternalServerError) and settings.DEBUG:
54 64cd4730 Antony Chazapis
        fault.details = format_exc(fault)
55 7a0c3713 Kostas Papadimitriou
56 64cd4730 Antony Chazapis
    request.serialization = 'text'
57 863193cb Sofia Papagiannaki
    data = fault.message + '\n'
58 863193cb Sofia Papagiannaki
    if fault.details:
59 863193cb Sofia Papagiannaki
        data += '\n' + fault.details
60 64cd4730 Antony Chazapis
    response = HttpResponse(data, status=fault.code)
61 64cd4730 Antony Chazapis
    response['Content-Length'] = len(response.content)
62 863193cb Sofia Papagiannaki
    return response
63 64cd4730 Antony Chazapis
64 64cd4730 Antony Chazapis
def authenticate(request):
65 64cd4730 Antony Chazapis
    # Normal Response Codes: 204
66 863193cb Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
67 64cd4730 Antony Chazapis
    #                       badRequest (400)
68 64cd4730 Antony Chazapis
    #                       unauthorised (401)
69 64cd4730 Antony Chazapis
    try:
70 64cd4730 Antony Chazapis
        if request.method != 'GET':
71 64cd4730 Antony Chazapis
            raise BadRequest('Method not allowed.')
72 64cd4730 Antony Chazapis
        x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
73 64cd4730 Antony Chazapis
        if not x_auth_token:
74 64cd4730 Antony Chazapis
            return render_fault(request, BadRequest('Missing X-Auth-Token'))
75 7a0c3713 Kostas Papadimitriou
76 64cd4730 Antony Chazapis
        try:
77 0905ccd2 Sofia Papagiannaki
            user = AstakosUser.objects.get(auth_token=x_auth_token)
78 0905ccd2 Sofia Papagiannaki
        except AstakosUser.DoesNotExist, e:
79 7a0c3713 Kostas Papadimitriou
            return render_fault(request, Unauthorized('Invalid X-Auth-Token'))
80 7a0c3713 Kostas Papadimitriou
81 64cd4730 Antony Chazapis
        # Check if the is active.
82 0905ccd2 Sofia Papagiannaki
        if not user.is_active:
83 64cd4730 Antony Chazapis
            return render_fault(request, Unauthorized('User inactive'))
84 7a0c3713 Kostas Papadimitriou
85 64cd4730 Antony Chazapis
        # Check if the token has expired.
86 64cd4730 Antony Chazapis
        if (time() - mktime(user.auth_token_expires.timetuple())) > 0:
87 64cd4730 Antony Chazapis
            return render_fault(request, Unauthorized('Authentication expired'))
88 7a0c3713 Kostas Papadimitriou
89 64cd4730 Antony Chazapis
        response = HttpResponse()
90 64cd4730 Antony Chazapis
        response.status=204
91 fc3da598 Sofia Papagiannaki
        user_info = {'username':user.username,
92 fc3da598 Sofia Papagiannaki
                     'uniq':user.email,
93 890b0eaf Sofia Papagiannaki
                     'auth_token':user.auth_token,
94 a314b027 root
                     'auth_token_created':user.auth_token_created.isoformat(),
95 a314b027 root
                     'auth_token_expires':user.auth_token_expires.isoformat()}
96 64cd4730 Antony Chazapis
        response.content = json.dumps(user_info)
97 863193cb Sofia Papagiannaki
        response['Content-Type'] = 'application/json; charset=UTF-8'
98 863193cb Sofia Papagiannaki
        response['Content-Length'] = len(response.content)
99 64cd4730 Antony Chazapis
        return response
100 64cd4730 Antony Chazapis
    except BaseException, e:
101 81f840be Sofia Papagiannaki
        logger.exception(e)
102 863193cb Sofia Papagiannaki
        fault = InternalServerError('Unexpected error')
103 64cd4730 Antony Chazapis
        return render_fault(request, fault)
104 1ae97c83 Sofia Papagiannaki
105 1ae97c83 Sofia Papagiannaki
def get_services(request):
106 1ae97c83 Sofia Papagiannaki
    if request.method != 'GET':
107 1ae97c83 Sofia Papagiannaki
        raise BadRequest('Method not allowed.')
108 7a0c3713 Kostas Papadimitriou
109 7a0c3713 Kostas Papadimitriou
    callback = request.GET.get('callback', None)
110 1ae97c83 Sofia Papagiannaki
    data = json.dumps(CLOUD_SERVICES)
111 7a0c3713 Kostas Papadimitriou
    mimetype = 'application/json'
112 7a0c3713 Kostas Papadimitriou
113 7a0c3713 Kostas Papadimitriou
    if callback:
114 7a0c3713 Kostas Papadimitriou
        mimetype = 'application/javascript'
115 7a0c3713 Kostas Papadimitriou
        data = '%s(%s)' % (callback, data)
116 7a0c3713 Kostas Papadimitriou
117 7a0c3713 Kostas Papadimitriou
    return HttpResponse(content=data, mimetype=mimetype)
118 1ae97c83 Sofia Papagiannaki
119 cb79e2ed Kostas Papadimitriou
def get_menu(request, with_extra_links=False, with_signout=True):
120 1ae97c83 Sofia Papagiannaki
    location = request.GET.get('location', '')
121 9f841089 Sofia Papagiannaki
    exclude = []
122 9f841089 Sofia Papagiannaki
    index_url = reverse('index')
123 9f841089 Sofia Papagiannaki
    login_url = reverse('login')
124 9f841089 Sofia Papagiannaki
    logout_url = reverse('astakos.im.views.logout')
125 26774255 Sofia Papagiannaki
    absolute = lambda (url): request.build_absolute_uri(url)
126 9f841089 Sofia Papagiannaki
    l = index_url, login_url, logout_url
127 9f841089 Sofia Papagiannaki
    forbidden = []
128 9f841089 Sofia Papagiannaki
    for url in l:
129 9f841089 Sofia Papagiannaki
        url = url.rstrip('/')
130 9f841089 Sofia Papagiannaki
        forbidden.extend([url, url + '/', absolute(url), absolute(url + '/')])
131 9f841089 Sofia Papagiannaki
    if location not in forbidden:
132 1ae97c83 Sofia Papagiannaki
        index_url = '%s?next=%s' % (index_url, quote(location))
133 9f841089 Sofia Papagiannaki
    l = [{ 'url': absolute(index_url), 'name': "Sign in"}]
134 1ae97c83 Sofia Papagiannaki
    if request.user.is_authenticated():
135 1ae97c83 Sofia Papagiannaki
        l = []
136 f534fb96 Sofia Papagiannaki
        l.append({ 'url': absolute(reverse('astakos.im.views.index')),
137 26774255 Sofia Papagiannaki
                  'name': request.user.email})
138 26774255 Sofia Papagiannaki
        l.append({ 'url': absolute(reverse('astakos.im.views.edit_profile')),
139 cb79e2ed Kostas Papadimitriou
                  'name': "My account" })
140 cb79e2ed Kostas Papadimitriou
        if with_extra_links:
141 cb79e2ed Kostas Papadimitriou
            if request.user.password:
142 cb79e2ed Kostas Papadimitriou
                l.append({ 'url': absolute(reverse('password_change')),
143 cb79e2ed Kostas Papadimitriou
                          'name': "Change password" })
144 cb79e2ed Kostas Papadimitriou
            if INVITATIONS_ENABLED:
145 cb79e2ed Kostas Papadimitriou
                l.append({ 'url': absolute(reverse('astakos.im.views.invite')),
146 cb79e2ed Kostas Papadimitriou
                          'name': "Invitations" })
147 cb79e2ed Kostas Papadimitriou
            l.append({ 'url': absolute(reverse('astakos.im.views.send_feedback')),
148 cb79e2ed Kostas Papadimitriou
                      'name': "Feedback" })
149 cb79e2ed Kostas Papadimitriou
        if with_signout:
150 cb79e2ed Kostas Papadimitriou
            l.append({ 'url': absolute(reverse('astakos.im.views.logout')),
151 cb79e2ed Kostas Papadimitriou
                      'name': "Sign out"})
152 7a0c3713 Kostas Papadimitriou
153 7a0c3713 Kostas Papadimitriou
    callback = request.GET.get('callback', None)
154 1ae97c83 Sofia Papagiannaki
    data = json.dumps(tuple(l))
155 7a0c3713 Kostas Papadimitriou
    mimetype = 'application/json'
156 7a0c3713 Kostas Papadimitriou
157 7a0c3713 Kostas Papadimitriou
    if callback:
158 7a0c3713 Kostas Papadimitriou
        mimetype = 'application/javascript'
159 7a0c3713 Kostas Papadimitriou
        data = '%s(%s)' % (callback, data)
160 7a0c3713 Kostas Papadimitriou
161 7a0c3713 Kostas Papadimitriou
    return HttpResponse(content=data, mimetype=mimetype)