1 from traceback import format_exc
2 from time import time, mktime
3 from django.conf import settings
4 from django.http import HttpResponse
5 from django.utils import simplejson as json
7 from pithos.im.faults import BadRequest, Unauthorized, ServiceUnavailable
8 from pithos.im.models import User
12 def render_fault(request, fault):
13 if settings.DEBUG or settings.TEST:
14 fault.details = format_exc(fault)
16 request.serialization = 'text'
17 data = '\n'.join((fault.message, fault.details)) + '\n'
18 response = HttpResponse(data, status=fault.code)
21 def update_response_headers(response):
22 response['Content-Type'] = 'application/json; charset=UTF-8'
23 response['Content-Length'] = len(response.content)
25 def authenticate(request):
26 # Normal Response Codes: 204
27 # Error Response Codes: serviceUnavailable (503)
31 if request.method != 'GET':
32 raise BadRequest('Method not allowed.')
33 x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
35 return render_fault(request, BadRequest('Missing X-Auth-Token'))
38 user = User.objects.get(auth_token=x_auth_token)
39 except User.DoesNotExist, e:
40 return render_fault(request, Unauthorized('Invalid X-Auth-Token'))
42 # Check if the is active.
43 if user.state != 'ACTIVE':
44 return render_fault(request, Unauthorized('User inactive'))
46 # Check if the token has expired.
47 if (time() - mktime(user.auth_token_expires.timetuple())) > 0:
48 return render_fault(request, Unauthorized('Authentication expired'))
50 response = HttpResponse()
52 user_info = user.__dict__
53 for k,v in user_info.items():
54 if isinstance(v, datetime.datetime):
55 user_info[k] = v.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
56 user_info.pop('_state')
57 response.content = json.dumps(user_info)
58 update_response_headers(response)
60 except BaseException, e:
61 fault = ServiceUnavailable('Unexpected error')
62 return render_fault(request, fault)