From c8a34aea9a29499b8693a7d328d19d29175a5c9e Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 7 Oct 2010 21:36:41 +0000
Subject: [PATCH] Debug de editer_liens et fonctionnement corrige pour
 correspondre aux tests : les fonctions associer/dissocier renvoient le nombre
 de de liens affectes (inseres ou supprimes) la fonction set renvoie false en
 cas d'erreur ou 1 sinon, et ne donne pas acces au nombre de donnees modifiees

---
 ecrire/action/editer_liens.php | 55 ++++++++++++++++++++++++----------
 ecrire/base/connect_sql.php    |  3 ++
 2 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/ecrire/action/editer_liens.php b/ecrire/action/editer_liens.php
index c9ab292fdd..6e8323b897 100644
--- a/ecrire/action/editer_liens.php
+++ b/ecrire/action/editer_liens.php
@@ -58,12 +58,12 @@ function objet_associable($objet){
  * @return string
  */
 function objet_associer($objets_source, $objets_lies, $qualif = null){
-	objet_traiter_laisons('lien_insert', $objets_source, $objets_lies);
+	$modifs = objet_traiter_laisons('lien_insert', $objets_source, $objets_lies);
 
 	if ($qualif)
 		objet_qualifier($objets_source, $objets, $qualif);
 
-	return ''; // pas d'erreur
+	return $modifs; // pas d'erreur
 }
 
 
@@ -86,9 +86,7 @@ function objet_associer($objets_source, $objets_lies, $qualif = null){
  * @return string
  */
 function objet_dissocier($objets_source,$objets_lies){
-	objet_traiter_laisons('lien_delete',$objets_source,$objets_lies);
-
-	return ''; // pas d'erreur
+	return objet_traiter_laisons('lien_delete',$objets_source,$objets_lies);
 }
 
 
@@ -111,7 +109,7 @@ function objet_dissocier($objets_source,$objets_lies){
  * @param array $qualif
  */
 function objet_qualifier($objets_source,$objets_lies,$qualif){
-	objet_traiter_laisons('lien_set',$objets_source,$objets_lies,$qualif);
+	return objet_traiter_laisons('lien_set',$objets_source,$objets_lies,$qualif);
 }
 
 
@@ -149,20 +147,27 @@ function objet_qualifier($objets_source,$objets_lies,$qualif){
 function objet_traiter_laisons($operation,$objets_source,$objets_lies, $set = null){
 	// accepter une syntaxe minimale pour supprimer tous les liens
 	if ($objets_lies=='*') $objets_lies = array('*'=>'*');
-	
+	$modifs = 0; // compter le nombre de modifications
+	$echec = null;
 	foreach($objets_source as $objet=>$ids){
 		if ($a = objet_associable($objet)) {
 			list($primary,$l) = $a;
 			if (!is_array($ids)) $ids = array($ids);
 			foreach($ids as $id) {
 				$res = $operation($objet,$primary,$l,$id,$objets_lies,$set);
-				if ($res===false)
+				if ($res===false) {
 					spip_log("objet_traiter_laisons [Echec] : $operation sur $objet/$primary/$l/$id");
+					$echec = true;
+				}
+				else
+					$modifs+=$res;
 			}
 		}
+		else
+			$echec = true;
 	}
 
-	return ''; // pas d'erreur
+	return ($echec?false:$modifs); // pas d'erreur
 }
 
 
@@ -185,21 +190,26 @@ function objet_traiter_laisons($operation,$objets_source,$objets_lies, $set = nu
  */
 function lien_insert($objet_source,$primary,$table_lien,$id,$objets) {
 	$ins = 0;
+	$echec = null;
 	foreach($objets as $objet => $id_objets){
 		if (!is_array($id_objets)) $id_objets = array($id_objets);
 		foreach($id_objets as $id_objet) {
+			$objet = objet_type($objet); # securite
 			if ($id_objet=intval($id_objet)
 				AND !sql_getfetsel(
 								$primary,
 								$table_lien,
 								array('id_objet='.intval($id_objet), 'objet='.sql_quote($objet), $primary.'='.intval($id))))
 			{
-					if (sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id))!==false);
+					$e = sql_insertq($table_lien, array('id_objet' => $id_objet, 'objet'=>$objet, $primary=>$id));
+					if ($e!==false)
 						$ins++;
+					else
+						$echec = true;
 			}
 		}
 	}
-	return $ins;
+	return ($echec?false:$ins);
 }
 
 function lien_where($primary, $id_source, $objet, $id_objet){
@@ -237,17 +247,24 @@ function lien_where($primary, $id_source, $objet, $id_objet){
  */
 function lien_delete($objet_source,$primary,$table_lien,$id,$objets){
 	$retire = array();
+	$dels = 0;
+	$echec = false;
 	foreach($objets as $objet => $id_objets){
+		$objet = objet_type($objet); # securite
 		if (!is_array($id_objets)) $id_objets = array($id_objets);
 		foreach($id_objets as $id_objet) {
 			$where = lien_where($primary, $id, $objet, $id_objet);
-			sql_delete($table_lien, $where);
+			$e = sql_delete($table_lien, $where);
+			if ($e!==false)
+				$dels+=$e;
+			else
+				$echec = true;
 			$retire[] = array('source'=>array($objet_source=>$id),'lien'=>array($objet=>$id_objet),'type'=>$objet,'id'=>$id_objet);
 		}
 	}
 	pipeline('trig_supprimer_objets_lies',$retire);
 
-	return ''; // pas d'erreur
+	return ($echec?false:$dels);
 }
 
 /**
@@ -270,14 +287,20 @@ function lien_delete($objet_source,$primary,$table_lien,$id,$objets){
  * @param array $qualif
  */
 function lien_set($objet_source,$primary,$table_lien,$id,$objets,$qualif){
+	$echec = null;
+	if (!$qualif)
+		return false;
 	foreach($objets as $objet => $id_objets){
+		$objet = objet_type($objet); # securite
 		if (!is_array($id_objets)) $id_objets = array($id_objets);
 		foreach($id_objets as $id_objet) {
-			$where = lien_where($objet_source, $id, $objet, $id_objet);
-			if ($c)
-				sql_updateq($table_lien,$qualif,$where);
+			$where = lien_where($primary, $id, $objet, $id_objet);
+			$e = sql_updateq($table_lien,$qualif,$where);
+			if ($e===false)
+				$echec = true;
 		}
 	}
+	return ($echec?false:true);
 }
 
 
diff --git a/ecrire/base/connect_sql.php b/ecrire/base/connect_sql.php
index d30937c3a3..08a0c5d35c 100644
--- a/ecrire/base/connect_sql.php
+++ b/ecrire/base/connect_sql.php
@@ -292,6 +292,9 @@ function objet_type($table_objet){
 	$type = preg_replace(',^spip_|^id_|s$,', '', $table_objet);
 	if (isset($surnoms[$type]))
 		return $surnoms[$type];
+
+	// securite : eliminer les caracteres non \w
+	$type = preg_replace(',[^\w],','',$type);
 	
 	// si le type redonne bien la table c'est bon
 	// oui si table_objet ressemblait deja a un type
-- 
GitLab