From c5b9ec24c51b42c1cfb619f685e5bf230d58e0dc Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Fri, 14 Nov 2008 14:08:58 +0000
Subject: [PATCH] faux conflits d'edition: sur certains serveurs SELECT
 MD5(texte) ne donne pas pareil que md5(SELECT texte) ; on resoud en se
 limitant au md5 de php

---
 ecrire/inc/editer.php | 22 +++++++++-------------
 1 file changed, 9 insertions(+), 13 deletions(-)

diff --git a/ecrire/inc/editer.php b/ecrire/inc/editer.php
index 9bb1890d57..9a8861cb38 100644
--- a/ecrire/inc/editer.php
+++ b/ecrire/inc/editer.php
@@ -301,16 +301,14 @@ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctrl_')
 	}
 	if (!$champs) return;
 
-	// On veut savoir si notre modif va avoir un impact ; en mysql
-	// on pourrait employer mysql_affected_rows() mais pas en multi-base
-	// donc on fait autrement, avec verification prealable
-	// On utilise md5 pour eviter la casse (en SQL: 'SPIP'='spip')
-	$verifier = array();
+	// On veut savoir si notre modif va avoir un impact
+	// par rapport aux donnees contenues dans la base
+	// (qui peuvent etre differentes de celles ayant servi a calculer le ctr)
+	$s = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=$id", $serveur);
+	$intact = true;
 	foreach ($champs as $ch => $val)
-		$verifier[] = "($ch IS NULL OR MD5($ch)!=".sql_quote(md5($val)).")";
-	if (!sql_countsel($spip_table_objet, "($id_table_objet=$id) AND (" . join(' OR ',$verifier). ")",
-	null,null,null,$serveur))
-		return;
+		$intact &= ($s[$ch] == $val);
+	if ($intact) return;
 
 	// Detection de conflits :
 	// On verifie si notre modif ne provient pas d'un formulaire
@@ -322,15 +320,13 @@ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctrl_')
 		if ($m = $ctr[$prefix.$key]) {
 			$ctrh[$key] = $m;
 			$ctrq[] = $key;
-			$ctrq[] = "md5($key) AS ctrq_$key";
 		}
 	}
 	if ($ctrq) {
 		$ctrq = sql_fetsel($ctrq, $spip_table_objet, "$id_table_objet=$id", $serveur);
 		foreach ($ctrh as $key => $m) {
-			if ($m != $ctrq['ctrq_'.$key]
-			AND $champs[$key] !== $ctrq[$key]
-			AND $ctrq['ctrq_'.$key] !== null) {
+			if ($m != md5($ctrq[$key])
+			AND $champs[$key] !== $ctrq[$key]) {
 				$conflits[$key] = array(
 					'base' => $ctrq[$key],
 					'post' => $champs[$key]
-- 
GitLab