diff --git a/README b/README index 2246116..98c7dd2 100644 --- a/README +++ b/README @@ -19,3 +19,8 @@ - Kerberos: TODO - RADIUS: TODO - Inside: Going away + + +# TODO + - finish auth backend. + - allow non LDAP-users (conditional LDAP-stuff), because we don't want LDAP filled with non-active members \ No newline at end of file diff --git a/main/authentication.py b/main/authentication.py new file mode 100644 index 0000000..e39bcf2 --- /dev/null +++ b/main/authentication.py @@ -0,0 +1,76 @@ +from django.contrib.auth.models import User, Group +from django.db import connections + + +class InsideBackend(object): + """ + Authenticate against the inside database + """ + + def authenticate(self, username=None, password=None): + row = None + cur = connections['inside'].cursor() + try: + cur.execute("SELECT id,firstname,lastname,email FROM din_user WHERE password=PASSWORD(%s) AND (username=%s OR email=%s)", [password, username, username]) + row = cur.fetchone() + except Exception as e: + # FIXME errorhandling + print "Auth ERROR: {}".format(e) + raise e + finally: + cur.close() + + if row: + try: + user = User.objects.get(username=username) + except User.DoesNotExist: + # Create a new user. + user = User(username=username, password=password) + + user = self._update_user_details(user, row) # Saves user object + user = self._update_groups(user, row) + + return user + + return None + + def get_user(self, user_id): + try: + return User.objects.get(pk=user_id) + except User.DoesNotExist: + return None + + def _update_user_details(self, user, row): + uid, first_name, last_name, email = row + user.first_name = first_name + user.last_name = last_name + user.email = email + user.save() + return user + + def _update_groups(self, user, user_row): + groups = None + cur = connections['inside'].cursor() + user_id = user_row[0] + + existing_groups = list(user.groups.all()) + try: + cur.execute("SELECT g.posix_group FROM din_user AS u LEFT JOIN din_usergrouprelationship AS ugr ON u.id = ugr.user_id LEFT JOIN din_group AS g ON ugr.group_id = g.id WHERE u.id = %s AND g.posix_group != ''", (int(user_row[0]),)) + groups = map(lambda x: x[0], cur.fetchall()) + for group in groups: + g, created = Group.objects.get_or_create(name=group) + user.groups.add(g) + + # Remove old relationships + # TODO: if setting is set, not tested + for g in existing_groups: + if g.name not in groups: + user.groups.remove(g) + + except Exception as e: + # FIXME errorhandling + print "ERROR: {}".format(e) + finally: + cur.close() + + return user diff --git a/main/views.py b/main/views.py index 7265769..ed61c5f 100644 --- a/main/views.py +++ b/main/views.py @@ -38,14 +38,15 @@ def index(request): @login_required def profile(request): username = request.user.username + groups = request.user.groups.all() ldap_user = None try: ldap_user = LdapUser.objects.get(username=username) except: return render_to_response('private/profile.html', locals(), context_instance=RequestContext(request)) - groups = LdapGroup.objects.filter(usernames__contains=username) - private_group = LdapGroup.objects.get(gid=ldap_user.group) + ldap_groups = LdapGroup.objects.filter(usernames__contains=username) + ldap_private_group = LdapGroup.objects.get(gid=ldap_user.group) return render_to_response('private/profile.html', locals(), context_instance=RequestContext(request)) diff --git a/templates/private/profile.html b/templates/private/profile.html index d92fd01..73f3c0a 100644 --- a/templates/private/profile.html +++ b/templates/private/profile.html @@ -8,9 +8,9 @@

Om deg

@@ -28,7 +28,7 @@