Revision 7376ef80 snf-astakos-app/astakos/im/api/service.py

b/snf-astakos-app/astakos/im/api/service.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
import logging
35
import urllib
36 35

  
37
from functools import wraps
38
from traceback import format_exc
39 36
from time import time, mktime
40
from urllib import quote
41
from urlparse import urlparse
42
from collections import defaultdict
43 37

  
44
from django.conf import settings
45 38
from django.http import HttpResponse
46
from django.core.urlresolvers import reverse
39
from django.utils import simplejson as json
47 40
from django.views.decorators.csrf import csrf_exempt
48 41

  
49 42
from astakos.im.api.faults import *
43
from astakos.im.api import _get_user_by_email, _get_user_by_username, apiMethod
50 44
from astakos.im.models import AstakosUser, Service
51
from astakos.im.settings import INVITATIONS_ENABLED, COOKIE_NAME, EMAILCHANGE_ENABLED
52 45
from astakos.im.util import epoch
53 46
from astakos.im.forms import FeedbackForm
54 47
from astakos.im.functions import send_feedback as send_feedback_func, SendMailError
55 48

  
56 49
logger = logging.getLogger(__name__)
57 50

  
58
def render_fault(request, fault):
59
    if isinstance(fault, InternalServerError) and settings.DEBUG:
60
        fault.details = format_exc(fault)
51
class service_api_method(apiMethod):
52
    def _get_token_owner(self, x_auth_token):
53
        try:
54
            service = Service.objects.get(auth_token=x_auth_token)
55
            
56
            # Check if the token has expired.
57
            if (time() - mktime(service.auth_token_expires.timetuple())) > 0:
58
                raise Unauthorized('Authentication expired')
59
            
60
            return service
61
        except Service.DoesNotExist, e:
62
            raise Unauthorized('Invalid X-Auth-Token')
61 63

  
62
    request.serialization = 'text'
63
    data = fault.message + '\n'
64
    if fault.details:
65
        data += '\n' + fault.details
66
    response = HttpResponse(data, status=fault.code)
67
    response['Content-Length'] = len(response.content)
68
    return response
69

  
70
def api_method(http_method=None, token_required=False):
71
    """Decorator function for views that implement an API method."""
72
    def decorator(func):
73
        @wraps(func)
74
        def wrapper(request, *args, **kwargs):
75
            try:
76
                if http_method and request.method != http_method:
77
                    raise BadRequest('Method not allowed.')
78
                x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
79
                if token_required:
80
                    if not x_auth_token:
81
                        raise Unauthorized('Access denied')
82
                    try:
83
                        service = Service.objects.get(auth_token=x_auth_token)
84
                        
85
                        # Check if the token has expired.
86
                        if (time() - mktime(service.auth_token_expires.timetuple())) > 0:
87
                            raise Unauthorized('Authentication expired')
88
                    except Service.DoesNotExist, e:
89
                        raise Unauthorized('Invalid X-Auth-Token')
90
                response = func(request, *args, **kwargs)
91
                return response
92
            except Fault, fault:
93
                return render_fault(request, fault)
94
            except BaseException, e:
95
                logger.exception('Unexpected error: %s' % e)
96
                fault = InternalServerError('Unexpected error')
97
                return render_fault(request, fault)
98
        return wrapper
99
    return decorator
100

  
101
@api_method(http_method='GET', token_required=True)
64
@service_api_method(http_method='GET', token_required=True)
102 65
def get_user_by_email(request, user=None):
103 66
    # Normal Response Codes: 200
104 67
    # Error Response Codes: internalServerError (500)
......
109 72
    email = request.GET.get('name')
110 73
    return _get_user_by_email(email)
111 74

  
112
@api_method(http_method='GET', token_required=True)
75
@service_api_method(http_method='GET', token_required=True)
113 76
def get_user_by_username(request, user_id, user=None):
114 77
    # Normal Response Codes: 200
115 78
    # Error Response Codes: internalServerError (500)
......
120 83
    return _get_user_by_username(user_id)
121 84

  
122 85
@csrf_exempt
123
@api_method(http_method='POST', token_required=True)
86
@service_api_method(http_method='POST', token_required=True)
124 87
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
125 88
    # Normal Response Codes: 200
126 89
    # Error Response Codes: internalServerError (500)

Also available in: Unified diff