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'); }
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); }
/** * 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')); }
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('<', '"'), $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('&', '&', $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>'; } } }
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')); }
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('&', '&', $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; }
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; }
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; }
/** * 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')); }
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); }
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('"', '"', $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('"', '"', $lien) . "\" class='{$class}'{$lang}{$title}{$rel}{$mime}>{$texte}</a>"; return typo($lien, true, $connect); }
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('"', '"', $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); }
/** * 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; }
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); } }
/** * 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); } }
/** * 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 `&` * @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}"); }
/** * 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('&', '&', $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; }
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; }
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> </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;'> </div>"; return $res; }
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); }
/** * 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; }
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')."&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); }
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)); } }
function redirige_formulaire($url, $equiv = '', $format='message') { if (!_AJAX AND !headers_sent() AND !_request('var_ajax')) { redirige_par_entete(str_replace('&','&',$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('<','"'),$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('&','&',$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>'; } }
/** * 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); }
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; }
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; }
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('"', '"', $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('"', '"', $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; }
/** * 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; }