provide authentication service & change pithos to contact it to authenticate users
[pithos] / pithos / im / api.py
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
6
7 from pithos.im.faults import BadRequest, Unauthorized, ServiceUnavailable
8 from pithos.im.models import User
9
10 import datetime
11
12 def render_fault(request, fault):
13     if settings.DEBUG or settings.TEST:
14         fault.details = format_exc(fault)
15     
16     request.serialization = 'text'
17     data = '\n'.join((fault.message, fault.details)) + '\n'
18     response = HttpResponse(data, status=fault.code)
19     return response
20
21 def update_response_headers(response):
22     response['Content-Type'] = 'application/json; charset=UTF-8'
23     response['Content-Length'] = len(response.content)
24
25 def authenticate(request):
26     # Normal Response Codes: 204
27     # Error Response Codes: serviceUnavailable (503)
28     #                       badRequest (400)
29     #                       unauthorised (401)
30     try:
31         if request.method != 'GET':
32             raise BadRequest('Method not allowed.')
33         x_auth_token = request.META.get('HTTP_X_AUTH_TOKEN')
34         if not x_auth_token:
35             return render_fault(request, BadRequest('Missing X-Auth-Token'))
36         
37         try:
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')) 
41         
42         # Check if the is active.
43         if user.state != 'ACTIVE':
44             return render_fault(request, Unauthorized('User inactive'))
45         
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'))
49         
50         response = HttpResponse()
51         response.status=204
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)
59         return response
60     except BaseException, e:
61         fault = ServiceUnavailable('Unexpected error')
62         return render_fault(request, fault)