From 11e645cae06138893ba574f7d123c94751329a8b Mon Sep 17 00:00:00 2001 From: zhengxie Date: Tue, 23 Feb 2016 14:26:10 +0800 Subject: [PATCH] [shib] Use display_name in shib_meta as nickname, fallback to givenname + surname if missing --- .../thirdpart/shibboleth/test_middleware.py | 77 +++++++++++++++++++ thirdpart/shibboleth/middleware.py | 15 +++- 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 tests/seahub/thirdpart/shibboleth/test_middleware.py diff --git a/tests/seahub/thirdpart/shibboleth/test_middleware.py b/tests/seahub/thirdpart/shibboleth/test_middleware.py new file mode 100644 index 0000000000..b920476f52 --- /dev/null +++ b/tests/seahub/thirdpart/shibboleth/test_middleware.py @@ -0,0 +1,77 @@ +from mock import Mock + +from django.conf import settings +from django.test import RequestFactory + +from seahub.profile.models import Profile +from seahub.test_utils import BaseTestCase +from shibboleth.middleware import ShibbolethRemoteUserMiddleware + +settings.AUTHENTICATION_BACKENDS += ( + 'shibboleth.backends.ShibbolethRemoteUserBackend', +) + +class ShibbolethRemoteUserMiddlewareTest(BaseTestCase): + def setUp(self): + self.middleware = ShibbolethRemoteUserMiddleware() + + self.factory = RequestFactory() + + # Create an instance of a GET request. + self.request = self.factory.get('/foo/') + # self.request = Mock() + + self.request.user = self.user + self.request.user.is_authenticated = lambda: False + self.request.cloud_mode = False + self.request.session = {} + + self.request.META = {} + self.request.META['REMOTE_USER'] = self.user.username + self.request.META['eppn'] = 'test eppn' + self.request.META['givenname'] = 'test_gname' + self.request.META['surname'] = 'test_sname' + + # def test_can_process(self): + # assert len(Profile.objects.all()) == 0 + + # self.middleware.process_request(self.request) + + # assert len(Profile.objects.all()) == 1 + # assert self.request.shib_login is True + + def test_make_profile_for_display_name(self): + assert len(Profile.objects.all()) == 0 + + self.middleware.make_profile(self.user, { + 'display_name': 'display name', + 'institution': 'i', + 'contact_email': 'foo@foo.com' + }) + + assert len(Profile.objects.all()) == 1 + assert Profile.objects.all()[0].nickname == 'display name' + + def test_make_profile_for_givenname_surname(self): + assert len(Profile.objects.all()) == 0 + + self.middleware.make_profile(self.user, { + 'givenname': 'g', + 'surname': 's', + 'institution': 'i', + 'contact_email': 'foo@foo.com' + }) + + assert len(Profile.objects.all()) == 1 + assert Profile.objects.all()[0].nickname == 'g s' + + def test_make_profile_for_name_missing(self): + assert len(Profile.objects.all()) == 0 + + self.middleware.make_profile(self.user, { + 'institution': 'i', + 'contact_email': 'foo@foo.com' + }) + + assert len(Profile.objects.all()) == 1 + assert Profile.objects.all()[0].nickname == '' diff --git a/thirdpart/shibboleth/middleware.py b/thirdpart/shibboleth/middleware.py index c9d9058f0b..332e4524c9 100755 --- a/thirdpart/shibboleth/middleware.py +++ b/thirdpart/shibboleth/middleware.py @@ -112,9 +112,14 @@ class ShibbolethRemoteUserMiddleware(RemoteUserMiddleware): Extrat nickname(givenname surname), contact_email, institution from Shib attributs, and add those to user profile. """ - givenname = shib_meta.get('givenname', '') - surname = shib_meta.get('surname', '') - nickname = "%s %s" % (givenname, surname) + # use `display_name` as nickname in shib_meta first + nickname = shib_meta.get('display_name', None) + if nickname is None: + # otherwise, fallback to givenname plus surname in shib_meta + givenname = shib_meta.get('givenname', '') + surname = shib_meta.get('surname', '') + nickname = "%s %s" % (givenname, surname) + institution = shib_meta.get('institution', None) contact_email = shib_meta.get('contact_email', None) @@ -122,7 +127,9 @@ class ShibbolethRemoteUserMiddleware(RemoteUserMiddleware): if not p: p = Profile(user=user.username) - p.nickname = nickname + if nickname.strip(): # set nickname when it's not empty + p.nickname = nickname + if institution: p.institution = institution if contact_email: