From 4bb1e0f94972a996847c81b9862ad90f54bac2dd Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Thu, 24 Jan 2008 14:42:47 +0000
Subject: [PATCH] genere_url_document et encore un peu CSV.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Le changement de stratégie sur la protection des documents rebondit encore.
Si un modèle a besoin d'incruster un document dont il ne connait que l'URL, le site exécutant la fonction copie_locale va échouer sur son propre appel car un serveur n'est pas son propre client. On repère donc la situation suffisamment en amont pour pouvoir faire sauter la auto-protection.

Par ailleurs, le filtre d'incrustation d'un CSV admet aussi la tabulation comme séparateur de colonne, et le {{{^M}}} comme unique séparateur de ligne (j'espère que le nombre de tableurs qui réinventent le RFC de CSV est strictement inférieur à mon nombre de collègues, je commence à en douter).

Précision sur [11111]: le raccourci pour Caption est {{{||}}} qu'il faut écrire entre triple accolade sur le Wiki de Trac.
---
 ecrire/inc/autoriser.php | 11 ++++++-----
 ecrire/inc/distant.php   |  9 +++++++++
 ecrire/inc/documents.php | 15 +++++++++------
 ecrire/inc/filtres.php   |  8 ++++++--
 4 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index 850d41813e..a84675c084 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -523,15 +523,16 @@ function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
 	if ($GLOBALS['meta']["creer_htaccess"] != 'oui')
 		return true;
 
-	if (($id = intval($id)) <= 0) return false;
+	if ((!is_numeric($id)) OR $id < 0) return false;
 
 	if (in_array($qui['statut'], array('0minirezo', '1comite')))
-		return true;
+		return 'htaccess';
 
-	return sql_countsel('spip_documents_articles AS rel_articles, spip_articles AS articles', "rel_articles.id_article = articles.id_article AND articles.statut = 'publie' AND rel_articles.id_document = $id") > 0
+	if (sql_countsel('spip_documents_articles AS rel_articles, spip_articles AS articles', "rel_articles.id_article = articles.id_article AND articles.statut = 'publie' AND rel_articles.id_document = $id") > 0
 	OR sql_countsel('spip_documents_rubriques AS rel_rubriques, spip_rubriques AS rubriques', "rel_rubriques.id_rubrique = rubriques.id_rubrique AND rubriques.statut = 'publie' AND rel_rubriques.id_document = $id") > 0
-	OR sql_countsel('spip_documents_breves AS rel_breves, spip_breves AS breves', "rel_breves.id_breve = breves.id_breve AND breves.statut = 'publie' AND rel_breves.id_document = $id") > 0
-	;
+	OR sql_countsel('spip_documents_breves AS rel_breves, spip_breves AS breves', "rel_breves.id_breve = breves.id_breve AND breves.statut = 'publie' AND rel_breves.id_document = $id") > 0)
+		return 'htaccess';
+	else return false;
 }
 
 // Qui peut activer le debugueur ?
diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 5c82c070af..62f2dbcd53 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -23,6 +23,13 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 //
 // http://doc.spip.org/@copie_locale
 function copie_locale($source, $mode='auto') {
+
+	// si c'est la protection de soi-meme 
+	$reg = ',' . $GLOBALS['meta']['adresse_site']
+	  . "/?spip.php[?]action=acceder_document.*file=(.*)$,";
+
+	if (preg_match($reg, $source, $local)) return _DIR_IMG . urldecode($local[1]);
+
 	$local = fichier_copie_locale($source);
 
 	// test d'existence du fichier
@@ -295,8 +302,10 @@ function fichier_copie_locale($source) {
 
 	// Si c'est deja dans la table des documents,
 	// ramener le nom de sa copie potentielle
+
 	$ext = sql_getfetsel("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''");
 
+
 	if ($ext) return nom_fichier_copie_locale($source, $ext);
 
 	// voir si l'extension indiquee dans le nom du fichier est ok
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index e11e6107cb..c23a3b1223 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -63,16 +63,20 @@ function generer_url_document_dist($id_document, $args='', $ancre='') {
 	include_spip('inc/autoriser');
 	if (!autoriser('voir', 'document', $id_document)) return '';
 
-	$row = sql_fetsel("fichier,distant", "spip_documents", "id_document=".sql_quote($id_document));
+	$r = sql_fetsel("fichier,distant", "spip_documents", "id_document=".sql_quote($id_document));
 
-	if (!$row) return '';
+	if (!$r) return '';
 
-	$f = $row['fichier'];
+	$f = $r['fichier'];
+
+	if ($r['distant'] == 'oui') return $f;
 
 	// Si droit de voir tous les docs, pas seulement celui-ci
 	// il est inutilement couteux de rajouter une protection
-	if (($row['distant'] == 'oui') OR autoriser('voir', 'document'))
-		return get_spip_doc($f);
+
+	$r = autoriser('voir', 'document');
+
+	if ($r AND $r !== 'htaccess') return get_spip_doc($f);
 
 	include_spip('inc/securiser_action');
 
@@ -278,7 +282,6 @@ function afficher_documents_colonne($id, $type="article",$script=NULL) {
 	}
 	$ret .= "</div>";
 	if (test_espace_prive()){
-	  spip_log("doc scrip");
 		$ret .= http_script('', _DIR_JAVASCRIPT."async_upload.js")
 		  . http_script('$("form.form_upload").async_upload(async_upload_article_edit)');
 	}
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 9c21538965..f29c7623c8 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -44,11 +44,15 @@ function filtre_text_csv_dist($t)
 {
 	$virg = substr_count($t, ',');
 	$pvirg = substr_count($t, ';');
+	$tab = substr_count($t, "\t");
 	if ($virg > $pvirg)
 		{ $sep = ','; $hs = '&#44;';}
-	else	{ $sep = ';'; $hs = '&#59;';}
+	else	{ $sep = ';'; $hs = '&#59;'; $virg = $pvirg;}
+	if ($tab > $virg) {$sep = "\t"; $hs = "\t";}
 
-	$t = str_replace('""','&#34;', preg_replace('/\r?\n/', "\n", $t));
+	$t = str_replace('""','&#34;',
+			 preg_replace('/\r?\n/', "\n",
+				      preg_replace('/\r/', "\n", $t)));
 	preg_match_all('/"[^"]*"/', $t, $r);
 	foreach($r[0] as $cell) 
 		$t = str_replace($cell, 
-- 
GitLab