Projet

Général

Profil

Bug #38877

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

Ajouté par Nicolas Roche (absent jusqu'au 3 avril) il y a environ 4 ans. Mis à jour il y a environ 4 ans.

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

#1

Mis à jour par Nicolas Roche (absent jusqu'au 3 avril) il y a environ 4 ans

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.

Formats disponibles : Atom PDF