Projet

Général

Profil

0001-auth_fc-update-info-on-the-FC-accout-related-user-45.patch

Nicolas Roche, 09 avril 2021 16:09

Télécharger (4,86 ko)

Voir les différences:

Subject: [PATCH 1/2] auth_fc: update info on the FC accout related user
 (#45199)

 src/authentic2_auth_fc/backends.py |  3 +-
 tests/auth_fc/test_auth_fc.py      | 48 ++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
src/authentic2_auth_fc/backends.py
42 42
        except models.FcAccount.DoesNotExist:
43 43
            logger.debug(u'user with the sub %s does not exist.', sub)
44 44
        else:
45 45
            user = account.user
46 46
            logger.debug(u'found user %s with sub %s', user, sub)
47 47
            if not user.is_active:
48 48
                logger.info(u'user %s login refused, it is inactive', user)
49 49
                raise PermissionDenied
50
        if user_info:
50
        if user_info and not user:
51 51
            User = get_user_model()
52 52
            user_qs = User.objects.filter(**kwargs.get('user_filter', {}))
53 53
            if user_qs.count() > 1:
54 54
                return
55 55
            if user_qs.exists():
56 56
                user = user_qs.get()
57 57

  
58 58
            if not user:
......
71 71
                else:
72 72
                    logger.debug(
73 73
                        u'user creation enabled with fc_account (sub : %s - token : %s)',
74 74
                        sub,
75 75
                        json.dumps(kwargs['token']),
76 76
                    )
77 77
                    hooks.call_hooks('event', name='fc-create', user=user, sub=sub)
78 78

  
79
        if user_info:
79 80
            # always handle given_name and family_name
80 81
            updated = []
81 82
            if user_info.get('given_name') and user.first_name != user_info['given_name']:
82 83
                user.first_name = user_info['given_name']
83 84
                updated.append('given name: "%s"' % user_info['given_name'])
84 85
            if user_info.get('family_name') and user.last_name != user_info['family_name']:
85 86
                user.last_name = user_info['family_name']
86 87
                updated.append('family name: "%s"' % user_info['family_name'])
tests/auth_fc/test_auth_fc.py
342 342
    del franceconnect.user_info['email']
343 343
    response = app.get('/login/?service=portail&next=/idp/')
344 344
    response = response.click(href='callback')
345 345

  
346 346
    response = franceconnect.handle_authorization(app, response.location, status=302)
347 347
    assert User.objects.count() == 1
348 348

  
349 349
    response = app.get('/accounts/', status=200)
350

  
351

  
352
def test_update_fc_email(settings, app, franceconnect):
353
    settings.A2_EMAIL_IS_UNIQUE = True
354

  
355
    user1 = User(email='john.doe@example.com', first_name='John', last_name='Doe')
356
    user1.save()
357
    models.FcAccount.objects.create(user=user1, sub='1234')
358

  
359
    user2 = User(email='joe@example.com', first_name='Joe', last_name='Dalton')
360
    user2.save()
361
    models.FcAccount.objects.create(user=user2, sub='4567')
362

  
363
    # user1 FC email has changed
364
    assert franceconnect.sub == '1234'
365
    assert franceconnect.user_info['given_name'] == 'Ÿuñe'
366
    franceconnect.user_info['email'] = 'jhonny@example.com'
367

  
368
    # connection using FC sub 1234 will affect user1 (as expected)
369
    franceconnect.login_with_fc_fixed_params(app)
370
    assert User.objects.get(pk=user1.pk).email == 'jhonny@example.com'
371
    assert User.objects.get(pk=user1.pk).first_name == 'Ÿuñe'
372
    assert User.objects.get(pk=user2.pk).email == 'joe@example.com'
373
    assert app.session['_auth_user_id'] == str(user1.pk)
374

  
375

  
376
def test_update_fc_redondant_email(settings, app, franceconnect):
377
    settings.A2_EMAIL_IS_UNIQUE = True
378

  
379
    user1 = User(email='john.doe@example.com', first_name='John', last_name='Doe')
380
    user1.save()
381
    models.FcAccount.objects.create(user=user1, sub='1234')
382

  
383
    user2 = User(email='joe@example.com', first_name='Joe', last_name='Dalton')
384
    user2.save()
385
    models.FcAccount.objects.create(user=user2, sub='4567')
386

  
387
    # user1 FC email has changed and provide user2 email
388
    assert franceconnect.sub == '1234'
389
    assert franceconnect.user_info['given_name'] == 'Ÿuñe'
390
    franceconnect.user_info['email'] = 'joe@example.com'
391

  
392
    # connection using FC sub 1234 will affect user2
393
    franceconnect.login_with_fc_fixed_params(app)
394
    assert User.objects.get(pk=user1.pk).email == 'joe@example.com'
395
    assert User.objects.get(pk=user1.pk).first_name == 'Ÿuñe'
396
    assert User.objects.get(pk=user2.pk).email == 'joe@example.com'
397
    assert app.session.get('_auth_user_id')
350
-