Nettoyage des pages vandalisées depuis 1 heure(s)
Résultats :
<?php
// Charles Népote 2005
// License GPL.
// Version 0.6.1 du 08/02/2005 à 22:10.
// TODO
// -- cas où un spammeur édite 98 fois une page (solution : par date)
// -- cas où le spammeur change d'IP à chaque passage (solution : par date)
// -- case pour sélectionner tout
// -- attention au cas où la version mais aussi la page est effacée
// (cf. handler deletepage) (et les commentaires ?)
// Vérification de sécurité
if (!defined('WIKINI_VERSION'))
{
die ('accès direct interdit');
}
echo "\n<!-- == Action erasespam v 0.6 ============================= -->\n";
// La norme HTML interdit la basile style ailleurs que dans <head></head>
// on l'utilise ici à titre de débogage et pendant la construction de l'action
echo "<style type=\"text/css\">",
"p { margin: 0; }",
".action_erasespam { background-color: yellow; }",
"</style>\n";
// Contrôle d'accès à cette action
/*
if (!$this->GetUser() == "CharlesNepote")
{
echo "<p class =\"action_erasespam\">",
"Vous n'êtes pas autorisé à utiliser cette action.</p>";
return;
}
/* */
// -- (1) Formulaire d'accueil de l'action -------------------------------
//
// Le formulaire est affiché si aucun spammer n'a encore été précisé ou
// si le champ a été laissé vide et validé
if(empty($_POST['spammer']))
{
echo "<div class=\"action_erasespam\">\n",
"<form method=\"post\" action=\"". $this->Href() . "\" name=\"selection\">\n",
"<fieldset>\n",
"<legend>Sélection des pages</legend>\n";
// Si le formulaire a été validé avec le champ vide, on alerte l'utilisateur
if(isset($_POST['spammer']))
echo "<p><em>Attention : ",
"veuillez préciser un nom d'utilisateur</em></p>\n";
echo "<p>\n",
"Nom de l'utilisateur : <input name=\"spammer\" /> ",
"<button value=\"Valider\">Valider</button>\n",
"</p>\n";
echo "</fieldset>\n",
"</form>\n",
"</div>\n";
}
// -- (2) Page de résultats et form. de sélection des pages à effacer ----
//
else if(!isset($_POST['erase']))
{
// Sélection de toutes les pages de cet utilisateur
// TODO : ne sélectionner que les pages des n derniers jours
// TODO : contrôler préalablement le contenu de $_POST['spammer']
$requete =
"select *
from ".$this->config["table_prefix"]."pages
where user = '" . $_POST['spammer'] . "' and latest = 'Y'
order by `time` desc";
$pagesFromSpammer = $this->LoadAll($requete);
// Affichage des pages pour validation
echo "<div class=\"action_erasespam\">\n";
echo "<p>Nettoyage des pages vandalisées par " . $_POST['spammer'] . "</p>\n";
echo "<form method=\"post\" action=\"". $this->Href() . "\">\n";
foreach ($pagesFromSpammer as $i => $page)
{
echo "<p><input name=\"" . $page["tag"] . "\" type=\"checkbox\" />",
"(", $page["time"], ") ",
"(",$this->ComposeLinkToPage($page["tag"], "revisions", "historique", 0),") ",
$this->ComposeLinkToPage($page["tag"], "", "", 0),
" . . . . ",$this->Format($page["user"]),"</p>\n" ;
}
echo "<p>Commentaire : <input name=\"comment\" style=\"width: 80%;\" /></p>\n";
echo "<p>\n",
"<input type=\"hidden\" name=\"wiki\" value=\"" . $this->GetPageTag() . "\" />\n",
"<input type=\"hidden\" name=\"spammer\" value=\"" . $_POST['spammer'] . "\" />\n",
"<input type=\"hidden\" name=\"erase\" value=\"yes\" />\n",
"<button value=\"Valider\">Effacer les versions sélectionnées</button>\n",
"</p>\n";
echo "</form>\n";
echo "</div>\n";
}
// -- (3) Effacement des pages et page de résultats ----------------------
//
else
{
$deletedPages = "";
// Sélection de toutes les pages de cet utilisateur
$requete1 =
"select *
from ".$this->config["table_prefix"]."pages
where user = '" . $_POST['spammer'] . "' and latest = 'Y'";
$pagesFromSpammer = $this->LoadAll($requete1);
// Pour chaque page sélectionnée
foreach ($pagesFromSpammer as $i => $page)
{
// Si la case d'une page a été cochée comme SPAM
if (isset($_POST[$page["tag"]]))
{
$requeteVersionBefore =
"select * " .
"from " . $this->config["table_prefix"] . "pages " .
"where tag = '" . $page["tag"] . "' " .
"and time < '" . $page["time"] . "' " .
"order by `time` desc limit 1";
$versionBefore = $this->LoadSingle($requeteVersionBefore);
// Pour l'instant l'effacement ne peut avoir lieu que s'il
// existe une version antérieure à la page
// Ce qui fait qu'une page créée par un spammeur ne sera pas
// effacée... Il faudrait attendre le nouveau système de
// purge permettant de toujours conserver une page au delà
// du délai de purge
if (!empty($versionBefore))
{
// Efface
$requeteDelete =
"delete from " . $this->config["table_prefix"] . "pages " .
"where id = '" . $page["id"] . "' " .
"and tag = '" . $page["tag"] . "' " .
"limit 1";
$this->Query($requeteDelete);
//echo "$$$$$$$$$$$$$$";
$deletedPages .= $page["tag"] . " ";
// Fait de la version précédente la version active
// if($page['latest'] == 'Y' && !empty($versionBefore))
$makeLatest =
"update " . $this->config["table_prefix"] . "pages " .
"set latest = 'Y' ".
"where id = '" . $versionBefore["id"] . "' " .
"and tag = '" . $page["tag"] . "' " .
"limit 1";
$this->Query($makeLatest);
}
}
}
// Affichage de la page des résultats ; par exemple :
// Pages effacées : BacASable WikiNi
echo "<div class=\"action_erasespam\">\n";
echo $deletedPages ?
"Pages effacées : " . $this->Format($deletedPages) . "\n" :
"Aucune page effacée\n";
echo "</div>\n\n";
// S'il y a eu des pages nettoyées,
// on enregistre dans une page choisie qui a fait quoi
if ($deletedPages)
{
// Détermine quelle est la page de log :
// -- passée en paramètre (que se passe-t'il si elle n'existe pas ?)
// -- ou la page en cours par défaut
$test = $this->GetParameter("logpage");
$reportingPage = $test ? $test : $this->GetPageTag();
// Ajout de la ligne de log
// TODO : remplacer par une méthode AppendContent ?
/* $requeteBody =
"select body " .
"from " . $this->config["table_prefix"] . "pages " .
"where tag = '" . $reportingPage . "' " .
"and latest = 'Y' " .
"limit 1";
$result = $this->LoadSingle($requeteBody); */
$result = $this->LoadPage($reportingPage);
$body = $result['body'];
// Ajout de qui à fait quoi au corps de la page
$body .= "\n(". date("Y-m-d H:i:s") . ") Pages nettoyées par " .
$this->GetUserName() .
" [" . $_POST['comment'] . "] : " . $deletedPages . "\n";
// Sauvegarde de la page
// Note : la page est sauvegardée même si l'utilisateur n'a pas accès
// à cette page
$this->SavePage($reportingPage, $body);
// now we render it internally so we can write the updated link table.
$this->ClearLinkTable();
$this->StartLinkTracking();
$this->Format($body);
if($user = $this->GetUser())
{
$this->TrackLinkTo($user['name']);
}
if($owner = $this->GetPageOwner())
{
$this->TrackLinkTo($owner);
}
$this->StopLinkTracking();
$this->WriteLinkTable();
$this->ClearLinkTable();
}
}
?>
<?php
// Charles Népote 2005
// Didier Loiseau 2005
// License GPL.
// Version 0.7.2 du 20/02/2005 à 21:32.
// TODO
// -- case pour sélectionner tout
// -- attention au cas où la version mais aussi la page est effacée
// (cf. handler deletepage) (et les commentaires ?)
// -- les opérations sur la page contenant cette action + logpage devraient
// être impossibles ?
// -- ne rien loguer si rien n'a été effacé
// -- idéalement la dernière page affiche les résultats mais ne renettoie
// pas les pages si elle est rechargée
// -- test pour savoir si quelque chose a bien été effacé
/*$essai = $this->GetLinkTable();
echo "<pre>";
print_r($essai);
echo "</pre>\n";*/
// Vérification de sécurité
if (!defined('WIKINI_VERSION'))
{
die ('accès direct interdit');
}
echo "\n<!-- == Action erasespam v 0.7.2 ============================= -->\n";
// La norme HTML interdit la balise style ailleurs que dans <head></head>
// on l'utilise ici à titre de débogage et pendant la construction de l'action
echo "<style type=\"text/css\">",
"p { margin: 0; }",
".action_erasespam { background-color: yellow; }",
".action_erasespam td { text-align: right; vertical-align: top; }",
"</style>\n";
// Contrôle d'accès à cette action
/*
if (!$this->GetUser() == "CharlesNepote")
{
echo "<p class =\"action_erasespam\">",
"Vous n'êtes pas autorisé à utiliser cette action.</p>";
return;
}
/* */
// -- (1) Formulaire d'accueil de l'action -------------------------------
//
// Le formulaire est affiché si aucun spammer n'a encore été précisé ou
// si le champ a été laissé vide et validé
if(empty($_POST['spammer']) && empty($_POST['from']) && !isset($_POST['clean']))
{
echo "<div class=\"action_erasespam\">\n",
"<form method=\"post\" action=\"". $this->Href() . "\" name=\"selection\">\n",
"<fieldset>\n",
"<legend>Sélection des pages</legend>\n";
// Si le formulaire a été validé avec le champ vide, on alerte l'utilisateur
if(isset($_POST['spammer']))
echo "<p><em>Attention : ",
"veuillez préciser un nom d'utilisateur</em></p>\n";
echo "<p>\n",
"Nom de l'utilisateur : <input name=\"spammer\" /> ",
"<button name=\"1\" value=\"Valider\">Valider</button>\n",
"</p>\n";
echo "<p>\n",
"ou\n",
"</p>\n";
echo "<p>\n",
"Toutes les modifications depuis ",
"<select name=\"from\">\n",
"<option selected=\"selected\" value=\"1\">depuis 1 heure</option>\n",
"<option value=\"3\">depuis 3 heures</option>\n",
"<option value=\"6\">depuis 6 heures</option>\n",
"<option value=\"12\">depuis 12 heures</option>\n",
"<option value=\"24\">depuis 24 heures</option>\n",
"<option value=\"48\">depuis 48 heures</option>\n",
"<option value=\"168\">depuis 1 semaine</option>\n",
"<option value=\"336\">depuis 2 semaines</option>\n",
"<option value=\"744\">depuis 1 mois</option>\n",
"</select>\n",
"<button name=\"2\" value=\"Valider\">Valider</button>\n",
"</p>\n";
echo "</fieldset>\n",
"</form>\n",
"</div>\n\n";
}
// -- (2) Page de résultats et form. de sélection des pages à effacer ----
//
else if(!isset($_POST['clean']))
{
// Sélection de toutes les pages de cet utilisateur
// TODO : ne sélectionner que les pages des n derniers jours
// TODO : contrôler préalablement le contenu de $_POST['spammer']
if(isset($_POST['spammer']) && isset($_POST['1']))
{
$requete =
"select *
from ".$this->config["table_prefix"]."pages
where
user = '" . $_POST['spammer'] . "'
and latest = 'Y'
order by `time` desc";
$title =
"<p>Nettoyage des pages vandalisées par " .
$_POST['spammer'] . "</p>\n";
}
if(isset($_POST['from']) && isset($_POST['2']))
{
$requete =
"select *
from ".$this->config["table_prefix"]."pages
where
time > date_sub(now(), interval " . $_POST['from'] . " hour)
and latest = 'Y'
order by `time` desc";
$title =
"<p>Nettoyage des pages vandalisées depuis " .
$_POST['from'] . " heure(s)</p>\n";
}
//echo $requete;
$pagesFromSpammer = $this->LoadAll($requete);
// Affichage des pages pour validation
echo "<div class=\"action_erasespam\">\n";
echo $title;
echo "<form method=\"post\" action=\"". $this->Href() . "\">\n";
echo "<table>\n";
foreach ($pagesFromSpammer as $i => $page)
{
/*echo "<p><input name=\"" . $page["tag"] . "\" type=\"checkbox\" />",
"(", $page["time"], ") ",
"(",$this->ComposeLinkToPage($page["tag"], "revisions", "historique", 0),") ",
$this->ComposeLinkToPage($page["tag"], "", "", 0),
" . . . . ",$this->Format($page["user"]),"</p>\n" ;*/
$revisions = $this->LoadRevisions($page["tag"]);
echo "<tr>\n",
"<td>",
$this->ComposeLinkToPage($page["tag"], "", "", 0), " ",
"(", $page["time"], ") ",
"(",$this->ComposeLinkToPage($page["tag"], "revisions", "historique", 0),") ",
"</td>\n";
echo "<td>",
"<input name=\"suppr[]\" value=\"" . $page["tag"] . "\" type=\"checkbox\" /> [Suppr.!]",
"</td>\n";
echo "<td>\n";
foreach ($revisions as $revision)
{
// Si c'est la dernière version on saute cette itération
// ce n'est pas elle qu'on va vouloir restaurer...
if(!isset($revision1))
{
$revision1 = "";
continue;
}
echo "<input name=\"rev[]\" value=\"" . $revision["id"] . "\" type=\"checkbox\" /> ";
echo "Restaurer depuis la version du ",
"<a href=\"".$this->href("show")."&time=".urlencode($revision["time"])."\">".$revision["time"]."</a>",
" par ", $this->Format($revision['user']), " ",
"<br />\n";
}
unset($revision1);
echo //" . . . . ",$this->Format($page["user"]),"</p>\n",
"</td>\n",
"</tr>\n",
"";
}
echo "</table>\n";
echo "<p>Commentaire : <input name=\"comment\" style=\"width: 80%;\" /></p>\n";
echo "<p>\n",
"<input type=\"hidden\" name=\"spammer\" value=\"" . $_POST['spammer'] . "\" />\n",
"<input type=\"hidden\" name=\"clean\" value=\"yes\" />\n",
"<button value=\"Valider\">Nettoyer >></button>\n",
"</p>\n";
echo "</form>\n";
echo "</div>\n\n";
}
// -- (3) Nettoyage des pages et affichage de la page de résultats -------
//
else if(isset($_POST['clean']))
{
//echo "<script type=\"text/javascript\">alert('test');</script>";
$deletedPages = "";
$restoredPages = "";
$logPage = $this->GetParameter("logpage");
// -- 3.1 Effacement ---
// On efface chaque élément du tableau suppr[]
// Pour chaque page sélectionnée
if (!empty($_POST['suppr']))
{
foreach ($_POST['suppr'] as $page)
{
// Effacement de la page en utilisant la méthode adéquate
// (si DeleteOrphanedPage ne convient pas, soit on créé
// une autre, soit on la modifie
$this->DeleteOrphanedPage($page);
$deletedPages .= $page . ", ";
}
$deletedPages = trim($deletedPages, ", ");
}
// -- 3.2 Restauration des pages sélectionnées ---
if (!empty($_POST['rev']))
{
//print_r($_POST["rev"]);
foreach ($_POST["rev"] as $rev_id)
{
echo $rev_id."<br>";
// Sélectionne la révision
$revision = $this->LoadPageById($rev_id);
// Fait de la dernière version de cette révision
// une version archivée
$requeteUpdate =
"update " . $this->config["table_prefix"] . "pages " .
"set latest = 'N' ".
"where latest = 'Y' " .
"and tag = '" . $revision["tag"] . "' " .
"limit 1";
$this->Query($requeteUpdate);
$restoredPages .= $revision["tag"] . ", ";
// Fait de la version sélectionnée la nouvelle version active
$this->SavePage($revision["tag"], $revision['body']);
// */
}
$restoredPages = trim($restoredPages, ", ");
}
// -- 3.3 Affichage de la page des résultats ---
// par exemple :
// Pages effacées : BacASable WikiNi
echo "<div class=\"action_erasespam\">\n";
echo "<p><em>Résultats :</em></p>\n";
echo "<ul>\n";
echo !empty($deletedPages) ?
"<li>Pages définitivement effacées : " .
$this->Format($deletedPages) . ".</li>\n" :
"<li>Aucune page effacée.</li>\n";
echo !empty($restoredPages) ?
"<li>Pages restaurées : " .
$this->Format($restoredPages) . ".</li>\n" :
"<li>Aucune page restaurée.</li>\n";
echo "</ul>\n";
echo "<p><a href=\"", $this->Href(), "\">Retour au formulaire de départ >></p>\n";
echo "<p><a href=\"" .
(!empty($logPage) ?
$this->Href('', $logPage) :
$this->Href()) . "\">Consultation du journal des nettoyages >></p>\n";
echo "</div>\n\n";
// -- 3.4 Écriture du journal des actions ---
// S'il y a eu des pages nettoyées,
// on enregistre dans une page choisie qui a fait quoi
if ($deletedPages||$restoredPages)
{
// -- Détermine quelle est la page de log :
// -- passée en paramètre (que se passe-t'il si elle n'existe pas ?)
// -- ou la page en cours par défaut
$reportingPage = $logPage ? $logPage : $this->GetPageTag();
// -- Ajout de la ligne de log
// TODO : remplacer par une méthode AppendContent ?
$result = $this->LoadPage($reportingPage);
$body = $result['body'];
// Ajout de qui à fait quoi au corps de la page
$deletedPages = $deletedPages ? $deletedPages." (effacée(s))" : "";
$restoredPages = $restoredPages ? $restoredPages." (restaurée(s))" : "";
if ($deletedPages&&$restoredPages) $liaison = " et ";
else $liaison = "";
$body .= "\n(". date("Y-m-d H:i:s") . ") Pages nettoyées par " .
$this->GetUserName() .
" [" . $_POST['comment'] . "] : " . $deletedPages .
$liaison . $restoredPages. "\n";
// -- Sauvegarde de la page
// Note : la page est sauvegardée même si l'utilisateur n'a pas accès
// à cette page
$this->SavePage($reportingPage, $body);
// now we render it internally so we can write the updated link table.
/*$this->ClearLinkTable();
$this->StartLinkTracking();
$this->Format($body);
if($user = $this->GetUser())
{
$this->TrackLinkTo($user['name']);
}
if($owner = $this->GetPageOwner())
{
$this->TrackLinkTo($owner);
}
$this->StopLinkTracking();
$this->WriteLinkTable();
$this->ClearLinkTable();*/
}
}
?>