Revision 79b5d61b snf-astakos-app/astakos/api/util.py

b/snf-astakos-app/astakos/api/util.py
31 31
# interpreted as representing official policies, either expressed
32 32
# or implied, of GRNET S.A.
33 33

  
34
from functools import wraps
35
from time import time, mktime
36

  
34 37
from django.http import HttpResponse
35 38
from django.utils import simplejson as json
36 39

  
40
from astakos.im.models import AstakosUser, Service
41
from snf_django.lib.api import faults
42

  
43
from astakos.im.forms import FeedbackForm
44
from astakos.im.functions import send_feedback as send_feedback_func
45

  
46
import logging
47
logger = logging.getLogger(__name__)
48

  
49
absolute = lambda request, url: request.build_absolute_uri(url)
50

  
37 51

  
38 52
def json_response(content, status_code=None):
39 53
    response = HttpResponse()
......
52 66

  
53 67
def are_integer(lst):
54 68
    return all(map(is_integer, lst))
69

  
70

  
71
def user_from_token(func):
72
    @wraps(func)
73
    def wrapper(request, *args, **kwargs):
74
        try:
75
            token = request.x_auth_token
76
        except AttributeError:
77
            raise faults.Unauthorized("No authentication token")
78

  
79
        if not token:
80
            raise faults.Unauthorized("Invalid X-Auth-Token")
81

  
82
        try:
83
            user = AstakosUser.objects.get(auth_token=token)
84
        except AstakosUser.DoesNotExist:
85
            raise faults.Unauthorized('Invalid X-Auth-Token')
86

  
87
        return func(request, user, *args, **kwargs)
88
    return wrapper
89

  
90

  
91
def service_from_token(func):
92
    """Decorator for authenticating service by it's token.
93

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

  
98
    """
99
    @wraps(func)
100
    def wrapper(request, *args, **kwargs):
101
        try:
102
            token = request.x_auth_token
103
        except AttributeError:
104
            raise faults.Unauthorized("No authentication token")
105

  
106
        if not token:
107
            raise faults.Unauthorized("Invalid X-Auth-Token")
108
        try:
109
            service = Service.objects.get(auth_token=token)
110
        except Service.DoesNotExist:
111
            raise faults.Unauthorized("Invalid X-Auth-Token")
112

  
113
        # Check if the token has expired
114
        expiration_date = service.auth_token_expires
115
        if expiration_date:
116
            expires_at = mktime(expiration_date.timetuple())
117
            if time() > expires_at:
118
                raise faults.Unauthorized("Authentication expired")
119

  
120
        request.service_instance = service
121
        return func(request, *args, **kwargs)
122
    return wrapper
123

  
124

  
125
def __get_uuid_displayname_catalogs(request, user_call=True):
126
    # Normal Response Codes: 200
127
    # Error Response Codes: BadRequest (400)
128

  
129
    try:
130
        input_data = json.loads(request.raw_post_data)
131
    except:
132
        raise faults.BadRequest('Request body should be json formatted.')
133
    else:
134
        uuids = input_data.get('uuids', [])
135
        if uuids is None and user_call:
136
            uuids = []
137
        displaynames = input_data.get('displaynames', [])
138
        if displaynames is None and user_call:
139
            displaynames = []
140
        user_obj = AstakosUser.objects
141
        d = {'uuid_catalog': user_obj.uuid_catalog(uuids),
142
             'displayname_catalog': user_obj.displayname_catalog(displaynames)}
143

  
144
        response = HttpResponse()
145
        response.content = json.dumps(d)
146
        response['Content-Type'] = 'application/json; charset=UTF-8'
147
        response['Content-Length'] = len(response.content)
148
        return response
149

  
150

  
151
def __send_feedback(request, email_template_name='im/feedback_mail.txt',
152
                    user=None):
153
    if not user:
154
        auth_token = request.POST.get('auth', '')
155
        if not auth_token:
156
            raise faults.BadRequest('Missing user authentication')
157

  
158
        try:
159
            user = AstakosUser.objects.get(auth_token=auth_token)
160
        except AstakosUser.DoesNotExist:
161
            raise faults.BadRequest('Invalid user authentication')
162

  
163
    form = FeedbackForm(request.POST)
164
    if not form.is_valid():
165
        logger.error("Invalid feedback request: %r", form.errors)
166
        raise faults.BadRequest('Invalid data')
167

  
168
    msg = form.cleaned_data['feedback_msg']
169
    data = form.cleaned_data['feedback_data']
170
    try:
171
        send_feedback_func(msg, data, user, email_template_name)
172
    except:
173
        return HttpResponse(status=502)
174
    return HttpResponse(status=200)

Also available in: Unified diff