Bug #38877
api: lorsque l'on ne spécifie pas de valeur à un opérateur de recherche, alors l'évaluation est toujours vraie
Statut:
Nouveau
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
10 janvier 2020
Echéance:
% réalisé:
0%
Temps estimé:
Patch proposed:
Oui
Planning:
Non
Description
Vu par exemple ici #38872 et reproductible localement :
$ curl -X GET -u admin:admin https://authentic.dev.publik.love/api/users/?email__iexact=admin@localhost (un utilisateur retourné) $ curl -X GET -u admin:admin https://authentic.dev.publik.love/api/users/?email__iexact= (tous les utilisateurs)
Fichiers
Historique
Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a environ 4 ans
- Fichier 0001-api-search-on-empty-string-should-not-return-all-obj.patch 0001-api-search-on-empty-string-should-not-return-all-obj.patch ajouté
- Tracker changé de Support à Bug
- Patch proposed changé de Non à Oui
Cela me semble compliqué à corriger.
L'API utilise django-filter, or d'après https://django-filter.readthedocs.io/en/master/guide/tips.html#filtering-by-an-empty-string
It’s not currently possible to filter by an empty string, since empty values are interpreted as a skipped filter.
C'est à dire :
On passe systématiquement sur tous le filtres,django_filters/filterset.py::BaseFilterSet::qs
# start with all the results and filter from there qs = self.queryset.all() for name, filter_ in six.iteritems(self.filters): value = self.form.cleaned_data.get(name) if value is not None: # valid & clean data ## <= '' is not None qs = filter_.filter(qs, value)
puis on n'applique que les fitres pour lesquels une valeur de recherche est fournie.django_filters/filters.py::Filter::filter
EMPTY_VALUES = ([], (), {}, '', None) if value in EMPTY_VALUES: return qs qs = ...
La première solution donnée par le lien ci-dessus, est incompatible avec une chaîne vide comme valeur sentinelle (
empty_value
) : le patch proposé casse les autres tests.