Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.8 kB)

1 bd40abfa Christos Stavrakakis
# Copyright 2011-2013 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
from time import time, mktime
35 ee7a2b87 Christos Stavrakakis
from functools import wraps
36 6b03a847 Sofia Papagiannaki
from django.views.decorators.csrf import csrf_exempt
37 6b03a847 Sofia Papagiannaki
38 ee7a2b87 Christos Stavrakakis
from . import  __get_uuid_displayname_catalogs, __send_feedback
39 ee7a2b87 Christos Stavrakakis
from snf_django.lib import api
40 bd40abfa Christos Stavrakakis
from snf_django.lib.api import faults
41 890c2065 Sofia Papagiannaki
from astakos.im.models import Service
42 6b03a847 Sofia Papagiannaki
43 ee7a2b87 Christos Stavrakakis
import logging
44 6b03a847 Sofia Papagiannaki
logger = logging.getLogger(__name__)
45 6b03a847 Sofia Papagiannaki
46 5ce3ce4f Sofia Papagiannaki
47 ee7a2b87 Christos Stavrakakis
def service_from_token(func):
48 ee7a2b87 Christos Stavrakakis
    """Decorator for authenticating service by it's token.
49 5ce3ce4f Sofia Papagiannaki

50 ee7a2b87 Christos Stavrakakis
    Check that a service with the corresponding token exists. Also,
51 ee7a2b87 Christos Stavrakakis
    if service's token has an expiration token, check that it has not
52 ee7a2b87 Christos Stavrakakis
    expired.
53 ee7a2b87 Christos Stavrakakis

54 ee7a2b87 Christos Stavrakakis
    """
55 ee7a2b87 Christos Stavrakakis
    @wraps(func)
56 ee7a2b87 Christos Stavrakakis
    def wrapper(request, *args, **kwargs):
57 ee7a2b87 Christos Stavrakakis
        try:
58 ee7a2b87 Christos Stavrakakis
            token = request.x_auth_token
59 ee7a2b87 Christos Stavrakakis
        except AttributeError:
60 ee7a2b87 Christos Stavrakakis
            raise faults.Unauthorized("No authentication token")
61 ee7a2b87 Christos Stavrakakis
62 ee7a2b87 Christos Stavrakakis
        if not token:
63 ee7a2b87 Christos Stavrakakis
            raise faults.Unauthorized("Invalid X-Auth-Token")
64 ee7a2b87 Christos Stavrakakis
        try:
65 ee7a2b87 Christos Stavrakakis
            service = Service.objects.get(auth_token=token)
66 ee7a2b87 Christos Stavrakakis
        except Service.DoesNotExist:
67 ee7a2b87 Christos Stavrakakis
            raise faults.Unauthorized("Invalid X-Auth-Token")
68 ee7a2b87 Christos Stavrakakis
69 ee7a2b87 Christos Stavrakakis
        # Check if the token has expired
70 ee7a2b87 Christos Stavrakakis
        expiration_date = service.auth_token_expires
71 ee7a2b87 Christos Stavrakakis
        if expiration_date:
72 ee7a2b87 Christos Stavrakakis
            expires_at = mktime(expiration_date.timetuple())
73 ee7a2b87 Christos Stavrakakis
            if time() > expires_at:
74 ee7a2b87 Christos Stavrakakis
                raise faults.Unauthorized("Authentication expired")
75 ee7a2b87 Christos Stavrakakis
76 befa5997 Giorgos Korfiatis
        request.service_instance = service
77 ee7a2b87 Christos Stavrakakis
        return func(request, *args, **kwargs)
78 ee7a2b87 Christos Stavrakakis
    return wrapper
79 5ce3ce4f Sofia Papagiannaki
80 6b03a847 Sofia Papagiannaki
81 890c2065 Sofia Papagiannaki
@csrf_exempt
82 ee7a2b87 Christos Stavrakakis
@api.api_method(http_method='POST', token_required=True, user_required=False,
83 ee7a2b87 Christos Stavrakakis
            logger=logger)
84 ee7a2b87 Christos Stavrakakis
@service_from_token  # Authenticate service !!
85 890c2065 Sofia Papagiannaki
def get_uuid_displayname_catalogs(request):
86 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
87 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
88 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
89 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
90 19246578 Sofia Papagiannaki
    return __get_uuid_displayname_catalogs(request, user_call=False)
91 5ce3ce4f Sofia Papagiannaki
92 bd40abfa Christos Stavrakakis
93 6b03a847 Sofia Papagiannaki
@csrf_exempt
94 ee7a2b87 Christos Stavrakakis
@api.api_method(http_method='POST', token_required=True, user_required=False,
95 ee7a2b87 Christos Stavrakakis
            logger=logger)
96 ee7a2b87 Christos Stavrakakis
@service_from_token  # Authenticate service !!
97 6b03a847 Sofia Papagiannaki
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
98 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
99 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
100 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
101 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
102 890c2065 Sofia Papagiannaki
    return __send_feedback(request, email_template_name)