Skip to content

Commit ae6513f

Browse files
committed
Improved the handling in the OpenID Connect userinfo response of multiple meeting registrations with different email addresses for the same person.
- Legacy-Id: 18286
1 parent fb78f9a commit ae6513f

2 files changed

Lines changed: 34 additions & 18 deletions

File tree

ietf/ietfauth/tests.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -767,10 +767,13 @@ def test_oidc_code_auth(self):
767767
# Get a user for which we want to get access
768768
person = PersonFactory()
769769
RoleFactory(name_id='chair', person=person)
770+
# an additional email
771+
EmailFactory(person=person)
772+
email_list = person.email_set.all().values_list('address', flat=True)
770773
meeting = MeetingFactory(type_id='ietf', date=datetime.date.today())
771774
MeetingRegistration.objects.create(
772775
meeting=meeting, person=None, first_name=person.first_name(), last_name=person.last_name(),
773-
email=person.email(), ticket_type='full_week', reg_type='remote', affiliation='Some Company',
776+
email=email_list[0], ticket_type='full_week', reg_type='remote', affiliation='Some Company',
774777
)
775778

776779
# Get access authorisation
@@ -830,7 +833,21 @@ def test_oidc_code_auth(self):
830833
for key in [ 'email', 'family_name', 'given_name', 'meeting', 'name', 'roles',
831834
'ticket_type', 'reg_type', 'affiliation', ]:
832835
self.assertIn(key, userinfo)
836+
self.assertIn('remote', set(userinfo['reg_type'].split()))
837+
self.assertNotIn('hackathon', set(userinfo['reg_type'].split()))
833838

839+
# Create another registration, with a different email
840+
MeetingRegistration.objects.create(
841+
meeting=meeting, person=None, first_name=person.first_name(), last_name=person.last_name(),
842+
email=email_list[1], ticket_type='one_day', reg_type='hackathon', affiliation='Some Company, Inc',
843+
)
844+
userinfo = client.do_user_info_request(state=params["state"], scope=args['scope'])
845+
self.assertIn('hackathon', set(userinfo['reg_type'].split()))
846+
self.assertIn('remote', set(userinfo['reg_type'].split()))
847+
self.assertIn('full_week', set(userinfo['ticket_type'].split()))
848+
self.assertIn('Some Company', userinfo['affiliation'])
849+
850+
# Check that ending a session works
834851
r = client.do_end_session_request(state=params["state"], scope=args['scope'])
835852
self.assertEqual(r.status_code, 302)
836853
self.assertEqual(r.headers["Location"], urlreverse('ietf.ietfauth.views.login'))

ietf/ietfauth/utils.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -249,33 +249,32 @@ def scope_registration(self):
249249
from ietf.stats.models import MeetingRegistration
250250
meeting = get_current_ietf_meeting()
251251
person = self.user.person
252-
reg = MeetingRegistration.objects.filter(person=person, meeting=meeting).first()
253-
if not reg:
254-
# No person match; try to match by email address. They could
255-
# have registered with a new address and added it to the account
256-
# later.
257-
email_list = person.email_set.values_list('address')
258-
reg = MeetingRegistration.objects.filter(email__in=email_list, meeting=meeting).first()
259-
if reg:
252+
email_list = person.email_set.values_list('address')
253+
q = Q(person=person, meeting=meeting) | Q(email__in=email_list, meeting=meeting)
254+
regs = MeetingRegistration.objects.filter(q).distinct()
255+
for reg in regs:
256+
if not reg.person_id:
260257
reg.person = person
261258
reg.save()
262259
info = {}
263-
if reg:
264-
# maybe register attendence if logged in to follow a meeting
260+
if regs:
261+
# maybe register attendance if logged in to follow a meeting
265262
today = datetime.date.today()
266263
if meeting.date <= today <= meeting.end_date():
267264
client = ClientRecord.objects.get(client_id=self.client.client_id)
268-
if client.name == 'Meetecho' and not reg.attended:
269-
reg.attended = True
270-
reg.save()
265+
if client.name == 'Meetecho':
266+
for reg in regs:
267+
if not reg.attended:
268+
reg.attended = True
269+
reg.save()
271270
# fill in info to return
272271
info = {
273-
'meeting': reg.meeting.number,
272+
'meeting': meeting.number,
274273
# full_week, one_day, student:
275-
'ticket_type': reg.ticket_type,
274+
'ticket_type': ' '.join(set( reg.ticket_type for reg in regs )),
276275
# in_person, onliine, hackathon:
277-
'reg_type': reg.reg_type,
278-
'affiliation': reg.affiliation,
276+
'reg_type': ' '.join(set( reg.reg_type for reg in regs )),
277+
'affiliation': ([ reg.affiliation for reg in regs if reg.affiliation ] or [''])[0],
279278
}
280279

281280
return info

0 commit comments

Comments
 (0)