Projet

Général

Profil

0001-idp-oidc-set-user-identifier-as-preferred-username-c.patch

Josué Kouka, 09 août 2018 11:21

Télécharger (5,97 ko)

Voir les différences:

Subject: [PATCH] idp oidc: set user identifier as preferred username claim
 (#23900)

 .../migrations/0011_auto_20180808_1546.py     | 38 +++++++++++++++
 tests/test_idp_oidc.py                        | 46 +++++++++++++++++--
 2 files changed, 81 insertions(+), 3 deletions(-)
 create mode 100644 src/authentic2_idp_oidc/migrations/0011_auto_20180808_1546.py
src/authentic2_idp_oidc/migrations/0011_auto_20180808_1546.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations
5

  
6

  
7
DEFAULT_CLAIM_VALUES = {
8
    'django_user_email', 'django_user_email_verified', 'django_user_first_name',
9
    'django_user_last_name', 'django_user_username'}
10

  
11

  
12
def set_oidcclient_default_preferred_username_as_identifier(apps, schema_editor):
13
    OIDCClient = apps.get_model('authentic2_idp_oidc', 'OIDCClient')
14
    OIDCClaim = apps.get_model('authentic2_idp_oidc', 'OIDCClaim')
15
    for oidcclient in OIDCClient.objects.all():
16
        claim_values = set(oidcclient.oidcclaim_set.values_list('value', flat=True))
17
        # check if default config
18
        if DEFAULT_CLAIM_VALUES.symmetric_difference(claim_values):
19
            continue
20
        pref_username_claim = OIDCClaim.objects.get(name='preferred_username', client=oidcclient)
21
        if pref_username_claim.value != 'django_user_identifier':
22
            pref_username_claim.value = 'django_user_identifier'
23
            pref_username_claim.save()
24

  
25

  
26
def unset_oidcclient_default_preferred_username_as_identifier(apps, schema_editor):
27
    pass
28

  
29

  
30
class Migration(migrations.Migration):
31

  
32
    dependencies = [
33
        ('authentic2_idp_oidc', '0010_oidcclaim'),
34
    ]
35

  
36
    operations = [
37
        migrations.RunPython(set_oidcclient_default_preferred_username_as_identifier, unset_oidcclient_default_preferred_username_as_identifier)
38
    ]
tests/test_idp_oidc.py
11 11
import utils
12 12

  
13 13
from django.core.urlresolvers import reverse
14
from django.db import connection
15
from django.db.migrations.executor import MigrationExecutor
14 16
from django.utils.timezone import now
15 17
from django.contrib.auth import get_user_model
16 18

  
19

  
17 20
User = get_user_model()
18 21

  
19 22
from authentic2_idp_oidc.models import OIDCClient, OIDCAuthorization, OIDCCode, OIDCAccessToken, OIDCClaim
......
856 859

  
857 860

  
858 861
def test_oidclient_claims_data_migration():
859
    from django.db import connection
860
    from django.db.migrations.executor import MigrationExecutor
861

  
862 862
    executor = MigrationExecutor(connection)
863 863
    app = 'authentic2_idp_oidc'
864 864
    migrate_from = [(app, '0009_auto_20180313_1156')]
......
877 877
    assert OIDCClaim.objects.filter(client=client.id).count() == 5
878 878

  
879 879

  
880
def test_oidclient_preferred_username_as_identifier_data_migration():
881
    executor = MigrationExecutor(connection)
882
    app = 'authentic2_idp_oidc'
883
    migrate_from = [(app, '0010_oidcclaim')]
884
    migrate_to = [(app, '0011_auto_20180808_1546')]
885
    executor.migrate(migrate_from)
886
    executor.loader.build_graph()
887
    old_apps = executor.loader.project_state(migrate_from).apps
888
    OIDCClient = old_apps.get_model('authentic2_idp_oidc', 'OIDCClient')
889
    OIDCClaim = old_apps.get_model('authentic2_idp_oidc', 'OIDCClaim')
890
    client1 = OIDCClient.objects.create(name='test', slug='test', redirect_uris='https://example.net/')
891
    client2 = OIDCClient.objects.create(name='test1', slug='test1', redirect_uris='https://example.net/')
892
    client3 = OIDCClient.objects.create(name='test2', slug='test2', redirect_uris='https://example.net/')
893
    for client in (client1, client2, client3):
894
        if client.name == 'test1':
895
            continue
896
        OIDCClaim.objects.create(client=client, name='preferred_username', value='django_user_username', scopes='profile')
897
        OIDCClaim.objects.create(client=client, name='given_name', value='django_user_first_name', scopes='profile')
898
        OIDCClaim.objects.create(client=client, name='family_name', value='django_user_last_name', scopes='profile')
899
        if client.name == 'test2':
900
            continue
901
        OIDCClaim.objects.create(client=client, name='email', value='django_user_email', scopes='email')
902
        OIDCClaim.objects.create(client=client, name='email_verified', value='django_user_email_verified', scopes='email')
903
    executor.migrate(migrate_to)
904
    executor.loader.build_graph()
905
    client = OIDCClient.objects.first()
906
    for client in OIDCClient.objects.all():
907
        claims = client.oidcclaim_set.all()
908
        if client.name == 'test':
909
            assert claims.count() == 5
910
            assert sorted(claims.values_list('name', flat=True)) == [u'email', u'email_verified', u'family_name', u'given_name', u'preferred_username']
911
            assert sorted(claims.values_list('value', flat=True)) == [u'django_user_email', u'django_user_email_verified', u'django_user_first_name', u'django_user_identifier', u'django_user_last_name']
912
        elif client.name == 'test2':
913
            assert claims.count() == 3
914
            assert sorted(claims.values_list('name', flat=True)) == [u'family_name', u'given_name', u'preferred_username']
915
            assert sorted(claims.values_list('value', flat=True)) == [u'django_user_first_name', u'django_user_last_name', u'django_user_username']
916
        else:
917
            assert claims.count() == 0
918

  
919

  
880 920
def test_api_synchronization(app, oidc_client):
881 921
    oidc_client.has_api_access = True
882 922
    oidc_client.save()
883
-