blob: 4ed1471615862712ea07054f0a184a625063fe82 [file] [log] [blame]
mblighe8819cd2008-02-15 16:48:40 +00001from django.contrib.auth.models import User, Group, check_password
showarda5288b42009-07-28 20:06:08 +00002from django.contrib.auth import backends
mblighe8819cd2008-02-15 16:48:40 +00003from django.contrib import auth
4from django import http
5
showarda5288b42009-07-28 20:06:08 +00006from autotest_lib.frontend import thread_local
7from autotest_lib.frontend.afe import models, management
mblighe8819cd2008-02-15 16:48:40 +00008
9DEBUG_USER = 'debug_user'
10
showarda5288b42009-07-28 20:06:08 +000011class SimpleAuthBackend(backends.ModelBackend):
jadmanski0afbb632008-06-06 21:10:57 +000012 """
13 Automatically allows any login. This backend is for use when Apache is
14 doing the real authentication. Also ensures logged-in user exists in
15 frontend.afe.models.User database.
16 """
17 def authenticate(self, username=None, password=None):
18 try:
19 user = User.objects.get(username=username)
20 except User.DoesNotExist:
21 # password is meaningless
22 user = User(username=username,
23 password='apache authentication')
24 user.is_staff = True
25 user.save() # need to save before adding groups
26 user.groups.add(Group.objects.get(
27 name=management.BASIC_ADMIN))
mblighe8819cd2008-02-15 16:48:40 +000028
jadmanski0afbb632008-06-06 21:10:57 +000029 SimpleAuthBackend.check_afe_user(username)
30 return user
mblighe8819cd2008-02-15 16:48:40 +000031
32
jadmanski0afbb632008-06-06 21:10:57 +000033 @staticmethod
34 def check_afe_user(username):
showard3dd47c22008-07-10 00:41:36 +000035 user, created = models.User.objects.get_or_create(login=username)
36 if created:
37 user.save()
mblighe8819cd2008-02-15 16:48:40 +000038
jadmanski0afbb632008-06-06 21:10:57 +000039 def get_user(self, user_id):
40 try:
41 return User.objects.get(pk=user_id)
42 except User.DoesNotExist:
43 return None
mblighe8819cd2008-02-15 16:48:40 +000044
45
showard6f1593c2008-07-11 16:56:16 +000046class GetApacheUserMiddleware(object):
jadmanski0afbb632008-06-06 21:10:57 +000047 """
48 Middleware for use when Apache is doing authentication. Looks for
showard6f1593c2008-07-11 16:56:16 +000049 REMOTE_USER in headers and passed the username found to
50 thread_local.set_user(). If no such header is found, looks for
51 HTTP_AUTHORIZATION header with username (this allows CLI to authenticate).
52 If neither of those are found, DEBUG_USER is used.
jadmanski0afbb632008-06-06 21:10:57 +000053 """
mblighe8819cd2008-02-15 16:48:40 +000054
jadmanski0afbb632008-06-06 21:10:57 +000055 def process_request(self, request):
56 # look for a username from Apache
57 user = request.META.get('REMOTE_USER')
58 if user is None:
59 # look for a user in headers. This is insecure but
60 # it's our temporarily solution for CLI auth.
61 user = request.META.get('HTTP_AUTHORIZATION')
62 if user is None:
63 # no user info - assume we're in development mode
64 user = DEBUG_USER
showard6f1593c2008-07-11 16:56:16 +000065 thread_local.set_user(user)
66
67
68class ApacheAuthMiddleware(GetApacheUserMiddleware):
69 """
70 Like GetApacheUserMiddleware, but also logs the user into Django's auth
71 system, and replaces the username in thread_local with the actual User model
72 object.
73 """
74
showarda79583c2008-07-17 17:01:15 +000075
showard6f1593c2008-07-11 16:56:16 +000076 def process_request(self, request):
77 super(ApacheAuthMiddleware, self).process_request(request)
78 username = thread_local.get_user()
showarda79583c2008-07-17 17:01:15 +000079 thread_local.set_user(None)
showard6f1593c2008-07-11 16:56:16 +000080 user_object = auth.authenticate(username=username,
jadmanski0afbb632008-06-06 21:10:57 +000081 password='')
82 auth.login(request, user_object)
showard6f1593c2008-07-11 16:56:16 +000083 thread_local.set_user(models.User.objects.get(login=username))