Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / api / admin.py @ a706ae94

History | View | Annotate | Download (7 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 3a9f4931 Sofia Papagiannaki
import logging
35 3a9f4931 Sofia Papagiannaki
36 18ffbee1 Sofia Papagiannaki
from functools import wraps
37 64cd4730 Antony Chazapis
from time import time, mktime
38 1ae97c83 Sofia Papagiannaki
39 64cd4730 Antony Chazapis
from django.http import HttpResponse
40 64cd4730 Antony Chazapis
from django.utils import simplejson as json
41 64cd4730 Antony Chazapis
42 5ce3ce4f Sofia Papagiannaki
from astakos.im.api.faults import (
43 5ce3ce4f Sofia Papagiannaki
    Fault, Unauthorized, InternalServerError, BadRequest,
44 c0b26605 Sofia Papagiannaki
    Forbidden
45 c0b26605 Sofia Papagiannaki
)
46 aab4d540 Sofia Papagiannaki
from astakos.im.api import render_fault, _get_user_by_email, _get_user_by_username
47 aab4d540 Sofia Papagiannaki
from astakos.im.models import AstakosUser
48 09e7393c Sofia Papagiannaki
from astakos.im.util import epoch
49 64cd4730 Antony Chazapis
50 3a9f4931 Sofia Papagiannaki
logger = logging.getLogger(__name__)
51 30dc8c1a Sofia Papagiannaki
format = ('%a, %d %b %Y %H:%M:%S GMT')
52 3a9f4931 Sofia Papagiannaki
53 5ce3ce4f Sofia Papagiannaki
54 30dc8c1a Sofia Papagiannaki
def api_method(http_method=None, token_required=False, perms=None):
55 18ffbee1 Sofia Papagiannaki
    """Decorator function for views that implement an API method."""
56 30dc8c1a Sofia Papagiannaki
    if not perms:
57 30dc8c1a Sofia Papagiannaki
        perms = []
58 d492d8ae Kostas Papadimitriou
59 18ffbee1 Sofia Papagiannaki
    def decorator(func):
60 18ffbee1 Sofia Papagiannaki
        @wraps(func)
61 18ffbee1 Sofia Papagiannaki
        def wrapper(request, *args, **kwargs):
62 18ffbee1 Sofia Papagiannaki
            try:
63 18ffbee1 Sofia Papagiannaki
                if http_method and request.method != http_method:
64 18ffbee1 Sofia Papagiannaki
                    raise BadRequest('Method not allowed.')
65 18ffbee1 Sofia Papagiannaki
                x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
66 18ffbee1 Sofia Papagiannaki
                if token_required:
67 18ffbee1 Sofia Papagiannaki
                    if not x_auth_token:
68 18ffbee1 Sofia Papagiannaki
                        raise Unauthorized('Access denied')
69 18ffbee1 Sofia Papagiannaki
                    try:
70 18ffbee1 Sofia Papagiannaki
                        user = AstakosUser.objects.get(auth_token=x_auth_token)
71 18ffbee1 Sofia Papagiannaki
                        if not user.has_perms(perms):
72 30dc8c1a Sofia Papagiannaki
                            raise Forbidden('Unauthorized request')
73 18ffbee1 Sofia Papagiannaki
                    except AstakosUser.DoesNotExist, e:
74 18ffbee1 Sofia Papagiannaki
                        raise Unauthorized('Invalid X-Auth-Token')
75 18ffbee1 Sofia Papagiannaki
                    kwargs['user'] = user
76 18ffbee1 Sofia Papagiannaki
                response = func(request, *args, **kwargs)
77 18ffbee1 Sofia Papagiannaki
                return response
78 18ffbee1 Sofia Papagiannaki
            except Fault, fault:
79 18ffbee1 Sofia Papagiannaki
                return render_fault(request, fault)
80 18ffbee1 Sofia Papagiannaki
            except BaseException, e:
81 18ffbee1 Sofia Papagiannaki
                logger.exception('Unexpected error: %s' % e)
82 18ffbee1 Sofia Papagiannaki
                fault = InternalServerError('Unexpected error')
83 18ffbee1 Sofia Papagiannaki
                return render_fault(request, fault)
84 18ffbee1 Sofia Papagiannaki
        return wrapper
85 18ffbee1 Sofia Papagiannaki
    return decorator
86 18ffbee1 Sofia Papagiannaki
87 5ce3ce4f Sofia Papagiannaki
88 18ffbee1 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True)
89 18ffbee1 Sofia Papagiannaki
def authenticate_old(request, user=None):
90 64cd4730 Antony Chazapis
    # Normal Response Codes: 204
91 863193cb Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
92 64cd4730 Antony Chazapis
    #                       badRequest (400)
93 64cd4730 Antony Chazapis
    #                       unauthorised (401)
94 18ffbee1 Sofia Papagiannaki
    if not user:
95 18ffbee1 Sofia Papagiannaki
        raise BadRequest('No user')
96 d492d8ae Kostas Papadimitriou
97 18ffbee1 Sofia Papagiannaki
    # Check if the is active.
98 18ffbee1 Sofia Papagiannaki
    if not user.is_active:
99 18ffbee1 Sofia Papagiannaki
        raise Unauthorized('User inactive')
100 1ae97c83 Sofia Papagiannaki
101 18ffbee1 Sofia Papagiannaki
    # Check if the token has expired.
102 18ffbee1 Sofia Papagiannaki
    if (time() - mktime(user.auth_token_expires.timetuple())) > 0:
103 18ffbee1 Sofia Papagiannaki
        raise Unauthorized('Authentication expired')
104 d492d8ae Kostas Papadimitriou
105 fcf90160 Sofia Papagiannaki
    if not user.signed_terms:
106 18ffbee1 Sofia Papagiannaki
        raise Unauthorized('Pending approval terms')
107 d492d8ae Kostas Papadimitriou
108 18ffbee1 Sofia Papagiannaki
    response = HttpResponse()
109 5ce3ce4f Sofia Papagiannaki
    response.status = 204
110 5ce3ce4f Sofia Papagiannaki
    user_info = {'username': user.username,
111 5ce3ce4f Sofia Papagiannaki
                 'uniq': user.email,
112 5ce3ce4f Sofia Papagiannaki
                 'auth_token': user.auth_token,
113 5ce3ce4f Sofia Papagiannaki
                 'auth_token_created': user.auth_token_created.isoformat(),
114 5ce3ce4f Sofia Papagiannaki
                 'auth_token_expires': user.auth_token_expires.isoformat(),
115 5ce3ce4f Sofia Papagiannaki
                 'has_credits': user.has_credits,
116 5ce3ce4f Sofia Papagiannaki
                 'has_signed_terms': user.signed_terms,
117 5ce3ce4f Sofia Papagiannaki
                 'groups': [g.name for g in user.groups.all()]}
118 18ffbee1 Sofia Papagiannaki
    response.content = json.dumps(user_info)
119 18ffbee1 Sofia Papagiannaki
    response['Content-Type'] = 'application/json; charset=UTF-8'
120 18ffbee1 Sofia Papagiannaki
    response['Content-Length'] = len(response.content)
121 18ffbee1 Sofia Papagiannaki
    return response
122 18ffbee1 Sofia Papagiannaki
123 5ce3ce4f Sofia Papagiannaki
124 18ffbee1 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True)
125 18ffbee1 Sofia Papagiannaki
def authenticate(request, user=None):
126 18ffbee1 Sofia Papagiannaki
    # Normal Response Codes: 204
127 18ffbee1 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
128 18ffbee1 Sofia Papagiannaki
    #                       badRequest (400)
129 18ffbee1 Sofia Papagiannaki
    #                       unauthorised (401)
130 18ffbee1 Sofia Papagiannaki
    if not user:
131 18ffbee1 Sofia Papagiannaki
        raise BadRequest('No user')
132 d492d8ae Kostas Papadimitriou
133 18ffbee1 Sofia Papagiannaki
    # Check if the is active.
134 18ffbee1 Sofia Papagiannaki
    if not user.is_active:
135 18ffbee1 Sofia Papagiannaki
        raise Unauthorized('User inactive')
136 18ffbee1 Sofia Papagiannaki
137 18ffbee1 Sofia Papagiannaki
    # Check if the token has expired.
138 18ffbee1 Sofia Papagiannaki
    if (time() - mktime(user.auth_token_expires.timetuple())) > 0:
139 18ffbee1 Sofia Papagiannaki
        raise Unauthorized('Authentication expired')
140 d492d8ae Kostas Papadimitriou
141 fcf90160 Sofia Papagiannaki
    if not user.signed_terms:
142 18ffbee1 Sofia Papagiannaki
        raise Unauthorized('Pending approval terms')
143 d492d8ae Kostas Papadimitriou
144 18ffbee1 Sofia Papagiannaki
    response = HttpResponse()
145 5ce3ce4f Sofia Papagiannaki
    response.status = 204
146 5ce3ce4f Sofia Papagiannaki
    user_info = {'userid': user.username,
147 5ce3ce4f Sofia Papagiannaki
                 'email': [user.email],
148 5ce3ce4f Sofia Papagiannaki
                 'name': user.realname,
149 5ce3ce4f Sofia Papagiannaki
                 'auth_token': user.auth_token,
150 5ce3ce4f Sofia Papagiannaki
                 'auth_token_created': epoch(user.auth_token_created),
151 5ce3ce4f Sofia Papagiannaki
                 'auth_token_expires': epoch(user.auth_token_expires),
152 5ce3ce4f Sofia Papagiannaki
                 'has_credits': user.has_credits,
153 5ce3ce4f Sofia Papagiannaki
                 'is_active': user.is_active,
154 5ce3ce4f Sofia Papagiannaki
                 'groups': [g.name for g in user.groups.all()]}
155 18ffbee1 Sofia Papagiannaki
    response.content = json.dumps(user_info)
156 18ffbee1 Sofia Papagiannaki
    response['Content-Type'] = 'application/json; charset=UTF-8'
157 18ffbee1 Sofia Papagiannaki
    response['Content-Length'] = len(response.content)
158 18ffbee1 Sofia Papagiannaki
    return response
159 7a0c3713 Kostas Papadimitriou
160 5ce3ce4f Sofia Papagiannaki
161 ce70ac01 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True, perms=['im.can_access_userinfo'])
162 30dc8c1a Sofia Papagiannaki
def get_user_by_email(request, user=None):
163 30dc8c1a Sofia Papagiannaki
    # Normal Response Codes: 200
164 18ffbee1 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
165 18ffbee1 Sofia Papagiannaki
    #                       badRequest (400)
166 18ffbee1 Sofia Papagiannaki
    #                       unauthorised (401)
167 30dc8c1a Sofia Papagiannaki
    #                       forbidden (403)
168 30dc8c1a Sofia Papagiannaki
    #                       itemNotFound (404)
169 30dc8c1a Sofia Papagiannaki
    email = request.GET.get('name')
170 6b03a847 Sofia Papagiannaki
    return _get_user_by_email(email)
171 18ffbee1 Sofia Papagiannaki
172 5ce3ce4f Sofia Papagiannaki
173 ce70ac01 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True, perms=['im.can_access_userinfo'])
174 30dc8c1a Sofia Papagiannaki
def get_user_by_username(request, user_id, user=None):
175 30dc8c1a Sofia Papagiannaki
    # Normal Response Codes: 200
176 18ffbee1 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
177 18ffbee1 Sofia Papagiannaki
    #                       badRequest (400)
178 18ffbee1 Sofia Papagiannaki
    #                       unauthorised (401)
179 30dc8c1a Sofia Papagiannaki
    #                       forbidden (403)
180 30dc8c1a Sofia Papagiannaki
    #                       itemNotFound (404)
181 35f8ccf1 Sofia Papagiannaki
    return _get_user_by_username(user_id)