Les fonctions parametre_url (js et php) n'insèrent pas correctement les tableaux #3248

Closed
opened 7 years ago by bystrano · 4 comments
bystrano commented 7 years ago

L'appel

parametre_url('http://domaine/spip.php?t[]=1','t',array(0,2));

retourne

http://domaine/spip.php?t[]=1&t[]=0&t[]=2

au lieu de

http://domaine/spip.php?t[]=0&t[]=2

Ce problème est présent à la fois dans la version javascript et la version php. Je n'ai testé que sur SPIP 3.0.16.

J'ai un patch qui corrige ça dans les deux cas.

Pour le javascript, il y a une regexp mal échappée, et un appel à la fonction substring avec un index négatif, ce qui n'est pas permis, seule la fonction substr le permet… (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring)

Et dans les deux cas, il faut bien vider les valeurs initiale du tableau dans l'url avant d'ajouter les nouvelles valeurs.

Je joins des fichiers corrigés, et voici un patch :

2 files changed, 9 insertions(+), 3 deletions(-)
 2014/ecrire/inc/utils.php             | 5 +++++
 2014/prive/javascript/ajaxCallback.js | 7 ++++---

	Modified   2014/ecrire/inc/utils.php
diff --git a/2014/ecrire/inc/utils.php b/2014/ecrire/inc/utils.php
index b875aa2..01a7f53 100644
--- a/2014/ecrire/inc/utils.php
+++ b/2014/ecrire/inc/utils.php
`` -333,6 +333,11 `` function parametre_url($url, $c, $v=NULL, $sep='&') {
 				$url[$n] = $r[1].'='.$u;
 				unset($ajouts[$r[1]]);
 			}
+			// Pour les tableaux on laisse tomber les valeurs de
+			// départ, on remplira à l'étape suivante
+			else {
+				unset($url[$n]);
+			}
 		}
 	}
 
	Modified   2014/prive/javascript/ajaxCallback.js
diff --git a/2014/prive/javascript/ajaxCallback.js b/2014/prive/javascript/ajaxCallback.js
index 118fc31..de434c4 100644
--- a/2014/prive/javascript/ajaxCallback.js
+++ b/2014/prive/javascript/ajaxCallback.js
`` -809,7 +809,7 `` function parametre_url(url,c,v,sep,force_vide){
 	}
         else
             a=url;
-	var regexp = new RegExp('^(' + c.replace('[]','\[\]') + '\[?\]?)(=.*)?$');
+	var regexp = new RegExp('^(' + c.replace('[]','\\[\\]') + '\\[?\\]?)(=.*)?$');
 	var ajouts = [];
 	var u = (typeof(v)!=='object')?encodeURIComponent(v):v;
 	var na = [];
`` -829,11 +829,12 `` function parametre_url(url,c,v,sep,force_vide){
 			}
 			// Ajout. Pour une variable, remplacer au meme endroit,
 			// pour un tableau ce sera fait dans la prochaine boucle
-			else if (r[1].substring(-2) != '[]') {
+			else if (r[1].substr(-2) != '[]') {
 				na.push(r[1]+'='+u);
 				ajouts.push(r[1]);
 			}
-			else na.push(args[n]);
+			/* Pour les tableaux ont laisse tomber les valeurs de départ, on
+				 remplira à l'étape suivante */
 		}
 		else
 			na.push(args[n]);

L'appel <pre> parametre_url('http://domaine/spip.php?t[]=1','t',array(0,2)); </pre> retourne <pre> http://domaine/spip.php?t[]=1&t[]=0&t[]=2 </pre> au lieu de <pre> http://domaine/spip.php?t[]=0&t[]=2 </pre> Ce problème est présent à la fois dans la version javascript et la version php. Je n'ai testé que sur SPIP 3.0.16. J'ai un patch qui corrige ça dans les deux cas. Pour le javascript, il y a une regexp mal échappée, et un appel à la fonction substring avec un index négatif, ce qui n'est pas permis, seule la fonction substr le permet… (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring) Et dans les deux cas, il faut bien vider les valeurs initiale du tableau dans l'url avant d'ajouter les nouvelles valeurs. Je joins des fichiers corrigés, et voici un patch : <pre> 2 files changed, 9 insertions(+), 3 deletions(-) 2014/ecrire/inc/utils.php | 5 +++++ 2014/prive/javascript/ajaxCallback.js | 7 ++++--- Modified 2014/ecrire/inc/utils.php diff --git a/2014/ecrire/inc/utils.php b/2014/ecrire/inc/utils.php index b875aa2..01a7f53 100644 --- a/2014/ecrire/inc/utils.php +++ b/2014/ecrire/inc/utils.php `` -333,6 +333,11 `` function parametre_url($url, $c, $v=NULL, $sep='&amp;') { $url[$n] = $r[1].'='.$u; unset($ajouts[$r[1]]); } + // Pour les tableaux on laisse tomber les valeurs de + // départ, on remplira à l'étape suivante + else { + unset($url[$n]); + } } } Modified 2014/prive/javascript/ajaxCallback.js diff --git a/2014/prive/javascript/ajaxCallback.js b/2014/prive/javascript/ajaxCallback.js index 118fc31..de434c4 100644 --- a/2014/prive/javascript/ajaxCallback.js +++ b/2014/prive/javascript/ajaxCallback.js `` -809,7 +809,7 `` function parametre_url(url,c,v,sep,force_vide){ } else a=url; - var regexp = new RegExp('^(' + c.replace('[]','\[\]') + '\[?\]?)(=.*)?$'); + var regexp = new RegExp('^(' + c.replace('[]','\\[\\]') + '\\[?\\]?)(=.*)?$'); var ajouts = []; var u = (typeof(v)!=='object')?encodeURIComponent(v):v; var na = []; `` -829,11 +829,12 `` function parametre_url(url,c,v,sep,force_vide){ } // Ajout. Pour une variable, remplacer au meme endroit, // pour un tableau ce sera fait dans la prochaine boucle - else if (r[1].substring(-2) != '[]') { + else if (r[1].substr(-2) != '[]') { na.push(r[1]+'='+u); ajouts.push(r[1]); } - else na.push(args[n]); + /* Pour les tableaux ont laisse tomber les valeurs de départ, on + remplira à l'étape suivante */ } else na.push(args[n]); </pre>
Owner

Version cible mise à 3.0

**Version cible mise à 3.0**
Owner

Appliqué par commit r21592.
Statut changé à Fermé

Appliqué par commit r21592. **Statut changé à Fermé**
Owner

Version cible mise à 3.1
Statut changé à Nouveau

**Version cible mise à 3.1** **Statut changé à Nouveau**
Owner

Statut changé à Fermé

**Statut changé à Fermé**
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.