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 = ',';} - else { $sep = ';'; $hs = ';';} + else { $sep = ';'; $hs = ';'; $virg = $pvirg;} + if ($tab > $virg) {$sep = "\t"; $hs = "\t";} - $t = str_replace('""','"', preg_replace('/\r?\n/', "\n", $t)); + $t = str_replace('""','"', + 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