| 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') |
|---|