Skip to content
Extraits de code Groupes Projets
inc_version.php3 26,8 ko
Newer Older
<?php
Yannick Patois's avatar
Yannick Patois a validé

//
// Ce fichier ne sera execute qu'une fois
if (defined("_ECRIRE_INC_VERSION")) return;
define("_ECRIRE_INC_VERSION", "1");

Fil's avatar
Fil a validé

Fil's avatar
Fil a validé
// *********** traiter les variables ************
// Magic quotes : on n'en veut pas sur la base,
// et on nettoie les GET/POST/COOKIE le cas echeant
//

function magic_unquote($table) {
	if (is_array($GLOBALS[$table])) {
Fil's avatar
Fil a validé
		reset($GLOBALS[$table]);
		while (list($key, $val) = each($GLOBALS[$table])) {
			if (is_string($val))
Antoine Pitrou's avatar
Antoine Pitrou a validé
				$GLOBALS[$table][$key] = stripslashes($val);
Fil's avatar
Fil a validé
		}
Fil's avatar
Fil a validé
	}
}

@set_magic_quotes_runtime(0);
$unquote_gpc = @get_magic_quotes_gpc();
Fil's avatar
Fil a validé

if ($unquote_gpc) {
	magic_unquote('HTTP_GET_VARS');
	magic_unquote('HTTP_POST_VARS');
	magic_unquote('HTTP_COOKIE_VARS');
}

//
// Dirty hack contre le register_globals a 'Off' (PHP 4.1.x)
// A remplacer par une gestion propre des variables admissibles ;-)
//

Antoine Pitrou's avatar
Antoine Pitrou a validé
$INSECURE = array();

function feed_globals($table, $insecure = true, $ignore_variables_contexte = false) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	global $INSECURE;

	// ignorer des cookies qui contiendraient du contexte 
	$is_contexte = array('id_parent'=>1, 'id_rubrique'=>1, 'id_article'=>1, 'id_auteur'=>1,
		'id_breve'=>1, 'id_forum'=>1, 'id_secteur'=>1, 'id_syndic'=>1, 'id_syndic_article'=>1,
		'id_mot'=>1, 'id_groupe'=>1, 'id_document'=>1, 'date'=>1, 'lang'=>1);

Fil's avatar
Fil a validé
	if (is_array($GLOBALS[$table])) {
        reset($GLOBALS[$table]);
        while (list($key, $val) = each($GLOBALS[$table])) {
Fil's avatar
Fil a validé
			if ($ignore_variables_contexte AND isset($is_contexte[$key]))
				unset ($GLOBALS[$key]);
			else
				$GLOBALS[$key] = $val;
Antoine Pitrou's avatar
Antoine Pitrou a validé
			if ($insecure) $INSECURE[$key] = $val;
Fil's avatar
Fil a validé
	}
}

feed_globals('HTTP_COOKIE_VARS', true, true);
Fil's avatar
Fil a validé
feed_globals('HTTP_GET_VARS');
feed_globals('HTTP_POST_VARS');
Antoine Pitrou's avatar
Antoine Pitrou a validé
feed_globals('HTTP_SERVER_VARS', false);
Fil's avatar
Fil a validé


//
// Avec register_globals a Off sous PHP4, il faut utiliser
// la nouvelle variable HTTP_POST_FILES pour les fichiers uploades
// (pas valable sous PHP3...)
//

function feed_post_files($table) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	global $INSECURE;
Fil's avatar
Fil a validé
	if (is_array($GLOBALS[$table])) {
	        reset($GLOBALS[$table]);
	        while (list($key, $val) = each($GLOBALS[$table])) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	                $GLOBALS[$key] = $INSECURE[$key] = $val['tmp_name'];
	                $GLOBALS[$key.'_name'] = $INSECURE[$key.'_name'] = $val['name'];
Fil's avatar
Fil a validé
	        }
	}
}

feed_post_files('HTTP_POST_FILES');

Antoine Pitrou's avatar
Antoine Pitrou a validé
//
Antoine Pitrou's avatar
Antoine Pitrou a validé
// 	*** Parametrage par defaut de SPIP ***
//
Fil's avatar
Fil a validé
// Ces parametres d'ordre technique peuvent etre modifies
Antoine Pitrou's avatar
Antoine Pitrou a validé
// dans ecrire/mes_options.php3. Les valeurs specifiees
// dans ce dernier fichier remplaceront automatiquement
// les valeurs ci-dessous.
//
// Pour creer ecrire/mes_options.php3 : recopier simplement
// les lignes ci-dessous, et ajouter le marquage de debut et
// de fin de fichier PHP ("< ?php" et "? >", sans les espaces)
Antoine Pitrou's avatar
Antoine Pitrou a validé
//
Fil's avatar
Fil a validé

// Prefixe des tables dans la base de donnees
// (a modifier pour avoir plusieurs sites SPIP dans une seule base)
$table_prefix = "spip";

// Prefixe et chemin des cookies
// (a modifier pour installer des sites SPIP dans des sous-repertoires)
$cookie_prefix = "spip";
$cookie_path = "";
// Dossier des squelettes
// (a modifier si l'on veut passer rapidement d'un jeu de squelettes a un autre)
$dossier_squelettes = "";

// faut-il autoriser SPIP a compresser les pages a la volee quand le
// navigateur l'accepte (valable pour apache >= 1.3 seulement) ?
$auto_compress = true;

Fil's avatar
Fil a validé
// compresser les fichiers du repertoire CACHE/ avec gzip ?
// attention : apres toute modification de ce reglage il faut vider le cache
$compresser_cache = true;

Fil's avatar
Fil a validé
// Type d'URLs
// 'standard': article.php3?id_article=123
// 'html': article123.html
// 'propres': Titre-de-l-article.html <http://lab.spip.net/spikini/UrlsPropres>
$type_urls = 'standard';

// creation des vignettes avec image magick en ligne de commande : mettre
// le chemin complet '/bin/convert' (Linux) ou '/sw/bin/convert' (fink/Mac OS X)
// Note : preferer GD2 ou le module php imagick s'ils sont disponibles
$convert_command = 'convert';
// creation des vignettes avec djpeg/pnmscale/cjpeg
$djpeg_command = 'djpeg';
$cjpeg_command = 'cjpeg';
$pnmscale_command = 'pnmscale';
// faut-il passer les connexions MySQL en mode debug ?
Fil's avatar
Fil a validé
$mysql_debug = false;

// faut-il chronometrer les requetes MySQL ?
$mysql_profile = false;

// faut-il faire des connexions completes rappelant le nom du serveur et de
// la base MySQL ? (utile si vos squelettes appellent d'autres bases MySQL ;
// a desactiver en cas de soucis de connexion chez certains hebergeurs [??])
$mysql_rappel_connexion = true;
// faut-il afficher en rouge les chaines non traduites ?
$test_i18n = false;
// faut-il souligner en gris, dans ecrire/articles.php3, les espaces insecables ?
$activer_revision_nbsp = false;

Fil's avatar
Fil a validé
// gestion des extras (voir ecrire/inc_extra.php3 pour plus d'informations)
$champs_extra = false;
$champs_extra_proposes = false;

// faut-il ignorer l'authentification par auth http/remote_user ?
// cela permet d'avoir un SPIP sous .htaccess (ignore_remote_user),
// mais aussi de fonctionner sur des serveurs debiles se
// bloquant sur PHP_AUTH_USER=root (ignore_auth_http)
$ignore_auth_http = false;
$ignore_remote_user = false;
Fil's avatar
Fil a validé

// Faut-il "invalider" les caches quand on depublie ou modifie un article ?
# en faire une option dans l'interface de configuration ?
# NB: cette option ne concerne que articles,breves,rubriques et site
# car les forums sont toujours invalidants.
$invalider_caches = true;

// Quota : la variable $quota_cache, si elle est > 0, indique la taille
// totale maximale desiree des fichiers contenus dans le CACHE/ ;
// ce quota n'est pas "dur", il ne s'applique qu'une fois par heure et
// fait redescendre le cache a la taille voulue ; valeur en Mo
Fil's avatar
Fil a validé
// Si la variable vaut 0 aucun quota ne s'applique
$quota_cache = 5;
// code a fournir pour obtenir le debuggueur (urls &var_debug=xxxx)
// par defaut seuls les admins : $code_activation_debug='';
// pour mettre un mot de passe : $code_activation_debug='x5g8jk9';
$code_activation_debug = '';
//
# aide en ligne
$help_server = 'http://www.spip.net/aide';
# TeX
$tex_server = 'http://math.spip.org/tex.php';
# MathML
$mathml_server = 'http://arno.rezo.net/tex2mathml/latex.php';
# Orthographe (serveurs multiples) [pas utilise pour l'instant]
$ortho_servers = array ('http://ortho.spip.net/ortho_serveur.php');
// Produire du TeX ou du MathML ?
// Masquer les warning
error_reporting(E_ALL ^ E_NOTICE);

// le repértoire des images

/* ATTENTION CETTE VARIABLE NE FONCTIONNE PAS ENCORE */
Fil's avatar
Fil a validé
// Extension du fichier du squelette 
$extension_squelette = 'html';
/* / MERCI DE VOTRE ATTENTION */


Antoine Pitrou's avatar
Antoine Pitrou a validé
//
// *** Fin du parametrage ***
Antoine Pitrou's avatar
Antoine Pitrou a validé
//
Fil's avatar
Fil a validé

Fil's avatar
Fil a validé
$flag_ecrire = !@file_exists('./ecrire/inc_version.php3');
Antoine Pitrou's avatar
Antoine Pitrou a validé
if ($flag_ecrire) {
Fil's avatar
Fil a validé
	if (@file_exists('mes_options.php3')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		include('mes_options.php3');
Fil's avatar
Fil a validé
	if (@file_exists('ecrire/mes_options.php3')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		include('ecrire/mes_options.php3');
// le repertoire des pieces rapportes

define('_DIR_IMG', ($flag_ecrire ? "../" : "")."IMG/");


// Version courante de SPIP
// Stockee sous forme de nombre decimal afin de faciliter les comparaisons
// (utilise pour les modifs de la base de donnees)

// version de la base

// version de spip
$spip_version_affichee = "1.8 beta 2 CVS";
// version de spip / tag cvs
if (ereg('Name: v(.*) ','$Name$', $regs)) $spip_version_affichee = $regs[1];


// ** Securite **
$auteur_session = '';
$connect_statut = '';
$hash_recherche_strict = '';
Antoine Pitrou's avatar
Antoine Pitrou a validé
// (doit etre au moins egale a 3.0.8)
$php_version = phpversion();
$php_version_tab = explode('.', $php_version);
$php_version_maj = intval($php_version_tab[0]);
$php_version_med = intval($php_version_tab[1]);
if (ereg('([0-9]+)', $php_version_tab[2], $match)) $php_version_min = intval($match[1]);

$flag_levenshtein = ($php_version_maj >= 4);
$flag_uniqid2 = ($php_version_maj > 3 OR $php_version_min >= 13);
Antoine Pitrou's avatar
Antoine Pitrou a validé
$flag_get_cfg_var = (@get_cfg_var('error_reporting') != "");
$flag_strtr2 = ($php_version_maj > 3);
Antoine Pitrou's avatar
Antoine Pitrou a validé
$flag_ini_get = (function_exists("ini_get")
	&& (@ini_get('max_execution_time') > 0));	// verifier pas desactivee
$flag_gz = function_exists("gzencode"); #php 4.0.4
Antoine Pitrou's avatar
Antoine Pitrou a validé
$flag_ob = ($flag_ini_get
	&& !ereg("ob_", ini_get('disable_functions'))
	&& function_exists("ob_start"));
$flag_obgz = ($flag_ob && ($php_version<>'4.0.4')
	&& function_exists("ob_gzhandler"));
Antoine Pitrou's avatar
Antoine Pitrou a validé
$flag_pcre = function_exists("preg_replace");
$flag_crypt = function_exists("crypt");
$flag_wordwrap = function_exists("wordwrap");
$flag_apc = function_exists("apc_rm");
$flag_sapi_name = function_exists("php_sapi_name");
$flag_utf8_decode = function_exists("utf8_decode");
$flag_ldap = function_exists("ldap_connect");
$flag_flock = function_exists("flock");
$flag_ImageCreateTrueColor = function_exists("ImageCreateTrueColor");
$flag_ImageCopyResampled = function_exists("ImageCopyResampled");
Antoine Pitrou's avatar
Antoine Pitrou a validé
$flag_ImageGif = function_exists("ImageGif");
$flag_ImageJpeg = function_exists("ImageJpeg");
$flag_ImagePng = function_exists("ImagePng");
Fil's avatar
Fil a validé
$flag_imagick = function_exists("imagick_readimage");	// http://pear.sourceforge.net/en/packages.imagick.php
Antoine Pitrou's avatar
Antoine Pitrou a validé
$flag_multibyte = function_exists("mb_encode_mimeheader");
$flag_iconv = function_exists("iconv");
Fil's avatar
Fil a validé
$flag_strtotime = function_exists("strtotime");
$flag_gd = $flag_ImageGif || $flag_ImageJpeg || $flag_ImagePng;
$flag_revisions = ($flag_pcre AND function_exists("gzcompress"));
Yannick Patois's avatar
Yannick Patois a validé

//
// Appliquer le prefixe cookie
//
function spip_setcookie ($name='', $value='', $expire=0, $path='AUTO', $domain='', $secure='') {
Fil's avatar
Fil a validé
	$name = ereg_replace ('^spip_', $GLOBALS['cookie_prefix'].'_', $name);
	if ($path == 'AUTO') $path=$GLOBALS['cookie_path'];
Antoine Pitrou's avatar
Antoine Pitrou a validé

	if ($secure)
		@setcookie ($name, $value, $expire, $path, $domain, $secure);
	else if ($domain)
		@setcookie ($name, $value, $expire, $path, $domain);
	else if ($path)
		@setcookie ($name, $value, $expire, $path);
	else if ($expire)
		@setcookie ($name, $value, $expire);
	else
		@setcookie ($name, $value);
}
Antoine Pitrou's avatar
Antoine Pitrou a validé
if ($cookie_prefix != 'spip') {
	reset ($HTTP_COOKIE_VARS);
	while (list($name,$value) = each($HTTP_COOKIE_VARS)) {
Fil's avatar
Fil a validé
		if (ereg('^spip_', $name)) {
			unset($HTTP_COOKIE_VARS[$name]);
			unset($$name);
		}
	}
	reset ($HTTP_COOKIE_VARS);
	while (list($name,$value) = each($HTTP_COOKIE_VARS)) {
Fil's avatar
Fil a validé
		if (ereg('^'.$cookie_prefix.'_', $name)) {
			$spipname = ereg_replace ('^'.$cookie_prefix.'_', 'spip_', $name);
			$HTTP_COOKIE_VARS[$spipname] = $INSECURE[$spipname] = $value;
Yannick Patois's avatar
Yannick Patois a validé
//
// Infos sur l'hebergeur
//

$hebergeur = '';
$login_hebergeur = '';
$os_serveur = '';

Antoine Pitrou's avatar
Antoine Pitrou a validé

// Lycos (ex-Multimachin)
if ($HTTP_X_HOST == 'membres.lycos.fr') {
	$hebergeur = 'lycos';
	ereg('^/([^/]*)', $REQUEST_URI, $regs);
	$login_hebergeur = $regs[1];
Yannick Patois's avatar
Yannick Patois a validé
}
// Altern
Antoine Pitrou's avatar
Antoine Pitrou a validé
if (ereg('altern\.com$', $SERVER_NAME)) {
Yannick Patois's avatar
Yannick Patois a validé
	$hebergeur = 'altern';
	ereg('([^.]*\.[^.]*)$', $HTTP_HOST, $regs);
	$login_hebergeur = ereg_replace('[^a-zA-Z0-9]', '_', $regs[1]);
}
// Free
else if (ereg('^/([^/]*)\.free.fr/', $REQUEST_URI, $regs)) {
	$hebergeur = 'free';
	$login_hebergeur = $regs[1];
}
// NexenServices
else if ($SERVER_ADMIN == 'www@nexenservices.com') {
Fil's avatar
Fil a validé
	if (!function_exists('email'))
		include ('mail.inc');
Yannick Patois's avatar
Yannick Patois a validé
	$hebergeur = 'nexenservices';
}
Antoine Pitrou's avatar
Antoine Pitrou a validé
// Online
else if (function_exists('email')) {
	$hebergeur = 'online';
}
Yannick Patois's avatar
Yannick Patois a validé

if (eregi('\(Win', $HTTP_SERVER_VARS['SERVER_SOFTWARE']))
	$os_serveur = 'windows';

// Droits d'acces maximum par defaut
@umask(0);


//
// Infos sur le fichier courant
//

// Compatibilite avec serveurs ne fournissant pas $REQUEST_URI
if (!$REQUEST_URI) {
Yannick Patois's avatar
Yannick Patois a validé
	$REQUEST_URI = $PHP_SELF;
	if (!strpos($REQUEST_URI, '?') && $QUERY_STRING)
		$REQUEST_URI .= '?'.$QUERY_STRING;
}
Fil's avatar
Fil a validé
$dir_ecrire = (ereg("/ecrire/", $GLOBALS['REQUEST_URI'])) ? '' : 'ecrire/';
Yannick Patois's avatar
Yannick Patois a validé

if (!$PATH_TRANSLATED) {
	if ($SCRIPT_FILENAME) $PATH_TRANSLATED = $SCRIPT_FILENAME;
	else if ($DOCUMENT_ROOT && $SCRIPT_URL) $PATH_TRANSLATED = $DOCUMENT_ROOT.$SCRIPT_URL;
}


//
// Gestion des inclusions et infos repertoires
//

$included_files = '';

function include_local($file) {
	if ($GLOBALS['included_files'][$file]) return;
	include($file);
	$GLOBALS['included_files'][$file] = 1;
}

function include_ecrire($file) {
	if (!$GLOBALS['flag_ecrire']) $file = "ecrire/$file";
	if ($GLOBALS['included_files'][$file]) return;
	include($file);
	$GLOBALS['included_files'][$file] = 1;
}

Antoine Pitrou's avatar
Antoine Pitrou a validé

Fil's avatar
Fil a validé
$flag_connect = @file_exists(($flag_ecrire ? "" : "ecrire/")."inc_connect.php3");
Antoine Pitrou's avatar
Antoine Pitrou a validé

function spip_query($query) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if ($GLOBALS['flag_connect']) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		include_ecrire("inc_connect.php3");
		if (!$GLOBALS['db_ok'])
			return;
		if ($GLOBALS['spip_connect_version'] < 0.1) {
			if (!$GLOBALS['flag_ecrire']) {
				$GLOBALS['db_ok'] = false;
				return;
			}
			@Header("Location: upgrade.php3?reinstall=oui");
			exit;
		}
	}
Fil's avatar
Fil a validé
	return spip_query_db($query);
Yannick Patois's avatar
Yannick Patois a validé
//
// Infos de config PHP
//

// cf. liste des sapi_name - http://fr.php.net/php_sapi_name
$php_module = (($flag_sapi_name AND eregi("apache", @php_sapi_name())) OR
	ereg("^Apache.* PHP", $SERVER_SOFTWARE));
$php_cgi = ($flag_sapi_name AND eregi("cgi", @php_sapi_name()));

function http_status($status) {
	global $php_cgi, $REDIRECT_STATUS;

	if ($REDIRECT_STATUS && $REDIRECT_STATUS == $status) return;
	$status_string = array(
		200 => '200 OK',
		304 => '304 Not Modified',
		401 => '401 Unauthorized',
		403 => '403 Forbidden',
		404 => '404 Not Found'
	);
	if ($php_cgi) Header("Status: $status");
	else Header("HTTP/1.0 ".$status_string[$status]);
}
Yannick Patois's avatar
Yannick Patois a validé

function http_gmoddate($lastmodified) {
	return gmdate("D, d M Y H:i:s", $lastmodified);
}
function http_last_modified($lastmodified, $expire = 0) {
	if ($GLOBALS['HTTP_IF_MODIFIED_SINCE']) {
		$if_modified_since = ereg_replace(';.*$', '', $GLOBALS['HTTP_IF_MODIFIED_SINCE']);
		$if_modified_since = trim(str_replace('GMT', '', $if_modified_since));
		if ($if_modified_since == $gmoddate) {
			http_status(304);
			$headers_only = true;
		}
	}
	@Header ("Last-Modified: ".$gmoddate." GMT");
	if ($expire) 
		@Header ("Expires: ".http_gmoddate($expire)." GMT");
	return $headers_only;
}
$flag_upload = (!$flag_get_cfg_var || (get_cfg_var('upload_max_filesize') > 0));
Yannick Patois's avatar
Yannick Patois a validé
function tester_upload() {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	return $GLOBALS['flag_upload'];
Yannick Patois's avatar
Yannick Patois a validé
}


//
// Reglage de l'output buffering : si possible, generer une sortie
// compressee pour economiser de la bande passante
//
Fil's avatar
Fil a validé
function test_obgz () {
	return
	$GLOBALS['auto_compress']
	&& $GLOBALS['flag_ob']
	&& $GLOBALS['flag_obgz']
Yannick Patois's avatar
Yannick Patois a validé
	// special bug de proxy
Fil's avatar
Fil a validé
	&& !eregi("NetCache|Hasd_proxy", $GLOBALS['HTTP_VIA'])
Yannick Patois's avatar
Yannick Patois a validé
	// special bug Netscape Win 4.0x
Fil's avatar
Fil a validé
	&& !eregi("Mozilla/4\.0[^ ].*Win", $GLOBALS['HTTP_USER_AGENT'])
Antoine Pitrou's avatar
Antoine Pitrou a validé
	// special bug Apache2x
Fil's avatar
Fil a validé
	&& !eregi("Apache(-[^ ]+)?/2", $GLOBALS['SERVER_SOFTWARE'])
	&& !($GLOBALS['flag_sapi_name'] AND ereg("^apache2", @php_sapi_name()))
	// si la compression est deja commencee, stop
Fil's avatar
Fil a validé
	&& !@ini_get("zlib.output_compression")
	&& !@ini_get("output_handler");
ARNO*'s avatar
ARNO* a validé
}
Fil's avatar
Fil a validé
// si un buffer est deja ouvert, stop
if ($flag_ob AND !strlen(@ob_get_contents())) {
	@header("Vary: Cookie, Accept-Encoding");
#	if (test_obgz())
#		ob_start('ob_gzhandler');
Yannick Patois's avatar
Yannick Patois a validé
class Link {
	var $file;
	var $vars;
	var $arrays;

	//
	// Contructeur : a appeler soit avec l'URL du lien a creer,
	// soit sans parametres, auquel cas l'URL est l'URL courante
	//
	function Link($url = '', $reentrant = false) {
		static $link = '';

/*		// If root link not defined, create it
Yannick Patois's avatar
Yannick Patois a validé
		if (!$link && !$reentrant) {
			$link = new Link('', true);
		}
Yannick Patois's avatar
Yannick Patois a validé

		$this->vars = array();
Yannick Patois's avatar
Yannick Patois a validé

		// Normal case
		if ($link) {
			if ($url) {
				$v = split('[\?\&]', $url);
				list(, $this->file) = each($v);
				while (list(, $var) = each($v)) {
					list($name, $value) = split('=', $var, 2);
					$name = urldecode($name);
					$value = urldecode($value);
					if (ereg('^(.*)\[\]$', $name, $regs)) {
						$this->arrays[$regs[1]][] = $value;
					}
					else {
						$this->vars[$name] = $value;
					}
				}
			}
			else {
				$this->file = $link->file;
				$this->vars = $link->vars;
				$this->arrays = $link->arrays;
			}
			return;
		}

		// Si aucun URL n'est specifie, creer le lien "propre"
		// ou l'on supprime de l'URL courant les bidules inutiles
Yannick Patois's avatar
Yannick Patois a validé
		if (!$url) {
			// GET variables are read from the original URL
			// (HTTP_GET_VARS may contain additional variables
			// introduced by rewrite-rules)
Yannick Patois's avatar
Yannick Patois a validé
			$url = $GLOBALS['REQUEST_URI'];
			$url = substr($url, strrpos($url, '/') + 1);
Antoine Pitrou's avatar
Antoine Pitrou a validé
			if (!$url) $url = "./";
			if (count($GLOBALS['HTTP_POST_VARS']))
				$vars = $GLOBALS['HTTP_POST_VARS'];
Yannick Patois's avatar
Yannick Patois a validé
		}
		$v = split('[\?\&]', $url);
		list(, $this->file) = each($v);

		if (!$vars) {
Yannick Patois's avatar
Yannick Patois a validé
				list($name, $value) = split('=', $var, 2);
				$name = urldecode($name);
				$value = urldecode($value);
				if (ereg('^(.*)\[\]$', $name, $regs))
Yannick Patois's avatar
Yannick Patois a validé
					$vars[$regs[1]][] = $value;
Yannick Patois's avatar
Yannick Patois a validé
					$vars[$name] = $value;
			}
		}

		if (is_array($vars)) {
			foreach ($vars as $name => $value) {
				// items supprimes
				if (!preg_match('/^('.
				($GLOBALS['flag_ecrire'] ?
					'|lang|set_options|set_couleur|set_disp|set_ecran':
					'|submit|recalcul')
Yannick Patois's avatar
Yannick Patois a validé
					if (is_array($value))
						$this->arrays[$name] = $value;
					else
						$this->vars[$name] = $value;
				}
			}
		}
	}

	//
	// Effacer une variable
	//
	function delVar($name) {
ARNO*'s avatar
ARNO* a validé
		if($this->vars[$name]) unset($this->vars[$name]);
		if($this->arrays[$name]) unset($this->arrays[$name]);
Yannick Patois's avatar
Yannick Patois a validé
	}

	//
	// Ajouter une variable
	// (si aucune valeur n'est specifiee, prend la valeur globale actuelle)
	//
	function addVar($name, $value = '__global__') {
		if ($value == '__global__') $value = $GLOBALS[$name];
		if (is_array($value))
			$this->arrays[$name] = $value;
		else
			$this->vars[$name] = $value;
	}

	//
	// Recuperer l'URL correspondant au lien
	//
	function getUrl($anchor = '') {
		$url = $this->file;
Yannick Patois's avatar
Yannick Patois a validé
		$query = '';
		foreach($this->vars as $name => $value)
			$query .= '&'.$name.'='.urlencode($value);

		foreach ($this->arrays as $name => $table)
		foreach ($table as $value)
			$query .= '&'.$name.'[]='.urlencode($value);

Yannick Patois's avatar
Yannick Patois a validé
		if ($anchor) $anchor = '#'.$anchor;
		return $url.'?'.substr($query, 1).$anchor;
Yannick Patois's avatar
Yannick Patois a validé
	}

	//
	// Recuperer le debut de formulaire correspondant au lien
	// (tag ouvrant + entrees cachees representant les variables)
	//

	function getForm($method = 'get', $anchor = '', $enctype = '') {
Yannick Patois's avatar
Yannick Patois a validé
		if ($anchor) $anchor = '#'.$anchor;
		$form = "<form method='$method' action='".$this->file.$anchor."'";
		if ($enctype) $form .= " enctype='$enctype'";
		$form .= " style='border: 0px; margin: 0px;'>\n";
		foreach ($this->vars as $name => $value) {
			$value = ereg_replace('&amp;(#[0-9]+;)', '&\1', htmlspecialchars($value));
			$form .= "<input type=\"hidden\" name=\"$name\" value=\"$value\" />\n";
Yannick Patois's avatar
Yannick Patois a validé
		}
		foreach ($this->arrays as $name => $table)
		foreach ($table as $value) {
			$value = ereg_replace('&amp;(#[0-9]+;)', '&\1', htmlspecialchars($value));
			$form .= "<input type=\"hidden\" name=\"".$name."[]\" value=\"".$value."\" />\n";
Yannick Patois's avatar
Yannick Patois a validé
		}

// Lien vers la page demandee et lien nettoye ne contenant que des id_objet
Yannick Patois's avatar
Yannick Patois a validé

// URLs avec passage & -> &amp;
function quote_amp ($url) {
	$url = str_replace("&amp;", "&", $url);
	$url = str_replace("&", "&amp;", $url);
// Module de lecture/ecriture/suppression de fichiers utilisant flock()
include_ecrire('inc_flock.php3');
Fil's avatar
Fil a validé
// Gerer les valeurs meta
function lire_meta($nom) {
	global $meta;
	return $meta[$nom];
}
function lire_meta_maj($nom) {
	global $meta_maj;
	return $meta_maj[$nom];
}

Fil's avatar
Fil a validé
// Lire les meta cachees
if (!defined('_DATA_META_CACHE') AND !defined('_ECRIRE_INC_META')) {
	unset($meta); # parano

	if (lire_fichier ($dir_ecrire.'data/meta_cache.php3', $contenu,
	array('phpcheck' => 'oui')))
		eval('?'.'>'.$contenu);

	// en cas d'echec refaire le fichier
	if (!is_array($meta) AND @file_exists($dir_ecrire.'inc_connect.php3')) {
Fil's avatar
Fil a validé
		include_ecrire('inc_meta.php3');
		lire_metas();
		ecrire_metas();
	}
}

// Verifier la conformite d'une ou plusieurs adresses email
function email_valide($adresse) {
	$adresses = explode(',', $adresse);
	if (is_array($adresses)) {
		while (list(, $adresse) = each($adresses)) {
Fil's avatar
Fil a validé
			// nettoyer certains formats
			// "Marie Toto <Marie@toto.com>"
			$adresse = eregi_replace("^[^<>\"]*<([^<>\"]+)>$", "\\1", $adresse);
Antoine Pitrou's avatar
Antoine Pitrou a validé
			// RFC 822
			if (!eregi('^[^()<>@,;:\\"/[:space:]]+(@([-_0-9a-z]+\.)*[-_0-9a-z]+)?$', trim($adresse)))
				return false;
		}
		return true;
	return false;
Antoine Pitrou's avatar
Antoine Pitrou a validé
}
Yannick Patois's avatar
Yannick Patois a validé

Fil's avatar
 
Fil a validé
//
// Traduction des textes de SPIP
Fil's avatar
 
Fil a validé
//
function _T($text, $args = '') {
	include_ecrire('inc_lang.php3');
	$text = traduire_chaine($text, $args);

	if ($GLOBALS['xhtml']) {
		include_ecrire("inc_charsets.php3");
		$text = html2unicode($text);
	}
// chaines en cours de traduction
function _L($text) {
	if ($GLOBALS['test_i18n'])
		return "<span style='color:red;'>$text</span>";
	else
		return $text;
$langue_site = lire_meta('langue_site');
if (!$langue_site) include_ecrire('inc_lang.php3');
Fil's avatar
 
Fil a validé

Fil's avatar
Fil a validé

// Nommage bizarre des tables d'objets
function table_objet($type) {
	if ($type == 'syndic' OR $type == 'forum')
		return $type;
	else
		return $type.'s';
}


//
// Enregistrement des evenements
//
function spip_log($message, $logname='spip') {
Fil's avatar
 
Fil a validé
	global $flag_ecrire;

Antoine Pitrou's avatar
Antoine Pitrou a validé
	$pid = '(pid '.@getmypid().')';
	if (!$ip = $GLOBALS['REMOTE_ADDR']) $ip = '-';
Fil's avatar
Fil a validé

Antoine Pitrou's avatar
Antoine Pitrou a validé
	$message = date("M d H:i:s")." $ip $pid "
		.ereg_replace("\n*$", "\n", $message);
Fil's avatar
 
Fil a validé

	$logfile = ($flag_ecrire ? "" : "ecrire/") . "data/$logname.log";
	if (@filesize($logfile) > 10*1024) {
		$rotate = true;
		$message .= "[-- rotate --]\n";
	}
Fil's avatar
 
Fil a validé
	$f = @fopen($logfile, "ab");
	if ($f) {
		fputs($f, $message);
		fclose($f);
	}
	if ($rotate) {
		@unlink($logfile.'.3');
		@rename($logfile.'.2',$logfile.'.3');
		@rename($logfile.'.1',$logfile.'.2');
		@rename($logfile,$logfile.'.1');
Fil's avatar
Fil a validé
		#if (function_exists('logrotate'))
		#	logrotate($logfile);
Fil's avatar
Fil a validé

	// recopier les spip_log mysql (ce sont uniquement des erreurs)
	// dans le spip_log general
	if ($logname == 'mysql')
		spip_log($message);
// Savoir si on peut lancer de gros calculs, et eventuellement poser un lock SQL
// Resultat : true=vas-y ; false=stop
//
Antoine Pitrou's avatar
Antoine Pitrou a validé
function timeout($lock=false, $action=true, $connect_mysql=true) {
	static $ok = true;
	global $db_ok, $dir_ecrire;

	// Fichier lock hebergeur ?  (age maxi, 10 minutes)
	$timeoutfile = $dir_ecrire.'data/lock';
	if (@file_exists($timeoutfile)
	AND ((time() - @filemtime($timeoutfile)) < 600))
		return $ok = false;

	// Ne rien faire ?
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (!$action || !$ok)
Antoine Pitrou's avatar
Antoine Pitrou a validé
	$ok = false;

	// Base connectee ?
	if ($connect_mysql) {
		include_ecrire('inc_connect.php3');
		if (!$db_ok)
Antoine Pitrou's avatar
Antoine Pitrou a validé
			return false;
Antoine Pitrou's avatar
Antoine Pitrou a validé
		// Verrou demande ?
		if ($lock AND !spip_get_lock($lock))
			return false;
//
// Tests sur le nom du butineur
//
function verif_butineur() {
	global $HTTP_USER_AGENT, $browser_name, $browser_version, $browser_description, $browser_rev;
	ereg("^([A-Za-z]+)/([0-9]+\.[0-9]+) (.*)$", $HTTP_USER_AGENT, $match);
	$browser_name = $match[1];
	$browser_version = $match[2];
	$browser_description = $match[3];
Antoine Pitrou's avatar
Antoine Pitrou a validé

	if (eregi("opera", $browser_description)) {
		eregi("Opera ([^\ ]*)", $browser_description, $match);
		$browser_name = "Opera";
		$browser_version = $match[1];
	}
	else if (eregi("msie", $browser_description)) {
		eregi("MSIE ([^;]*)", $browser_description, $match);
		$browser_name = "MSIE";
		$browser_version = $match[1];
	}
	else if (eregi("KHTML", $browser_description) &&
		eregi("Safari/([^;]*)", $browser_description, $match)) {
		$browser_name = "Safari";
		$browser_version = $match[1];
	}
	else if (eregi("mozilla", $browser_name) AND $browser_version >= 5) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		// Numero de version pour Mozilla "authentique"
		if (ereg("rv:([0-9]+\.[0-9]+)", $browser_description, $match))
			$browser_rev = doubleval($match[1]);
		// Autres Gecko => equivalents 1.4 par defaut (Galeon, etc.)
Antoine Pitrou's avatar
Antoine Pitrou a validé
		else if (strpos($browser_description, "Gecko") and !strpos($browser_description, "KHTML"))
Antoine Pitrou's avatar
Antoine Pitrou a validé
			$browser_rev = 1.4;
		// Machins quelconques => equivalents 1.0 par defaut (Konqueror, etc.)
		else $browser_rev = 1.0;
Antoine Pitrou's avatar
Antoine Pitrou a validé

	if (!$browser_name) $browser_name = "Mozilla";
Fil's avatar
Fil a validé
//
// spip_timer : on l'appelle deux fois et on a la difference, affichable
//
function spip_timer($t='rien') {
	static $time;
	$a=time(); $b=microtime();

	if (isset($time[$t])) {
		$p = $a + $b - $time[$t];
		unset($time[$t]);
		return sprintf("%.2fs", $p);
	} else
		$time[$t] = $a + $b;
}

// qq  fonctions service pour les 2 niveaux
//
function calculer_hierarchie($id_rubrique, $exclure_feuille = false) {
	if (!$id_rubrique)
		return '0';
	if (!$exclure_feuille)
		$hierarchie = ",$id_rubrique";

	do {
		$q = spip_query("SELECT id_parent FROM spip_rubriques WHERE id_rubrique=$id_rubrique");
		list($id_rubrique) = spip_fetch_array($q);
		$hierarchie = ",$id_rubrique".$hierarchie;
	} while ($id_rubrique);

	return substr($hierarchie, 1); // Attention ca demarre toujours par '0'
}


//
// Verifier la presence des .htaccess
//
function verifier_htaccess($rep) {
	if (!@file_exists("$rep/.htaccess")) {
		spip_log("creation $rep/.htaccess");
		if ($GLOBALS['hebergeur'] != 'nexenservices'){
			$f = fopen("$rep/.htaccess", "w");
			fputs($f, "deny from all\n");
			fclose($f);
		} else {
			echo "<font color=\"#FF0000\">IMPORTANT : </font>";
			echo "Votre h&eacute;bergeur est Nexen Services.<br />";
			echo "La protection du r&eacute;pertoire <i>$rep/</i> doit se faire
			par l'interm&eacute;diaire de ";
			echo "<a href=\"http://www.nexenservices.com/webmestres/htlocal.php\"
			target=\"_blank\">l'espace webmestres</a>.";
			echo "Veuillez cr&eacute;er manuellement la protection pour
			ce r&eacute;pertoire (un couple login/mot de passe est
			n&eacute;cessaire).<br />";
		}
	}
}

//
// Retourne $subdir/ si le sous-repertoire peut etre cree, '' sinon
//

function creer_repertoire($base, $subdir) {
	if (@file_exists("$base/.plat")) return '';
	$path = $base.'/'.$subdir;
	if (@file_exists($path)) return "$subdir/";

	@mkdir($path, 0777);
	@chmod($path, 0777);
	$ok = false;
	if ($f = @fopen("$path/.test", "w")) {
		@fputs($f, '<'.'?php $ok = true; ?'.'>');
		@fclose($f);
		include("$path/.test");
	}
	if (!$ok) {
		$f = @fopen("$base/.plat", "w");
		if ($f)
			fclose($f);
		else {
			@header("Location: spip_test_dirs.php3");
			exit;
		}
	}
	return ($ok? "$subdir/" : '');
}

function creer_repertoire_documents($ext) {
# est-il bien raisonnable d'accepter de creer si creer_rep retourne '' ?
	return  _DIR_IMG . creer_repertoire(_DIR_IMG, $ext);
}

// Pour les documents comme pour les logos, le filtre |fichier donne
// le chemin du fichier apres 'IMG/' ;  peut-etre pas d'une purete
// remarquable, mais a conserver pour compatibilite ascendante.
// -> http://www.spip.net/fr_article901.html

function calcule_fichier_logo($on) {
  $r= ereg_replace("^" . _DIR_IMG, "", $on);
#  spip_log("calculer_fihchier_logo $on $r");
  return $r;
}

function cherche_image_nommee($nom, $formats = array ('gif', 'jpg', 'png')) {
	if (ereg("^../",$nom))	$nom = substr($nom,3);
	if (ereg("^" . _DIR_IMG, $nom)) $nom = substr($nom,strlen(_DIR_IMG));
ARNO*'s avatar
ARNO* a validé
	
	reset($formats);
	
	while (list(, $format) = each($formats)) {
		$d = _DIR_IMG . "$nom.$format";
		if (@file_exists($d)) return array(_DIR_IMG, $nom, $format);
	}
}