Projet

Général

Profil

Development #35189

API, lorsqu'on filtre par service les utilisateurs une erreur de typo renvoie la totalité des utilisateurs

Ajouté par Benjamin Dauvergne il y a plus de 4 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
-
Version cible:
-
Début:
01 août 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

En effet si on ne trouve pas de service, alors on ne filtre pas alors qu'on devrait simplement retourner une liste vide.

commit 38298c31929f39430349327abf9369c1a59d84bd
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Thu Mar 8 23:56:29 2018 +0100

    api: add parameters to filter users by allowed services (fixes #22377)

diff --git a/src/authentic2/api_views.py b/src/authentic2/api_views.py
index 8d98c057..6e0dafd4 100644
--- a/src/authentic2/api_views.py
+++ b/src/authentic2/api_views.py
@@ -27,7 +27,7 @@ from django_filters.rest_framework import FilterSet

 from .custom_user.models import User
 from . import utils, decorators, attribute_kinds, app_settings, hooks
-from .models import Attribute, PasswordReset
+from .models import Attribute, PasswordReset, Service
 from .a2_rbac.utils import get_default_ou

@@ -548,6 +548,14 @@ class UsersAPI(HookMixin, ExceptionHandlerMixin, ModelViewSet):
         if self.request.method == 'GET':
             qs = qs.prefetch_related('attribute_values', 'attribute_values__attribute')
         qs = self.request.user.filter_by_perm(['custom_user.view_user'], qs)
+        # filter users authorized for a specified service
+        if 'service-slug' in self.request.GET and 'service-ou' in self.request.GET:
+            service_slug = self.request.GET['service-slug']
+            service_ou = self.request.GET['service-ou']
+            service = Service.objects.filter(slug=service_slug, ou__slug=service_ou).prefetch_related('authorized_roles').first()
+            if service and service.authorized_roles.all(): <-- ici on doit toujours filtrer
+                qs = qs.filter(roles__in=service.authorized_roles.children())
+                qs = qs.distinct()
         new_qs = hooks.call_hooks_first_result('api_modify_queryset', self, qs)
         if new_qs is not None:
             return new_qs

En effet si c'est utilisé par un service pour du provisionning alors il va charger la totalité de la liste.


Fichiers

Révisions associées

Révision 96f8538a (diff)
Ajouté par Benjamin Dauvergne il y a plus de 4 ans

api: returns no user if service-slug is unknown (#35189)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Assigné à mis à Benjamin Dauvergne
#2

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

#3

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

La véritable solution à ce problème est #35191, car le seul moyen propre de filtrer est de filtrer en se basant sur l'authentification, comme cela pas d'erreur possible (à moins de connaître des identifiants donnant un accès plus large). Une typo sur le nom du paramètre "service_slug" au lieu de "service-slug" donnera le même bug qu'ici, la seule solution serait de considérer tout paramètre inconnu comme une erreur mais c'est problématique.

#4

Mis à jour par Paul Marillonnet il y a plus de 4 ans

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

Benjamin Dauvergne a écrit :

La véritable solution à ce problème est #35191 […].

C'est quand même bien d'avoir ça ici.

#5

Mis à jour par Benjamin Dauvergne il y a plus de 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 96f8538a08872e59940a9dbcfcad9befbe1a8e2a
Author: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date:   Tue Sep 10 10:27:46 2019 +0200

    api: returns no user if service-slug is unknown (#35189)
#6

Mis à jour par Frédéric Péters il y a plus de 4 ans

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

Formats disponibles : Atom PDF