Projet

Général

Profil

Bug #31296

authn OIDC : typo sur la signature utilisée lors de l'enregistrement d'un fournisseur distant

Ajouté par Paul Marillonnet il y a environ 5 ans. Mis à jour il y a environ 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
12 mars 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Dans cette fonction register_issuer on a :

    elif (set(['HS256', 'HS384', 'HS512']) &
          set(openid_configuration['id_token_signing_alg_values_supported'])):
        idtoken_algo = models.OIDCProvider.HMAC

alors que dans les modèles la constante magique n'est pas HMAC mais ALGO_HMAC.


Fichiers

Révisions associées

Révision b9d98648 (diff)
Ajouté par Paul Marillonnet il y a environ 5 ans

oidc authn: add issuer registration testing (#31296)

Révision 89d0b7e2 (diff)
Ajouté par Paul Marillonnet il y a environ 5 ans

oidc authn: use correct hmac signature magic constant (#31296)

Révision 5e4e0592 (diff)
Ajouté par Paul Marillonnet il y a environ 5 ans

oidc authn: do not set the provider fixture's id (#31296)

Historique

#1

Mis à jour par Paul Marillonnet il y a environ 5 ans

(Je vais commencer par écrire un test qui fera planter cette fonction register_issuer.)

#2

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Assigné à mis à Paul Marillonnet

Toujours une bonne idée d'ajouter des tests, mais je valide d'avance la correction.

#3

Mis à jour par Paul Marillonnet il y a environ 5 ans

  • Fichier 0001-manager-unset-verified-flag-on-a-modified-email-addr.patch ajouté
  • Fichier 0002-users-api-unset-verified-flag-on-a-modified-email-ad.patch ajouté
  • Statut changé de Nouveau à Solution proposée
  • Assigné à Paul Marillonnet supprimé
  • Patch proposed changé de Non à Oui
#4

Mis à jour par Paul Marillonnet il y a environ 5 ans

  • Fichier 0001-manager-unset-verified-flag-on-a-modified-email-addr.patch supprimé
#5

Mis à jour par Paul Marillonnet il y a environ 5 ans

  • Fichier 0002-users-api-unset-verified-flag-on-a-modified-email-ad.patch supprimé
#7

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Build error.

#8

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Statut changé de Solution proposée à En cours
  • Assigné à mis à Paul Marillonnet
#9

Mis à jour par Paul Marillonnet il y a environ 5 ans

Ça ne casse que pour l'environnement virtuel dj1.8+pg :

=================================== FAILURES ===================================
_____________________ test_register_issuer[oidc_provider2] _____________________

app = <django_webtest.DjangoTestApp object at 0x7f3d1e82f850>
caplog = <_pytest.logging.LogCaptureFixture object at 0x7f3d1f503950>
code = 'xxxx', oidc_provider = <OIDCProvider 'https://idp.example.com/'>
oidc_provider_jwkset = {'keys': _JWKkeys([<jwcrypto.jwk.JWK object at 0x7f3d1f503650>])}

    def test_register_issuer(app, caplog, code, oidc_provider, oidc_provider_jwkset):
        config_dir = os.path.dirname(__file__)
        config_file = os.path.join(config_dir, 'openid_configuration.json')
        with open(config_file) as f:
            oidc_conf = json.load(f)
        jwks_uri = urlparse.urlparse(oidc_conf['jwks_uri'])

        @urlmatch(netloc=jwks_uri.netloc, path=jwks_uri.path)
        def jwks_mock(url, request):
            return oidc_provider_jwkset.export()

        with HTTMock(jwks_mock):
            provider = register_issuer(
                    name='test_issuer',
                    issuer=oidc_provider.issuer,
>                   openid_configuration=oidc_conf)

tests/test_auth_oidc.py:460: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
src/authentic2_auth_oidc/utils.py:277: in register_issuer
    return models.OIDCProvider.objects.create(**kwargs)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/manager.py:127: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/query.py:348: in create
    obj.save(force_insert=True, using=self.db)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/base.py:734: in save
    force_update=force_update, update_fields=update_fields)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/base.py:762: in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/base.py:846: in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/base.py:885: in _do_insert
    using=using, raw=raw)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/manager.py:127: in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/query.py:920: in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py:974: in execute_sql
    cursor.execute(sql, params)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/backends/utils.py:64: in execute
    return self.cursor.execute(sql, params)
/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/utils.py:98: in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <django.db.backends.utils.CursorWrapper object at 0x7f3d1f513990>
sql = 'INSERT INTO "authentic2_auth_oidc_oidcprovider" ("name", "slug", "issuer", "client_id", "client_secret", "authorizati...%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) RETURNING "authentic2_auth_oidc_oidcprovider"."id"'
params = ('test_issuer', None, 'https://a2test.publik/', '016fbe9d-28bd-4640-ad58-c46f57058ea8', '6f2bd534-24d6-4845-95b2-5b3cf893d595', 'https://a2test.publik/idp/oidc/authorize/', ...)

    def execute(self, sql, params=None):
        self.db.validate_no_broken_transaction()
        with self.db.wrap_database_errors:
            if params is None:
                return self.cursor.execute(sql)
            else:
>               return self.cursor.execute(sql, params)
E               IntegrityError: ERREUR:  la valeur d'une cl\xe9 dupliqu\xe9e rompt la contrainte unique \xab authentic2_auth_oidc_oidcprovider_pkey \xbb
E               DETAIL:  La cl\xe9 \xab (id)=(1) \xbb existe d\xe9j\xe0.

/tmp/tox-jenkins/authentic/wip/31296-typo-in-authn-oidc-utils/py27-coverage-dj18-authentic-pg-/local/lib/python2.7/site-packages/django/db/backends/utils.py:64: IntegrityError

Je creuse l'affaire.

#10

Mis à jour par Paul Marillonnet il y a environ 5 ans

Contrainte d'unicité sur l'attribut issuer pour un fournisseur OIDC.
Je corrige ça.
Étrange quand même que ça casse ce virtualenv seulement.

#11

Mis à jour par Paul Marillonnet il y a environ 5 ans

Je m'étais pris les pieds dans les fixtures, c'est corrigé ici.
Le second patch ne change pas.

#12

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Oui étrange surtout que cela lève une exception sur l'index de la clé primaire et pas du tout sur issuer, à mon avis ça vaut la peine de comprendre.

#13

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Bon là le souci c'est qu'on voit qu'on peut filer n'importe quel issuer et ça ne fait même pas de vérification que l'issuer passé correspond à l'issuer récupéré via HTTP ou passé (d'ailleurs il faudrait aussi faire un test via HTTP pour les métadonnées OIDC).

#14

Mis à jour par Paul Marillonnet il y a environ 5 ans

Je crois maintenant que le problème vient de la fixture oidc_provider pour laquelle on mentionne explicitement l'attribut id de l'objet créé puis retourné.
Je ne comprends pas pourquoi on fait ça (cf https://git.entrouvert.org/authentic.git/tree/tests/test_auth_oidc.py#n114).

#15

Mis à jour par Paul Marillonnet il y a environ 5 ans

Benjamin Dauvergne a écrit :

Bon là le souci c'est qu'on voit qu'on peut filer n'importe quel issuer et ça ne fait même pas de vérification que l'issuer passé correspond à l'issuer récupéré via HTTP ou passé (d'ailleurs il faudrait aussi faire un test via HTTP pour les métadonnées OIDC).

C'est, je crois, un autre problème encore. #31318.

#16

Mis à jour par Paul Marillonnet il y a environ 5 ans

Et bien sûr les tests tapent maintenant dans la base, il faut rajouter un marks.db.
Je l'ai mis au début du fichier de tests, comme c'est le cas pour beaucoup d'autres.

#17

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Paul Marillonnet a écrit :

Je crois maintenant que le problème vient de la fixture oidc_provider pour laquelle on mentionne explicitement l'attribut id de l'objet créé puis retourné.
Je ne comprends pas pourquoi on fait ça (cf https://git.entrouvert.org/authentic.git/tree/tests/test_auth_oidc.py#n114).

Effectivement c'est con, tu peux défaire, et je ne sais pas pourquoi j'ai fait ça.

#19

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

C'est perso mais je n'aime pas pytestmark = pytest.mark.django_db je préfère un db dans la signature du test, "explicit is better than implicit".

Test foirant sur un test n'ayant aucun rapport j'ai relancé.

#20

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

  • Statut changé de Solution proposée à Solution validée

Ack, mais je veux bien que tu enlèves pytest.mark.

#21

Mis à jour par Benjamin Dauvergne il y a environ 5 ans

Go.

#22

Mis à jour par Paul Marillonnet il y a environ 5 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 5e4e0592ec67bd9ec42dbf8df7aa85f87cc03746
Author: Paul Marillonnet <pmarillonnet@entrouvert.com>
Date:   Tue Mar 12 16:06:28 2019 +0100

    oidc authn: do not set the provider fixture's id (#31296)

commit 89d0b7e2da9386807de443bc122419f8b5e89000
Author: Paul Marillonnet <pmarillonnet@entrouvert.com>
Date:   Tue Mar 12 11:38:55 2019 +0100

    oidc authn: use correct hmac signature magic constant (#31296)

commit b9d98648d2254cf27732be18965f4e17aa8c0c99
Author: Paul Marillonnet <pmarillonnet@entrouvert.com>
Date:   Tue Mar 12 11:38:12 2019 +0100

    oidc authn: add issuer registration testing (#31296)

#23

Mis à jour par Frédéric Péters il y a environ 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF