[SPIP Zone] [Spip-zone-commit] r26046 - in /_plugins_/_stable_/antispam: ./ balise/ balise/formulaire_forum.php fonds/ fonds/cfg_antispam.html formulaires/ formulaires/forum.html inc/ inc/forum_insert.php plugin.xml

Adaptation de "nospam", ou autre technique ???

Le 19 janv. 09 à 16:53, stephane@rezo.net a écrit :

Author: stephane@rezo.net
Date: Mon Jan 19 16:53:42 2009
New Revision: 26046

Log:
un antispam pour spip 1.9.2

Added:
   _plugins_/_stable_/antispam/
   _plugins_/_stable_/antispam/balise/
   _plugins_/_stable_/antispam/balise/formulaire_forum.php
   _plugins_/_stable_/antispam/fonds/
   _plugins_/_stable_/antispam/fonds/cfg_antispam.html
   _plugins_/_stable_/antispam/formulaires/
   _plugins_/_stable_/antispam/formulaires/forum.html
   _plugins_/_stable_/antispam/inc/
   _plugins_/_stable_/antispam/inc/forum_insert.php
   _plugins_/_stable_/antispam/plugin.xml

Added: _plugins_/_stable_/antispam/balise/formulaire_forum.php

======================================================================
--- _plugins_/_stable_/antispam/balise/formulaire_forum.php (added)
+++ _plugins_/_stable_/antispam/balise/formulaire_forum.php Mon Jan 19 16:53:42 2009
@@ -0,0 +1,324 @@
+<?php
+
+/***************************************************************************\
+ * SPIP, Systeme de publication pour l'internet *
+ * *
+ * Copyright (c) 2001-2007 *
+ * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
+ * *
+ * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
+ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return; #securite
+
+include_spip('inc/meta');
+include_spip('inc/acces');
+include_spip('inc/texte');
+include_spip('inc/lang');
+include_spip('inc/mail');
+include_spip('inc/forum');
+include_spip('base/abstract_sql');
+spip_connect();
+
+charger_generer_url();
+
+/*******************************/
+/* GESTION DU FORMULAIRE FORUM */
+/*******************************/
+
+// Contexte du formulaire
+// Mots-cles dans les forums :
+// Si la variable de personnalisation $afficher_groupe est definie
+// dans le fichier d'appel, et si la table de reference est OK, proposer
+// la liste des mots-cles
+
+// http://doc.spip.org/@balise_FORMULAIRE_FORUM
+function balise_FORMULAIRE_FORUM ($p) {
+
+ $p = calculer_balise_dynamique($p,'FORMULAIRE_FORUM', array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic', 'ajouter_mot', 'ajouter_groupe', 'afficher_texte'));
+
+ // Ajouter le code d'invalideur specifique aux forums
+ include_spip('inc/invalideur');
+ if (function_exists($i = 'code_invalideur_forums'))
+ $p->code = $i($p, $p->code);
+
+ return $p;
+}
+
+// verification des droits a faire du forum
+// http://doc.spip.org/@balise_FORMULAIRE_FORUM_stat
+function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
+
+ // Note : ceci n'est pas documente !!
+ // $filtres[0] peut contenir l'url sur lequel faire tourner le formulaire
+ // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM|forum)]
+ // ou encore [(#FORMULAIRE_FORUM|forumspip.php)]
+
+ // le denier arg peut contenir l'url sur lequel faire le retour
+ // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
+
+ // recuperer les donnees du forum auquel on repond, false = forum interdit
+ list ($idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url) = $args;
+ $idr = intval($idr);
+ $idf = intval($idf);
+ $ida = intval($ida);
+ $idb = intval($idb);
+ $ids = intval($ids);
+ if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
+ return '';
+
+ list ($titre, $table, $forums_publics) = $r;
+
+ if (($GLOBALS['meta']["mots_cles_forums"] != "oui"))
+ $table = '';
+
+ // Sur quelle adresse va-t-on "boucler" pour la previsualisation ?
+ if ($script = $filtres[0])
+ $script = preg_match(',[.]php3?$,', $script) ?
+ $script : generer_url_public($script);
+ else
+ $script = self(); # sur soi-meme
+
+ return
+ array($titre, $table, $forums_publics, $script,
+ $idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url);
+}
+
+// http://doc.spip.org/@balise_FORMULAIRE_FORUM_dyn
+function balise_FORMULAIRE_FORUM_dyn(
+$titre, $table, $type, $script,
+$id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
+$ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
+{
+ // verifier l'identite des posteurs pour les forums sur abo
+ if ($type == "abo") {
+ if (!$GLOBALS["auteur_session"]) {
+ return array('formulaires/login_forum', 0,
+ array('inscription' => generer_url_public('spip_inscription'),
+ 'oubli' => generer_url_public('spip_pass')));
+ } else {
+ // forcer ces valeur
+ $auteur = $GLOBALS['auteur_session']['nom'];
+ $email_auteur = $GLOBALS['auteur_session']['email'];
+ }
+ }
+ // Tableau des valeurs servant au calcul d'une signature de securite.
+ // Elles seront placees en Input Hidden pour que inc/forum_insert
+ // recalcule la meme chose et verifie l'identite des resultats.
+ // Donc ne pas changer la valeur de ce tableau entre le calcul de
+ // la signature et la fabrication des Hidden
+ // Faire attention aussi a 0 != ''
+
+ // id_rubrique est parfois passee pour les articles, on n'en veut pas
+ $ids = array();
+ if ($id_rubrique > 0 AND ($id_article OR $id_breve OR $id_syndic))
+ $id_rubrique = 0;
+ foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
+ $ids[$o] = ($x = intval($$o)) ? $x : '';
+ }
+
+ // ne pas mettre '', sinon le squelette n'affichera rien.
+ $previsu = ' ';
+
+ //$securiser_action = charger_fonction('securiser_action', 'inc');
+ include_spip('inc/securiser_action');
+ // on sait que cette fonction est dans le fichier associe
+ $hash = calculer_action_auteur("ajout_forum-$arg");
+
+ // au premier appel (pas de Post-var nommee "retour_forum")
+ // memoriser eventuellement l'URL de retour pour y revenir apres
+ // envoi du message ; aux appels suivants, reconduire la valeur.
+ // Initialiser aussi l'auteur
+ if (!$retour_forum = rawurldecode(_request('retour_forum'))) {
+ if ($retour_forum = rawurldecode(_request('retour')))
+ $retour_forum = str_replace('&var_mode=recalcul','',$retour_forum);
+ else {
+ // par defaut, on veut prendre url_forum(), mais elle ne sera connue
+ // qu'en sortie, on inscrit donc une valeur absurde ("!")
+ $retour_forum = "!";
+ // sauf si on a passe un parametre en argument (exemple : {#SELF})
+ if ($url_param_retour)
+ $retour_forum = str_replace('&amp;', '&', $url_param_retour);
+ }
+ if (isset($_COOKIE['spip_forum_user'])
+ AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
+ $auteur = $cookie_user['nom'];
+ $email_auteur = $cookie_user['email'];
+ } else {
+ $auteur = $GLOBALS['auteur_session']['nom'];
+ $email_auteur = $GLOBALS['auteur_session']['email'];
+ }
+
+ } else { // appels ulterieurs
+
+ // Recuperer le message a previsualiser
+ $titre = _request('titre');
+ $texte = _request('texte');
+ $auteur = _request('auteur');
+ $email_auteur = _request('email_auteur');
+ $nom_site = _request('nom_site');
+ $url_site = _request('url_site');
+ $ajouter_mot = _request('ajouter_mot');
+ $ajouter_groupe = _request('ajouter_groupe');
+
+ if ($afficher_texte != 'non')
+ $previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot);
+
+ $arg = forum_fichier_tmp(join('', $ids));
+
+ // Poser un cookie pour ne pas retaper les infos invariables
+ include_spip('inc/cookie');
+ spip_setcookie('spip_forum_user',
+ serialize(array('nom' => $auteur,
+ 'email' => $email_auteur)));
+ }
+
+ // pour la chaine de hidden
+ $script_hidden = $script = str_replace('&amp;', '&', $script);
+ foreach ($ids as $id => $v)
+ $script_hidden = parametre_url($script_hidden, $id, $v, '&');
+ return array('formulaires/forum', 0,
+ array(
+ 'auteur' => $auteur,
+ 'readonly' => ($type == "abo")? "readonly" : '',
+ 'email_auteur' => $email_auteur,
+ 'modere' => (($type != 'pri') ? '' : ' '),
+ 'nom_site' => $nom_site,
+ 'retour_forum' => $retour_forum,
+ 'afficher_texte' => $afficher_texte,
+ 'previsu' => $previsu,
+ 'table' => $table,
+ 'texte' => $texte,
+ 'titre' => extraire_multi($titre),
+ 'url' => $script, # ce sur quoi on fait le action='...'
+ 'url_post' => $script_hidden, # pour les variables hidden
+ 'url_site' => ($url_site ? $url_site : "http://"),
+ 'arg' => $arg,
+ 'hash' => $hash,
+ 'nobot' => _request($hash),
+ 'ajouter_groupe' => $ajouter_groupe,
+ 'ajouter_mot' => (is_array($ajouter_mot) ? $ajouter_mot : array($ajouter_mot)),
+
+ ));
+}
+
+// http://doc.spip.org/@inclure_previsu
+function inclure_previsu($texte,$titre, $email_auteur, $auteur, $url_site, $nom_site, $ajouter_mot)
+{
+ $erreur = $bouton = '';
+ if (strlen($texte) < 10 AND !$ajouter_mot)
+ $erreur = _T('forum_attention_dix_caracteres');
+ else if (strlen($titre) < 3)
+ $erreur = _T('forum_attention_trois_caracteres');
+ else if (defined('_FORUM_LONGUEUR_MAXI')
+ AND _FORUM_LONGUEUR_MAXI > 0
+ AND strlen($texte) > _FORUM_LONGUEUR_MAXI)
+ $erreur = _T('forum_attention_trop_caracteres',
+ array(
+ 'compte' => strlen($texte),
+ 'max' => _FORUM_LONGUEUR_MAXI
+ ));
+ else
+ $bouton = _T('forum_message_definitif');
+
+ // supprimer les <form> de la previsualisation
+ // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums)
+ return preg_replace("@<(/?)f(orm[>[:space:]])@ism",
+ "<\\1no-f\\2",
+ inclure_balise_dynamique(array('formulaires/forum_previsu',
+ 0,
+ array(
+ 'titre' => safehtml(typo($titre)),
+ 'email_auteur' => safehtml($email_auteur),
+ 'auteur' => safehtml(typo($auteur)),
+ 'texte' => safehtml(propre($texte)),

[... 502 lines stripped ...]
_______________________________________________
Spip-zone-commit@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone-commit

-Nicolas

--
Nicolas HOIZEY

Nicolas Hoizey a écrit :

Adaptation de "nospam", ou autre technique ???

non, rien à voir avec no-spam, c'est une bidouille from scratch
:slight_smile:

ca n'ameliore pas beaucoup la detection de robot je pense (juste le champ nobot change de nom comme suggéré par ESJ) mais ca devrait quand meme en planter certains et eviter la pollution des forums privés (petit bug de spip 1.9.2).
Mais l'interet c'est surtout de pouvoir interdire des chaines de caractères dans les differents champs (il doit y avoir une lame du couteau suisse qui fait déjà plus ou moins ca d'ailleurs mais j'ai pas regardé)

@++

Le 19 janv. 09 à 17:40, Stephane a écrit :

Nicolas Hoizey a écrit :

Adaptation de "nospam", ou autre technique ???

non, rien à voir avec no-spam, c'est une bidouille from scratch

OK

ca n'ameliore pas beaucoup la detection de robot je pense (juste le champ nobot change de nom comme suggéré par ESJ) mais ca devrait quand meme en planter certains et eviter la pollution des forums privés (petit bug de spip 1.9.2).

C'est déjà ça !

Mais l'interet c'est surtout de pouvoir interdire des chaines de caractères dans les differents champs (il doit y avoir une lame du couteau suisse qui fait déjà plus ou moins ca d'ailleurs mais j'ai pas regardé)

OK, je regarderais.

-Nicolas

--
Nicolas HOIZEY