Revision ee7a2b87 snf-astakos-app/astakos/im/api/service.py

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

  
34
import logging
35

  
36
from functools import wraps
37 34
from time import time, mktime
38

  
35
from functools import wraps
39 36
from django.views.decorators.csrf import csrf_exempt
40 37

  
41
from . import render_fault, __get_uuid_displayname_catalogs, __send_feedback
38
from . import  __get_uuid_displayname_catalogs, __send_feedback
39
from snf_django.lib import api
42 40
from snf_django.lib.api import faults
43 41
from astakos.im.models import Service
44 42

  
43
import logging
45 44
logger = logging.getLogger(__name__)
46 45

  
47 46

  
48
def api_method(http_method=None, token_required=False):
49
    """Decorator function for views that implement an API method."""
50
    def decorator(func):
51
        @wraps(func)
52
        def wrapper(request, *args, **kwargs):
53
            try:
54
                if http_method and request.method != http_method:
55
                    raise faults.BadRequest('Method not allowed.')
56
                x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
57
                if token_required:
58
                    if not x_auth_token:
59
                        raise faults.Unauthorized('Access denied')
60
                    try:
61
                        service = Service.objects.get(auth_token=x_auth_token)
47
def service_from_token(func):
48
    """Decorator for authenticating service by it's token.
62 49

  
63
                        # Check if the token has expired.
64
                        if service.auth_token_expires:
65
                            if (time() - mktime(service.auth_token_expires.timetuple())) > 0:
66
                                raise faults.Unauthorized('Authentication expired')
67
                    except Service.DoesNotExist, e:
68
                        raise faults.Unauthorized('Invalid X-Auth-Token')
69
                response = func(request, *args, **kwargs)
70
                return response
71
            except faults.Fault, fault:
72
                return render_fault(request, fault)
73
            except BaseException, e:
74
                logger.exception('Unexpected error: %s' % e)
75
                fault = faults.InternalServerError('Unexpected error')
76
                return render_fault(request, fault)
77
        return wrapper
78
    return decorator
50
    Check that a service with the corresponding token exists. Also,
51
    if service's token has an expiration token, check that it has not
52
    expired.
53

  
54
    """
55
    @wraps(func)
56
    def wrapper(request, *args, **kwargs):
57
        try:
58
            token = request.x_auth_token
59
        except AttributeError:
60
            raise faults.Unauthorized("No authentication token")
61

  
62
        if not token:
63
            raise faults.Unauthorized("Invalid X-Auth-Token")
64
        try:
65
            service = Service.objects.get(auth_token=token)
66
        except Service.DoesNotExist:
67
            raise faults.Unauthorized("Invalid X-Auth-Token")
68

  
69
        # Check if the token has expired
70
        expiration_date = service.auth_token_expires
71
        if expiration_date:
72
            expires_at = mktime(expiration_date.timetuple())
73
            if time() > expires_at:
74
                raise faults.Unauthorized("Authentication expired")
75

  
76
        return func(request, *args, **kwargs)
77
    return wrapper
79 78

  
80 79

  
81 80
@csrf_exempt
82
@api_method(http_method='POST', token_required=True)
81
@api.api_method(http_method='POST', token_required=True, user_required=False,
82
            logger=logger)
83
@service_from_token  # Authenticate service !!
83 84
def get_uuid_displayname_catalogs(request):
84 85
    # Normal Response Codes: 200
85 86
    # Error Response Codes: internalServerError (500)
86 87
    #                       badRequest (400)
87 88
    #                       unauthorised (401)
88

  
89 89
    return __get_uuid_displayname_catalogs(request, user_call=False)
90 90

  
91 91

  
92 92
@csrf_exempt
93
@api_method(http_method='POST', token_required=True)
93
@api.api_method(http_method='POST', token_required=True, user_required=False,
94
            logger=logger)
95
@service_from_token  # Authenticate service !!
94 96
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
95 97
    # Normal Response Codes: 200
96 98
    # Error Response Codes: internalServerError (500)
97 99
    #                       badRequest (400)
98 100
    #                       unauthorised (401)
99

  
100 101
    return __send_feedback(request, email_template_name)

Also available in: Unified diff