Project

General

Profile

Development #35189

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

Added by Benjamin Dauvergne 6 months ago. Updated 4 months ago.

Status:
Solution déployée
Priority:
Normal
Category:
-
Target version:
-
Start date:
01 Aug 2019
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

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.

0001-api-returns-no-user-if-service-slug-is-unknown-35189.patch View (4.23 KB) Benjamin Dauvergne, 10 Sep 2019 10:28 AM

Associated revisions

Revision 96f8538a (diff)
Added by Benjamin Dauvergne 4 months ago

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

History

#1 Updated by Benjamin Dauvergne 4 months ago

  • Assignee set to Benjamin Dauvergne

#2 Updated by Benjamin Dauvergne 4 months ago

#3 Updated by Benjamin Dauvergne 4 months ago

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 Updated by Paul Marillonnet 4 months ago

  • Status changed from Solution proposée to 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 Updated by Benjamin Dauvergne 4 months ago

  • Status changed from Solution validée to 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 Updated by Frédéric Péters 4 months ago

  • Status changed from Résolu (à déployer) to Solution déployée

Also available in: Atom PDF