Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / im / api / service.py @ a4398c8c

History | View | Annotate | Download (4.2 kB)

1 6b03a847 Sofia Papagiannaki
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 6b03a847 Sofia Papagiannaki
#
3 6b03a847 Sofia Papagiannaki
# Redistribution and use in source and binary forms, with or
4 6b03a847 Sofia Papagiannaki
# without modification, are permitted provided that the following
5 6b03a847 Sofia Papagiannaki
# conditions are met:
6 6b03a847 Sofia Papagiannaki
#
7 6b03a847 Sofia Papagiannaki
#   1. Redistributions of source code must retain the above
8 6b03a847 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
9 6b03a847 Sofia Papagiannaki
#      disclaimer.
10 6b03a847 Sofia Papagiannaki
#
11 6b03a847 Sofia Papagiannaki
#   2. Redistributions in binary form must reproduce the above
12 6b03a847 Sofia Papagiannaki
#      copyright notice, this list of conditions and the following
13 6b03a847 Sofia Papagiannaki
#      disclaimer in the documentation and/or other materials
14 6b03a847 Sofia Papagiannaki
#      provided with the distribution.
15 6b03a847 Sofia Papagiannaki
#
16 6b03a847 Sofia Papagiannaki
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 6b03a847 Sofia Papagiannaki
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 6b03a847 Sofia Papagiannaki
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 6b03a847 Sofia Papagiannaki
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 6b03a847 Sofia Papagiannaki
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 6b03a847 Sofia Papagiannaki
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 6b03a847 Sofia Papagiannaki
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 6b03a847 Sofia Papagiannaki
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 6b03a847 Sofia Papagiannaki
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 6b03a847 Sofia Papagiannaki
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 6b03a847 Sofia Papagiannaki
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 6b03a847 Sofia Papagiannaki
# POSSIBILITY OF SUCH DAMAGE.
28 6b03a847 Sofia Papagiannaki
#
29 6b03a847 Sofia Papagiannaki
# The views and conclusions contained in the software and
30 6b03a847 Sofia Papagiannaki
# documentation are those of the authors and should not be
31 6b03a847 Sofia Papagiannaki
# interpreted as representing official policies, either expressed
32 6b03a847 Sofia Papagiannaki
# or implied, of GRNET S.A.
33 6b03a847 Sofia Papagiannaki
34 6b03a847 Sofia Papagiannaki
import logging
35 6b03a847 Sofia Papagiannaki
36 6b03a847 Sofia Papagiannaki
from functools import wraps
37 6b03a847 Sofia Papagiannaki
from time import time, mktime
38 6b03a847 Sofia Papagiannaki
39 6b03a847 Sofia Papagiannaki
from django.http import HttpResponse
40 6b03a847 Sofia Papagiannaki
from django.views.decorators.csrf import csrf_exempt
41 c700f742 Sofia Papagiannaki
from django.utils import simplejson as json
42 6b03a847 Sofia Papagiannaki
43 2a7276e7 Sofia Papagiannaki
from . import render_fault, __get_uuid_displayname_catalogs, __send_feedback
44 c700f742 Sofia Papagiannaki
from .faults import (
45 c700f742 Sofia Papagiannaki
    Fault, Unauthorized, InternalServerError, BadRequest, ItemNotFound)
46 890c2065 Sofia Papagiannaki
from astakos.im.models import Service
47 6b03a847 Sofia Papagiannaki
48 6b03a847 Sofia Papagiannaki
logger = logging.getLogger(__name__)
49 6b03a847 Sofia Papagiannaki
50 5ce3ce4f Sofia Papagiannaki
51 6b03a847 Sofia Papagiannaki
def api_method(http_method=None, token_required=False):
52 6b03a847 Sofia Papagiannaki
    """Decorator function for views that implement an API method."""
53 6b03a847 Sofia Papagiannaki
    def decorator(func):
54 6b03a847 Sofia Papagiannaki
        @wraps(func)
55 6b03a847 Sofia Papagiannaki
        def wrapper(request, *args, **kwargs):
56 6b03a847 Sofia Papagiannaki
            try:
57 6b03a847 Sofia Papagiannaki
                if http_method and request.method != http_method:
58 6b03a847 Sofia Papagiannaki
                    raise BadRequest('Method not allowed.')
59 6b03a847 Sofia Papagiannaki
                x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
60 6b03a847 Sofia Papagiannaki
                if token_required:
61 6b03a847 Sofia Papagiannaki
                    if not x_auth_token:
62 6b03a847 Sofia Papagiannaki
                        raise Unauthorized('Access denied')
63 6b03a847 Sofia Papagiannaki
                    try:
64 6b03a847 Sofia Papagiannaki
                        service = Service.objects.get(auth_token=x_auth_token)
65 5ce3ce4f Sofia Papagiannaki
66 6b03a847 Sofia Papagiannaki
                        # Check if the token has expired.
67 08494423 Sofia Papagiannaki
                        if service.auth_token_expires:
68 08494423 Sofia Papagiannaki
                            if (time() - mktime(service.auth_token_expires.timetuple())) > 0:
69 08494423 Sofia Papagiannaki
                                raise Unauthorized('Authentication expired')
70 a4398c8c Giorgos Korfiatis
                        request.service_instance = service
71 6b03a847 Sofia Papagiannaki
                    except Service.DoesNotExist, e:
72 6b03a847 Sofia Papagiannaki
                        raise Unauthorized('Invalid X-Auth-Token')
73 6b03a847 Sofia Papagiannaki
                response = func(request, *args, **kwargs)
74 6b03a847 Sofia Papagiannaki
                return response
75 6b03a847 Sofia Papagiannaki
            except Fault, fault:
76 6b03a847 Sofia Papagiannaki
                return render_fault(request, fault)
77 6b03a847 Sofia Papagiannaki
            except BaseException, e:
78 6b03a847 Sofia Papagiannaki
                logger.exception('Unexpected error: %s' % e)
79 6b03a847 Sofia Papagiannaki
                fault = InternalServerError('Unexpected error')
80 6b03a847 Sofia Papagiannaki
                return render_fault(request, fault)
81 6b03a847 Sofia Papagiannaki
        return wrapper
82 6b03a847 Sofia Papagiannaki
    return decorator
83 6b03a847 Sofia Papagiannaki
84 890c2065 Sofia Papagiannaki
@csrf_exempt
85 890c2065 Sofia Papagiannaki
@api_method(http_method='POST', token_required=True)
86 890c2065 Sofia Papagiannaki
def get_uuid_displayname_catalogs(request):
87 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
88 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
89 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
90 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
91 6b03a847 Sofia Papagiannaki
92 19246578 Sofia Papagiannaki
    return __get_uuid_displayname_catalogs(request, user_call=False)
93 5ce3ce4f Sofia Papagiannaki
94 6b03a847 Sofia Papagiannaki
@csrf_exempt
95 6b03a847 Sofia Papagiannaki
@api_method(http_method='POST', token_required=True)
96 6b03a847 Sofia Papagiannaki
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
97 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
98 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
99 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
100 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
101 5ce3ce4f Sofia Papagiannaki
102 890c2065 Sofia Papagiannaki
    return __send_feedback(request, email_template_name)