Valider 0050bbb5 rédigé par Fil's avatar Fil
Parcourir les fichiers

fusion des inc/distant de la branche 2.1 et de la branche 3 ; ca permet de...

fusion des inc/distant de la branche 2.1 et de la branche 3 ; ca permet de revenir sur [20104], sur la branche 2.1, qui etait un peu buggue, et surtout deja regle sur le trunk (spip3) en [19461]
au passage, ca reporte aussi [19231] (documents proteges, faussement distants) sur le trunk
a noter : les modifications d'espaces et de tabulations, bien que effectivement ameliorant le source, produisent de nombreux diffs 'muets' qu'il a fallu verifier un par un... au final une perte de temps desagreable
parent 6340b5dc
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+240 −195
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -3,7 +3,7 @@
/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2012                                                *
 *  Copyright (c) 2001-2013                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
@@ -21,17 +21,26 @@ define('_REGEXP_COPIE_LOCALE', ',' .
       . "/?spip.php[?]action=acceder_document.*file=(.*)$,");

//@define('_COPIE_LOCALE_MAX_SIZE',2097152); // poids (inc/utils l'a fait)
//
// Cree au besoin la copie locale d'un fichier distant
// mode = 'test' - ne faire que tester
// mode = 'auto' - charger au besoin
// mode = 'modif' - Si deja present, ne charger que si If-Modified-Since
// mode = 'force' - charger toujours (mettre a jour)
//
// Prend en argument un chemin relatif au rep racine, ou une URL
// Renvoie un chemin relatif au rep racine, ou false
//
// http://doc.spip.org/@copie_locale

/**
 * Cree au besoin la copie locale d'un fichier distant
 *
 *
 * Prend en argument un chemin relatif au rep racine, ou une URL
 * Renvoie un chemin relatif au rep racine, ou false
 *
 * http://doc.spip.org/@copie_locale
 *
 * @param $source
 * @param string $mode
 *   'test' - ne faire que tester
 *   'auto' - charger au besoin
 *   'modif' - Si deja present, ne charger que si If-Modified-Since
 *   'force' - charger toujours (mettre a jour)
 * @param string $local
 *   permet de specifier le nom du fichier local (stockage d'un cache par exemple, et non document IMG)
 * @return bool|string
 */
function copie_locale($source, $mode='auto') {

	// si c'est la protection de soi-meme, retourner le path
@@ -56,9 +65,22 @@ function copie_locale($source, $mode='auto') {
		return $local;

	if ($mode=='modif' OR !$t){
		$res = recuperer_page($source, $localrac,false,_COPIE_LOCALE_MAX_SIZE, '','',false, $t ? filemtime($localrac) : '');
		// passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation
		// et des eventuelles recuperations concurantes
		include_spip("inc/acces");
		$localractmp = "$localrac.".creer_uniqid().".tmp";
		$res = recuperer_page($source, $localractmp, false, _COPIE_LOCALE_MAX_SIZE, '', '', false, $t ? filemtime($localrac) : '');
		if ($res) {
			// si OK on supprime l'ancien fichier et on renomme
			spip_log("copie_locale : recuperation $source sur $localractmp taille $res OK, renommage en $localrac");
			spip_unlink($localrac);
			@rename($localractmp, $localrac);
		} else {
			// sinon on supprime le fichier temporaire qui a echoue et qui est sans doute corrompu...
			spip_log("copie_locale : Echec recuperation $source sur $localractmp, fichier supprime",_LOG_INFO_IMPORTANTE);
			spip_unlink($localractmp);
		}
		if (!$res) return $t ? $local : false;
#		spip_log ('ecrire copie locale '.$localrac." taille $res");

		// pour une eventuelle indexation
		pipeline('post_edition',
@@ -211,8 +233,7 @@ function recuperer_page($url, $trans=false, $get_headers=false,
// si $trans est null -> on ne veut que les headers
// si $trans est une chaine, c'est un nom de fichier pour ecrire directement dedans
// http://doc.spip.org/@recuperer_lapage
function recuperer_lapage($url, $trans=false, $get='GET', $taille_max = 1048576, $datas='', $refuser_gz = false, $date_verif = '', $uri_referer = '')
{
function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = 1048576, $datas = '', $refuser_gz = false, $date_verif = '', $uri_referer = ''){
	// $copy = copier le fichier ?
	$copy = (is_string($trans) AND strlen($trans)>5); // eviter "false" :-)

@@ -241,9 +262,11 @@ function recuperer_lapage($url, $trans=false, $get='GET', $taille_max = 1048576,
			if ($headers){
				spip_log("HTTP status $headers pour $url");
				return false;
			} elseif ($result = @file_get_contents($url))
			}
			elseif ($result = @file_get_contents($url))
				return array('', $result);
			else return false;
			else
				return false;
		}
		if (!is_array($headers)){ // cas Location
			fclose($f);
@@ -264,7 +287,8 @@ function recuperer_lapage($url, $trans=false, $get='GET', $taille_max = 1048576,
#	spip_log("entete ($trans $copy $gz)\n$headers"); 
	$result = recuperer_body($f, $taille_max, $gz ? $gz : ($copy ? $trans : ''));
	fclose($f);
	if (!$result) return array($headers, $result);
	if (!$result)
		return array($headers, $result);

	// Decompresser au besoin
	if ($gz){
@@ -281,18 +305,14 @@ function recuperer_lapage($url, $trans=false, $get='GET', $taille_max = 1048576,
}

// http://doc.spip.org/@recuperer_body
function recuperer_body($f, $taille_max=1048576, $fichier='')
{
function recuperer_body($f, $taille_max = 1048576, $fichier = ''){
	$taille = 0;
	$result = '';
	$fp = false;
	if ($fichier){
		spip_fopen_lock($fichier.'.lock', 'w', LOCK_EX);
		if (file_exists($fichier)) {
			unlink ($fichier.'.lock');
			return spip_file_get_contents($fichier);
		}
		$fp = spip_fopen_lock($fichier.'.tmp', 'w',LOCK_EX);
		if (!$fp) return false;
		$fp = spip_fopen_lock($fichier, 'w', LOCK_EX);
		if (!$fp)
			return false;
		$result = 0; // on renvoie la taille du fichier
	}
	while (!feof($f) AND $taille<$taille_max){
@@ -305,11 +325,8 @@ function recuperer_body($f, $taille_max=1048576, $fichier='')
		else
			$result .= $res;
	}
	if ($fp) {
	if ($fp)
		spip_fclose_unlock($fp);
		rename($fichier.'.tmp', $fichier);
		unlink ($fichier.'.lock');
	}
	return $result;
}

@@ -319,8 +336,7 @@ function recuperer_body($f, $taille_max=1048576, $fichier='')
// le tableau des entetes dans tous les autres cas

// http://doc.spip.org/@recuperer_entetes
function recuperer_entetes($f, $date_verif='')
{
function recuperer_entetes($f, $date_verif = ''){
	$s = @trim(fgets($f, 16384));

	if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)){
@@ -345,8 +361,10 @@ function recuperer_entetes($f, $date_verif='')
		}
	}

	if ($location) return $location;
	if ($status != 200 or $not_modif) return $status;
	if ($location)
		return $location;
	if ($status!=200 or $not_modif)
		return $status;
	return $headers;
}

@@ -356,8 +374,10 @@ function recuperer_entetes($f, $date_verif='')
// des filesystems
// http://doc.spip.org/@nom_fichier_copie_locale
function nom_fichier_copie_locale($source, $extension){

	if (version_compare($spip_version_branche,"3.0.0") < 0)
		include_spip('inc/getdocument');
	else
		include_spip('inc/documents');
	$d = creer_repertoire_documents('distant'); # IMG/distant/
	$d = sous_repertoire($d, $extension); # IMG/distant/pdf/

@@ -393,7 +413,8 @@ function fichier_copie_locale($source) {
	if ($ext
	AND preg_match(',^\w+$,', $ext) // pas de php?truc=1&...
	AND $f = nom_fichier_copie_locale($source, $ext)
	  AND file_exists(_DIR_RACINE . $f))
	AND file_exists(_DIR_RACINE . $f)
	)
		return $f;


@@ -477,13 +498,15 @@ function recuperer_infos_distantes($source, $max=0, $charger_si_petite_image = t
		$t = null;
		if (in_array($mime_type, array('text/plain', '', 'application/octet-stream'))){
			if (!$t
				AND preg_match(',\.([a-z0-9]+)(\?.*)?$,', $source, $rext)) {
				$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1]));
				AND preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
			){
				$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1],'','text'));
			}
			if (!$t
				AND preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims", $headers, $m)
					AND preg_match(',\.([a-z0-9]+)(\?.*)?$,', $m[1], $rext)){
				$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1]));
				AND preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext)
			){
				$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1],'','text'));
			}
		}

@@ -495,8 +518,9 @@ function recuperer_infos_distantes($source, $max=0, $charger_si_petite_image = t
		// On essaie de nouveau avec l'extension
		if (!$t
			AND $mime_type!='text/plain'
		AND preg_match(',\.([a-z0-9]+)(\?.*)?$,', $source, $rext)) {
			$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1]));
			AND preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext)
		){
			$t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1],'','text')); # eviter xxx.3 => 3gp (> SPIP 3)
		}


@@ -512,7 +536,8 @@ function recuperer_infos_distantes($source, $max=0, $charger_si_petite_image = t
		}

		if (preg_match(",\nContent-Length: *([^[:space:]]*),i",
			"\n$headers", $regs))
			"\n$headers", $regs)
		)
			$a['taille'] = intval($regs[1]);
	}

@@ -528,7 +553,8 @@ function recuperer_infos_distantes($source, $max=0, $charger_si_petite_image = t
		if ($max==0
			AND $a['taille']<1024*1024
				AND (strpos($GLOBALS['meta']['formats_graphiques'], $a['extension'])!==false)
		AND $charger_si_petite_image) {
					AND $charger_si_petite_image
		){
			$a = recuperer_infos_distantes($source, 1024*1024);
		}
		else if ($a['body']){
@@ -543,8 +569,9 @@ function recuperer_infos_distantes($source, $max=0, $charger_si_petite_image = t

	// Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut
	// ce sera mieux que 0x0
	if ($a['extension'] == 'swf'
	AND !$a['largeur']) {
	if ($a AND $a['extension']=='swf'
		AND !$a['largeur']
	){
		$a['largeur'] = 425;
		$a['hauteur'] = 350;
	}
@@ -561,10 +588,20 @@ function recuperer_infos_distantes($source, $max=0, $charger_si_petite_image = t
}


// http://doc.spip.org/@need_proxy
function need_proxy($host)
{
/**
 * Tester si un host peut etre recuperer directement ou doit passer par un proxy
 * on peut passer en parametre le proxy et la liste des host exclus,
 * pour les besoins des tests, lors de la configuration
 *
 * @param string $host
 * @param string $http_proxy
 * @param string $http_noproxy
 * @return string
 */
function need_proxy($host, $http_proxy = null, $http_noproxy = null){
	if (is_null($http_proxy))
		$http_proxy = @$GLOBALS['meta']["http_proxy"];
	if (is_null($http_noproxy))
		$http_noproxy = @$GLOBALS['meta']["http_noproxy"];

	$domain = substr($host, strpos($host, '.'));
@@ -587,13 +624,16 @@ function init_http($method, $url, $refuse_gz=false, $referer = '', $datas="", $v
	$t = @parse_url($url);
	$host = $t['host'];
	if ($t['scheme']=='http'){
		$scheme = 'http'; $noproxy = '';
		$scheme = 'http';
		$noproxy = '';
	} elseif ($t['scheme']=='https') {
		$scheme = 'ssl'; $noproxy = 'ssl://';
		$scheme = 'ssl';
		$noproxy = 'ssl://';
		if (!isset($t['port']) || !($port = $t['port'])) $t['port'] = 443;
	}
	else {
		$scheme = $t['scheme']; $noproxy = $scheme.'://';
		$scheme = $t['scheme'];
		$noproxy = $scheme . '://';
	}
	if (isset($t['user']))
		$user = array($t['user'], $t['pass']);
@@ -609,7 +649,10 @@ function init_http($method, $url, $refuse_gz=false, $referer = '', $datas="", $v
			$f = @fopen($url, "rb");
			spip_log("connexion vers $url par simple fopen");
			$fopen = true;
		} else $f = false;// echec total
		}
		else
			$f = false;
		// echec total
	}

	return array($f, $fopen);
@@ -631,7 +674,9 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $
		if (!($port = $t2['port'])) $port = 80;
		if ($t2['user'])
			$proxy_user = base64_encode($t2['user'] . ":" . $t2['pass']);
	} else $first_host = $noproxy.$host;
	}
	else
		$first_host = $noproxy . $host;

	$f = @fsockopen($first_host, $port);
	spip_log("Recuperer $path sur $first_host:$port par $f");