[SPIP][PLUGINS] v3.0-->v3.2
[lhc/web/www.git] / www / plugins-dist / statistiques / public / stats.php
index 76213a9..8b6b232 100644 (file)
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-if (!defined("_ECRIRE_INC_VERSION")) return;
-
-// https://code.spip.net/@public_stats_dist
-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"];
-       
+/**
+ * Loguer une visite
+ *
+ * @plugin Statistiques pour SPIP
+ * @license GNU/GPL
+ * @package SPIP\Stats\Public
+ **/
+
+if (!defined("_ECRIRE_INC_VERSION")) {
+       return;
+}
+
+/**
+ * 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;
+       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($_GET['page']) AND $_GET['page'] == 'forum'))
+               or (isset($contexte['page']) and $contexte['page'] == 'forum')
+       ) {
                return;
+       }
 
        // rejet des pages 404
        if (isset($GLOBALS['page']['status'])
-       AND $GLOBALS['page']['status'] == 404)
+               and $GLOBALS['page']['status'] == 404
+       ) {
                return;
+       }
 
        // Identification du client
        $client_id = substr(md5(
-               $GLOBALS['ip'] . $_SERVER['HTTP_USER_AGENT']
+               $GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_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);
+               . (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;
+       if (!isset($GLOBALS['meta']['activer_referers']) or $GLOBALS['meta']['activer_referers'] == "oui") {
+               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
+       // 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))
+       if (lire_fichier($fichier, $content)) {
                $content = @unserialize($content);
+       }
+       // fichier absent probablement (ou problème unserialize)
+       if (!is_array($content)) {
+               $content = array();
+       }
 
        // 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']))
+               if (isset($contexte['id_article'])) {
                        $log_type = "article";
-               else if (isset($GLOBALS['contexte']['id_breve']))
+               } elseif (isset($contexte['id_breve'])) {
                        $log_type = "breve";
-               else if (isset($GLOBALS['contexte']['id_rubrique']))
+               } elseif (isset($contexte['id_rubrique'])) {
                        $log_type = "rubrique";
-               else
+               } else {
                        $log_type = "";
+               }
 
-               if ($log_type)
-                       $log_type .= "\t" . intval($GLOBALS['contexte']["id_$log_type"]);
-               else    $log_type = "autre\t0";
+               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]))
+               if (isset($content[$log_type])) {
                        $content[$log_type]++;
-               else    $content[$log_type] = 1; // bienvenue au club
+               } else {
+                       $content[$log_type] = 1;
+               } // bienvenue au club
 
                ecrire_fichier($fichier, serialize($content));
-       }
-       else {
+       } else {
                $flood = sous_repertoire(_DIR_TMP, 'flood') . $GLOBALS['ip'];
                @touch($flood);
        }
 }
-
-?>