Project

General

Profile

Bug #38877

api: lorsque l'on ne spécifie pas de valeur à un opérateur de recherche, alors l'évaluation est toujours vraie

Added by Nicolas Roche over 5 years ago. Updated about 5 years ago.

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

#1

Updated by Nicolas Roche about 5 years ago

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.

Also available in: Atom PDF