Skip to content

Commit 6ed4658

Browse files
sijandh35giohappy
andauthored
[Fixes #13672] Update group role at each login via oAuth (#13673)
* [Fixes #13672] refresh group detail on login --------- Co-authored-by: G.Allegri <[email protected]>
1 parent a664cee commit 6ed4658

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

geonode/people/adapters.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,29 @@ def handle_user_invalid_email(user):
279279
ID_TOKEN_ISSUER = getattr(settings, "SOCIALACCOUNT_PROVIDERS", {}).get(PROVIDER_ID, {}).get("ID_TOKEN_ISSUER", "")
280280

281281

282+
def _update_user_groups_from_social(sociallogin, user):
283+
extractor = get_data_extractor(sociallogin.account.provider)
284+
group_role_mapper = get_group_role_mapper(sociallogin.account.provider)
285+
try:
286+
groups = extractor.extract_groups(sociallogin.account.extra_data) or extractor.extract_roles(
287+
sociallogin.account.extra_data
288+
)
289+
290+
# check here if user is member already of other groups and remove it form the ones that are not declared here...
291+
for groupprofile in user.group_list_all():
292+
groupprofile.leave(user)
293+
for group_role_name in groups:
294+
group_name, role_name = group_role_mapper.parse_group_and_role(group_role_name)
295+
groupprofile = GroupProfile.objects.filter(slug=group_name).first()
296+
if groupprofile:
297+
groupprofile.join(user)
298+
if group_role_mapper.is_manager(role_name):
299+
groupprofile.promote(user)
300+
except (AttributeError, NotImplementedError):
301+
pass # extractor doesn't define a method for extracting field
302+
return user
303+
304+
282305
class GenericOpenIDConnectAdapter(OAuth2Adapter, SocialAccountAdapter):
283306
provider_id = PROVIDER_ID
284307
access_token_url = ACCESS_TOKEN_URL
@@ -347,23 +370,12 @@ def complete_login(self, request, app, token, response, **kwargs):
347370

348371
def save_user(self, request, sociallogin, form=None):
349372
user = super(SocialAccountAdapter, self).save_user(request, sociallogin, form=form)
350-
extractor = get_data_extractor(sociallogin.account.provider)
351-
group_role_mapper = get_group_role_mapper(sociallogin.account.provider)
352-
try:
353-
groups = extractor.extract_groups(sociallogin.account.extra_data) or extractor.extract_roles(
354-
sociallogin.account.extra_data
355-
)
356-
357-
# check here if user is member already of other groups and remove it form the ones that are not declared here...
358-
for groupprofile in user.group_list_all():
359-
groupprofile.leave(user)
360-
for group_role_name in groups:
361-
group_name, role_name = group_role_mapper.parse_group_and_role(group_role_name)
362-
groupprofile = GroupProfile.objects.filter(slug=group_name).first()
363-
if groupprofile:
364-
groupprofile.join(user)
365-
if group_role_mapper.is_manager(role_name):
366-
groupprofile.promote(user)
367-
except (AttributeError, NotImplementedError):
368-
pass # extractor doesn't define a method for extracting field
373+
user = _update_user_groups_from_social(sociallogin, user)
369374
return user
375+
376+
def pre_social_login(self, request, sociallogin):
377+
"""update user groups on each social login"""
378+
super().pre_social_login(request, sociallogin)
379+
user = sociallogin.user
380+
if user.pk:
381+
_update_user_groups_from_social(sociallogin, user)

0 commit comments

Comments
 (0)