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 about 2 months ago. Updated 6 days ago.

Status:
Solution proposé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

History

#1 Updated by Benjamin Dauvergne 6 days ago

  • Assignee set to Benjamin Dauvergne

#2 Updated by Benjamin Dauvergne 6 days ago

#3 Updated by Benjamin Dauvergne 6 days 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.

Also available in: Atom PDF