Projet

Général

Profil

Development #22031

Modifier le retour geojson pour être clair sur le côté échappé (ou pas) des valeurs

Ajouté par Frédéric Péters il y a environ 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Josué Kouka
Version cible:
-
Début:
21 février 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Aujourd'hui parce que le geojson a juste été prévu pour être consommé par w.c.s., il contient les valeurs pré-échappées pour insertion dans de l'html; ce n'est typiquement pas ce qu'on rencontrerait ailleurs, où c'est du côté du javascript consommant la donnée qu'il y aurait à se soucier de ça. Je suggérerais du coup de faire pareil ici, ne pas échapper côté json.

Mais il reste les valeurs des champs, on veut parfois que ça soit de l'html quand même (pour que sur un champ de type fichier ce soit un lien cliquable); plutôt qu'aujourd'hui la liste displayed_fields [(libellé, valeur), ...], je suggère de faire displayed_fields [{'label': 'libellé', 'html_value': '<x>valeur formatée html</x>'}, ...].


Fichiers

0001-api-change-geojson-display-fields-format-22031.patch (5,08 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 04 juin 2018 17:18
0001-api-change-geojson-display-fields-format-22031.patch (5,53 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 05 juin 2018 15:46
0001-api-change-geojson-display-fields-format-22031.patch (5,94 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 06 juin 2018 17:41
0001-api-change-geojson-display-fields-format-22031.patch (5,68 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 07 juin 2018 11:30
0001-api-change-geojson-display-fields-format-22031.patch (5,62 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 07 juin 2018 15:58
0001-api-change-geojson-display-fields-format-22031.patch (5,63 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 07 juin 2018 17:02
Screenshot-2018-6-7 Backoffice de Auquo - Formulaire - Collecte Propreté.png (40,5 ko) Screenshot-2018-6-7 Backoffice de Auquo - Formulaire - Collecte Propreté.png Frédéric Péters, 07 juin 2018 17:05
wcs_geojson.png (305 ko) wcs_geojson.png Josué Kouka, 07 juin 2018 18:24
0001-api-change-geojson-display-fields-format-22031.patch (6,05 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 08 juin 2018 15:08
fsb-geojson.png (743 ko) fsb-geojson.png Serghei Mihai, 08 juin 2018 15:25
0001-api-change-geojson-display-fields-format-22031.patch (5,63 ko) 0001-api-change-geojson-display-fields-format-22031.patch Josué Kouka, 12 juin 2018 07:10
wcs_marker_popup.mp4 (8,44 Mo) wcs_marker_popup.mp4 Josué Kouka, 12 juin 2018 07:10

Demandes liées

Lié à Combo - Development #21034: cartes: option pour afficher les propriétés du geojson lors du clic sur le marqueur.Fermé08 janvier 2018

Actions

Révisions associées

Révision 5f3bdfe1 (diff)
Ajouté par Josué Kouka il y a presque 6 ans

api: change geojson display fields format (#22031)

Historique

#1

Mis à jour par Frédéric Péters il y a environ 6 ans

  • Lié à Development #21034: cartes: option pour afficher les propriétés du geojson lors du clic sur le marqueur. ajouté
#2

Mis à jour par Josué Kouka il y a presque 6 ans

  • Statut changé de Nouveau à En cours
  • Assigné à mis à Josué Kouka
#3

Mis à jour par Josué Kouka il y a presque 6 ans

#4

Mis à jour par Frédéric Péters il y a presque 6 ans

formdata.data = {'0': 'FOO BAR', '1': upload}

Faut faire un test avec {'0': '<font color="red">FOO BAR</font>'}. Et tant qu'à faire, user.name = '<font color="red">Jean Darmette</font>'.

Et pour la forme du js, cf mon commentaire 34 dans #21034.

#5

Mis à jour par Josué Kouka il y a presque 6 ans

Ok, avec les commentaires pris en compte.

#6

Mis à jour par Frédéric Péters il y a presque 6 ans

assert field['html_value'] == username

Ça ne devrait pas marcher, ça devrait échouer sur username = '<font color="red">Jean Darmette</font>'.

Tu n'as visiblement pas encore compris le fond du problème; ici w.c.s. doit poser dans html_value du code qui va pouvoir être inséré en tant qu'HTML.

#7

Mis à jour par Josué Kouka il y a presque 6 ans

Frédéric Péters a écrit :

assert field['html_value'] == username

Ça ne devrait pas marcher, ça devrait échouer sur username = '<font color="red">Jean Darmette</font>'.

Tu n'as visiblement pas encore compris le fond du problème; ici w.c.s. doit poser dans html_value du code qui va pouvoir être inséré en tant qu'HTML.

Ok possible. Dans ce cas il faudrait m'expliquer pour que je comprenne.
Est ce que formdata.get_field_view_value n'est pas censé me renvoyer la valeur html d'un champ quand un max_length est passé ?

#8

Mis à jour par Frédéric Péters il y a presque 6 ans

Tu testes que assert field['html_value'] username

D'une lecture du test, sauf erreur, ça fait '<font color="red">Jean Darmette</font>' '<font color="red">Jean Darmette</font>'.

Mais les propriétés html_value, il faut dedans du contenu pour lequel le client (javascript) soit sûr que le contenu est de l'HTML bien contrôlé, pas le '<script>alert("hello");</script>" posé comme prénom pour rigoler.

(je crains que tu ne comprennes toujours pas mais ça fait quatre mois que je n'arrive visiblement pas à expliquer).

#9

Mis à jour par Frédéric Péters il y a presque 6 ans

Espoir du matin.

Pour reprendre dans l'autre sens, l'affichage par le client (javascript) des propriétés doit se faire en utilisant .text(la valeur de la propriété). Pour permettre de l'affichage plus évolué, w.c.s. décide dans ce ticket d'également fournir avec les champs une seconde valeur, que w.c.s. garantit comme pouvant être passée sans risque à .html(...).

"Sans risque" ça veut dire que M. <script>alert('hello');</script>, quand son nom est affiché, ne lève pas une alerte javascript.

Plutôt que fournir displayed_fields comme étant [(libellé, valeur), ...], ce ticket demande ainsi pour displayed_fields la structure suivante :

{
  "label": "le libellé du champ",
  "value": "la valeur du champ exploitable via .text(...)",
  "html_value"; "la valeur du champ exploitable via .html(...)" 
}

Avec les exemples tout à fait nécessaires,

{
 "label": "nom",
 "value": "<script>alert('hello');</li>',
 "html_value": "&lt;script&gt;alert('hello');&lt;lt;/script&gt;" 
}

et

{
 "label": "fichier",
 "value": "plop.pdf",
 "html_value": "<a href=...>plop.pdf</a>" 
}
#10

Mis à jour par Josué Kouka il y a presque 6 ans

Ok. Un patch qui essaie de répondre au besoin.

#11

Mis à jour par Frédéric Péters il y a presque 6 ans

Ça approche mais non sur if field.type == 'file':, les spécificités doivent au maximum être gérées au niveau des classes des champs, il ne doit pas y avoir de condition sur le type de champ.

'label': field.label, et $f_label = $('<span class="field-label">').html(field.label);, tu considères le libellé comme de l'HTML safe, ce n'est pas ce qu'on fait ailleurs. (essaie d'ajouter un champ <i>toto</i>, tu verras les balises apparaitre, pas le texte en italique.

wcs/qommon/static/js/qommon.map.js parfois tu termines les lignes par des point-virgules, parfois pas. Et on positionne le else sur la même ligne que les accolades.

#12

Mis à jour par Josué Kouka il y a presque 6 ans

Ok. J'ai supprimé le spécifique et rajouté des ; là ou il en fallait.

#13

Mis à jour par Frédéric Péters il y a presque 6 ans

La partie js m'a l'air bien compliquée (genre devoir réfléchir à ce qui peut bien se trouver dans $popup_field0.outerHTML).

Je proposerais plutôt :

var $popup_field = $('<p class="popup-field"><span class="field-label"></span><span class="field-value"></span></p>');
$popup_field.find('field-label').text(field.label);
if (field.html_value) {
  $popup_field.find('field-value').html(field.html_value);
else {
  $popup_field.find('field-value').text(field.value);
}
popup += $popup_field.html();
#15

Mis à jour par Frédéric Péters il y a presque 6 ans

Ce dernier js me semble avoir été copié/collé sans tester. (il faut un <div> autour du contenu de $popup_field, pour que le .html() en prennent aussi le <p>).

                   var $popup_field = $('<div><p class="popup-field"><span class="field-label"></span><span class="field-value"></span></p></div>');

(à ne pas copier/coller sans tester)

#16

Mis à jour par Josué Kouka il y a presque 6 ans

Frédéric Péters a écrit :

Ce dernier js me semble avoir été copié/collé sans tester. (il faut un <div> autour du contenu de $popup_field, pour que le .html() en prennent aussi le <p>).

[...]

(à ne pas copier/coller sans tester)

J'avais testé. Je n'aurai pas eu de rendu sinon. Parce que un $popup_field.find('field-label') ça ne trouve aucun element (pas le bon selecteur).
J'ai rajouté une div (il n'y en avait pas avant).

#17

Mis à jour par Frédéric Péters il y a presque 6 ans

Mais je ne comprends plus, tu testes quoi/comment pour ne pas voir (pièce jointe) ?

#18

Mis à jour par Josué Kouka il y a presque 6 ans

Frédéric Péters a écrit :

Mais je ne comprends plus, tu testes quoi/comment pour ne pas voir (pièce jointe) ?

Mon rendu non plus n'est pas super. J'arrive à avoir quelque chose de potable en rajoutant une margin à div.leaflet-popup-content span.field-value (pense pas que ce soit la solution).

#19

Mis à jour par Frédéric Péters il y a presque 6 ans

  • Patch proposed changé de Oui à Non

Ok j'imagine que tu n'oses pas proposer ça.

#20

Mis à jour par Josué Kouka il y a presque 6 ans

Frédéric Péters a écrit :

Ok j'imagine que tu n'oses pas proposer ça.

Avec la margin.

#21

Mis à jour par Serghei Mihai il y a presque 6 ans

Je débarque peut-être comme un cheveux sur la soupe, mais pourquoi le libellé et la valeur sont sur la même ligne alors qu'elles devraient être une sous l'autre?
Sur la recette de Fontenay ça rend comme il faut: https://demarches-fsb.test.au-quotidien.com/backoffice/management/signalement-sur-l-espace-public-v2-pour-stats/map?order_by=-receipt_time&q=&filter=all&filter-status=on&id=on&time=on&last_update_time=on&user-label=on&12=on&14=on&bo4=on&bo5=on&bo6=on&status=on (capture jointe)

Je trouve étrange la fabrication d'un objet:

var $popup_field = $('<div><p class="popup-field"><span class="field-label"></span><span class="field-value"></span></p></div>');

pour ensuite chercher dédans l'element pour placer le libellé et puis la valeur. Et ensuite le reconvertir en chaîne. Alors qu'on peut concatener les chaînes, genre:
var $popup_field = '<div><p class="popup-field"><span class="field-label">' + field.label + '</span>';

#22

Mis à jour par Frédéric Péters il y a presque 6 ans

pour ensuite chercher dédans l'element pour placer le libellé et puis la valeur. Et ensuite le reconvertir en chaîne. Alors qu'on peut concatener les chaînes, genre:

Nope, ton code va afficher une popup et vider ton compte en banque.

#23

Mis à jour par Frédéric Péters il y a presque 6 ans

Si tu veux appliquer le patch en local et regarder ce que ça donne chez toi, super. Et Josué si tu peux attacher une capture montrant ce que ça donne chez toi, super aussi.

#25

Mis à jour par Frédéric Péters il y a presque 6 ans

  • Statut changé de En cours à Résolu (à déployer)

Poussé ça histoire de ne pas bloquer ensuite pour Combo.

commit 5f3bdfe1b38ad6c1d4e3df6226d5612652dd0d0a
Author: Josue Kouka <jkouka@entrouvert.com>
Date:   Mon Jun 4 17:17:51 2018 +0200

    api: change geojson display fields format (#22031)
#26

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF