DjangoAuthIntegration: djangoauth_1.py

File djangoauth_1.py, 4.2 kB (added by waylan, 3 months ago)

Another iteration by Milan Andric which he emailed me on April 25, 2008.

Line 
1 # DjangoAuth plugin
2
3 # Copyright (c) 2007, Waylan Limberg <waylan@gmail.com>
4
5 from trac.core import *
6 from trac.web.chrome import INavigationContributor
7 from trac.web.main import IAuthenticator, IRequestHandler
8 from trac.perm import IPermissionGroupProvider
9 from trac.util import escape, Markup
10 import os
11 import datetime
12
13 class DjangoAuthPlugin(Component):
14     implements(IAuthenticator, IPermissionGroupProvider, \
15                INavigationContributor, IRequestHandler)
16
17     # IAuthenticator methods
18     def authenticate(self, req):
19         authname = None
20         if req.remote_user and (req.remote_user != "anonymous"):
21             authname = req.remote_user
22         elif req.incookie.has_key('sessionid'):
23             authname = self._get_name_from_django(req, req.incookie['sessionid'])
24         else:
25             authname = req.remote_user
26
27         if authname and self.config.getbool('trac', 'ignore_auth_case'):
28             authname = authname.lower()
29
30         return authname
31
32     # INavigationContributor methods
33     def get_active_navigation_item(self, req):
34         return 'login'
35
36     def get_navigation_items(self, req):
37         if req.authname and req.authname != 'anonymous':
38             yield 'metanav', 'login', 'logged in as "%s"' % req.authname
39             yield 'metanav', 'logout', Markup('<a href="%s">Log-out</a>',
40                     self.config.get('djangoauth', 'logout_url', '#'))
41         else:
42             yield 'metanav', 'login', Markup('<a href="%s">Log-in</a>',
43                     self.config.get('djangoauth', 'login_url', '#'))
44
45     # private methods
46     def _get_name_from_django(self, req, sessionid):
47         settings = self.config.get('djangoauth', 'django_settings_module')
48         os.environ['DJANGO_SETTINGS_MODULE'] = settings
49         from django.contrib.sessions.models import Session
50         from django.contrib.auth.models import User
51         #req.django_sess = 'value is '+sessionid.value
52         try:
53             session = Session.objects.get(pk=sessionid.value)
54         except Session.DoesNotExist:
55             pass
56         else:
57      
58             # Check for stale session
59             if session.expire_date > datetime.datetime.now():
60                 data = session.get_decoded()
61
62                 if data.has_key('_auth_user_id'):
63                     try:
64                         user = User.objects.get(pk=data['_auth_user_id'])
65                     except User.DoesNotExist:
66                         return None
67
68                     # Check user perms
69                     if user.is_active:
70
71                         if self.config.getbool('djangoauth', 'use_django_perms'):
72                             # make user object available for perm checks later
73                             self.user = user
74
75                         # Update session expire_date
76                         # session.expire_date = datetime.datetime.now()
77                         # session.save() # OperationalError: readonly db??
78
79                     return user.username
80         return None
81  
82     # IPermissionGroupProvider methods
83     def get_permission_groups(self, username):
84         if hasattr(self, 'user') and self.user.username == username:
85             groups = self.user.groups.filter(name__startswith='trac_')
86             return [g.name[5:] for g in groups]
87         else:
88             return []
89
90     # IRequestHandler methods
91     def match_request(self, req):
92         return req.path_info == '/dj'
93
94     def process_request(self, req):
95         req.send_response(200)
96         req.send_header('Content-Type', 'text/plain')
97         req.end_headers()
98         req.write('DjangoAuth is enabled!\n')
99         req.write(str(dir(req))+ '\n')
100         req.write('incookie: ' + str(req.incookie) + '\n')
101         req.write('outcookie: ' + str(req.outcookie) + '\n')
102         try:
103             req.write('perm: ' + str((req.perm.permissions(),req.perm.perms)) + '\n')
104         except AttributeError:
105             pass
106         req.write('remote_user: ' + str(req.remote_user) + '\n')
107         req.write('server_name: ' + str(req.server_name) + '\n')
108         req.write('session: ' + str(req.session) + '\n')
109         if req.django_sess:
110             req.write('django-sess: ' + str(req.django_sess) + '\n')
111         if req.authname:
112             req.write('authname: ' + str(req.authname) + '\n')