From 961a7986cfe2df92f1e0cabf068d018477bbcde0 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 16 Jun 2007 09:24:39 +0000
Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20de=20#961=20:=20il=20est?=
 =?UTF-8?q?=20maintenant=20possible=20de=20sp=C3=A9cifier=20des=20machines?=
 =?UTF-8?q?=20ou=20des=20domaines=20pour=20lesquels=20le=20proxy=20ne=20do?=
 =?UTF-8?q?it=20pas=20etre=20utilis=C3=A9.=20On=20en=20profite=20pour=20al?=
 =?UTF-8?q?ler=20jusqu'au=20bout=20de=20l'usage=20d'Ajax=20dans=20ce=20cas?=
 =?UTF-8?q?=20de=20configuraiton,=20mais=20=C3=A7a=20marche=20toujours=20s?=
 =?UTF-8?q?ans=20Ajax=20(mais=20comment=20on=20n'a=20pu=20supporter=20si?=
 =?UTF-8?q?=20longtemps=20une=20lenteur=20pareille=20dans=20ce=20cas=3F).?=
 =?UTF-8?q?=20On=20en=20profite=20aussi=20pour=20revoir=20les=20libell?=
 =?UTF-8?q?=C3=A9s,=20d'une=20part=20pour=20signaler=20que=20c'est=20n?=
 =?UTF-8?q?=C3=A9cessaire=20=C3=A0=20l'acc=C3=A8s=20=C3=A0=20la=20document?=
 =?UTF-8?q?ation=20(on=20aurait=20du=20le=20faire=20depuis=20longtemps)=20?=
 =?UTF-8?q?et=20pour=20que=20la=20validation=20en=20mode=20Ajax=20soit=20s?=
 =?UTF-8?q?uivie=20d'une=20diff=C3=A9rence=20graphique=20(sinon,=20on=20av?=
 =?UTF-8?q?ait=20l'impression=20que=20rien=20ne=20s'=C3=A9tait=20pass?=
 =?UTF-8?q?=C3=A9).?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Attention, il y a un gros Hack pour forcer ces modifications dans les libellés, il faut une intégration propre à terme.
---
 .gitattributes                        |  2 +
 ecrire/action/configurer_relayeur.php | 37 +++++++++++
 ecrire/configuration/relayeur.php     | 91 +++++++++++++++++++++++----
 ecrire/exec/config_fonctions.php      |  2 +-
 ecrire/exec/configurer_relayeur.php   | 20 ++++++
 ecrire/inc/config.php                 | 44 +------------
 ecrire/inc/distant.php                | 19 +++---
 7 files changed, 155 insertions(+), 60 deletions(-)
 create mode 100644 ecrire/action/configurer_relayeur.php
 create mode 100644 ecrire/exec/configurer_relayeur.php

diff --git a/.gitattributes b/.gitattributes
index d85f9c01ed..5c6048b502 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -347,6 +347,7 @@ dist/win_width.htc -text
 ecrire/action/acceder_document.php -text
 ecrire/action/activer_plugins.php -text
 ecrire/action/configurer.php -text
+ecrire/action/configurer_relayeur.php -text
 ecrire/action/converser.php -text
 ecrire/action/copier_local.php -text
 ecrire/action/dater.php -text
@@ -464,6 +465,7 @@ ecrire/exec/config_lang.php -text
 ecrire/exec/config_multilang.php -text
 ecrire/exec/configuration.php -text
 ecrire/exec/configurer.php -text
+ecrire/exec/configurer_relayeur.php -text
 ecrire/exec/controle_forum.php -text
 ecrire/exec/controle_petition.php -text
 ecrire/exec/convert_sql_utf8.php -text
diff --git a/ecrire/action/configurer_relayeur.php b/ecrire/action/configurer_relayeur.php
new file mode 100644
index 0000000000..8aa2c0797c
--- /dev/null
+++ b/ecrire/action/configurer_relayeur.php
@@ -0,0 +1,37 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// Mise a jour de l'option de configuration du proxy
+
+include_spip('configuration/relayeur');
+
+function action_configurer_relayeur_dist() {
+
+	$securiser_action = charger_fonction('securiser_action', 'inc');
+	$arg = $securiser_action();
+
+	$http_proxy = _request('http_proxy');
+	$http_noproxy = _request('http_noproxy');
+	$test_proxy = _request('test_proxy');
+	$tester_proxy = _request('tester_proxy');
+
+	$test = configuration_relayeur_post($http_proxy, $http_noproxy, $test_proxy, $tester_proxy); 
+
+	// message a afficher dans l'exec de retour
+
+	$r = rawurldecode(_request('redirect'));
+	$r = parametre_url($r, 'retour_proxy', $test, "&");
+	redirige_par_entete($r);
+}
+?>
diff --git a/ecrire/configuration/relayeur.php b/ecrire/configuration/relayeur.php
index 269e5674ff..63bb886113 100644
--- a/ecrire/configuration/relayeur.php
+++ b/ecrire/configuration/relayeur.php
@@ -13,15 +13,34 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
-include_spip('inc/config');
 
-function configuration_relayeur_dist()
+/// A PASSER DANS LES FICHIERS DE LANGUE
+
+_T('texte_test_proxy'); // force le chargement du fichier de langue
+// pour ecraser la valeur ci-dessous ensuite 
+$GLOBALS[$GLOBALS['idx_lang']]['texte_proxy'] = 'Dans certains cas
+		(intranet, r&eacute;seaux prot&eacute;g&eacute;s...),
+		les sites distants
+		(documentation de SPIP, sites syndiqu&eacute;s etc.)
+		ne sont accessibles qu\'&agrave; travers un
+		<i>proxy HTTP</i>.
+		Le cas &eacute;ch&eacute;ant,
+		indiquez ci-dessous son adresse, sous la forme
+		@proxy_en_cours@.
+		En g&eacute;n&eacute;ral, vous laisserez cette case vide.';
+// et un nouveau, gaffe au _L implicite
+$GLOBALS[$GLOBALS['idx_lang']]['pas_de_proxy_pour'] = 'Au besoin, indiquez les machines ou domaines pour lesquels ce proxy ne doit pas s\'appliquer (par exemple: @exemple@)&nbsp;:';
+
+function configuration_relayeur_dist($retour_proxy)
 {
-	global $spip_lang_right, $spip_lang_left;
+	global $spip_lang_left;
 
 	$res = $submit = '';
 
-	if ($http_proxy = $GLOBALS['meta']["http_proxy"]) {
+	$http_proxy = $GLOBALS['meta']["http_proxy"];
+	$http_noproxy = $GLOBALS['meta']["http_noproxy"];
+
+	if ($http_proxy) {
 		include_spip('inc/distant');
 		// Masquer un eventuel password authentifiant
 		$http_proxy=entites_html(no_password_proxy_url($http_proxy));
@@ -33,10 +52,7 @@ function configuration_relayeur_dist()
 			. "<input type='text' name='test_proxy' value='http://www.spip.net/' size='40' class='forml' />"
 			. "</p>";
 
-			// ce retour_proxy provient soit de l'url, si on est en ajax,
-			// soit des globales si on est en mode sans javascript. Joli :(
-			if($retour_proxy = _request('retour_proxy')
-			OR $retour_proxy = $GLOBALS['retour_proxy']) {
+			if($retour_proxy) {
 				$res .= debut_boite_info(true)
 				. $retour_proxy
 				. fin_boite_info(true);
@@ -46,18 +62,71 @@ function configuration_relayeur_dist()
 		}
 	}
 
+	$encours = $http_proxy ? $http_proxy : "http://proxy:8080";
+	$exemple = $http_noproxy ? $http_noproxy : "127.0.0.1 .mondomaine.net";
 	$res = "\n<div class='verdana2'>"
-	. propre(_T('texte_proxy'))
+	  . propre(_T('texte_proxy', array('proxy_en_cours' => "<b><tt><html>$encours</html></tt></b>")))
 	. "</div>"
 	. "\n<div class='verdana2'>"
 	. "<input type='text' name='http_proxy' size='40' class='forml' value='$http_proxy' />"
+	. "<br />"
+	  . propre(_T('pas_de_proxy_pour', array('exemple' => "<b><tt><html>$exemple</html></tt></b>")))
+	. "<input type='text' name='http_noproxy' size='40' class='forml' value='$http_noproxy' />"
 	. $res
 	. "</div>";
 
 	$res = debut_cadre_trait_couleur("base-24.gif", true, "", _T('info_sites_proxy').aide ("confhttpproxy"))
-	.  ajax_action_post('configurer', 'relayeur', 'config_fonctions', '', $res, $submit)
+	.  ajax_action_post('configurer_relayeur', 0, 'config_fonctions', '', $res, $submit)
 	.  fin_cadre_trait_couleur(true);
 
-	return ajax_action_greffe("configurer-relayeur", '', $res);
+	return ajax_action_greffe("configurer_relayeur", 0, $res);
+}
+
+function configuration_relayeur_post ($http_proxy, $http_noproxy, $test_proxy, $tester_proxy) 
+{
+	// http_proxy : ne pas prendre en compte la modif si le password est '****'
+	if (preg_match(',:\*\*\*\*@,', $http_proxy))
+		$http_proxy = $GLOBALS['meta']['http_proxy'];
+
+	$retour_proxy = '';
+	if ($tester_proxy AND $http_proxy) {
+		if (!$test_proxy) {
+			$retour_proxy = _T('info_adresse_non_indiquee');
+		} else {
+			include_spip('inc/texte'); // pour aide, couper, lang
+			if (strncmp("http://", $http_proxy,7)!=0)
+			  $page = '';
+			else {
+			  include_spip('inc/distant');
+			  $page = recuperer_page($test_proxy, true);
+			}
+			if ($page)
+				$retour_proxy = "<p>"._T('info_proxy_ok')."</p>\n<tt>".couper(entites_html($page),300)."</tt>";
+			else
+				$retour_proxy = _T('info_impossible_lire_page', array('test_proxy' => $test_proxy))
+				. " <tt>".no_password_proxy_url($http_proxy)."</tt>."
+				. aide('confhttpproxy');
+		}
+	}
+	if ($t = ($http_proxy !== NULL)) {
+		ecrire_meta('http_proxy', $http_proxy);
+	}
+	if ($http_noproxy !== NULL) {
+		ecrire_meta('http_noproxy', $http_noproxy);
+		$t = true;
+	}
+	if ($t) ecrire_metas();
+	return $retour_proxy;
+}
+
+// Ne pas afficher la partie 'password' du proxy
+// http://doc.spip.org/@no_password_proxy_url
+function no_password_proxy_url($http_proxy) {
+        if ($p = @parse_url($http_proxy)
+        AND $p['pass']) {
+                $p['pass'] = '****';
+                $http_proxy = glue_url($p);
+        }
+        return $http_proxy;
 }
 ?>
diff --git a/ecrire/exec/config_fonctions.php b/ecrire/exec/config_fonctions.php
index 3710590fa7..b62a695c21 100644
--- a/ecrire/exec/config_fonctions.php
+++ b/ecrire/exec/config_fonctions.php
@@ -67,7 +67,7 @@ function exec_config_fonctions_dist()
 
 	  $previsualiseur(), // Previsualisation sur le site public
 
-	  $relayeur(); // Proxy pour lire syndication & doc
+	  $relayeur(_request('retour_proxy')); // Proxy pour syndication & doc
 //
 // Choix supplementaires proposees par les plugins
 //
diff --git a/ecrire/exec/configurer_relayeur.php b/ecrire/exec/configurer_relayeur.php
new file mode 100644
index 0000000000..0e37e9a147
--- /dev/null
+++ b/ecrire/exec/configurer_relayeur.php
@@ -0,0 +1,20 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function exec_configurer_relayeur_dist()
+{
+	$relayeur = charger_fonction('relayeur', 'configuration');
+	ajax_retour($relayeur(_request('retour_proxy')));
+}
+?>
diff --git a/ecrire/inc/config.php b/ecrire/inc/config.php
index 3461c1addf..7d0e3f0c4f 100644
--- a/ecrire/inc/config.php
+++ b/ecrire/inc/config.php
@@ -153,10 +153,10 @@ function afficher_choix($nom, $valeur_actuelle, $valeurs, $sep = "<br />") {
 
 // http://doc.spip.org/@appliquer_modifs_config
 function appliquer_modifs_config() {
-	global $email_webmaster, $descriptif_site, $email_envoi, $post_dates, $tester_proxy, $test_proxy, $http_proxy, $activer_moteur;
+	global $email_webmaster, $descriptif_site, $email_envoi, $post_dates;
 	global $forums_publics, $forums_publics_appliquer;
 	global $charset, $charset_custom, $langues_auth;
-	global $retour_proxy, $envoi_now;
+	global $envoi_now, $activer_moteur;
 
 	if (_request('adresse_site'))
 		$_POST['adresse_site'] = preg_replace(",/?\s*$,", "", _request('adresse_site'));
@@ -183,32 +183,7 @@ function appliquer_modifs_config() {
 		ecrire_meta('accepter_visiteurs', 'oui');
 
 	// Test du proxy : $tester_proxy est le bouton "submit"
-
-	// http_proxy : ne pas prendre en compte la modif si le password est '****'
-	if (preg_match(',:\*\*\*\*@,', $http_proxy))
-		$http_proxy = $GLOBALS['meta']['http_proxy'];
-
-	// Un globale qui servira soit en ajax soit en direct pour afficher un 
-	// message de statut du proxy.
-	// Cf. action/configurer et configuration/relayeur
-	$retour_proxy = '';
-	if ($tester_proxy) {
-		if (!$test_proxy) {
-			$retour_proxy = _T('info_adresse_non_indiquee');
-		} else {
-			include_spip('inc/texte'); // pour aide, couper, lang
-			if (strncmp("http://", $http_proxy,7)!=0)
-			  $page = '';
-			else {
-			  include_spip('inc/distant');
-			  $page = recuperer_page($test_proxy, true);
-			}
-			if ($page)
-				$retour_proxy = "<p>"._T('info_proxy_ok')."</p>\n<tt>".couper(entites_html($page),300)."</tt>";
-			else
-				$retour_proxy = _T('info_impossible_lire_page', array('test_proxy' => $test_proxy))." <tt>".no_password_proxy_url($http_proxy)."</tt>.".aide('confhttpproxy');
-		}
-	}
+	configuration_relayeur_post(_request('http_proxy'), _request('http_noproxy'), _request('test_proxy'), _request('tester_proxy'));
 
 	// Activer le moteur : dresser la liste des choses a indexer
 	if ($activer_moteur == 'oui' AND ($activer_moteur != $GLOBALS['meta']["activer_moteur"])) {
@@ -256,7 +231,6 @@ function appliquer_modifs_config() {
 		'activer_syndic',
 		'visiter_sites',
 		'moderation_sites',
-		'http_proxy',
 
 		'forums_publics',
 		'accepter_inscriptions',
@@ -318,18 +292,6 @@ function appliquer_modifs_config() {
 	}
 }
 
-// Ne pas afficher la partie 'password' du proxy
-// http://doc.spip.org/@no_password_proxy_url
-function no_password_proxy_url($http_proxy) {
-	if ($p = @parse_url($http_proxy)
-	AND $p['pass']) {
-		$p['pass'] = '****';
-		$http_proxy = glue_url($p);
-	}
-	return $http_proxy;
-}
-
-
 // Function glue_url : le pendant de parse_url 
 // http://doc.spip.org/@glue_url
 function glue_url ($url){
diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 3a4b4059a4..e24ce0d5c9 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -408,13 +408,6 @@ function recuperer_infos_distantes($source, $max=0) {
 // http://doc.spip.org/@init_http
 function init_http($get, $url, $refuse_gz=false, $uri_referer = '') {
 	$via_proxy = ''; $proxy_user = ''; $fopen = false;
-	$http_proxy = $GLOBALS['meta']["http_proxy"];
-	if (strncmp("http://", $http_proxy,7)!=0)
-		$http_proxy = '';
-	else
-		$via_proxy = " (proxy $http_proxy)";
-
-	spip_log("http $get $url$via_proxy");
 
 	$t = @parse_url($url);
 	$host = $t['host'];
@@ -427,6 +420,18 @@ function init_http($get, $url, $refuse_gz=false, $uri_referer = '') {
 	$query = $t['query'];
 	if (!isset($t['path']) || !($path = $t['path'])) $path = "/";
 
+	$http_proxy = $GLOBALS['meta']["http_proxy"];
+	$http_noproxy = $GLOBALS['meta']["http_noproxy"];
+
+	if (strncmp("http://", $http_proxy,7)!=0
+	    OR (strpos(" $http_noproxy ", " $host ") !== false)
+	    OR (strpos(" $http_noproxy ", ' ' . substr($host,(strpos($host,'.')) . ' ')) !== false))
+		$http_proxy = '';
+	else
+		$via_proxy = " (proxy $http_proxy)";
+
+	spip_log("http $get $url$via_proxy");
+
 	if ($http_proxy) {
 		$t2 = @parse_url($http_proxy);
 		$proxy_host = $t2['host'];
-- 
GitLab