Pouvoir définir quels attributs de type téléphone sont à vocation identifiante pour l’usager (#78046) #75

Merged
pmarillonnet merged 6 commits from wip/78046-password-authn-identifier-selection into main 2023-06-26 11:27:13 +02:00
Owner
No description provided.
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from db91642fbc to ea4b59a9a8 2023-06-14 12:24:19 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from ea4b59a9a8 to d5181a5dfa 2023-06-14 15:13:39 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 3dc3336db9 to 9372864bea 2023-06-14 16:43:22 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 9372864bea to f5d2c390e4 2023-06-15 09:44:41 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from f5d2c390e4 to 957b00221f 2023-06-15 10:59:07 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 957b00221f to 2e7276f579 2023-06-15 11:16:00 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 2e7276f579 to 7c61a5e9a5 2023-06-15 11:27:02 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 7d3b8d4bb5 to a2deb47587 2023-06-15 15:02:11 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 107f2cc0a5 to 43c8e37f36 2023-06-15 16:29:25 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 43c8e37f36 to 9d55ba27c9 2023-06-19 14:27:09 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 9d55ba27c9 to 078ea11c44 2023-06-19 14:53:14 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 078ea11c44 to 5415bb6d91 2023-06-19 15:15:29 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 5415bb6d91 to 913dc73bc7 2023-06-19 15:35:51 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 913dc73bc7 to 9099a2d289 2023-06-19 15:42:57 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 9099a2d289 to 09fbdcb837 2023-06-19 16:06:53 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 09fbdcb837 to 1b2a940a84 2023-06-19 16:56:34 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 1b2a940a84 to 6cfaaa0521 2023-06-20 09:57:35 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 6cfaaa0521 to f9b33e2dd0 2023-06-20 10:05:02 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from f9b33e2dd0 to 9db24df86e 2023-06-20 10:11:08 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 9db24df86e to 8a0fd753e4 2023-06-20 10:12:47 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 8a0fd753e4 to e82b35e423 2023-06-20 10:14:42 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from e82b35e423 to 7671e5a6d3 2023-06-20 10:29:40 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 7671e5a6d3 to a44bea2688 2023-06-20 11:14:20 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from a44bea2688 to 27aba4d692 2023-06-20 11:45:11 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 27aba4d692 to 66e637867c 2023-06-20 11:48:17 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 66e637867c to ec7b1caeb9 2023-06-20 11:53:02 +02:00 Compare
pmarillonnet changed title from WIP: Pouvoir définir quels attributs de type téléphone sont à vocation identifiante pour l’usager (#78046) to Pouvoir définir quels attributs de type téléphone sont à vocation identifiante pour l’usager (#78046) 2023-06-20 11:54:22 +02:00
vdeniaud requested changes 2023-06-20 16:40:15 +02:00
vdeniaud left a comment
Owner

Voilà pour un premier tour, je n'ai rien de très intéressant à dire.

Par contre je suis assez opposé au dernier commit, c'est quel critère qui te fait dire qu'activer ou pas l'authentification par téléphone devrait être réservée aux super utilisateurs ? (par rapport à tout le reste qu'on peut faire dans ces vues, changer la politique du mot de passe, ouvrir les inscriptions, configurer un fournisseur SAML...)

Voilà pour un premier tour, je n'ai rien de très intéressant à dire. Par contre je suis assez opposé au dernier commit, c'est quel critère qui te fait dire qu'activer ou pas l'authentification par téléphone devrait être réservée aux super utilisateurs ? (par rapport à tout le reste qu'on peut faire dans ces vues, changer la politique du mot de passe, ouvrir les inscriptions, configurer un fournisseur SAML...)
@ -1959,3 +1957,3 @@
if d not in block:
block[d] = value
if d == 'user_filter' and app_settings.A2_ACCEPT_EMAIL_AUTHENTICATION:
if d == 'user_filter' and get_password_authenticator().accept_email_authentication:
Owner

Peut-être récupérer l'objet hors de la boucle, pour éviter une requête à chaque fois.

Peut-être récupérer l'objet hors de la boucle, pour éviter une requête à chaque fois.
Author
Owner

Oui complètement, c’est corrigé, merci.

Oui complètement, c’est corrigé, merci.
vdeniaud marked this conversation as resolved
@ -62,3 +63,3 @@
)
if not app_settings.A2_ACCEPT_PHONE_AUTHENTICATION or not get_user_model()._meta.get_field('phone'):
if not utils_misc.get_password_authenticator().is_phone_authn_active:
Owner

Tu peux directement utiliser self.authenticator.

Tu peux directement utiliser `self.authenticator`.
Author
Owner

C’est corrigé ici ainsi que tous les autres endroits où tu le mentionnes (+ quelques autres occurrences dans ce même formulaire).

C’est corrigé ici ainsi que tous les autres endroits où tu le mentionnes (+ quelques autres occurrences dans ce même formulaire).
vdeniaud marked this conversation as resolved
@ -96,3 +103,3 @@
def clean(self):
if app_settings.A2_ACCEPT_PHONE_AUTHENTICATION and get_user_model()._meta.get_field('phone'):
if utils_misc.get_password_authenticator().is_phone_authn_active:
Owner

Pareil, self.authenticator

Pareil, `self.authenticator`
pmarillonnet marked this conversation as resolved
@ -125,0 +133,4 @@
if not user.email and not (
phone_authn_active
and models.AttributeValue.objects.filter(
attribute=utils_misc.get_password_authenticator().phone_identifier_field,
Owner

Pareil, self.authenticator

Pareil, `self.authenticator`
pmarillonnet marked this conversation as resolved
@ -1172,3 +1177,3 @@
return self.perform_email_registration(form, email)
if app_settings.A2_ACCEPT_PHONE_AUTHENTICATION:
if utils_misc.get_password_authenticator().is_phone_authn_active:
Owner

Pareil, self.authenticator

Pareil, `self.authenticator`
pmarillonnet marked this conversation as resolved
@ -1683,1 +1698,4 @@
user = form.instance
if (
(phone := getattr(self, 'phone', None))
and (authn := utils_misc.get_password_authenticator())
Owner

Pareil, self.authenticator

Pareil, `self.authenticator`
pmarillonnet marked this conversation as resolved
@ -1684,0 +1708,4 @@
content=phone,
attribute=authn.phone_identifier_field,
)
if authn.is_default_phone_authn_config:
Owner

Ici on duplique donc la valeur de User.phone dans un objet AttributeValue ? La raison c'est de ne pas complexifier les endroits où on filtre sur cet attribut ?

Je ne mesure pas la probabilité des situations où les deux pourraient se trouver désynchronisés, ni leur impact.

Ici on duplique donc la valeur de `User.phone` dans un objet AttributeValue ? La raison c'est de ne pas complexifier les endroits où on filtre sur cet attribut ? Je ne mesure pas la probabilité des situations où les deux pourraient se trouver désynchronisés, ni leur impact.
Author
Owner

Non, bonne remarque, il n’y a plus de raison à chercher à continuer à gérer une prétendue configuration par défaut qui serait plus simple. Je retire cela ainsi que la propriété is_default_phone_authn_config sur l’authentificateur, qui n’a plus lieu d’être.

Pour prévenir la désynchronisation il y avait eu d3e64bd82 au départ (qui s’assure que le contenu de l’attribut étendu reprend toujours le contenu du champ de modèle utilisateur, si existant), qui n’est maintenant plus pertinent et qu’on pourra virer dans une prochaine PR.

Non, bonne remarque, il n’y a plus de raison à chercher à continuer à gérer une prétendue configuration par défaut qui serait plus simple. Je retire cela ainsi que la propriété is_default_phone_authn_config sur l’authentificateur, qui n’a plus lieu d’être. Pour prévenir la désynchronisation il y avait eu d3e64bd82 au départ (qui s’assure que le contenu de l’attribut étendu reprend toujours le contenu du champ de modèle utilisateur, si existant), qui n’est maintenant plus pertinent et qu’on pourra virer dans une prochaine PR.
vdeniaud marked this conversation as resolved
@ -324,3 +324,2 @@
def test_views_sms_ratelimit(app, db, simple_user, settings, freezer, view_name):
def test_views_sms_ratelimit(app, db, simple_user, settings, freezer, view_name, phone_activated_authn):
freezer.move_to('2020-01-01')
LoginPasswordAuthenticator.objects.update(sms_ip_ratelimit='10/h', sms_number_ratelimit='3/d')
Owner

Cosmétique, cette ligne n'aurait pas dû bouger

Cosmétique, cette ligne n'aurait pas dû bouger
Author
Owner

Oui en effet, j’ai rétabli.

Oui en effet, j’ai rétabli.
vdeniaud marked this conversation as resolved
Author
Owner

Voilà pour un premier tour, je n'ai rien de très intéressant à dire.

Merci pour la relecture.

Par contre je suis assez opposé au dernier commit, c'est quel critère qui te fait dire qu'activer ou pas l'authentification par téléphone devrait être réservée aux super utilisateurs ? (par rapport à tout le reste qu'on peut faire dans ces vues, changer la politique du mot de passe, ouvrir les inscriptions, configurer un fournisseur SAML...)

C’est une restriction temporaire pour refléter ce qui se fait actuellement avec les settings. L’authn, la récupération de mot de passe et l’enregistrement fonctionnent mais il manque encore la partie parcours de modification de numéro de téléphone similaire à l’email, pour que ça puisse arriver en prod sans tout casser (sans parler des instances dont les démarches présupposent que l’usager a un courriel, lesquelles seront à revoir). Il manque aussi le parcours de suppression où l’on re-vérifie la détention du numéro par l’usager connecté.

Pour l’instant la fonctionnalité peut donc être activée seulement au cas par cas en recette. Si l’on expose ces champs de config d’authentificateur à quiconque détient le rôle “Administrateur des moyens d’authentification” (ce qui est le cas de pas mal de clients, via héritage du rôle générique “Administrateur”), c’est sûr que la fonctionnalité va arriver par mégarde en prod et qu’il faudra ensuite rétablir le bon fonctionnement de l’instance depuis un état de données incohérent :/

> Voilà pour un premier tour, je n'ai rien de très intéressant à dire. Merci pour la relecture. > Par contre je suis assez opposé au dernier commit, c'est quel critère qui te fait dire qu'activer ou pas l'authentification par téléphone devrait être réservée aux super utilisateurs ? (par rapport à tout le reste qu'on peut faire dans ces vues, changer la politique du mot de passe, ouvrir les inscriptions, configurer un fournisseur SAML...) C’est une restriction temporaire pour refléter ce qui se fait actuellement avec les settings. L’authn, la récupération de mot de passe et l’enregistrement fonctionnent mais il manque encore la partie parcours de modification de numéro de téléphone similaire à l’email, pour que ça puisse arriver en prod sans tout casser (sans parler des instances dont les démarches présupposent que l’usager a un courriel, lesquelles seront à revoir). Il manque aussi le parcours de suppression où l’on re-vérifie la détention du numéro par l’usager connecté. Pour l’instant la fonctionnalité peut donc être activée seulement au cas par cas en recette. Si l’on expose ces champs de config d’authentificateur à quiconque détient le rôle “Administrateur des moyens d’authentification” (ce qui est le cas de pas mal de clients, via héritage du rôle générique “Administrateur”), c’est sûr que la fonctionnalité va arriver par mégarde en prod et qu’il faudra ensuite rétablir le bon fonctionnement de l’instance depuis un état de données incohérent :/
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from ec7b1caeb9 to b332ad2abd 2023-06-21 10:19:00 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from b332ad2abd to b13b68aaa1 2023-06-21 10:24:03 +02:00 Compare
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from b13b68aaa1 to 6da76f6c6f 2023-06-21 10:37:23 +02:00 Compare
pmarillonnet requested review from vdeniaud 2023-06-21 10:38:30 +02:00
vdeniaud requested changes 2023-06-21 11:31:54 +02:00
vdeniaud left a comment
Owner

D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger.

Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu.

D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger. Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu.
Author
Owner

D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger.

Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu.

Oui c’est vrai, ce sera mieux. Le changement à faire dans le code en l’état actuel de la PR, pour ouvrir la fonctionnalité le moment venu, me paraissait assez simple, mais c’est encore plus direct avec un feature flag.

Je fais la correction. Merci.

> D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger. > > Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu. Oui c’est vrai, ce sera mieux. Le changement à faire dans le code en l’état actuel de la PR, pour ouvrir la fonctionnalité le moment venu, me paraissait assez simple, mais c’est encore plus direct avec un feature flag. Je fais la correction. Merci.
Author
Owner

D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger.

Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu.

Oui c’est vrai, ce sera mieux. Le changement à faire dans le code en l’état actuel de la PR, pour ouvrir la fonctionnalité le moment venu, me paraissait assez simple, mais c’est encore plus direct avec un feature flag.

Je fais la correction. Merci.

Voilà, le commit en haut de branche est corrigé et le message adapté en conséquence.

> > D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger. > > > > Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu. > > Oui c’est vrai, ce sera mieux. Le changement à faire dans le code en l’état actuel de la PR, pour ouvrir la fonctionnalité le moment venu, me paraissait assez simple, mais c’est encore plus direct avec un feature flag. > > Je fais la correction. Merci. Voilà, le commit en haut de branche est corrigé et le message adapté en conséquence.
pmarillonnet requested review from vdeniaud 2023-06-21 12:01:53 +02:00
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 70ec268580 to 049c4a4f82 2023-06-21 12:02:11 +02:00 Compare
Author
Owner

D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger.

Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu.

Oui c’est vrai, ce sera mieux. Le changement à faire dans le code en l’état actuel de la PR, pour ouvrir la fonctionnalité le moment venu, me paraissait assez simple, mais c’est encore plus direct avec un feature flag.

Je fais la correction. Merci.

Voilà, le commit en haut de branche est corrigé et le message adapté en conséquence.

Arf j’ai oublié de découper en deux commits, je recommence.

Edit: Et on me dit de vive-voix que ça va très bien comme ça, ça m’arrange :)

> > > D'accord, c'est donc temporaire, dans ce cas j'aimerais bien qu'on colle à ce qui est fait ailleurs, c'est à dire ajouter un feature flag qui contrôlerait l'affichage de ces options. L'avantage c'est que le changement à effectuer le moment venu est trivial, gérable par n'importe qui, vs ici où il y a quand même pas mal de code à comprendre et bouger. > > > > > > Sinon, au moins splitter le commit pour vraiment en avoir un avec juste le code à revert le moment venu. > > > > Oui c’est vrai, ce sera mieux. Le changement à faire dans le code en l’état actuel de la PR, pour ouvrir la fonctionnalité le moment venu, me paraissait assez simple, mais c’est encore plus direct avec un feature flag. > > > > Je fais la correction. Merci. > > Voilà, le commit en haut de branche est corrigé et le message adapté en conséquence. Arf j’ai oublié de découper en deux commits, je recommence. Edit: Et on me dit de vive-voix que ça va très bien comme ça, ça m’arrange :)
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 049c4a4f82 to fc9cc67c04 2023-06-21 12:10:03 +02:00 Compare
vdeniaud approved these changes 2023-06-21 14:03:04 +02:00
@ -135,0 +148,4 @@
resp = app.get('/manage/authenticators/%s/edit/' % authenticator.pk)
assert list(resp.form.fields) == [
Owner

Dernière remarque tatillonne, ça serait bien ici de vérifier que les champs sont bien apparus avec des « in » (ces listes explicites sont pénibles à maintenir (ma faute c'est moi qui ai ajouté celle plus haut))

Dernière remarque tatillonne, ça serait bien ici de vérifier que les champs sont bien apparus avec des « in » (ces listes explicites sont pénibles à maintenir (ma faute c'est moi qui ai ajouté celle plus haut))
Author
Owner

Dernière remarque tatillonne, ça serait bien ici de vérifier que les champs sont bien apparus avec des « in » (ces listes explicites sont pénibles à maintenir (ma faute c'est moi qui ai ajouté celle plus haut))

Plutôt en manipulant des ensembles (et donc sans ce soucier d’un ordre quel qu’il soit), par exemple en testant que l’ensemble des champs écrit en dur à droite est bien inclus dans l’ensemble champs présentés par le formulaire ?

> Dernière remarque tatillonne, ça serait bien ici de vérifier que les champs sont bien apparus avec des « in » (ces listes explicites sont pénibles à maintenir (ma faute c'est moi qui ai ajouté celle plus haut)) Plutôt en manipulant des ensembles (et donc sans ce soucier d’un ordre quel qu’il soit), par exemple en testant que l’ensemble des champs écrit en dur à droite est bien inclus dans l’ensemble champs présentés par le formulaire ?
Owner

Pour moi c'est superflu de vérifier que les autres champs sont toujours là, mais comme tu veux.

À relire le code, comme plus bas on a

    resp.form['accept_email_authentication'] = False
    resp.form['accept_phone_authentication'] = True
    assert resp.form['phone_identifier_field'].options == [

on vérifie déjà que les champs sont apparus, dont contrairement à ce que j'écrivais en parlant de « in », on pourrait juste supprimer ce assert sans remplacer.

Pour moi c'est superflu de vérifier que les autres champs sont toujours là, mais comme tu veux. À relire le code, comme plus bas on a ``` resp.form['accept_email_authentication'] = False resp.form['accept_phone_authentication'] = True assert resp.form['phone_identifier_field'].options == [ ``` on vérifie déjà que les champs sont apparus, dont contrairement à ce que j'écrivais en parlant de « in », on pourrait juste supprimer ce assert sans remplacer.
Author
Owner

Oui, fair enough, je retire ce assert et je merge.

Oui, fair enough, je retire ce assert et je merge.
pmarillonnet added 5 commits 2023-06-26 10:21:35 +02:00
pmarillonnet force-pushed wip/78046-password-authn-identifier-selection from 0ccef49b72 to e4cb69c1cb 2023-06-26 10:47:27 +02:00 Compare
pmarillonnet merged commit e4cb69c1cb into main 2023-06-26 11:27:13 +02:00
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: entrouvert/authentic#75
No description provided.