Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5.9 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
import urllib
36 6b03a847 Sofia Papagiannaki
37 6b03a847 Sofia Papagiannaki
from functools import wraps
38 6b03a847 Sofia Papagiannaki
from traceback import format_exc
39 6b03a847 Sofia Papagiannaki
from time import time, mktime
40 6b03a847 Sofia Papagiannaki
from urllib import quote
41 6b03a847 Sofia Papagiannaki
from urlparse import urlparse
42 6b03a847 Sofia Papagiannaki
from collections import defaultdict
43 6b03a847 Sofia Papagiannaki
44 6b03a847 Sofia Papagiannaki
from django.conf import settings
45 6b03a847 Sofia Papagiannaki
from django.http import HttpResponse
46 6b03a847 Sofia Papagiannaki
from django.core.urlresolvers import reverse
47 6b03a847 Sofia Papagiannaki
from django.views.decorators.csrf import csrf_exempt
48 6b03a847 Sofia Papagiannaki
49 6b03a847 Sofia Papagiannaki
from astakos.im.api.faults import *
50 6b03a847 Sofia Papagiannaki
from astakos.im.models import AstakosUser, Service
51 6b03a847 Sofia Papagiannaki
from astakos.im.settings import INVITATIONS_ENABLED, COOKIE_NAME, EMAILCHANGE_ENABLED
52 6b03a847 Sofia Papagiannaki
from astakos.im.util import epoch
53 6b03a847 Sofia Papagiannaki
from astakos.im.forms import FeedbackForm
54 6b03a847 Sofia Papagiannaki
from astakos.im.functions import send_feedback as send_feedback_func, SendMailError
55 6b03a847 Sofia Papagiannaki
56 6b03a847 Sofia Papagiannaki
logger = logging.getLogger(__name__)
57 6b03a847 Sofia Papagiannaki
58 6b03a847 Sofia Papagiannaki
def render_fault(request, fault):
59 6b03a847 Sofia Papagiannaki
    if isinstance(fault, InternalServerError) and settings.DEBUG:
60 6b03a847 Sofia Papagiannaki
        fault.details = format_exc(fault)
61 6b03a847 Sofia Papagiannaki
62 6b03a847 Sofia Papagiannaki
    request.serialization = 'text'
63 6b03a847 Sofia Papagiannaki
    data = fault.message + '\n'
64 6b03a847 Sofia Papagiannaki
    if fault.details:
65 6b03a847 Sofia Papagiannaki
        data += '\n' + fault.details
66 6b03a847 Sofia Papagiannaki
    response = HttpResponse(data, status=fault.code)
67 6b03a847 Sofia Papagiannaki
    response['Content-Length'] = len(response.content)
68 6b03a847 Sofia Papagiannaki
    return response
69 6b03a847 Sofia Papagiannaki
70 6b03a847 Sofia Papagiannaki
def api_method(http_method=None, token_required=False):
71 6b03a847 Sofia Papagiannaki
    """Decorator function for views that implement an API method."""
72 6b03a847 Sofia Papagiannaki
    def decorator(func):
73 6b03a847 Sofia Papagiannaki
        @wraps(func)
74 6b03a847 Sofia Papagiannaki
        def wrapper(request, *args, **kwargs):
75 6b03a847 Sofia Papagiannaki
            try:
76 6b03a847 Sofia Papagiannaki
                if http_method and request.method != http_method:
77 6b03a847 Sofia Papagiannaki
                    raise BadRequest('Method not allowed.')
78 6b03a847 Sofia Papagiannaki
                x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
79 6b03a847 Sofia Papagiannaki
                if token_required:
80 6b03a847 Sofia Papagiannaki
                    if not x_auth_token:
81 6b03a847 Sofia Papagiannaki
                        raise Unauthorized('Access denied')
82 6b03a847 Sofia Papagiannaki
                    try:
83 6b03a847 Sofia Papagiannaki
                        service = Service.objects.get(auth_token=x_auth_token)
84 6b03a847 Sofia Papagiannaki
                        
85 6b03a847 Sofia Papagiannaki
                        # Check if the token has expired.
86 6b03a847 Sofia Papagiannaki
                        if (time() - mktime(service.auth_token_expires.timetuple())) > 0:
87 6b03a847 Sofia Papagiannaki
                            raise Unauthorized('Authentication expired')
88 6b03a847 Sofia Papagiannaki
                    except Service.DoesNotExist, e:
89 6b03a847 Sofia Papagiannaki
                        raise Unauthorized('Invalid X-Auth-Token')
90 6b03a847 Sofia Papagiannaki
                response = func(request, *args, **kwargs)
91 6b03a847 Sofia Papagiannaki
                return response
92 6b03a847 Sofia Papagiannaki
            except Fault, fault:
93 6b03a847 Sofia Papagiannaki
                return render_fault(request, fault)
94 6b03a847 Sofia Papagiannaki
            except BaseException, e:
95 6b03a847 Sofia Papagiannaki
                logger.exception('Unexpected error: %s' % e)
96 6b03a847 Sofia Papagiannaki
                fault = InternalServerError('Unexpected error')
97 6b03a847 Sofia Papagiannaki
                return render_fault(request, fault)
98 6b03a847 Sofia Papagiannaki
        return wrapper
99 6b03a847 Sofia Papagiannaki
    return decorator
100 6b03a847 Sofia Papagiannaki
101 6b03a847 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True)
102 6b03a847 Sofia Papagiannaki
def get_user_by_email(request, user=None):
103 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
104 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
105 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
106 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
107 6b03a847 Sofia Papagiannaki
    #                       forbidden (403)
108 6b03a847 Sofia Papagiannaki
    #                       itemNotFound (404)
109 6b03a847 Sofia Papagiannaki
    email = request.GET.get('name')
110 6b03a847 Sofia Papagiannaki
    return _get_user_by_email(email)
111 6b03a847 Sofia Papagiannaki
112 6b03a847 Sofia Papagiannaki
@api_method(http_method='GET', token_required=True)
113 6b03a847 Sofia Papagiannaki
def get_user_by_username(request, user_id, user=None):
114 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
115 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
116 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
117 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
118 6b03a847 Sofia Papagiannaki
    #                       forbidden (403)
119 6b03a847 Sofia Papagiannaki
    #                       itemNotFound (404)
120 6b03a847 Sofia Papagiannaki
    return _get_user_by_username(user_id)
121 6b03a847 Sofia Papagiannaki
122 6b03a847 Sofia Papagiannaki
@csrf_exempt
123 6b03a847 Sofia Papagiannaki
@api_method(http_method='POST', token_required=True)
124 6b03a847 Sofia Papagiannaki
def send_feedback(request, email_template_name='im/feedback_mail.txt'):
125 6b03a847 Sofia Papagiannaki
    # Normal Response Codes: 200
126 6b03a847 Sofia Papagiannaki
    # Error Response Codes: internalServerError (500)
127 6b03a847 Sofia Papagiannaki
    #                       badRequest (400)
128 6b03a847 Sofia Papagiannaki
    #                       unauthorised (401)
129 6b03a847 Sofia Papagiannaki
    auth_token = request.POST.get('auth', '')
130 6b03a847 Sofia Papagiannaki
    if not auth_token:
131 6b03a847 Sofia Papagiannaki
        raise BadRequest('Missing user authentication')
132 6b03a847 Sofia Papagiannaki
    
133 6b03a847 Sofia Papagiannaki
    user  = None
134 6b03a847 Sofia Papagiannaki
    try:
135 6b03a847 Sofia Papagiannaki
        user = AstakosUser.objects.get(auth_token=auth_token)
136 6b03a847 Sofia Papagiannaki
    except:
137 6b03a847 Sofia Papagiannaki
        pass
138 6b03a847 Sofia Papagiannaki
    
139 6b03a847 Sofia Papagiannaki
    if not user:
140 6b03a847 Sofia Papagiannaki
        raise BadRequest('Invalid user authentication')
141 6b03a847 Sofia Papagiannaki
    
142 6b03a847 Sofia Papagiannaki
    form = FeedbackForm(request.POST)
143 6b03a847 Sofia Papagiannaki
    if not form.is_valid():
144 6b03a847 Sofia Papagiannaki
        raise BadRequest('Invalid data')
145 6b03a847 Sofia Papagiannaki
    
146 6b03a847 Sofia Papagiannaki
    msg = form.cleaned_data['feedback_msg']
147 6b03a847 Sofia Papagiannaki
    data = form.cleaned_data['feedback_data']
148 6b03a847 Sofia Papagiannaki
    send_feedback_func(msg, data, user, email_template_name)
149 6b03a847 Sofia Papagiannaki
    response = HttpResponse(status=200)
150 6b03a847 Sofia Papagiannaki
    response['Content-Length'] = len(response.content)
151 6b03a847 Sofia Papagiannaki
    return response