From f9b2f9f3a218dd977d5d0450128aef6963705ecc Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Wed, 25 Feb 2009 00:11:35 +0000
Subject: [PATCH] reparer la 404 des urls propres, et le mode urls propres_qs

---
 ecrire/public/assembler.php |  2 +-
 ecrire/urls/arbo.php        | 12 ++++++++----
 ecrire/urls/propres.php     | 29 +++++++++++++++++++++++------
 ecrire/urls/propres_qs.php  |  2 +-
 4 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 99d10a3b15..c80fffc181 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -88,7 +88,7 @@ function assembler($fond, $connect='') {
 				$a = $renommer($url, $fond);
 				if (is_array($a)) {
 					list($ncontexte, $type, $url_redirect, $nfond) = $a;
-					if (isset($url_redirect)
+					if (strlen($url_redirect)
 					AND $url !== $url_redirect) {
 						spip_log("Redirige $url vers $url_redirect");
 						include_spip('inc/headers');
diff --git a/ecrire/urls/arbo.php b/ecrire/urls/arbo.php
index 49894dc461..9acb929342 100644
--- a/ecrire/urls/arbo.php
+++ b/ecrire/urls/arbo.php
@@ -470,7 +470,10 @@ function urls_arbo_dist($i, $entite, $args='', $ancre='') {
 	
 	include_spip('base/abstract_sql'); // chercher dans la table des URLS
 
-	// Compatilibite avec .htm/.html et autres terminaisons
+	// Revenir en utf-8 si encodage type %D8%A7 (farsi)
+	$url_propre = rawurldecode($url_propre);
+
+	// Compatibilite avec .htm/.html et autres terminaisons
 	$t = array_diff(array_unique(array_merge(array('.html','.htm','/'),url_arbo_terminaison(''))),array(''));
 	if (count($t))
 		$url_propre = preg_replace('{('
@@ -512,7 +515,7 @@ function urls_arbo_dist($i, $entite, $args='', $ancre='') {
 			}
 			else {
 				// un segment est inconnu
-				if ($entite=='type_urls') {
+				if ($entite=='' OR $entite=='type_urls') {
 					// on genere une 404 comme il faut si on ne sait pas ou aller
 					return array(array(),'404');
 				}
@@ -521,12 +524,13 @@ function urls_arbo_dist($i, $entite, $args='', $ancre='') {
 		}
 
 		// gerer le retour depuis des urls propres
-		if ($entite=='type_urls' AND $GLOBALS['profondeur_url']<=0){
+		if (($entite=='' OR $entite=='type_urls')
+		AND $GLOBALS['profondeur_url']<=0){
 			$urls_anciennes = charger_fonction('propres','urls');
 			return $urls_anciennes($url_propre,$entite);
 		}
 	}
-	if ($entite=='type_urls') {
+	if ($entite=='' OR $entite=='type_urls' /* compat .htaccess 2.0 */) {
 		if ($type)
 			$entite =  ($type == 'syndic') ?  'site' : $type;
 		else {
diff --git a/ecrire/urls/propres.php b/ecrire/urls/propres.php
index 739cf6c3ea..edaf65d66c 100644
--- a/ecrire/urls/propres.php
+++ b/ecrire/urls/propres.php
@@ -410,16 +410,19 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
 	
 	include_spip('base/abstract_sql'); // chercher dans la table des URLS
 
-	// Compatilibite avec propres2
+	// Compatibilite avec propres2
 	$url_propre = preg_replace(',\.html$,i', '', $url_propre);
-	
+
+	// Revenir en utf-8 si encodage type %D8%A7 (farsi)
+	$url_propre = rawurldecode($url_propre);
+
 	// Compatibilite avec les anciens marqueurs d'URL propres
 	// Tester l'entree telle quelle (avec 'url_libre' des sites ont pu avoir des entrees avec marqueurs dans la table spip_urls)
 	if (!$row = sql_fetsel('id_objet, type, date', 'spip_urls', 'url='.sql_quote($url_propre))) {
 		// Sinon enlever les marqueurs eventuels
-		$url_propre = retirer_marqueurs_url_propre($url_propre);
+		$url_propre2 = retirer_marqueurs_url_propre($url_propre);
 
-		$row = sql_fetsel('id_objet, type, date', 'spip_urls', 'url='.sql_quote($url_propre));
+		$row = sql_fetsel('id_objet, type, date', 'spip_urls', 'url='.sql_quote($url_propre2));
 	}
 
 	if ($row) {
@@ -443,12 +446,26 @@ function urls_propres_dist($i, $entite, $args='', $ancre='') {
 		}
 	}
 
-	if ($entite=='type_urls') {
+	if ($entite=='' OR $entite=='type_urls' /* compat .htaccess 2.0 */) {
 		if ($type)
 			$entite =  ($type == 'syndic') ?  'site' : $type;
 		else {
 			$entite = '404';
-			$contexte['erreur'] = ''; // qu'afficher ici ?  l'url n'existe pas... on ne sait plus dire de quel type d'objet il s'agit
+			$contexte['erreur'] = '';
+			// l'url n'existe pas...
+			// on ne sait plus dire de quel type d'objet il s'agit
+
+			// sauf si on a le marqueur. et la c'est un peu sale...
+			if (_MARQUEUR_URL) {
+				$fmarqueur = @array_flip(unserialize(_MARQUEUR_URL));
+				preg_match(',^([+][-]|[-+@_]),', $url_propre, $regs);
+				$objet = $regs ? substr($fmarqueur[$regs[1]],0,n-1) : 'article';
+				$contexte['erreur'] = _T(
+					($objet=='rubrique' OR $objet=='breve')
+						? 'public:aucune_'.$objet
+						: 'public:aucun_'.$objet
+				);
+			}
 		}
 	}
 
diff --git a/ecrire/urls/propres_qs.php b/ecrire/urls/propres_qs.php
index 53b1e13704..f8d439e5a7 100644
--- a/ecrire/urls/propres_qs.php
+++ b/ecrire/urls/propres_qs.php
@@ -34,6 +34,6 @@ define ('_debut_urls_propres', './?');
 // http://doc.spip.org/@urls_propres_qs_dist
 function urls_propres_qs_dist($i, &$entite, $args='', $ancre='') {
 	$f = charger_fonction('propres', 'urls');
-	return preg_replace(",^\.\./\./,","../",$f($i, $entite, $args, $ancre));
+	return $f($i, $entite, $args, $ancre);
 }
 ?>
-- 
GitLab