Bug #38877
api: lorsque l'on ne spécifie pas de valeur à un opérateur de recherche, alors l'évaluation est toujours vraie
Status:
Nouveau
Priority:
Normal
Assignee:
-
Category:
-
Target version:
-
Start date:
10 January 2020
Due date:
% Done:
0%
Estimated time:
Patch proposed:
Yes
Planning:
No
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)
Files
History
Updated by Nicolas Roche about 5 years ago
- File 0001-api-search-on-empty-string-should-not-return-all-obj.patch 0001-api-search-on-empty-string-should-not-return-all-obj.patch added
- Tracker changed from Support to Bug
- Patch proposed changed from No to Yes
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.