SpamBee: Implemented i18n for sidebar plugin and added English and German locales. Also fixed SQL inection vulnerability (although only admins could exploit it).

This commit is contained in:
Janek Bevendorff 2012-08-19 17:14:26 +02:00
parent b15462b990
commit dc49b31e3d
4 changed files with 59 additions and 36 deletions

View file

@ -79,8 +79,10 @@
@define('PLUGIN_SPAMBLOCK_BEE_DAYS', 'Anzuzeigende Tage'); @define('PLUGIN_SPAMBLOCK_BEE_DAYS', 'Anzuzeigende Tage');
@define('PLUGIN_SPAMBLOCK_BEE_DAYS_DESC', 'Der Report wird für die letzten X Tage erstellt. Hier kannst Du mehrere Tage Komma separiert einstellen, für die jeweils ein Report dargestellt werden soll.'); @define('PLUGIN_SPAMBLOCK_BEE_DAYS_DESC', 'Der Report wird für die letzten X Tage erstellt. Hier kannst Du mehrere Tage Komma separiert einstellen, für die jeweils ein Report dargestellt werden soll.');
@define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES', 'Datenbank Suchen'); @define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES', 'Datenbank Suchen');
@define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES_DESC', 'Dieses plugin durchsucht die spamblocklog Tabelle. Hier kannst Du Suchen für Deine AntiSpam Maßnamen einstellen, über die gezählt werden soll. In jede Zeile kommt eine Einstellung, Format ist DeinNameFürAntiSpamArt:DbSuche. Beispiel: "BayesPlugin:%Bayes%" wird alle Einträge zählen, die "Bayes" irgendwo in ihrem Titel haben und sie als "BayesPlugin" im Report darstellen.'); @define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES_DESC', 'Dieses plugin durchsucht die spamblocklog Tabelle. Hier kannst Du Suchen für Deine AntiSpam Maßnamen einstellen, über die gezählt werden soll. In jede Zeile kommt eine Einstellung, Format ist DeinNameFürAntiSpamArt:Suchbegriff. Das Zeichen % kann als Wildcard benutzt werden. Beispiel: "BayesPlugin:%Bayes%" wird alle Einträge zählen, die "Bayes" irgendwo in ihrem Titel haben und sie als "BayesPlugin" im Report darstellen.');
@define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN', 'Nur für eingeloggte Benutzer'); @define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN', 'Nur für eingeloggte Benutzer');
@define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC', 'Wenn Du dies anschaltest, dann können nur eingeloggte Benutzer des Blogs die Statistik in der Seitenleiste sehen.'); @define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC', 'Wenn Du dies anschaltest, dann können nur eingeloggte Benutzer des Blogs die Statistik in der Seitenleiste sehen.');
@define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS', 'Reporting Cache'); @define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS', 'Reporting Cache');
@define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS_DESC', 'Das Erzeugen des Reports erzeugt Last auf der Datenbank, deshalb sollte der Report gecached werden. Hier wird eingestellt, wie viele Minuten mindestens gewartet werden soll, bevor ein neuer Report erstellt wird.'); @define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS_DESC', 'Das Erzeugen des Reports erzeugt Last auf der Datenbank, deshalb sollte der Report gecached werden. Hier wird eingestellt, wie viele Minuten mindestens gewartet werden soll, bevor ein neuer Report erstellt wird.');
@define('PLUGIN_SPAMBLOCK_BEE_TODAY', 'Heute:');
@define('PLUGIN_SPAMBLOCK_BEE_LAST_X_DAYS', 'Die letzten %d Tage:');

View file

@ -79,8 +79,10 @@
@define('PLUGIN_SPAMBLOCK_BEE_DAYS', 'Anzuzeigende Tage'); @define('PLUGIN_SPAMBLOCK_BEE_DAYS', 'Anzuzeigende Tage');
@define('PLUGIN_SPAMBLOCK_BEE_DAYS_DESC', 'Der Report wird für die letzten X Tage erstellt. Hier kannst Du mehrere Tage Komma separiert einstellen, für die jeweils ein Report dargestellt werden soll.'); @define('PLUGIN_SPAMBLOCK_BEE_DAYS_DESC', 'Der Report wird für die letzten X Tage erstellt. Hier kannst Du mehrere Tage Komma separiert einstellen, für die jeweils ein Report dargestellt werden soll.');
@define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES', 'Datenbank Suchen'); @define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES', 'Datenbank Suchen');
@define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES_DESC', 'Dieses plugin durchsucht die spamblocklog Tabelle. Hier kannst Du Suchen für Deine AntiSpam Maßnamen einstellen, über die gezählt werden soll. In jede Zeile kommt eine Einstellung, Format ist DeinNameFürAntiSpamArt:DbSuche. Beispiel: "BayesPlugin:%Bayes%" wird alle Einträge zählen, die "Bayes" irgendwo in ihrem Titel haben und sie als "BayesPlugin" im Report darstellen.'); @define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES_DESC', 'Dieses plugin durchsucht die spamblocklog Tabelle. Hier kannst Du Suchen für Deine AntiSpam Maßnamen einstellen, über die gezählt werden soll. In jede Zeile kommt eine Einstellung, Format ist DeinNameFürAntiSpamArt:Suchbegriff. Das Zeichen % kann als Wildcard benutzt werden. Beispiel: "BayesPlugin:%Bayes%" wird alle Einträge zählen, die "Bayes" irgendwo in ihrem Titel haben und sie als "BayesPlugin" im Report darstellen.');
@define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN', 'Nur für eingeloggte Benutzer'); @define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN', 'Nur für eingeloggte Benutzer');
@define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC', 'Wenn Du dies anschaltest, dann können nur eingeloggte Benutzer des Blogs die Statistik in der Seitenleiste sehen.'); @define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC', 'Wenn Du dies anschaltest, dann können nur eingeloggte Benutzer des Blogs die Statistik in der Seitenleiste sehen.');
@define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS', 'Reporting Cache'); @define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS', 'Reporting Cache');
@define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS_DESC', 'Das Erzeugen des Reports erzeugt Last auf der Datenbank, deshalb sollte der Report gecached werden. Hier wird eingestellt, wie viele Minuten mindestens gewartet werden soll, bevor ein neuer Report erstellt wird.'); @define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS_DESC', 'Das Erzeugen des Reports erzeugt Last auf der Datenbank, deshalb sollte der Report gecached werden. Hier wird eingestellt, wie viele Minuten mindestens gewartet werden soll, bevor ein neuer Report erstellt wird.');
@define('PLUGIN_SPAMBLOCK_BEE_TODAY', 'Heute:');
@define('PLUGIN_SPAMBLOCK_BEE_LAST_X_DAYS', 'Die letzten %d Tage:');

View file

@ -81,9 +81,10 @@
@define('PLUGIN_SPAMBLOCK_BEE_DAYS', 'Days to show'); @define('PLUGIN_SPAMBLOCK_BEE_DAYS', 'Days to show');
@define('PLUGIN_SPAMBLOCK_BEE_DAYS_DESC', 'You can have the report display what events happened the last X days. You can configure more than one days by seperating them with comma.'); @define('PLUGIN_SPAMBLOCK_BEE_DAYS_DESC', 'You can have the report display what events happened the last X days. You can configure more than one days by seperating them with comma.');
@define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES', 'Database searches'); @define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES', 'Database searches');
@define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES_DESC', 'This plugin scans the spamblocklog table to generate its reports. You can enter searches you want to do here. One line is one search. The line should look like YourNameForTheBlock:SqlSearch. For instance "BayesPlugin:%Bayes%" will count all entries having "Bayes" anywhere in there title and report them as "BayesPlugin" in the sidebar.'); @define('PLUGIN_SPAMBLOCK_BEE_DBSEARCHES_DESC', 'This plugin scans the spamblocklog table to generate its reports. You can enter searches you want to do here. One line is one search. The line should look like YourNameForTheBlock:SearchTerm. You can use the character % as a wildcard. For instance "BayesPlugin:%Bayes%" will count all entries having "Bayes" anywhere in there title and report them as "BayesPlugin" in the sidebar.');
@define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN', 'Only for logged in users'); @define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN', 'Only for logged in users');
@define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC', 'If enabled, the sidebar will be visible only for logged in users (authors) of your blog.'); @define('PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC', 'If enabled, the sidebar will be visible only for logged in users (authors) of your blog.');
@define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS', 'Cache the report'); @define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS', 'Cache the report');
@define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS_DESC', 'Creating the report uses the database, so you should not create it with each pagecall but let it be cached. Here you set up the wait time (in minutes) before a new statistic is created.'); @define('PLUGIN_SPAMBLOCK_BEE_CACHEMINS_DESC', 'Creating the report uses the database, so you should not create it with each pagecall but let it be cached. Here you set up the wait time (in minutes) before a new statistic is created.');
@define('PLUGIN_SPAMBLOCK_BEE_TODAY', 'Today:');
@define('PLUGIN_SPAMBLOCK_BEE_LAST_X_DAYS', 'The last %d days:');

View file

@ -33,7 +33,7 @@ class serendipity_plugin_spamblock_bee extends serendipity_plugin {
$propbag->add('configuration', $configuration ); $propbag->add('configuration', $configuration );
} }
function introspect_config_item($name, &$propbag) { function introspect_config_item($name, &$propbag) {
global $serendipity; global $serendipity;
@ -71,7 +71,7 @@ Bayes:%Bayes%'
$propbag->add('type', 'boolean'); $propbag->add('type', 'boolean');
$propbag->add('name', PLUGIN_SPAMBLOCK_BEE_LOGGEDIN); $propbag->add('name', PLUGIN_SPAMBLOCK_BEE_LOGGEDIN);
$propbag->add('description', PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC); $propbag->add('description', PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC);
$propbag->add('default', true); $propbag->add('default', true);
break; break;
default: default:
return false; return false;
@ -87,42 +87,59 @@ Bayes:%Bayes%'
if ($_SESSION['serendipityAuthedUser'] != true) return; if ($_SESSION['serendipityAuthedUser'] != true) return;
} }
$title = $this->get_config('title', $this->title); $title = $this->get_config('title', $this->title);
$statsCached = $this->loadCachedStats();
$stats = array();
$stats = $this->loadCachedStats(); if (!empty($statsCached)) {
if (empty($stats)) { $stats = $statsCached;
$stats = ""; }
$days = explode(',', $this->get_config('days'));
$searches = preg_split('/(?:\r?\n|\r)/', $this->get_config('db_search_pattern'));
$todayAtMidnight = mktime(0,0,0, date("n"), date("j"), date("Y"));
$timestampDay = 60 * 60 * 24;
$statsString = '';
foreach ($days as $day) {
if (!isset($stats[$day])) {
$stats[$day] = array();
}
$sql = "SELECT COUNT(*) as total FROM {$serendipity['dbPrefix']}spamblocklog WHERE reason like '%s' and timestamp>%d;"; $timestamp = $todayAtMidnight - ($timestampDay * (trim($day) -1));
$days = explode(',', $this->get_config('days')); if ($day==1) {
$searches = explode("\n", $this->get_config('db_search_pattern')); $statsString .= '<b>' . PLUGIN_SPAMBLOCK_BEE_TODAY . '</b> <br>';
} else {
$statsString .= '<b>' . sprintf(PLUGIN_SPAMBLOCK_BEE_LAST_X_DAYS, $day) . '</b><br>';
}
$todayAtMidnight = mktime(0,0,0, date("n"), date("j"), date("Y")); foreach ($searches as $search) {
//echo "today: $todayAtMidnight<br>"; $singleSearch = explode(':', $search, 2);
$singleSearch[0] = trim($singleSearch[0]);
$timestampDay = 60 * 60 * 24; $singleSearch[1] = trim($singleSearch[1]);
//echo "diffDay: $timestampDay<br>";
foreach ($days as $day) { if (empty($statsCached)) {
$timestamp = $todayAtMidnight - ($timestampDay * (trim($day) -1)); $sql = "SELECT COUNT(*) as total FROM {$serendipity['dbPrefix']}spamblocklog WHERE reason like '%s' and timestamp>%d;";
if ($day==1) { $singleSql = sprintf($sql, serendipity_db_escape_string($singleSearch[1]), $timestamp);
$stats .= "<b>Heute:</b> <br>"; $result = serendipity_db_query($singleSql, true);
}
else {
$stats .= "<b>Die letzen $day Tage:</b> <br>";
}
//echo "ts: $timestamp<br>";
foreach ($searches as $search) {
$singleSearch = explode(':', $search,2);
$singleSql = sprintf($sql, trim($singleSearch[1]), $timestamp);
$result = serendipity_db_query($singleSql,TRUE);
if (!empty($result['total'])) { if (!empty($result['total'])) {
$stats .= "{$singleSearch[0]}: {$result['total']}<br/>"; $stats[$day][$singleSearch[1]] = $result['total'];
} else {
$stats[$day][$singleSearch[1]] = 0;
} }
} }
$searchResult = isset($stats[$day][$singleSearch[1]]) ? $stats[$day][$singleSearch[1]] : 0;
$statsString .= "{$singleSearch[0]}: {$searchResult}<br>";
} }
}
if (empty($statsCached)) {
$this->cacheStats($stats); $this->cacheStats($stats);
} }
echo $stats;
echo $statsString;
} }
function loadCachedStats() { function loadCachedStats() {
@ -136,11 +153,12 @@ Bayes:%Bayes%'
} }
fflush($fh); fflush($fh);
fclose($fh); fclose($fh);
return $stats; return unserialize($stats);
} }
return null; return array();
} }
function cacheStats($stats) { function cacheStats($stats) {
$stats = serialize($stats);
$cacheFile = $this->getCacheFilename(); $cacheFile = $this->getCacheFilename();
$fh = fopen($cacheFile, 'w'); $fh = fopen($cacheFile, 'w');
fputs($fh, $stats, strlen($stats)); fputs($fh, $stats, strlen($stats));
@ -155,7 +173,7 @@ Bayes:%Bayes%'
if ($this->cache_file === null) { if ($this->cache_file === null) {
$this->cache_file = $serendipity['serendipityPath'] . PATH_SMARTY_COMPILE . '/serendipity_plugin_spamblog_bee'; $this->cache_file = $serendipity['serendipityPath'] . PATH_SMARTY_COMPILE . '/serendipity_plugin_spamblog_bee';
} }
return $this->cache_file; return $this->cache_file;
} }
function cleanup() { function cleanup() {