Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.3 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
from urlparse import urlparse
39 6b03a847 Sofia Papagiannaki
from collections import defaultdict
40 6b03a847 Sofia Papagiannaki
41 6b03a847 Sofia Papagiannaki
from django.http import HttpResponse
42 6b03a847 Sofia Papagiannaki
from django.views.decorators.csrf import csrf_exempt
43 6b03a847 Sofia Papagiannaki
44 6b03a847 Sofia Papagiannaki
from astakos.im.api.faults import *
45 14c5be5a Sofia Papagiannaki
from astakos.im.api import render_fault
46 6b03a847 Sofia Papagiannaki
from astakos.im.models import AstakosUser, Service
47 6b03a847 Sofia Papagiannaki
from astakos.im.util import epoch
48 6b03a847 Sofia Papagiannaki
from astakos.im.forms import FeedbackForm
49 6b03a847 Sofia Papagiannaki
from astakos.im.functions import send_feedback as send_feedback_func, SendMailError
50 6b03a847 Sofia Papagiannaki
51 6b03a847 Sofia Papagiannaki
logger = logging.getLogger(__name__)
52 6b03a847 Sofia Papagiannaki
53 6b03a847 Sofia Papagiannaki
def api_method(http_method=None, token_required=False):
54 6b03a847 Sofia Papagiannaki
    """Decorator function for views that implement an API method."""
55 6b03a847 Sofia Papagiannaki
    def decorator(func):
56 6b03a847 Sofia Papagiannaki
        @wraps(func)
57 6b03a847 Sofia Papagiannaki
        def wrapper(request, *args, **kwargs):
58 6b03a847 Sofia Papagiannaki
            try:
59 6b03a847 Sofia Papagiannaki
                if http_method and request.method != http_method:
60 6b03a847 Sofia Papagiannaki
                    raise BadRequest('Method not allowed.')
61 6b03a847 Sofia Papagiannaki
                x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
62 6b03a847 Sofia Papagiannaki
                if token_required:
63 6b03a847 Sofia Papagiannaki
                    if not x_auth_token:
64 6b03a847 Sofia Papagiannaki
                        raise Unauthorized('Access denied')
65 6b03a847 Sofia Papagiannaki
                    try:
66 6b03a847 Sofia Papagiannaki
                        service = Service.objects.get(auth_token=x_auth_token)
67 6b03a847 Sofia Papagiannaki
                        
68 6b03a847 Sofia Papagiannaki
                        # Check if the token has expired.
69 6b03a847 Sofia Papagiannaki
                        if (time() - mktime(service.auth_token_expires.timetuple())) > 0:
70 6b03a847 Sofia Papagiannaki
                            raise Unauthorized('Authentication expired')
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 6b03a847 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True)
85 6b03a847 Sofia Papagiannaki
def get_user_by_email(request, user=None):
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 6b03a847 Sofia Papagiannaki
    #                       forbidden (403)
91 6b03a847 Sofia Papagiannaki
    #                       itemNotFound (404)
92 6b03a847 Sofia Papagiannaki
    email = request.GET.get('name')
93 6b03a847 Sofia Papagiannaki
    return _get_user_by_email(email)
94 6b03a847 Sofia Papagiannaki
95 6b03a847 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True)
96 6b03a847 Sofia Papagiannaki
def get_user_by_username(request, user_id, user=None):
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 6b03a847 Sofia Papagiannaki
    #                       forbidden (403)
102 6b03a847 Sofia Papagiannaki
    #                       itemNotFound (404)
103 6b03a847 Sofia Papagiannaki
    return _get_user_by_username(user_id)
104 6b03a847 Sofia Papagiannaki
105 6b03a847 Sofia Papagiannaki
@csrf_exempt
106 6b03a847 Sofia Papagiannaki
@api_method(http_method='POST', token_required=True)
107 6b03a847 Sofia Papagiannaki
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
108 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
109 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
110 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
111 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
112 6b03a847 Sofia Papagiannaki
    auth_token = request.POST.get('auth', '')
113 6b03a847 Sofia Papagiannaki
    if not auth_token:
114 6b03a847 Sofia Papagiannaki
        raise BadRequest('Missing user authentication')
115 6b03a847 Sofia Papagiannaki
    
116 6b03a847 Sofia Papagiannaki
    user  = None
117 6b03a847 Sofia Papagiannaki
    try:
118 6b03a847 Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=auth_token)
119 6b03a847 Sofia Papagiannaki
    except:
120 6b03a847 Sofia Papagiannaki
        pass
121 6b03a847 Sofia Papagiannaki
    
122 6b03a847 Sofia Papagiannaki
    if not user:
123 6b03a847 Sofia Papagiannaki
        raise BadRequest('Invalid user authentication')
124 6b03a847 Sofia Papagiannaki
    
125 6b03a847 Sofia Papagiannaki
    form = FeedbackForm(request.POST)
126 6b03a847 Sofia Papagiannaki
    if not form.is_valid():
127 6b03a847 Sofia Papagiannaki
        raise BadRequest('Invalid data')
128 6b03a847 Sofia Papagiannaki
    
129 6b03a847 Sofia Papagiannaki
    msg = form.cleaned_data['feedback_msg']
130 6b03a847 Sofia Papagiannaki
    data = form.cleaned_data['feedback_data']
131 6b03a847 Sofia Papagiannaki
    send_feedback_func(msg, data, user, email_template_name)
132 6b03a847 Sofia Papagiannaki
    response = HttpResponse(status=200)
133 6b03a847 Sofia Papagiannaki
    response['Content-Length'] = len(response.content)
134 6b03a847 Sofia Papagiannaki
    return response