Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / api / util.py @ 276f454e

History | View | Annotate | Download (5.5 kB)

1 18f21257 Giorgos Korfiatis
# Copyright 2013 GRNET S.A. All rights reserved.
2 18f21257 Giorgos Korfiatis
#
3 18f21257 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
4 18f21257 Giorgos Korfiatis
# without modification, are permitted provided that the following
5 18f21257 Giorgos Korfiatis
# conditions are met:
6 18f21257 Giorgos Korfiatis
#
7 18f21257 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
8 18f21257 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
9 18f21257 Giorgos Korfiatis
#      disclaimer.
10 18f21257 Giorgos Korfiatis
#
11 18f21257 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
12 18f21257 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
13 18f21257 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
14 18f21257 Giorgos Korfiatis
#      provided with the distribution.
15 18f21257 Giorgos Korfiatis
#
16 18f21257 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 18f21257 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 18f21257 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 18f21257 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 18f21257 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 18f21257 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 18f21257 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 18f21257 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 18f21257 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 18f21257 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 18f21257 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 18f21257 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
28 18f21257 Giorgos Korfiatis
#
29 18f21257 Giorgos Korfiatis
# The views and conclusions contained in the software and
30 18f21257 Giorgos Korfiatis
# documentation are those of the authors and should not be
31 18f21257 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
32 18f21257 Giorgos Korfiatis
# or implied, of GRNET S.A.
33 18f21257 Giorgos Korfiatis
34 79b5d61b Sofia Papagiannaki
from functools import wraps
35 79b5d61b Sofia Papagiannaki
from time import time, mktime
36 79b5d61b Sofia Papagiannaki
37 18f21257 Giorgos Korfiatis
from django.http import HttpResponse
38 18f21257 Giorgos Korfiatis
from django.utils import simplejson as json
39 18f21257 Giorgos Korfiatis
40 79b5d61b Sofia Papagiannaki
from astakos.im.models import AstakosUser, Service
41 79b5d61b Sofia Papagiannaki
from snf_django.lib.api import faults
42 79b5d61b Sofia Papagiannaki
43 79b5d61b Sofia Papagiannaki
from astakos.im.forms import FeedbackForm
44 79b5d61b Sofia Papagiannaki
from astakos.im.functions import send_feedback as send_feedback_func
45 79b5d61b Sofia Papagiannaki
46 79b5d61b Sofia Papagiannaki
import logging
47 79b5d61b Sofia Papagiannaki
logger = logging.getLogger(__name__)
48 79b5d61b Sofia Papagiannaki
49 79b5d61b Sofia Papagiannaki
absolute = lambda request, url: request.build_absolute_uri(url)
50 79b5d61b Sofia Papagiannaki
51 18f21257 Giorgos Korfiatis
52 18f21257 Giorgos Korfiatis
def json_response(content, status_code=None):
53 18f21257 Giorgos Korfiatis
    response = HttpResponse()
54 18f21257 Giorgos Korfiatis
    if status_code is not None:
55 18f21257 Giorgos Korfiatis
        response.status_code = status_code
56 18f21257 Giorgos Korfiatis
57 18f21257 Giorgos Korfiatis
    response.content = json.dumps(content)
58 18f21257 Giorgos Korfiatis
    response['Content-Type'] = 'application/json; charset=UTF-8'
59 18f21257 Giorgos Korfiatis
    response['Content-Length'] = len(response.content)
60 18f21257 Giorgos Korfiatis
    return response
61 ad730cc5 Giorgos Korfiatis
62 ad730cc5 Giorgos Korfiatis
63 ad730cc5 Giorgos Korfiatis
def is_integer(x):
64 ad730cc5 Giorgos Korfiatis
    return isinstance(x, (int, long))
65 ad730cc5 Giorgos Korfiatis
66 ad730cc5 Giorgos Korfiatis
67 ad730cc5 Giorgos Korfiatis
def are_integer(lst):
68 ad730cc5 Giorgos Korfiatis
    return all(map(is_integer, lst))
69 79b5d61b Sofia Papagiannaki
70 79b5d61b Sofia Papagiannaki
71 79b5d61b Sofia Papagiannaki
def user_from_token(func):
72 79b5d61b Sofia Papagiannaki
    @wraps(func)
73 79b5d61b Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
74 79b5d61b Sofia Papagiannaki
        try:
75 79b5d61b Sofia Papagiannaki
            token = request.x_auth_token
76 79b5d61b Sofia Papagiannaki
        except AttributeError:
77 79b5d61b Sofia Papagiannaki
            raise faults.Unauthorized("No authentication token")
78 79b5d61b Sofia Papagiannaki
79 79b5d61b Sofia Papagiannaki
        if not token:
80 79b5d61b Sofia Papagiannaki
            raise faults.Unauthorized("Invalid X-Auth-Token")
81 79b5d61b Sofia Papagiannaki
82 79b5d61b Sofia Papagiannaki
        try:
83 276f454e Sofia Papagiannaki
            request.user = AstakosUser.objects.get(auth_token=token)
84 79b5d61b Sofia Papagiannaki
        except AstakosUser.DoesNotExist:
85 79b5d61b Sofia Papagiannaki
            raise faults.Unauthorized('Invalid X-Auth-Token')
86 79b5d61b Sofia Papagiannaki
87 276f454e Sofia Papagiannaki
        return func(request, *args, **kwargs)
88 79b5d61b Sofia Papagiannaki
    return wrapper
89 79b5d61b Sofia Papagiannaki
90 79b5d61b Sofia Papagiannaki
91 79b5d61b Sofia Papagiannaki
def service_from_token(func):
92 79b5d61b Sofia Papagiannaki
    """Decorator for authenticating service by it's token.
93 79b5d61b Sofia Papagiannaki

94 79b5d61b Sofia Papagiannaki
    Check that a service with the corresponding token exists. Also,
95 79b5d61b Sofia Papagiannaki
    if service's token has an expiration token, check that it has not
96 79b5d61b Sofia Papagiannaki
    expired.
97 79b5d61b Sofia Papagiannaki

98 79b5d61b Sofia Papagiannaki
    """
99 79b5d61b Sofia Papagiannaki
    @wraps(func)
100 79b5d61b Sofia Papagiannaki
    def wrapper(request, *args, **kwargs):
101 79b5d61b Sofia Papagiannaki
        try:
102 79b5d61b Sofia Papagiannaki
            token = request.x_auth_token
103 79b5d61b Sofia Papagiannaki
        except AttributeError:
104 79b5d61b Sofia Papagiannaki
            raise faults.Unauthorized("No authentication token")
105 79b5d61b Sofia Papagiannaki
106 79b5d61b Sofia Papagiannaki
        if not token:
107 79b5d61b Sofia Papagiannaki
            raise faults.Unauthorized("Invalid X-Auth-Token")
108 79b5d61b Sofia Papagiannaki
        try:
109 79b5d61b Sofia Papagiannaki
            service = Service.objects.get(auth_token=token)
110 79b5d61b Sofia Papagiannaki
        except Service.DoesNotExist:
111 79b5d61b Sofia Papagiannaki
            raise faults.Unauthorized("Invalid X-Auth-Token")
112 79b5d61b Sofia Papagiannaki
113 79b5d61b Sofia Papagiannaki
        # Check if the token has expired
114 79b5d61b Sofia Papagiannaki
        expiration_date = service.auth_token_expires
115 79b5d61b Sofia Papagiannaki
        if expiration_date:
116 79b5d61b Sofia Papagiannaki
            expires_at = mktime(expiration_date.timetuple())
117 79b5d61b Sofia Papagiannaki
            if time() > expires_at:
118 79b5d61b Sofia Papagiannaki
                raise faults.Unauthorized("Authentication expired")
119 79b5d61b Sofia Papagiannaki
120 79b5d61b Sofia Papagiannaki
        request.service_instance = service
121 79b5d61b Sofia Papagiannaki
        return func(request, *args, **kwargs)
122 79b5d61b Sofia Papagiannaki
    return wrapper
123 79b5d61b Sofia Papagiannaki
124 79b5d61b Sofia Papagiannaki
125 79b5d61b Sofia Papagiannaki
def __get_uuid_displayname_catalogs(request, user_call=True):
126 79b5d61b Sofia Papagiannaki
    # Normal Response Codes: 200
127 79b5d61b Sofia Papagiannaki
    # Error Response Codes: BadRequest (400)
128 79b5d61b Sofia Papagiannaki
129 79b5d61b Sofia Papagiannaki
    try:
130 79b5d61b Sofia Papagiannaki
        input_data = json.loads(request.raw_post_data)
131 79b5d61b Sofia Papagiannaki
    except:
132 79b5d61b Sofia Papagiannaki
        raise faults.BadRequest('Request body should be json formatted.')
133 79b5d61b Sofia Papagiannaki
    else:
134 79b5d61b Sofia Papagiannaki
        uuids = input_data.get('uuids', [])
135 79b5d61b Sofia Papagiannaki
        if uuids is None and user_call:
136 79b5d61b Sofia Papagiannaki
            uuids = []
137 79b5d61b Sofia Papagiannaki
        displaynames = input_data.get('displaynames', [])
138 79b5d61b Sofia Papagiannaki
        if displaynames is None and user_call:
139 79b5d61b Sofia Papagiannaki
            displaynames = []
140 79b5d61b Sofia Papagiannaki
        user_obj = AstakosUser.objects
141 79b5d61b Sofia Papagiannaki
        d = {'uuid_catalog': user_obj.uuid_catalog(uuids),
142 79b5d61b Sofia Papagiannaki
             'displayname_catalog': user_obj.displayname_catalog(displaynames)}
143 79b5d61b Sofia Papagiannaki
144 79b5d61b Sofia Papagiannaki
        response = HttpResponse()
145 79b5d61b Sofia Papagiannaki
        response.content = json.dumps(d)
146 79b5d61b Sofia Papagiannaki
        response['Content-Type'] = 'application/json; charset=UTF-8'
147 79b5d61b Sofia Papagiannaki
        response['Content-Length'] = len(response.content)
148 79b5d61b Sofia Papagiannaki
        return response
149 79b5d61b Sofia Papagiannaki
150 79b5d61b Sofia Papagiannaki
151 276f454e Sofia Papagiannaki
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
152 79b5d61b Sofia Papagiannaki
    form = FeedbackForm(request.POST)
153 79b5d61b Sofia Papagiannaki
    if not form.is_valid():
154 79b5d61b Sofia Papagiannaki
        logger.error("Invalid feedback request: %r", form.errors)
155 79b5d61b Sofia Papagiannaki
        raise faults.BadRequest('Invalid data')
156 79b5d61b Sofia Papagiannaki
157 79b5d61b Sofia Papagiannaki
    msg = form.cleaned_data['feedback_msg']
158 79b5d61b Sofia Papagiannaki
    data = form.cleaned_data['feedback_data']
159 79b5d61b Sofia Papagiannaki
    try:
160 276f454e Sofia Papagiannaki
        send_feedback_func(msg, data, request.user, email_template_name)
161 79b5d61b Sofia Papagiannaki
    except:
162 79b5d61b Sofia Papagiannaki
        return HttpResponse(status=502)
163 79b5d61b Sofia Papagiannaki
    return HttpResponse(status=200)