Commit 0a17d8be by James Tait

Fix the UserOpenIDAdmin to set the permission on the user whose OpenID has just…

Fix the UserOpenIDAdmin to set the permission on the user whose OpenID has just been updated, not the user making the request; Save a db query in authenticate by returning the UserOpenID from create_user_from_openid; Set user permissions in update_user_details.
parent 340f84ad
...@@ -70,9 +70,9 @@ class UserOpenIDAdmin(admin.ModelAdmin): ...@@ -70,9 +70,9 @@ class UserOpenIDAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
permission = Permission.objects.get(codename='account_verified') permission = Permission.objects.get(codename='account_verified')
if obj.account_verified: if obj.account_verified:
request.user.user_permissions.add(permission) obj.user.user_permissions.add(permission)
else: else:
request.user.user_permissions.remove(permission) obj.user.user_permissions.remove(permission)
obj.save() obj.save()
def log_deletion(self, request, obj, object_repr): def log_deletion(self, request, obj, object_repr):
......
...@@ -80,9 +80,8 @@ class OpenIDBackend: ...@@ -80,9 +80,8 @@ class OpenIDBackend:
claimed_id__exact=openid_response.identity_url) claimed_id__exact=openid_response.identity_url)
except UserOpenID.DoesNotExist: except UserOpenID.DoesNotExist:
if getattr(settings, 'OPENID_CREATE_USERS', False): if getattr(settings, 'OPENID_CREATE_USERS', False):
user = self.create_user_from_openid(openid_response) user, user_openid = self.create_user_from_openid(
user_openid = UserOpenID.objects.get( openid_response)
claimed_id__exact=openid_response.identity_url)
else: else:
user = user_openid.user user = user_openid.user
...@@ -91,8 +90,7 @@ class OpenIDBackend: ...@@ -91,8 +90,7 @@ class OpenIDBackend:
if getattr(settings, 'OPENID_UPDATE_DETAILS_FROM_SREG', False): if getattr(settings, 'OPENID_UPDATE_DETAILS_FROM_SREG', False):
details = self._extract_user_details(openid_response) details = self._extract_user_details(openid_response)
self.update_user_details(user, details, openid_response) self.update_user_details(user_openid, details, openid_response)
self.update_user_openid(user_openid, details)
if getattr(settings, 'OPENID_PHYSICAL_MULTIFACTOR_REQUIRED', False): if getattr(settings, 'OPENID_PHYSICAL_MULTIFACTOR_REQUIRED', False):
pape_response = pape.Response.fromSuccessResponse(openid_response) pape_response = pape.Response.fromSuccessResponse(openid_response)
...@@ -277,10 +275,10 @@ class OpenIDBackend: ...@@ -277,10 +275,10 @@ class OpenIDBackend:
openid_response.identity_url) openid_response.identity_url)
user = User.objects.create_user(username, email, password=None) user = User.objects.create_user(username, email, password=None)
self.associate_openid(user, openid_response) user_openid = self.associate_openid(user, openid_response)
self.update_user_details(user, details, openid_response) self.update_user_details(user_openid, details, openid_response)
return user return user, user_openid
def associate_openid(self, user, openid_response): def associate_openid(self, user, openid_response):
"""Associate an OpenID with a user account.""" """Associate an OpenID with a user account."""
...@@ -302,15 +300,8 @@ class OpenIDBackend: ...@@ -302,15 +300,8 @@ class OpenIDBackend:
return user_openid return user_openid
def update_user_openid(self, user_openid, details): def update_user_details(self, user_openid, details, openid_response):
updated = False user = user_openid.user
if details.get('account_verified', None) is not None:
user_openid.account_verified = details['account_verified']
updated = True
if updated:
user_openid.save()
def update_user_details(self, user, details, openid_response):
updated = False updated = False
if details['first_name']: if details['first_name']:
user.first_name = details['first_name'][:30] user.first_name = details['first_name'][:30]
...@@ -324,9 +315,19 @@ class OpenIDBackend: ...@@ -324,9 +315,19 @@ class OpenIDBackend:
if getattr(settings, 'OPENID_FOLLOW_RENAMES', False): if getattr(settings, 'OPENID_FOLLOW_RENAMES', False):
user.username = self._get_available_username(details['nickname'], openid_response.identity_url) user.username = self._get_available_username(details['nickname'], openid_response.identity_url)
updated = True updated = True
account_verified = details.get('account_verified', None)
if account_verified is not None:
permission = Permission.objects.get(codename='account_verified')
user_openid.account_verified = account_verified
if account_verified:
user.user_permissions.add(permission)
else:
user.user_permissions.remove(permission)
updated = True
if updated: if updated:
user.save() user.save()
user_openid.save()
def get_teams_mapping(self): def get_teams_mapping(self):
teams_mapping_auto = getattr(settings, 'OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO', False) teams_mapping_auto = getattr(settings, 'OPENID_LAUNCHPAD_TEAMS_MAPPING_AUTO', False)
...@@ -369,17 +370,3 @@ class OpenIDBackend: ...@@ -369,17 +370,3 @@ class OpenIDBackend:
break break
user.save() user.save()
def has_perm(self, user_obj, perm, instance=None):
return perm in self.get_all_permissions(user_obj, instance)
def get_all_permissions(self, user_obj, instance=None):
try:
user_openid = UserOpenID.objects.get(user=user_obj)
except UserOpenID.DoesNotExist:
return set()
if user_openid.account_verified:
permission = Permission.objects.get(codename='account_verified')
return set(['%s.%s' % (permission.content_type.app_label,
permission.codename)])
return set()
...@@ -178,19 +178,25 @@ class OpenIDBackendTests(TestCase): ...@@ -178,19 +178,25 @@ class OpenIDBackendTests(TestCase):
response = self.make_response_ax() response = self.make_response_ax()
user = User.objects.create_user('someuser', 'someuser@example.com', user = User.objects.create_user('someuser', 'someuser@example.com',
password=None) password=None)
user_openid, created = UserOpenID.objects.get_or_create(
user=user,
claimed_id='http://example.com/existing_identity',
display_id='http://example.com/existing_identity',
account_verified=False)
data = dict(first_name=u"Some56789012345678901234567890123", data = dict(first_name=u"Some56789012345678901234567890123",
last_name=u"User56789012345678901234567890123", last_name=u"User56789012345678901234567890123",
email=u"someotheruser@example.com", account_verified=False) email=u"someotheruser@example.com", account_verified=False)
self.backend.update_user_details(user, data, response) self.backend.update_user_details(user_openid, data, response)
self.assertEqual("Some56789012345678901234567890", user.first_name) self.assertEqual("Some56789012345678901234567890", user.first_name)
self.assertEqual("User56789012345678901234567890", user.last_name) self.assertEqual("User56789012345678901234567890", user.last_name)
def test_update_user_openid_unverified(self): def test_update_user_openid_unverified(self):
response = self.make_response_ax()
user = User.objects.create_user('someuser', 'someuser@example.com', user = User.objects.create_user('someuser', 'someuser@example.com',
password=None) password=None)
user_openid = UserOpenID.objects.get_or_create( user_openid, created = UserOpenID.objects.get_or_create(
user=user, user=user,
claimed_id='http://example.com/existing_identity', claimed_id='http://example.com/existing_identity',
display_id='http://example.com/existing_identity', display_id='http://example.com/existing_identity',
...@@ -199,14 +205,14 @@ class OpenIDBackendTests(TestCase): ...@@ -199,14 +205,14 @@ class OpenIDBackendTests(TestCase):
last_name=u"User56789012345678901234567890123", last_name=u"User56789012345678901234567890123",
email=u"someotheruser@example.com", account_verified=False) email=u"someotheruser@example.com", account_verified=False)
user_openid = UserOpenID.objects.get(user=user) self.backend.update_user_details(user_openid, data, response)
self.backend.update_user_openid(user_openid, data)
self.assertFalse(user_openid.account_verified) self.assertFalse(user_openid.account_verified)
def test_update_user_openid_verified(self): def test_update_user_openid_verified(self):
response = self.make_response_ax()
user = User.objects.create_user('someuser', 'someuser@example.com', user = User.objects.create_user('someuser', 'someuser@example.com',
password=None) password=None)
user_openid = UserOpenID.objects.get_or_create( user_openid, created = UserOpenID.objects.get_or_create(
user=user, user=user,
claimed_id='http://example.com/existing_identity', claimed_id='http://example.com/existing_identity',
display_id='http://example.com/existing_identity', display_id='http://example.com/existing_identity',
...@@ -215,8 +221,7 @@ class OpenIDBackendTests(TestCase): ...@@ -215,8 +221,7 @@ class OpenIDBackendTests(TestCase):
last_name=u"User56789012345678901234567890123", last_name=u"User56789012345678901234567890123",
email=u"someotheruser@example.com", account_verified=True) email=u"someotheruser@example.com", account_verified=True)
user_openid = UserOpenID.objects.get(user=user) self.backend.update_user_details(user_openid, data, response)
self.backend.update_user_openid(user_openid, data)
self.assertTrue(user_openid.account_verified) self.assertTrue(user_openid.account_verified)
def test_extract_user_details_name_with_trailing_space(self): def test_extract_user_details_name_with_trailing_space(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment