$old_time, 'limit' => 1000]); // et on renvoie un html minimum if (!_request('redirect')) { include_spip('inc/headers'); http_status(204); // No Content header("Connection: close"); } } /** * Generer le HTML a afficher pour faire confirmer une action par l'utilisateur a son insu * (antispam qui declenche donc l'action uniquement si l'utilisateur charge les ressources de la page) * * @param string $function * @param string $description * @param array $arguments * @param string $file * @param null $time * @param string $method * @return string */ function nospam_confirm_action_prepare( $function, $description, $arguments = array(), $file = '', $time = null, $method = 'script') { // on stocke le descriptif de l'action a lancer dans un fichier $desc = [ 'function' => $function, 'description' => $description, 'arguments' => $arguments, 'file' => $file, 'time' => $time, // et des infos pour qualifier les spammeurs plus tard si besoin 'ip' => $GLOBALS['ip'], 'date' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']), // pour les logs, on met la date de la demande d'action 'ua' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'undefined', ]; $desc = json_encode($desc); $dir_actions = sous_repertoire(_DIR_TMP,_DIR_CONFIRM_ACTIONS); $hash = nospam_hash_action($desc); ecrire_fichier($dir_actions . $hash . ".json", $desc); include_spip('inc/actions'); include_spip('inc/filtres'); $url_action = str_replace("&", "&", generer_action_auteur("nospam_confirm_action", $hash)); $url_action_redirect = parametre_url($url_action, 'redirect', self(), '&'); switch ($method) { case 'iframe': $title = attribut_html(_T('nospam:info_alt_antispam')); $html_action = ""; break; case 'script': default: $bouton_action = charger_filtre('bouton_action'); $libelle = attribut_html(_T('nospam:libelle_je_ne_suis_pas_un_robot')); $html_action = $bouton_action($libelle, $url_action_redirect, 'btn-primary btn-sm btn-antispam'); $js = "jQuery.ajax({url: '{$url_action}'}).done(function(){jQuery('.nospam-checkbox').addClass('checked');})"; $html_action = ""; $css = file_get_contents(find_in_path('css/nospam-checkbox.min.css')); $html_action .= ""; break; } // supprimer des actions plus vieilles que 5mn en les logeant // si on le fait qu'a l'exec d'action legitime, on risque le flood si y a que des spammeurs ! $old_time = $_SERVER['REQUEST_TIME'] - 5 * 60; nospam_purge_actions($dir_actions, ['mtime' => $old_time, 'limit' => 10]); return $html_action; } /** * Calculer un hash pour une action donnee * * @param $desc_json * @return bool|string */ function nospam_hash_action($desc_json) { if (!function_exists('secret_du_site')) { include_spip('inc/securiser_action'); } $hash = substr(md5(__FILE__ . secret_du_site() . $desc_json), 0, 16); return $hash; } /** * Purge le répertoire des actions en logant tout ce qu'on purge * * @param string $dir * Chemin du répertoire à purger * @param array $options * Tableau des options. Peut être : * * - atime : timestamp pour ne supprimer que les fichiers antérieurs * à cette date (via fileatime) * - mtime : timestamp pour ne supprimer que les fichiers antérieurs * à cette date (via filemtime) * - limit : nombre maximum de suppressions * @return int * Nombre de fichiers supprimés **/ function nospam_purge_actions($dir, $options = array()) { if (!is_dir($dir) or !is_readable($dir)) { return; } $handle = opendir($dir); if (!$handle) { return; } $total = 0; while (($fichier = @readdir($handle)) !== false) { // Eviter ".", "..", ".htaccess", ".svn" etc. if ($fichier[0] == '.') { continue; } $chemin = "$dir/$fichier"; if (is_file($chemin)) { if ((!isset($options['atime']) or (@fileatime($chemin) < $options['atime'])) and (!isset($options['mtime']) or (@filemtime($chemin) < $options['mtime'])) ) { $action = file_get_contents($chemin); spip_log("Purge action non confirmee $fichier: $action", 'nospam_unconfirmed' . _LOG_INFO_IMPORTANTE); @unlink($chemin); $total++; } } else { if (is_dir($chemin)) { $opts = $options; if (isset($options['limit'])) { $opts['limit'] = $options['limit'] - $total; } $total += nospam_purge_actions($chemin, $opts); if (isset($options['subdir']) && $options['subdir']) { spip_unlink($chemin); } } } if (isset($options['limit']) and $total >= $options['limit']) { break; } } closedir($handle); return $total; }