datatracker/ietf/ietfauth/auth.py
Henrik Levkowetz b0016c0fe9 Minor cleanup.
- Legacy-Id: 4520
2012-06-27 08:31:15 +00:00

116 lines
4.7 KiB
Python

# Portions Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# * Neither the name of the Nokia Corporation and/or its
# subsidiary(-ies) nor the names of its contributors may be used
# to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Copyright The IETF Trust 2007, All Rights Reserved
from django.contrib.auth.backends import RemoteUserBackend
from django.contrib.auth.models import Group
from ietf.idtracker.models import IESGLogin, Role
from ietf.ietfauth.models import IetfUserProfile
from ietf.utils import log
AUTOMATIC_GROUPS = ["Area_Director", "Secretariat", "IETF_Chair",
"IAB_Chair", "IRTF_Chair", ]
class IetfUserBackend(RemoteUserBackend):
def find_groups(username):
"""
Role/Group:
Area_Director currently sitting AD
IETF_Chair currently sitting IETF Chair
IAB_Chair currently sitting IAB Chair
IRTF_Chair currently sitting IRTF Chair
Secretariat secretariat staff
Roles/Groups NOT YET IMPLEMENTED
WG_Chair currently sitting chair of some WG
IESG_Liaison non-ADs on iesg@ietf.org and telechats
Session_Chair chairing a non-WG session in IETF meeting
Ex_Area_Director past AD
"""
# Any group name added by this method should be added to the
# AUTOMATIC_GROUPS list
groups = []
try:
login = IESGLogin.objects.get(login_name=username)
if login.user_level == 1:
groups.append("Area_Director")
elif login.user_level == 0:
groups.append("Secretariat")
if login.person:
for role in login.person.role_set.all():
if role.id == Role.IETF_CHAIR:
groups.append("IETF_Chair")
elif role.id == Role.IAB_CHAIR:
groups.append("IAB_Chair")
elif role.id == Role.IRTF_CHAIR:
groups.append("IRTF_Chair")
except IESGLogin.DoesNotExist:
pass
#
# Additional sources of group memberships:
# - wg_password table
# - other Roles
# - the /etc/.../*.perms files
return groups
find_groups = staticmethod(find_groups)
def authenticate(self, remote_user):
user = RemoteUserBackend.authenticate(self, remote_user)
if not user:
return user
# Create profile if it doesn't exist
try:
profile = user.get_profile()
except IetfUserProfile.DoesNotExist:
profile = IetfUserProfile(user=user)
profile.save()
# Remove any automatic groups, the proper ones will be retrieved by
# find_groups
groups = [group for group in user.groups.exclude(name__in=AUTOMATIC_GROUPS)]
# Update group memberships
group_names = IetfUserBackend.find_groups(user.username)
for group_name in group_names:
# Create groups as needed
group,created = Group.objects.get_or_create(name=group_name)
if created:
log("IetfUserBackend created Group '%s'" % (group_name,))
groups.append(group)
user.groups = groups
return user