Пример #1
0
function message_oubli($email, $param)
{
	$r = formulaires_oubli_mail($email);
	if (is_array($r) AND $r[1]) {
		include_spip('inc/acces'); # pour creer_uniqid
		include_spip('inc/texte'); # pour corriger_typo
		$cookie = creer_uniqid();
		sql_updateq("spip_auteurs", array("cookie_oubli" => $cookie), "id_auteur=" . $r[1]['id_auteur']);

		$nom = textebrut(corriger_typo($GLOBALS['meta']["nom_site"]));
		$envoyer_mail = charger_fonction('envoyer_mail','inc');

		if ($envoyer_mail($email,
				  ("[$nom] " .  _T('pass_oubli_mot')),
				  _T('pass_mail_passcookie',
				     array('nom_site_spip' => $nom,
					   'adresse_site' => url_de_base(),
					   'sendcookie' => generer_url_public('spip_pass',
					   "$param=$cookie", true)))) )
		  return _T('pass_recevoir_mail');
		else
		  return  _T('pass_erreur_probleme_technique');
	}
	return  _T('pass_erreur_probleme_technique');
}
Пример #2
0
function url_absolue($url, $base='') {
	if (strlen($url = trim($url)) == 0)
		return '';
	if (!$base)
		$base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : '');
	return suivre_lien($base, $url);
}
Пример #3
0
/**
 * Se deloger
 * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton,
 * avec un autosubmit js pour ne pas compliquer l'experience utilisateur
 *
 * http://doc.spip.org/@action_logout_dist
 *
 */
function action_logout_dist()
{
	$logout =_request('logout');
	$url = _request('url');
	// seul le loge peut se deloger
	// (mais id_auteur peut valoir 0 apres une restauration avortee)
	if (isset($GLOBALS['visiteur_session']['id_auteur']) 
	AND is_numeric($GLOBALS['visiteur_session']['id_auteur'])
	// des sessions anonymes avec id_auteur=0 existent,
	// mais elles n'ont pas de statut : verifier ca aussi
	AND isset($GLOBALS['visiteur_session']['statut'])) {
		// relancer si pas de jeton
		if (!action_logout_secu($logout, $url, _request('jeton'))) {
			return; // page submit retournee
		} elseif (isset($_COOKIE['spip_session'])) {
		// le logout explicite vaut destruction de toutes les sessions
			
			$session = charger_fonction('session', 'inc');
			$session($GLOBALS['visiteur_session']['id_auteur']);
			spip_setcookie('spip_session', $_COOKIE['spip_session'], time()-3600);
		}
		include_spip('inc/auth');
		auth_trace($GLOBALS['visiteur_session'],'0000-00-00 00:00:00');
	}
	// Action terminee (ou non faite si pas les droits) on redirige.
	// Cas particulier, logout dans l'espace public
	$url = securiser_redirect_action($url);
	if ($logout == 'public' AND !$url)
		$url = url_de_base();
	include_spip('inc/headers');
	redirige_par_entete($url
		// contrer le cache navigateur (Safari3)
		? parametre_url($url, 'var_hasard', uniqid(rand()), '&')
		: generer_url_public('login'));
}
Пример #4
0
function redirige_formulaire($url, $equiv = '', $format = 'message')
{
    if (!_AJAX and !headers_sent() and !_request('var_ajax')) {
        redirige_par_entete(str_replace('&', '&', $url), $equiv);
    } elseif ($format == 'ajaxform' and preg_match(',^#[0-9a-z\\-_]+$,i', $url)) {
        return array("<a href='{$url}' name='ajax_ancre' style='display:none;'>anchor</a>", '');
    } else {
        // ne pas laisser passer n'importe quoi dans l'url
        $url = str_replace(array('<', '"'), array('&lt;', '&quot;'), $url);
        $url = strtr($url, "\n\r", "  ");
        # en theorie on devrait faire ca tout le temps, mais quand la chaine
        # commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
        if ($url[0] == '?') {
            $url = url_de_base() . $url;
        }
        $url = str_replace('&amp;', '&', $url);
        spip_log("redirige formulaire ajax: {$url}");
        include_spip('inc/filtres');
        if ($format == 'ajaxform') {
            return array('<a href="' . quote_amp($url) . '" name="ajax_redirect"  style="display:none;">' . _T('navigateur_pas_redirige') . '</a>', '<br /><a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>');
        } else {
            // format message texte, tout en js inline
            return "<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"{$url}\");} else {document.location.replace(\"{$url}\");}</script>" . http_img_pack('searching.gif', '') . '<br />' . '<a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>';
        }
    }
}
Пример #5
0
function action_logout_dist()
{
    global $visiteur_session, $ignore_auth_http;
    $logout = _request('logout');
    $url = securiser_redirect_action(_request('url'));
    // cas particulier, logout dans l'espace public
    if ($logout == 'public' and !$url) {
        $url = url_de_base();
    }
    // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
    if (is_numeric($visiteur_session['id_auteur'])) {
        include_spip('inc/auth');
        auth_trace($visiteur_session, '0000-00-00 00:00:00');
        // le logout explicite vaut destruction de toutes les sessions
        if (isset($_COOKIE['spip_session'])) {
            $session = charger_fonction('session', 'inc');
            $session($visiteur_session['id_auteur']);
            spip_setcookie('spip_session', $_COOKIE['spip_session'], time() - 3600);
        }
        // si authentification http, et que la personne est loge,
        // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
        if (isset($_SERVER['PHP_AUTH_USER']) and !$ignore_auth_http and $GLOBALS['auth_can_disconnect']) {
            ask_php_auth(_T('login_deconnexion_ok'), _T('login_verifiez_navigateur'), _T('login_retour_public'), "redirect=" . _DIR_RESTREINT_ABS, _T('login_test_navigateur'), true);
        }
    }
    // Rediriger en contrant le cache navigateur (Safari3)
    include_spip('inc/headers');
    redirige_par_entete($url ? parametre_url($url, 'var_hasard', uniqid(rand()), '&') : generer_url_public('login'));
}
Пример #6
0
function skeleditor_extraire_css($texte){
	$url_base = url_de_base();
	$url_page = substr(generer_url_public('A'), 0, -1);
	$dir = preg_quote($url_page,',').'|'.preg_quote(preg_replace(",^$url_base,",_DIR_RACINE,$url_page),',');

	$css = array();
	// trouver toutes les css pour les afficher dans le bouton
	// repris du compresseur
	foreach (extraire_balises($texte, 'link') as $s) {
		if (extraire_attribut($s, 'rel') === 'stylesheet'
		AND (!($type = extraire_attribut($s, 'type'))
			OR $type == 'text/css')
		AND !strlen(strip_tags($s))
		AND $src = preg_replace(",^$url_base,",_DIR_RACINE,extraire_attribut($s, 'href'))
		AND (
			// regarder si c'est du format spip.php?page=xxx
			preg_match(',^('.$dir.')(.*)$,', $src, $r)
			OR (
				// ou si c'est un fichier
				// enlever un timestamp eventuel derriere un nom de fichier statique
				$src2 = preg_replace(",[.]css[?].+$,",'.css',$src)
				// verifier qu'il n'y a pas de ../ ni / au debut (securite)
				AND !preg_match(',(^/|\.\.),', substr($src2,strlen(_DIR_RACINE)))
				// et si il est lisible
				AND @is_readable($src2)
			)
		)) {
			if ($r)
				$css[$s] = explode('&',
					str_replace('&amp;', '&', $r[2]), 2);
			else{
				$file = preg_replace(",[?]\d+$,","",$src);
				if (strncmp($file,_DIR_VAR,strlen(_DIR_VAR))==0){
					lire_fichier($file,$c);
					if (preg_match(",^\/\*\s*(#@.*)\s*\*\/,Uims",$c,$m)){
						$inc = explode("#@",$m[1]);
						$inc = array_map('trim',$inc);
						$inc = array_filter($inc);
						foreach($inc as $i){
							if (!in_array($i,$css))
								$css["$s:$i"] = $i;
						}
					}
				}
				else
					$css[$s] = $file;
			}
		}
	}
	return $css;
}
Пример #7
0
function spip_setcookie($name = '', $value = '', $expire = 0, $path = 'AUTO', $domain = '', $secure = '')
{
    $name = preg_replace('/^spip_/', $GLOBALS['cookie_prefix'] . '_', $name);
    if ($path == 'AUTO') {
        $path = defined('_COOKIE_PATH') ? _COOKIE_PATH : preg_replace(',^\\w+://[^/]*,', '', url_de_base());
    }
    if (!$domain and defined('_COOKIE_DOMAIN')) {
        $domain = _COOKIE_DOMAIN;
    }
    #spip_log("cookie('$name', '$value', '$expire', '$path', '$domain', '$secure', '$httponly'");
    // liste des cookies en httponly (a passer en define si besoin)
    $httponly = in_array($name, explode(' ', 'spip_session'));
    $a = ($httponly and strnatcmp(phpversion(), '5.2.0') >= 0) ? @setcookie($name, $value, $expire, $path, $domain, $secure, $httponly) : ($secure ? @setcookie($name, $value, $expire, $path, $domain, $secure) : ($domain ? @setcookie($name, $value, $expire, $path, $domain) : ($path ? @setcookie($name, $value, $expire, $path) : ($expire ? @setcookie($name, $value, $expire) : @setcookie($name, $value)))));
    spip_cookie_envoye(true);
    return $a;
}
Пример #8
0
function securiser_redirect_action($redirect)
{
    if ((tester_url_absolue($redirect) or preg_match(',^\\w+:,', trim($redirect))) and !defined('_AUTORISER_ACTION_ABS_REDIRECT')) {
        // si l'url est une url du site, on la laisse passer sans rien faire
        // c'est encore le plus simple
        $base = $GLOBALS['meta']['adresse_site'] . "/";
        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
            return $redirect;
        }
        $base = url_de_base();
        if (strlen($base) and strncmp($redirect, $base, strlen($base)) == 0) {
            return $redirect;
        }
        return "";
    }
    return $redirect;
}
Пример #9
0
/**
 * Se deloger
 * Pour eviter les CSRF on passe par une etape de confirmation si pas de jeton fourni
 * avec un autosubmit js pour ne pas compliquer l'experience utilisateur
 *
 * Déconnecte l'utilisateur en cours et le redirige sur l'URL indiquée par
 * l'argument de l'action sécurisée, et sinon sur la page d'accueil
 * de l'espace public.
 *
 */
function action_logout_dist()
{
    $logout = _request('logout');
    $url = securiser_redirect_action(_request('url'));
    // cas particulier, logout dans l'espace public
    if ($logout == 'public' and !$url) {
        $url = url_de_base();
    }
    // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee)
    if (isset($GLOBALS['visiteur_session']['id_auteur']) and is_numeric($GLOBALS['visiteur_session']['id_auteur']) and isset($GLOBALS['visiteur_session']['statut'])) {
        // il faut un jeton pour fermer la session (eviter les CSRF)
        if (!($jeton = _request('jeton')) or !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session'])) {
            $jeton = generer_jeton_logout($GLOBALS['visiteur_session']);
            $action = generer_url_action("logout", "jeton={$jeton}");
            $action = parametre_url($action, 'logout', _request('logout'));
            $action = parametre_url($action, 'url', _request('url'));
            include_spip("inc/minipres");
            include_spip("inc/filtres");
            $texte = bouton_action(_T('spip:icone_deconnecter'), $action);
            $texte = "<div class='boutons'>{$texte}</div>";
            $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>';
            $res = minipres(_T('spip:icone_deconnecter'), $texte, '', true);
            echo $res;
            return;
        }
        include_spip('inc/auth');
        auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00');
        // le logout explicite vaut destruction de toutes les sessions
        if (isset($_COOKIE['spip_session'])) {
            $session = charger_fonction('session', 'inc');
            $session($GLOBALS['visiteur_session']['id_auteur']);
            spip_setcookie('spip_session', $_COOKIE['spip_session'], time() - 3600);
        }
        // si authentification http, et que la personne est loge,
        // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http
        if (isset($_SERVER['PHP_AUTH_USER']) and !$GLOBALS['ignore_auth_http'] and $GLOBALS['auth_can_disconnect']) {
            ask_php_auth(_T('login_deconnexion_ok'), _T('login_verifiez_navigateur'), _T('login_retour_public'), "redirect=" . _DIR_RESTREINT_ABS, _T('login_test_navigateur'), true);
        }
    }
    // Rediriger en contrant le cache navigateur (Safari3)
    include_spip('inc/headers');
    redirige_par_entete($url ? parametre_url($url, 'var_hasard', uniqid(rand()), '&') : generer_url_public('login'));
}
Пример #10
0
function spip_setcookie ($name='', $value='', $expire=0, $path='AUTO', $domain='', $secure='') {
	$name = preg_replace ('/^spip_/', $GLOBALS['cookie_prefix'].'_', $name);
	if ($path == 'AUTO')
		$path = defined('_COOKIE_PATH')?_COOKIE_PATH:preg_replace(',^\w+://[^/]*,', '', url_de_base());
	if (!$domain AND defined('_COOKIE_DOMAIN'))
		$domain = _COOKIE_DOMAIN;

	#spip_log("cookie('$name', '$value', '$expire', '$path', '$domain', '$secure'");

	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);
}
Пример #11
0
function inc_lien($lien, $texte = '', $class = '', $title = '', $hlang = '', $rel = '', $connect = '')
{
    # Tests TW
    if (!$GLOBALS['tw']) {
        return inc_lien_dist($lien, $texte, $class, $title, $hlang, $rel, $connect);
    }
    static $u = null;
    if (!$u) {
        $u = url_de_base();
    }
    $typo = false;
    // Si une langue est demandee sur un raccourci d'article, chercher
    // la traduction ;
    // - [{en}->art2] => traduction anglaise de l'article 2, sinon art 2
    // - [{}->art2] => traduction en langue courante de l'art 2, sinon art 2
    if ($hlang and $match = typer_raccourci($lien)) {
        @(list($type, , $id, , $args, , $ancre) = $match);
        if ($id_trad = sql_getfetsel('id_trad', 'spip_articles', "id_article={$id}") and $id_dest = sql_getfetsel('id_article', 'spip_articles', "id_trad={$id_trad} AND lang=" . sql_quote($hlang))) {
            $lien = "{$type}{$id_dest}";
        } else {
            $hlang = '';
        }
    }
    $mode = ($texte and $class) ? 'url' : 'tout';
    $lien = calculer_url($lien, $texte, $mode, $connect);
    if ($mode === 'tout') {
        $texte = $lien['titre'];
        if (!$class and isset($lien['class'])) {
            $class = $lien['class'];
        }
        $lang = isset($lien['lang']) ? $lien['lang'] : '';
        $mime = isset($lien['mime']) ? " type='" . $lien['mime'] . "'" : "";
        $lien = $lien['url'];
    }
    $lien = trim($lien);
    if (strncmp($lien, "#", 1) == 0) {
        # ancres pures (internes a la page)
        $class = 'spip_ancre';
    } elseif (strncasecmp($lien, 'mailto:', 7) == 0) {
        # pseudo URL de mail
        $class = "spip_mail";
    } elseif (strncmp($texte, '<html>', 6) == 0) {
        # cf traiter_lien_explicite
        $class = "spip_url spip_out";
    } elseif (!$class) {
        $class = "spip_out";
    }
    # si pas spip_in|spip_glossaire
    // Si l'objet n'est pas de la langue courante, on ajoute hreflang
    if (!$hlang and $lang !== $GLOBALS['spip_lang']) {
        $hlang = $lang;
    }
    $lang = $hlang ? " hreflang='{$hlang}'" : '';
    if ($title) {
        $title = ' title="' . attribut_html($title) . '"';
    }
    // rel=external pour les liens externes
    if ((strncmp($lien, 'http://', 7) == 0 or strncmp($lien, 'https://', 8) == 0) and strncmp("{$lien}/", $u, strlen($u)) != 0) {
        $rel = trim("{$rel} external");
    }
    if ($rel) {
        $rel = " rel='{$rel}'";
    }
    if (traiter_modeles($texte, false, $echapper ? 'TYPO' : '', $connect) == $texte) {
        $texte = typo($texte, true, $connect);
        $lien = "<a href=\"" . str_replace('"', '&quot;', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}{$mime}>{$texte}</a>";
        return $lien;
    }
    # ceci s'execute heureusement avant les tableaux et leur "|".
    # Attention, le texte initial est deja echappe mais pas forcement
    # celui retourne par calculer_url.
    # Penser au cas [<imgXX|right>->URL], qui exige typo('<a>...</a>')
    $lien = "<a href=\"" . str_replace('"', '&quot;', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}{$mime}>{$texte}</a>";
    return typo($lien, true, $connect);
}
Пример #12
0
function inc_lien_dist($lien, $texte='', $class='', $title='', $hlang='', $rel='', $connect='')
{
	// Si une langue est demandee sur un raccourci d'article, chercher
	// la traduction ;
	// - [{en}->art2] => traduction anglaise de l'article 2, sinon art 2
	// - [{}->art2] => traduction en langue courante de l'art 2, sinon art 2
	if ($hlang
	AND $match = typer_raccourci($lien)) { 
		@list($type,,$id,,$args,,$ancre) = $match; 
		if ($id_trad = sql_getfetsel('id_trad', 'spip_articles', "id_article=$id")
		AND $id_dest = sql_getfetsel('id_article', 'spip_articles',
			"id_trad=$id_trad  AND statut<>'refuse' AND lang=" . sql_quote($hlang))
		)
			$lien = "$type$id_dest";
		else
			$hlang = '';
	}

	$mode = ($texte AND $class) ? 'url' : 'tout';
	$lien = calculer_url($lien, $texte, $mode, $connect);
	if ($mode === 'tout') {
		$texte = $lien['titre'];
		if (!$class AND isset($lien['class'])) $class = $lien['class'];
		$lang = isset($lien['lang']) ?$lien['lang'] : '';
		$mime = isset($lien['mime']) ? " type='".$lien['mime']."'" : "";
		$lien = $lien['url'];
	}
	if (substr($lien,0,1) == '#')  # ancres pures (internes a la page)
		$class = 'spip_ancre';
	elseif (preg_match('/^\s*mailto:/',$lien)) # pseudo URL de mail
		$class = "spip_mail";
	elseif (preg_match('/^<html>/',$texte)) # cf traiter_lien_explicite
		$class = "spip_url spip_out";
	elseif (!$class) {
	        # spip_out sur les URLs externes
	        if (preg_match(',^\w+://,iS', $lien)
	        AND strncasecmp($lien, url_de_base(), strlen(url_de_base()))
	        )
                $class = "spip_out"; # si pas spip_in|spip_glossaire
        }

	// Si l'objet n'est pas de la langue courante, on ajoute hreflang
	if (!$hlang AND $lang!==$GLOBALS['spip_lang'])
		$hlang = $lang;

	$lang = ($hlang ? " hreflang='$hlang'" : '');

	if ($title)
		$title = ' title="'.texte_backend($title).'"';
	else
		$title = ''; // $title peut etre 'false'

	// rel=external pour les liens externes
	if (preg_match(',^https?://,S', $lien)
	AND false === strpos("$lien/", url_de_base()))
		$rel = trim("$rel external");
	if ($rel) $rel = " rel='$rel'";

	$lien = "<a href=\"".str_replace('"', '&quot;', $lien)."\" class='$class'$lang$title$rel$mime>$texte</a>";

	# ceci s'execute heureusement avant les tableaux et leur "|".
	# Attention, le texte initial est deja echappe mais pas forcement
	# celui retourne par calculer_url.
	# Penser au cas [<imgXX|right>->URL], qui exige typo('<a>...</a>')
	return typo($lien, true, $connect);
}
Пример #13
0
/**
 * Installe ou vérifie un fichier .htaccess, y compris sa prise en compte par Apache
 *
 * @uses recuperer_lapage()
 * @param string $rep
 *     Nom du répertoire où SPIP doit vérifier l'existence d'un fichier .htaccess
 * @param bool $force
 * @return boolean
 */
function verifier_htaccess($rep, $force = false)
{
    $htaccess = rtrim($rep, "/") . "/" . _ACCESS_FILE_NAME;
    if ((@file_exists($htaccess) or defined('_TEST_DIRS')) and !$force) {
        return true;
    }
    // directive deny compatible Apache 2.0+
    $deny = "# Deny all requests from Apache 2.4+.\n<IfModule mod_authz_core.c>\n  Require all denied\n</IfModule>\n# Deny all requests from Apache 2.0-2.2.\n<IfModule !mod_authz_core.c>\n  Deny from all\n</IfModule>\n";
    // support des vieilles versions Apache 1.x mais uniquement si elles l'annoncent (pas en mode PROD)
    if (function_exists('apache_get_version') and $v = apache_get_version() and strncmp($v, "Apache/1.", 9) == 0) {
        $deny = "deny from all\n";
    }
    if ($ht = @fopen($htaccess, "w")) {
        fputs($ht, $deny);
        fclose($ht);
        @chmod($htaccess, _SPIP_CHMOD & 0666);
        $t = rtrim($rep, "/") . "/.ok";
        if ($ht = @fopen($t, "w")) {
            @fclose($ht);
            include_spip('inc/distant');
            $t = substr($t, strlen(_DIR_RACINE));
            $t = url_de_base() . $t;
            $ht = recuperer_lapage($t, false, 'HEAD', 0);
            // htaccess inoperant si on a recupere des entetes HTTP
            // (ignorer la reussite si connexion par fopen)
            $ht = !(isset($ht[0]) and $ht[0]);
        }
    }
    spip_log("Creation de {$htaccess} " . ($ht ? " reussie" : " manquee"));
    return $ht;
}
Пример #14
0
function appliquer_modifs_config($purger_skel=false) {

	if (($i = _request('adresse_site'))!==NULL){
		if (!strlen($i)) {$GLOBALS['profondeur_url']=_DIR_RESTREINT?0:1;$i = url_de_base();}
		$_POST['adresse_site'] = preg_replace(",/?\s*$,", "", $i);
	}

	// provoquer l'envoi des nouveautes en supprimant le fichier lock
	if (_request('envoi_now')) {
		spip_unlink(_DIR_TMP . 'mail.lock');
	}

	// Purger les squelettes si un changement de meta les affecte
	if ($i = _request('post_dates') AND ($i != $GLOBALS['meta']["post_dates"]))
		$purger_skel = true;

	if ($accepter_forum = _request('forums_publics')
	AND ($accepter_forum != $GLOBALS['meta']["forums_publics"])) {
		$purger_skel = true;
		$accepter_forum = substr($accepter_forum,0,3);
	}

	// Appliquer les changements de moderation forum
	// forums_publics_appliquer : futur, saufnon, tous
	if (in_array($appliquer = _request('forums_publics_appliquer'),
		array('tous', 'saufnon')
	)) {
		$sauf = ($appliquer == 'saufnon')
			? "accepter_forum != 'non'"
			: '';

		sql_updateq('spip_articles', array('accepter_forum'=>$accepter_forum), $sauf);
	}

	if ($accepter_forum == 'abo')
		ecrire_meta('accepter_visiteurs', 'oui');

	if ($i = _request('langues_auth') AND is_array($i)) {
		set_request('langues_multilingue', join($i, ","));
	}

	// Modification du reglage accepter_inscriptions => vider le cache
	// (pour repercuter la modif sur le panneau de login)
	if (($i = _request('accepter_inscriptions')
		AND $i != $GLOBALS['meta']['accepter_inscriptions'])
		OR ($i = _request('accepter_visiteurs')
		AND $i != $GLOBALS['meta']['accepter_visiteurs'])) {
		include_spip('inc/invalideur');
		suivre_invalideur("1"); # tout effacer
	}

	foreach(liste_metas() as $i => $v) {
		if (($x =_request($i))!==NULL)
			ecrire_meta($i, $x);
		elseif  (!isset($GLOBALS['meta'][$i]))
			ecrire_meta($i, $v);
	}

	if ($lang = _request('changer_langue_site')) {
		include_spip('inc/lang');
		// verif que la langue demandee est licite
		if (changer_langue($lang)) {
			ecrire_meta('langue_site', $lang);
		}
		// le test a defait ca:
		utiliser_langue_visiteur();
	}

	if ($purger_skel) {
		include_spip('inc/invalideur');
		purger_repertoire(_DIR_SKELS);
	}
}
Пример #15
0
/**
 * Logue une visite sur une page
 *
 * Enregistre le passage d'un visiteur sur la page demandée
 * dans `tmp/visites/` qui seront ensuite traitées par une tache cron.
 *
 * Ne tient pas compte
 * - des visites de robots,
 * - des 404,
 * - des forum
 *
 * @see genie_visites_dist() Pour la tache cron qui traite les logs.
 *
 * @param array|null $contexte
 *     Contexte d'appel de la page ; retrouvé automatiquement sinon.
 * @param string|null $referer
 *     Referer de provenance ; retrouvé automatiquement sinon.
 * @return null|void
 **/
function public_stats_dist($contexte = null, $referer = null)
{
    if (!is_array($contexte)) {
        $contexte = $GLOBALS['contexte'];
    }
    if (is_null($referer)) {
        // $_SERVER["HTTP_REFERER"] ne fonctionne pas partout
        if (isset($_SERVER['HTTP_REFERER'])) {
            $referer = $_SERVER['HTTP_REFERER'];
        } else {
            if (isset($GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"])) {
                $referer = $GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"];
            }
        }
    }
    // Rejet des robots (qui sont pourtant des humains comme les autres)
    if (_IS_BOT or isset($referer) and strpbrk($referer, '<>"\'')) {
        return;
    }
    // Ne pas tenir compte des tentatives de spam des forums
    if ($_SERVER['REQUEST_METHOD'] !== 'GET' or isset($contexte['page']) and $contexte['page'] == 'forum') {
        return;
    }
    // rejet des pages 404
    if (isset($GLOBALS['page']['status']) and $GLOBALS['page']['status'] == 404) {
        return;
    }
    // Identification du client
    $client_id = substr(md5($GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '') . (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '') . (isset($_SERVER['HTTP_ACCEPT_ENCODING']) ? $_SERVER['HTTP_ACCEPT_ENCODING'] : '')), 0, 10);
    // Analyse du referer
    $log_referer = '';
    if (isset($referer)) {
        $url_site_spip = preg_replace(',/$,', '', preg_replace(',^(https?://)?(www\\.)?,i', '', url_de_base()));
        if (!($url_site_spip != '' and strpos('-' . strtolower($referer), strtolower($url_site_spip)) and strpos($referer, "recherche=") === false)) {
            $log_referer = $referer;
        }
    }
    //
    // stockage sous forme de fichier tmp/visites/client_id
    //
    // 1. Chercher s'il existe deja une session pour ce numero IP.
    $content = array();
    $fichier = sous_repertoire(_DIR_TMP, 'visites') . $client_id;
    if (lire_fichier($fichier, $content)) {
        $content = @unserialize($content);
    }
    // 2. Plafonner le nombre de hits pris en compte pour un IP (robots etc.)
    // et ecrire la session
    if (count($content) < 200) {
        // Identification de l'element
        if (isset($contexte['id_article'])) {
            $log_type = "article";
        } else {
            if (isset($contexte['id_breve'])) {
                $log_type = "breve";
            } else {
                if (isset($contexte['id_rubrique'])) {
                    $log_type = "rubrique";
                } else {
                    $log_type = "";
                }
            }
        }
        if ($log_type) {
            $log_type .= "\t" . intval($contexte["id_{$log_type}"]);
        } else {
            $log_type = "autre\t0";
        }
        $log_type .= "\t" . trim($log_referer);
        if (isset($content[$log_type])) {
            $content[$log_type]++;
        } else {
            $content[$log_type] = 1;
        }
        // bienvenue au club
        ecrire_fichier($fichier, serialize($content));
    } else {
        $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
        @touch($flood);
    }
}
Пример #16
0
/**
 * Crée une URL vers une page publique de SPIP
 *
 * @example
 *     ```
 *     generer_url_public("rubrique","id_rubrique=$id_rubrique")
 *     ```
 *
 * @param string $script
 *     Nom de la page
 * @param string|array $args
 *     Arguments à transmettre a l'URL,
 *      soit sous la forme d'un string tel que `arg1=yy&arg2=zz`
 *      soit sous la forme d'un array tel que array( `arg1` => `yy`, `arg2` => `zz` )
 * @param bool $no_entities
 *     Si false : transforme les `&` en `&amp;`
 * @param bool $rel
 *     URL relative ?
 *
 *     - false : l’URL sera complète et contiendra l’URL du site
 *     - true : l’URL sera relavive.
 * @param string $action
 *     - Fichier d'exécution public (spip.php par défaut)
 * @return string URL
**/
function generer_url_public($script = '', $args = "", $no_entities = false, $rel = true, $action = '')
{
    // si le script est une action (spip_pass, spip_inscription),
    // standardiser vers la nouvelle API
    if (!$action) {
        $action = get_spip_script();
    }
    if ($script) {
        $action = parametre_url($action, _SPIP_PAGE, $script, '&');
    }
    if ($args) {
        if (is_array($args)) {
            $r = '';
            foreach ($args as $k => $v) {
                $r .= '&' . $k . '=' . $v;
            }
            $args = substr($r, 1);
        }
        $action .= (strpos($action, '?') !== false ? '&' : '?') . $args;
    }
    if (!$no_entities) {
        $action = quote_amp($action);
    }
    // ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide
    return $rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/') . preg_replace(",^/[.]/,", "/", "/{$action}");
}
Пример #17
0
/**
 * Compacter (concaténer+minifier) les fichiers format CSS ou JS
 * du head.
 *
 * Repérer fichiers statiques vs. url squelettes
 * Compacte le tout dans un fichier statique posé dans local/
 *
 * @param string $flux
 *    Contenu du <head> de la page html
 * @param string $format
 *    css ou js
 * @return string
 *    Contenu compressé du <head> de la page html
 */
function compacte_head_files($flux, $format)
{
    $url_base = url_de_base();
    $url_page = substr(generer_url_public('A'), 0, -1);
    $dir = preg_quote($url_page, ',') . '|' . preg_quote(preg_replace(",^{$url_base},", _DIR_RACINE, $url_page), ',');
    if (!($extraire_balises = charger_fonction("compresseur_extraire_balises_{$format}", '', true))) {
        return $flux;
    }
    $files = array();
    $flux_nocomment = preg_replace(",<!--.*-->,Uims", "", $flux);
    foreach ($extraire_balises($flux_nocomment, $url_base) as $s => $src) {
        if (preg_match(',^(' . $dir . ')(.*)$,', $src, $r) or $src = preg_replace(',^' . preg_quote(url_de_base(), ',') . ',', '', $src) and $src2 = preg_replace(",[.]{$format}[?].+\$,", ".{$format}", $src) and !preg_match(',(^/|\\.\\.),', substr($src, strlen(_DIR_RACINE))) and @is_readable($src2)) {
            if ($r) {
                $files[$s] = explode('&', str_replace('&amp;', '&', $r[2]), 2);
            } else {
                $files[$s] = $src;
            }
        }
    }
    $callbacks = array('each_min' => 'callback_minifier_' . $format . '_file');
    if ($format == "css") {
        $callbacks['each_pre'] = 'compresseur_callback_prepare_css';
        $callbacks['all_min'] = 'css_regroup_atimport';
        // ce n'est pas une callback, mais en injectant l'url de base ici
        // on differencie les caches quand l'url de base change
        // puisque la css compresse inclue l'url courante du site (en url absolue)
        // on exclue le protocole car la compression se fait en url relative au protocole
        $callbacks[] = protocole_implicite($url_base);
    }
    if ($format == 'js' and $GLOBALS['meta']['auto_compress_closure'] == 'oui') {
        $callbacks['all_min'] = 'minifier_encore_js';
    }
    include_spip('inc/compresseur_concatener');
    include_spip('inc/compresseur_minifier');
    if (list($src, $comms) = concatener_fichiers($files, $format, $callbacks) and $src) {
        $compacte_ecrire_balise = charger_fonction("compresseur_ecrire_balise_{$format}", '');
        $files = array_keys($files);
        // retrouver la position du premier fichier compacte
        $pos = strpos($flux, reset($files));
        // supprimer tous les fichiers compactes du flux
        $flux = str_replace($files, "", $flux);
        // inserer la balise (deleguer a la fonction, en lui donnant le necessaire)
        $flux = $compacte_ecrire_balise($flux, $pos, $src, $comms);
    }
    return $flux;
}
Пример #18
0
function formulaires_login_traiter_dist($cible="",$login="",$prive=null){
	$res = array();
	// Si on se connecte dans l'espace prive, 
	// ajouter "bonjour" (repere a peu pres les cookies desactives)
	if (is_null($prive) ? is_url_prive($cible) : $prive) {
		$cible = parametre_url($cible, 'bonjour', 'oui', '&');
	}
	if ($cible=='@page_auteur')
		$cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'],'auteur');

	if ($cible) {
		$cible = parametre_url($cible, 'var_login', '', '&');

		// transformer la cible absolue en cible relative
		// pour pas echouer quand la meta adresse_site est foireuse
		if (strncmp($cible,$u = url_de_base(),strlen($u))==0){
			$cible = "./".substr($cible,strlen($u));
		}

		// si c'est une url absolue, refuser la redirection
		// sauf si cette securite est levee volontairement par le webmestre
		elseif (tester_url_absolue($cible) AND !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
			$cible = "";
		}
	}


	// Si on est admin, poser le cookie de correspondance
	if ($GLOBALS['auteur_session']['statut'] == '0minirezo') {
		include_spip('inc/cookie');
		spip_setcookie('spip_admin', '@'.$GLOBALS['auteur_session']['login'],
		time() + 7 * 24 * 3600);
	}

	// Si on est connecte, envoyer vers la destination
	if ($cible AND ($cible!=self())) {
		if (!headers_sent() AND !$_GET['var_mode']) {
			include_spip('inc/headers');
			$res['redirect'] = $cible;
		} else {
			$res['message_ok'] .= inserer_attribut(
				"<a>" . _T('login_par_ici') . "</a>",
				'href', $cible
			);
		}
	}
	return $res;
}
Пример #19
0
function init_body($rubrique='accueil', $sous_rubrique='accueil', $id_rubrique='') {
	global $couleur_foncee, $couleur_claire;
	global $connect_id_auteur, $auth_can_disconnect;
	global $options, $spip_display, $spip_ecran;
	global $spip_lang, $spip_lang_rtl, $spip_lang_left, $spip_lang_right;

	if ($spip_ecran == "large") $largeur = 974; else $largeur = 750;

	$res = pipeline('body_prive',"<body class='$rubrique $sous_rubrique'"
			. ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : "")
			.'>')
	. "\n<div><map name='map_layout' id='map_layout'>"
	. lien_change_var (self(), 'set_disp', 1, '1,0,18,15', _T('lien_afficher_texte_seul'), "onmouseover=\"changestyle('bandeauvide');\" onfocus=\"changestyle('bandeauvide');\" onblur=\"changestyle('bandeauvide');\"")
	. lien_change_var (self(), 'set_disp', 2, '19,0,40,15', _T('lien_afficher_texte_icones'), "onmouseover=\"changestyle('bandeauvide');\" onfocus=\"changestyle('bandeauvide');\" onblur=\"changestyle('bandeauvide');\"")
	. lien_change_var (self(), 'set_disp', 3, '41,0,59,15', _T('lien_afficher_icones_seuls'), "onmouseover=\"changestyle('bandeauvide');\" onfocus=\"changestyle('bandeauvide');\" onblur=\"changestyle('bandeauvide');\"")
	. "\n</map></div>";

	if ($spip_display == "4") {
		$res .= "<ul>"
		. "\n<li><a href='./'>"._T('icone_a_suivre')."</a></li>"
		. "\n<li><a href='" . generer_url_ecrire("naviguer") . "'>"._T('icone_edition_site')."</a></li>"
		. "\n<li><a href='" . generer_url_ecrire("forum"). "'>"._T('titre_forum')."</a></li>"
		. "\n<li><a href='" . generer_url_ecrire("auteurs") . "'>"._T('icone_auteurs')."</a></li>"
		. "\n<li><a href=\"".url_de_base()."\">"._T('icone_visiter_site')."</a></li>"
		. "</ul>";

		return $res;
	}

	$res .= bandeau_double_rangee($rubrique, $sous_rubrique, $largeur);

	if (true /*$bandeau_colore*/) {
		if ($rubrique == "administration") {
			$style = "background: url(" . _DIR_IMG_PACK . "rayures-danger.png); background-color: $couleur_foncee";
			$res .= "<style>a.icone26 { color: white; }</style>";
		} else  $style = "background-color: $couleur_claire";

		$res .= "\n<div align='center' style=\"max-height: 40px; width: 100%; border-bottom: solid 1px white;$style\">"
	. "<table cellpadding='0' style='background: none;' width='$largeur'><tr>"
		. "<td valign='middle' class='bandeau_couleur' style='text-align: $spip_lang_left;'>"
		.  installer_gadgets($id_rubrique)
		. "</td>"
		. "<td valign='middle' class='bandeau_couleur' style='text-align: $spip_lang_left;'>"

	// Redacteur connecte
	// overflow pour masquer les noms tres longs
	// (et eviter debords, notamment en ecran etroit)

		. "<div style='width: "
		. (($spip_ecran == "large") ? 300 : 110)
		. "px; height: 14px; overflow: hidden;'>"
		. "<a href='"
		. generer_url_ecrire("auteur_infos","id_auteur=$connect_id_auteur") 
		. "' class='icone26' title=\""
		. entites_html(_T('icone_informations_personnelles'))
		. '">'
		. typo($GLOBALS['auteur_session']['nom'])
		. "</a></div>"
		. "</td>"
		. "<td> &nbsp; </td>"
		. "<td class='bandeau_couleur' style='text-align: $spip_lang_right;' valign='middle'>";

			// Choix display
		//	$res .="<img src=_DIR_IMG_PACK . 'rien.gif' width='10' />";
		if ($options != "avancees") {
				$lien = parametre_url(self(), 'set_options', 'avancees');
				$icone = "interface-display-comp.png";
				$alt =_T('icone_interface_complet');
		} else {
				$lien = parametre_url(self(), 'set_options', 'basiques');
				$icone = "interface-display.png";
				$alt =_T('icone_interface_simple');
		}
		$res .= "<a href='$lien' class='icone26' onmouseover=\"changestyle('bandeaudisplay');\" onfocus=\"changestyle('bandeaudisplay');\" onblur=\"changestyle('bandeaudisplay');\">"
		. http_img_pack($icone, "$alt", "width='26' height='20'")."</a>"
		. http_img_pack("rien.gif", "", "width='10' height='1'")
		. http_img_pack("choix-layout$spip_lang_rtl".($spip_lang=='he'?'_he':'').".gif", _T('choix_interface'), "class='format_png' style='vertical-align: middle' width='59' height='15' usemap='#map_layout'")
		. http_img_pack("rien.gif", "", "width='10' height='1'");
			// grand ecran
		if ($spip_ecran == "large") {
			$i = _T('info_petit_ecran');
			$res .= "<a href='". parametre_url(self(),'set_ecran', 'etroit') ."' class='icone26' onmouseover=\"changestyle('bandeauecran');\" title=\"$i\" onfocus=\"changestyle('bandeauecran');\" onblur=\"changestyle('bandeauecran');\">" .
			  http_img_pack("set-ecran-etroit.png", $i, "width='26' height='20'") . "</a>";
			$ecran = "<div><a href='".parametre_url(self(),'set_ecran', 'etroit')."' class='lien_sous'>"._T('info_petit_ecran')."</a>/<b>"._T('info_grand_ecran')."</b></div>";
		} else {
			$i = _T('info_grand_ecran');
			$res .= "<a href='".parametre_url(self(),'set_ecran', 'large')."' class='icone26' onmouseover=\"changestyle('bandeauecran');\" title=\"$i\" onfocus=\"changestyle('bandeauecran');\" onblur=\"changestyle('bandeauecran');\">" .
			  http_img_pack("set-ecran.png", $i, "width='26' height='20'") ."</a>";
			$ecran = "<div><b>"._T('info_petit_ecran')."</b>/<a href='".parametre_url(self(),'set_ecran', 'large')."' class='lien_sous'>"._T('info_grand_ecran')."</a></div>";
		}

		$res .= "</td>"
		. "<td class='bandeau_couleur' style='width: 60px; text-align:$spip_lang_left;' valign='middle'>"
		. choix_couleur()
		. "</td>";
	//
	// choix de la langue
	//
		if ($GLOBALS['all_langs']) {
			$res .= "<td class='bandeau_couleur' style='width: 100px; text-align: $spip_lang_right;' valign='middle'>"
			. menu_langues('var_lang_ecrire')
			. "</td>";
		}

		$res .= "<td class='bandeau_couleur' style='text-align: $spip_lang_right; width: 28px;' valign='middle'>";

		if ($auth_can_disconnect) {
			$alt=_T('icone_deconnecter');
                        /* Modif. LCS 21/09/07
			$res .= "<a href='".
			  generer_url_action("logout","logout=prive") .
			  "' class='icone26' onmouseover=\"changestyle('bandeaudeconnecter');\" onfocus=\"changestyle('bandeaudeconnecter');\" onblur=\"changestyle('bandeaudeconnecter');\">" .
			  http_img_pack("deconnecter-24.gif", "$alt", "") .
			  "</a>";
                        */
		          $res .= "<a href='../../lcs/logout.php' class='icone26' onmouseover=\"changestyle('bandeaudeconnecter','visibility', 'visible');\">".
			  http_img_pack("deconnecter-24.gif", "", "").
			  "</a>";
		}
		$res .= "</td>"
		. "</tr></table>";

	} // fin bandeau colore

	// <div> pour la barre des gadgets
	// (elements invisibles qui s'ouvrent sous la barre precedente)

	$res .= bandeau_gadgets($largeur, $options, $id_rubrique)
	. "</div>"
	. "</div>\n";

	if ($options != "avancees") $res .= "<div style='height: 18px;'>&nbsp;</div>";
	return $res;
}
Пример #20
0
function valider_skel($transformer_xml, $file, $dir, $ext)
{
	if (!lire_fichier ($file, $text)) return array('/', '/', $file,''); 
	if (!strpos($text, 'DOCTYPE')) {
		preg_match(",Content[-]Type:\s*[^/]+/([^ ;]+),", $text, $r);
		if ($r[1] === 'css' OR $r[1] === 'plain')
		  return array(0, array(), $file,'');
	}

	if ($ext != 'html') {
		// validation d'un non squelette
		$page = array('texte' => $text);
		$url = url_de_base() . _DIR_RESTREINT_ABS . $file;
		$script = $file;
	} else {
		$script = basename($file,'.html');
		// les squelettes en sous-repertoire sont problematiques,
		// traitons au moins le cas prive/exec
		if (substr_count($dir, '/') <= 1) {
			$url = generer_url_public($script, $contexte);
		} else 	$url = valider_pseudo_url(basename($dir), basename($file, '.html'), $contexte);
		$composer = charger_fonction('composer', 'public');
		list($skel_nom, $skel_code) = $composer($text, 'html', 'html', $file);

		spip_log("compilation de $file en " . strlen($skel_code) .  " octets de nom $skel_nom");
		if (!$skel_nom) return array('/', 0, $file,''); 
		$contexte = valider_contexte($skel_code, $file);
		$page = $skel_nom(array('cache'=>''), array($contexte));
	}
	list($texte, $err) = $transformer_xml($page['texte']);
	return array($texte, $err, $script, $url);
}
Пример #21
0
/**
 * Compare les domaines des liens fournis avec la presence dans la base
 *
 * @param array $liens
 *   liste des liens html
 * @param int $seuil
 *   seuil de detection de presence : nombre d'enregistrement qui ont deja un lien avec le meme domaine
 * @param string $table
 *   table sql
 * @param array $champs
 *   champs a prendre en compte dans la detection
 * @param null|string $condstatut
 *   condition sur le statut='spam' pour ne regarder que les enregistrement en statut spam
 * @return bool
 */
function rechercher_presence_liens_spammes($liens, $seuil, $table, $champs, $condstatut = null)
{
    include_spip("inc/filtres");
    if (is_null($condstatut)) {
        $condstatut = "statut=" . sql_quote('spam');
    }
    if ($condstatut) {
        $condstatut = "{$condstatut} AND ";
    }
    // limiter la recherche au mois precedent
    $trouver_table = charger_fonction("trouver_table", "base");
    if ($desc = $trouver_table($table) and isset($desc['date'])) {
        $depuis = date('Y-m-d H:i:s', strtotime("-1 month"));
        $condstatut .= $desc['date'] . ">" . sql_quote($depuis) . " AND ";
    }
    // ne pas prendre en compte les liens sur le meme domaine que celui du site
    $allowed = array();
    $tests = array($GLOBALS['meta']['adresse_site'], url_de_base());
    foreach ($tests as $t) {
        if ($parse = parse_url($t) and $parse['host']) {
            $host = explode(".", $parse['host']);
            while (count($host) > 2) {
                array_shift($host);
            }
            $allowed[] = implode(".", $host);
        }
    }
    if (count($allowed)) {
        $allowed = array_map('preg_quote', $allowed);
        $allowed = implode("|", $allowed);
        $allowed = "/({$allowed})\$/";
        spip_log("domaines whitelist pour les liens spams : {$allowed}", "nospam");
    } else {
        $allowed = "";
    }
    $hosts = array();
    foreach ($liens as $lien) {
        $url = extraire_attribut($lien, "href");
        if ($parse = parse_url($url) and $parse['host'] and (!$allowed or !preg_match($allowed, $parse['host']))) {
            $hosts[] = $parse['host'];
        }
    }
    $hosts = array_unique($hosts);
    $hosts = array_filter($hosts);
    // pour chaque host figurant dans un lien, regarder si on a pas deja eu des spams avec ce meme host
    // auquel cas on refuse poliment le message
    foreach ($hosts as $h) {
        $like = " LIKE " . sql_quote("%{$h}%");
        $where = $condstatut . "(" . implode("{$like} OR ", $champs) . "{$like})";
        if (($n = sql_countsel($table, $where)) >= $seuil) {
            // loger les 10 premiers messages concernes pour aider le webmestre
            $all = sql_allfetsel(id_table_objet($table), $table, $where, '', '', '0,10');
            $all = array_map('reset', $all);
            spip_log("{$n} liens trouves {$like} dans table {$table} (" . implode(",", $all) . ") [champs " . implode(',', $champs) . "]", "nospam");
            return $h;
        }
    }
    return false;
}
Пример #22
0
function definir_barre_boutons() {
	global $boutons_admin;

	global $spip_lang, $spip_lang_rtl, $spip_lang_left, $spip_lang_right;

	$boutons_admin=array();

	$boutons_admin['accueil'] = new Bouton(
		'asuivre-48.png', 'icone_a_suivre');

	$boutons_admin['naviguer'] = new Bouton(
		"documents-48$spip_lang_rtl.png", 'icone_edition_site');

	if ($GLOBALS['meta']['forum_prive'] != 'non' OR sql_countsel('spip_forum'))
		$boutons_admin['forum'] = new Bouton(
			'messagerie-48.png', 'titre_forum');

	$boutons_admin['auteurs'] = new Bouton(
		'redacteurs-48.png', 'icone_auteurs');


	if ($GLOBALS['meta']["activer_statistiques"] != 'non'
	AND autoriser('voirstats')) {
		$boutons_admin['statistiques_visites']=
		  new Bouton('statistiques-48.png', 'icone_statistiques_visites');
	}

	// autoriser('configurer') => forcement admin complet (ou webmestre)
	if (autoriser('configurer')) {
		$boutons_admin['configuration']=
		  new Bouton('administration-48.png', 'icone_configuration_site');
	}
	// autres admins (restreints ou non webmestres) peuvent aller sur les backups
	else
	if (autoriser('sauvegarder', 'admin_tech')) {
		$boutons_admin['admin_tech']=
		  new Bouton('administration-48.png', 'texte_sauvegarde_base');
	}

	$boutons_admin['espacement']=null;

	$urlAide= generer_url_ecrire('aide_index')."&amp;var_lang=$spip_lang";
	$boutons_admin['aide_index']=
		  new Bouton('aide-48'.$spip_lang_rtl.'.png', 'icone_aide_ligne',
					 $urlAide, null, "javascript:window.open('$urlAide', 'spip_aide', 'scrollbars=yes,resizable=yes,width=740,height=580');", 'aide_spip');

	$boutons_admin['visiter']=
		new Bouton("visiter-48$spip_lang_rtl.png", 'icone_visiter_site',
		url_de_base());

	// les sous menu des boutons, que si on est admin
	if ($GLOBALS['connect_statut'] == '0minirezo'
	AND $GLOBALS['connect_toutes_rubriques']) {

	// sous menu edition

	$sousmenu=array();

	$nombre_articles = sql_fetsel('id_article', 'spip_auteurs_articles', "id_auteur=".$GLOBALS['connect_id_auteur']);

	if ($nombre_articles > 0) {
		$sousmenu['articles_page']=
		  new Bouton('article-24.gif', 'icone_tous_articles');
	}

	if ($GLOBALS['meta']["activer_breves"] != "non") {
		$sousmenu['breves']=
		  new Bouton('breve-24.gif', 'icone_breves');
	}

	$articles_mots = $GLOBALS['meta']['articles_mots'];
	if ($articles_mots != "non") {
			$sousmenu['mots_tous']=
			  new Bouton('mot-cle-24.gif', 'icone_mots_cles');
	}

	$activer_sites = $GLOBALS['meta']['activer_sites'];
	if ($activer_sites<>'non')
			$sousmenu['sites_tous']=
			  new Bouton('site-24.gif', 'icone_sites_references');

	$n = sql_countsel('spip_documents_liens', 'id_objet>0 AND objet=\'rubrique\'');
	if ($n) {
			$sousmenu['documents_liste']=
			  new Bouton('doc-24.gif', 'icone_doc_rubrique');
	}
	$boutons_admin['naviguer']->sousmenu= $sousmenu;

	// sous menu forum

	$sousmenu=array();

	if ($GLOBALS['meta']['forum_prive_admin'] == 'oui'
	AND autoriser('forum_admin'))
		$sousmenu['forum_admin']=
		  new Bouton('forum-admin-24.gif', 'icone_forum_administrateur');

	if (sql_countsel('spip_forum'))
		$sousmenu['controle_forum']=
			new Bouton("suivi-forum-24.gif", "icone_suivi_forums");
	if (sql_countsel('spip_signatures'))
		$sousmenu['controle_petition']=
			new Bouton("suivi-petition-24.gif", "icone_suivi_pettions");

	// Si le forum a ete desactive, mais qu'il y a un sous-menu de suivi
	// des forums ou des petitions, on colle ce suivi sous le menu "a suivre"
	if ($sousmenu) {
		if (isset($boutons_admin['forum']))
			$boutons_admin['forum']->sousmenu= $sousmenu;
		else
			$boutons_admin['accueil']->sousmenu= $sousmenu;
	}



	// sous menu auteurs

	$sousmenu=array();

	if (avoir_visiteurs(true)) {
		include_spip('exec/auteurs');
		$sousmenu['auteurs'] =
			new Bouton("fiche-perso.png", 'icone_afficher_visiteurs', null, "statut=!".AUTEURS_MIN_REDAC);
	}

	$sousmenu['auteur_infos']=
		new Bouton("auteur-24.gif", "icone_creer_nouvel_auteur", null, 'new=oui');

	$boutons_admin['auteurs']->sousmenu= $sousmenu;

	// sous menu statistiques
	if (isset($boutons_admin['statistiques_visites'])) {
		$sousmenu=array(
			//'espacement' => null,// les espacements debloquent si on a des icones sur 2 lignes
			'statistiques_repartition' =>
				new Bouton("rubrique-24.gif", "icone_repartition_visites")
		);

		if ($GLOBALS['meta']['multi_articles'] == 'oui'
		OR $GLOBALS['meta']['multi_rubriques'] == 'oui')
			$sousmenu['statistiques_lang']=
				new Bouton("langues-24.gif", "onglet_repartition_lang");

		$sousmenu['statistiques_referers']=
		  new Bouton("referers-24.gif", "titre_liens_entrants");

		$boutons_admin['statistiques_visites']->sousmenu= $sousmenu;
	}

	// sous menu configuration
	if (autoriser('configurer')) {
		$sousmenu = array();
		if (autoriser('configurer', 'lang')) {
			$sousmenu['config_lang'] =
				new Bouton("langues-24.gif", "icone_gestion_langues");
			//$sousmenu['espacement'] = null; // les espacements debloquent si on a des icones sur 2 lignes
		}

		if (autoriser('sauvegarder')) {
			$sousmenu['admin_tech']=
				new Bouton("base-24.gif", "icone_maintenance_site");
		}
		if (autoriser('configurer', 'admin_vider')) {
			$sousmenu['admin_vider']=
				new Bouton("cache-24.gif", "onglet_vider_cache");
		}

		// Si _DIR_PLUGINS est definie a '', pas de bouton
		if (_DIR_PLUGINS
		AND autoriser('configurer', 'admin_plugin')) {
			$sousmenu['admin_plugin']=
				new Bouton("plugin-24.gif", "icone_admin_plugin");
		}

		if ($sousmenu)
			$boutons_admin['configuration']->sousmenu= $sousmenu;
	}

	} // fin si admin

	// ajouter les boutons issus des plugin via plugin.xml
	if (function_exists('boutons_plugins')
	  AND is_array($liste_boutons_plugins = boutons_plugins())){
		foreach($liste_boutons_plugins as $id => $infos){
			if (autoriser('bouton',$id)){
				if (($parent = $infos['parent']) && isset($boutons_admin[$parent]))
					$boutons_admin[$parent]->sousmenu[$id]= new Bouton(
					  find_in_path($infos['icone']),  // icone
					  $infos['titre'],	// titre
					  $infos['url']?$infos['url']:null,
					  $infos['args']?$infos['args']:null
					  );
				if (!$parent) {
					$b = array();
					foreach($boutons_admin as $k=>$v){
						if ($k=='espacement')
							$b = $b + array($id=> new Bouton(
					  find_in_path($infos['icone']),  // icone
					  $infos['titre'],	// titre
					  $infos['url']?generer_url_ecrire($infos['url'],$infos['args']?$infos['args']:''):null
					  ));
						$b = $b + array($k=>$v);
					}
					$boutons_admin = $b;
				}
			}
		}
	}

	$boutons_admin = pipeline('ajouter_boutons', $boutons_admin);
}
Пример #23
0
function public_stats_dist() {
	// $_SERVER["HTTP_REFERER"] ne fonctionne pas partout
	if (isset($_SERVER['HTTP_REFERER'])) $referer = $_SERVER['HTTP_REFERER'];
	else if (isset($GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"])) $referer = $GLOBALS["HTTP_SERVER_VARS"]["HTTP_REFERER"];
	
	// Rejeter pirates et robots (qui sont pourtant des humains comme les autres)
	if (_IS_BOT OR strlen($referer)!=strcspn($referer,'<>"\'')) return;

	// Ne pas tenir compte des tentatives de spam des forums
	if ($_SERVER['REQUEST_METHOD'] !== 'GET'
	OR $_GET['page'] == 'forum')
		return;

	// rejet des pages 404
	if (isset($GLOBALS['page']['status'])
	AND $GLOBALS['page']['status'] == 404)
		return;

	// Identification du client
	$client_id = substr(md5(
		$GLOBALS['ip'] . $_SERVER['HTTP_USER_AGENT']
//		. $_SERVER['HTTP_ACCEPT'] # HTTP_ACCEPT peut etre present ou non selon que l'on est dans la requete initiale, ou dans les hits associes
		. $_SERVER['HTTP_ACCEPT_LANGUAGE']
		. $_SERVER['HTTP_ACCEPT_ENCODING']
	), 0,10);

	// Analyse du referer
	$log_referer = '';
	if (isset($referer)) {
		$url_site_spip = preg_replace(',/$,', '',
			preg_replace(',^(https?://)?(www\.)?,i', '',
			url_de_base()));
		if (!(($url_site_spip<>'')
		AND strpos('-'.strtolower($referer), strtolower($url_site_spip))
		AND strpos($referer,"recherche=")===false)) {
			$log_referer =$referer;
		}
	}

	//
	// stockage sous forme de fichier ecrire/data/stats/client_id
	//

	// 1. Chercher s'il existe deja une session pour ce numero IP.
	$content = array();
	$fichier = sous_repertoire(_DIR_TMP, 'visites') . $client_id;
	if (lire_fichier($fichier, $content))
		$content = @unserialize($content);

	// 2. Plafonner le nombre de hits pris en compte pour un IP (robots etc.)
	// et ecrire la session
	if (count($content) < 200) {

		// Identification de l'element
		if (isset($GLOBALS['contexte']['id_article']))
			$log_type = "article";
		else if (isset($GLOBALS['contexte']['id_breve']))
			$log_type = "breve";
		else if (isset($GLOBALS['contexte']['id_rubrique']))
			$log_type = "rubrique";
		else
			$log_type = "";

		if ($log_type)
			$log_type .= "\t" . intval($GLOBALS['contexte']["id_$log_type"]);
		else    $log_type = "autre\t0";

		$log_type .= "\t" . trim($log_referer);
		if (isset($content[$log_type]))
			$content[$log_type]++;
		else	$content[$log_type] = 1; // bienvenue au club

		ecrire_fichier($fichier, serialize($content));
	}
}
Пример #24
0
function redirige_formulaire($url, $equiv = '', $format='message') {
	if (!_AJAX
	AND !headers_sent()
	AND !_request('var_ajax')) {
		redirige_par_entete(str_replace('&amp;','&',$url), $equiv);
	}
	// si c'est une ancre, fixer simplement le window.location.hash
	elseif($format=='ajaxform' AND preg_match(',^#[0-9a-z\-_]+$,i',$url)) {
		return array(
		// on renvoie un lien masque qui sera traite par ajaxCallback.js
		"<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>",
		// et rien dans le message ok
		'');
	}
	else {
		// ne pas laisser passer n'importe quoi dans l'url
		$url = str_replace(array('<','"'),array('&lt;','&quot;'),$url);

		$url = strtr($url, "\n\r", "  ");
		# en theorie on devrait faire ca tout le temps, mais quand la chaine
		# commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne
		if ($url[0]=='?')
			$url = url_de_base().(_DIR_RESTREINT?'':_DIR_RESTREINT_ABS).$url;
		$url = str_replace('&amp;','&',$url);
		spip_log("redirige formulaire ajax: $url");
		include_spip('inc/filtres');
		if ($format=='ajaxform')
			return array(
			// on renvoie un lien masque qui sera traite par ajaxCallback.js
			'<a href="'.quote_amp($url).'" name="ajax_redirect"  style="display:none;">'._T('navigateur_pas_redirige').'</a>',
			// et un message au cas ou
			'<br /><a href="'.quote_amp($url).'">'._T('navigateur_pas_redirige').'</a>'
			);
		else // format message texte, tout en js inline
			return
		// ie poste les formulaires dans une iframe, il faut donc rediriger son parent
		"<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>"
		. http_img_pack('searching.gif','')
		. '<br />'
		. '<a href="'.quote_amp($url).'">'._T('navigateur_pas_redirige').'</a>';
	}
}
Пример #25
0
/**
 * Essayer de valider un texte même sans Doctype
 * à moins qu'un Content-Type dise clairement que ce n'est pas du XML
 *
 * @param string $transformer_xml
 * @param string $file
 * @param string $dir
 * @param string $ext
 * @return array
 */
function valider_skel($transformer_xml, $file, $dir, $ext)
{
    if (!lire_fichier($file, $text)) {
        return array('/', '/', $file, '');
    }
    if (!strpos($text, 'DOCTYPE')) {
        preg_match(",Content[-]Type: *\\w+/(\\S)+,", $text, $r);
        if ($r[1] === 'css' or $r[1] === 'plain') {
            return array('/', 'DOCTYPE?', $file, '');
        }
    }
    if ($ext != 'html') {
        // validation d'un non squelette
        $page = array('texte' => $text);
        $url = url_de_base() . _DIR_RESTREINT_ABS . $file;
        $script = $file;
    } else {
        $script = basename($file, '.html');
        // pas de validation solitaire pour les squelettes internes, a revoir.
        if (substr_count($dir, '/') <= 1) {
            $url = generer_url_public($script, $contexte);
        } else {
            $url = '';
        }
        $composer = charger_fonction('composer', 'public');
        list($skel_nom, $skel_code) = $composer($text, 'html', 'html', $file);
        spip_log("compilation de {$file} en " . strlen($skel_code) . " octets de nom {$skel_nom}");
        if (!$skel_nom) {
            return array('/', '/', $file, '');
        }
        $contexte = valider_contexte($skel_code, $file);
        $page = $skel_nom(array('cache' => ''), array($contexte));
    }
    $res = $transformer_xml($page['texte']);
    return array(count($res->err), strlen($res->page), $res->err, $script, $url);
}
Пример #26
0
function verifier_htaccess($rep, $force=false) {
	$htaccess = rtrim($rep,"/") . "/" . _ACCESS_FILE_NAME;
	if (((@file_exists($htaccess)) OR defined('_TEST_DIRS')) AND !$force)
		return true;
	if ($_SERVER['SERVER_ADMIN'] == '*****@*****.**')
		return nexen($rep);
	if ($ht = @fopen($htaccess, "w")) {
		fputs($ht, "deny from all\n");
		fclose($ht);
		@chmod($htaccess, _SPIP_CHMOD & 0666);
		$t = rtrim($rep,"/") . "/.ok";
		if ($ht = @fopen($t, "w")) {
			@fclose($ht);
			include_spip('inc/distant');
			$t = substr($t,strlen(_DIR_RACINE));
			$t = url_de_base() . $t;
			$ht = recuperer_lapage($t, false, 'HEAD', 0);
			// htaccess inoperant si on a recupere des entetes HTTP
			// (ignorer la reussite si connexion par fopen)
			$ht = !(isset($ht[0]) AND $ht[0]);
		}
	}
	spip_log("Creation de $htaccess " . ($ht ? " reussie" : " manquee"));
	return $ht;
}	
Пример #27
0
function formulaires_login_traiter_dist($cible = "", $login = "", $prive = null)
{
    $res = array();
    // Si on se connecte dans l'espace prive,
    // ajouter "bonjour" (repere a peu pres les cookies desactives)
    if (is_null($prive) ? is_url_prive($cible) : $prive) {
        $cible = parametre_url($cible, 'bonjour', 'oui', '&');
    }
    if ($cible == '@page_auteur') {
        $cible = generer_url_entite($GLOBALS['auteur_session']['id_auteur'], 'auteur');
    }
    if ($cible) {
        $cible = parametre_url($cible, 'var_login', '', '&');
        // transformer la cible absolue en cible relative
        // pour pas echouer quand la meta adresse_site est foireuse
        if (strncmp($cible, $u = url_de_base(), strlen($u)) == 0) {
            $cible = "./" . substr($cible, strlen($u));
        } elseif (tester_url_absolue($cible) and !defined('_AUTORISER_LOGIN_ABS_REDIRECT')) {
            $cible = "";
        }
    }
    // Si on est connecte, envoyer vers la destination
    if ($cible and $cible != self()) {
        if (!headers_sent() and !$_GET['var_mode']) {
            include_spip('inc/headers');
            $res['redirect'] = $cible;
        } else {
            $res['message_ok'] = inserer_attribut("<a>" . _T('login_par_ici') . "</a>", 'href', $cible);
        }
    }
    return $res;
}
Пример #28
0
function inc_lien_dist($lien, $texte = '', $class = '', $title = '', $hlang = '', $rel = '', $connect = '', $env = array())
{
    static $u = null;
    if (!$u) {
        $u = url_de_base();
    }
    $typo = false;
    // Si une langue est demandee sur un raccourci d'article, chercher
    // la traduction ;
    // - [{en}->art2] => traduction anglaise de l'article 2, sinon art 2
    // - [{}->art2] => traduction en langue courante de l'art 2, sinon art 2
    // s'applique a tout objet traduit
    if ($hlang and $match = typer_raccourci($lien)) {
        @(list($type, , $id, , $args, , $ancre) = $match);
        $trouver_table = charger_fonction('trouver_table', 'base');
        $desc = $trouver_table(table_objet($type, $connect), $connect);
        if ($desc and $id_table_objet = $desc['key']['PRIMARY KEY']) {
            $table_objet_sql = $desc['table'];
            if ($row = sql_fetsel('*', $table_objet_sql, "{$id_table_objet}=" . intval($id)) and isset($row['id_trad']) and isset($row['lang']) and $id_dest = sql_getfetsel($id_table_objet, $table_objet_sql, "id_trad=" . intval($row['id_trad']) . " AND lang=" . sql_quote($hlang)) and objet_test_si_publie($type, $id_dest)) {
                $lien = "{$type}{$id_dest}";
            } else {
                $hlang = '';
            }
        } else {
            $hlang = '';
        }
    }
    $mode = ($texte and $class) ? 'url' : 'tout';
    $lien = calculer_url($lien, $texte, $mode, $connect);
    if ($mode === 'tout') {
        $texte = $lien['titre'];
        if (!$class and isset($lien['class'])) {
            $class = $lien['class'];
        }
        $lang = isset($lien['lang']) ? $lien['lang'] : '';
        $mime = isset($lien['mime']) ? " type='" . $lien['mime'] . "'" : "";
        $lien = $lien['url'];
    }
    $lien = trim($lien);
    if (strncmp($lien, "#", 1) == 0) {
        # ancres pures (internes a la page)
        $class = 'spip_ancre';
    } elseif (strncasecmp($lien, 'mailto:', 7) == 0) {
        # pseudo URL de mail
        $class = "spip_mail";
    } elseif (strncmp($texte, '<html>', 6) == 0) {
        # cf traiter_lien_explicite
        $class = "spip_url spip_out";
    } elseif (!$class) {
        $class = "spip_out";
    }
    # si pas spip_in|spip_glossaire
    // Si l'objet n'est pas de la langue courante, on ajoute hreflang
    if (!$hlang and $lang !== $GLOBALS['spip_lang']) {
        $hlang = $lang;
    }
    $lang = $hlang ? " hreflang='{$hlang}'" : '';
    if ($title) {
        $title = ' title="' . attribut_html($title) . '"';
    } else {
        $title = '';
    }
    // $title peut etre 'false'
    // rel=external pour les liens externes
    if ((strncmp($lien, 'http://', 7) == 0 or strncmp($lien, 'https://', 8) == 0) and strncmp("{$lien}/", $u, strlen($u)) != 0) {
        $rel = trim("{$rel} external");
    }
    if ($rel) {
        $rel = " rel='{$rel}'";
    }
    // si pas de modele dans le texte du lien, on peut juste passer typo sur le texte, c'est plus rapide
    // les rares cas de lien qui encapsule un modele passe en dessous, c'est plus lent
    if (traiter_modeles($texte, false, '', $connect, null, $env) == $texte) {
        $texte = typo($texte, true, $connect, $env);
        $lien = "<a href=\"" . str_replace('"', '&quot;', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}" . (isset($mime) ? $mime : '') . ">{$texte}</a>";
        return $lien;
    }
    # ceci s'execute heureusement avant les tableaux et leur "|".
    # Attention, le texte initial est deja echappe mais pas forcement
    # celui retourne par calculer_url.
    # Penser au cas [<imgXX|right>->URL], qui exige typo('<a>...</a>')
    $lien = "<a href=\"" . str_replace('"', '&quot;', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}{$mime}>{$texte}</a>";
    $res = typo($lien, true, $connect, $env);
    // dans ce cas, echapons le resultat du modele pour que propre etc ne viennent pas pouicher le html
    $res = echappe_html("<html>{$res}</html>");
    return $res;
}
Пример #29
0
/**
 * Mettre a jour l'adresse du site a partir d'une valeur saisie
 * (ou auto detection si vide)
 * 
 * @param  $adresse_site
 * @return void
 */
function appliquer_adresse_site($adresse_site)
{
    if ($adresse_site !== NULL) {
        if (!strlen($adresse_site)) {
            $GLOBALS['profondeur_url'] = _DIR_RESTREINT ? 0 : 1;
            $adresse_site = url_de_base();
        }
        $adresse_site = preg_replace(",/?\\s*\$,", "", $adresse_site);
        if (!preg_match(",^[\\w]+://,Uims", $adresse_site)) {
            $adresse_site = "http://{$adresse_site}";
        }
        ecrire_meta('adresse_site', $adresse_site);
    }
    return $adresse_site;
}
/**
 * Attraper automatiquement toutes les .less ou .less.css du head
 * les compiler, et les remplacer par leur css compilee
 *
 * @param string $head
 * @return string
 */
function lesscss_cssify_head($head)
{
    $url_base = url_de_base();
    $balises = extraire_balises($head, 'link');
    $files = array();
    foreach ($balises as $s) {
        if (extraire_attribut($s, 'rel') === 'stylesheet' and (!($type = extraire_attribut($s, 'type')) or $type == 'text/css') and $src = extraire_attribut($s, 'href') and preg_match(",\\.(less\\.css|less)(\\?\\d+)?\$,", $src) and $src = preg_replace(",\\?\\d+\$,", "", $src) and $src = preg_replace(",^{$url_base},", _DIR_RACINE, $src) and file_exists($src)) {
            $files[$s] = $src;
        }
    }
    if (!count($files)) {
        return $head;
    }
    foreach ($files as $s => $lessfile) {
        $cssfile = less_css($lessfile);
        $m = @filemtime($cssfile);
        $s2 = inserer_attribut($s, "href", "{$cssfile}?{$m}");
        $head = str_replace($s, $s2, $head);
    }
    return $head;
}