From dc49b31e3d2b43732e481b85bf3f7315e3926bba Mon Sep 17 00:00:00 2001 From: Janek Bevendorff Date: Sun, 19 Aug 2012 17:14:26 +0200 Subject: [PATCH] SpamBee: Implemented i18n for sidebar plugin and added English and German locales. Also fixed SQL inection vulnerability (although only admins could exploit it). --- .../UTF-8/lang_de.inc.php | 4 +- .../lang_de.inc.php | 4 +- .../lang_en.inc.php | 5 +- .../serendipity_plugin_spamblock_bee.php | 82 +++++++++++-------- 4 files changed, 59 insertions(+), 36 deletions(-) diff --git a/serendipity_event_spamblock_bee/UTF-8/lang_de.inc.php b/serendipity_event_spamblock_bee/UTF-8/lang_de.inc.php index 8d331545..45b1841a 100644 --- a/serendipity_event_spamblock_bee/UTF-8/lang_de.inc.php +++ b/serendipity_event_spamblock_bee/UTF-8/lang_de.inc.php @@ -79,8 +79,10 @@ @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_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_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_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:'); diff --git a/serendipity_event_spamblock_bee/lang_de.inc.php b/serendipity_event_spamblock_bee/lang_de.inc.php index f643dc0f..59c2afe5 100644 --- a/serendipity_event_spamblock_bee/lang_de.inc.php +++ b/serendipity_event_spamblock_bee/lang_de.inc.php @@ -79,8 +79,10 @@ @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_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_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_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:'); diff --git a/serendipity_event_spamblock_bee/lang_en.inc.php b/serendipity_event_spamblock_bee/lang_en.inc.php index 906a811d..ecf87210 100644 --- a/serendipity_event_spamblock_bee/lang_en.inc.php +++ b/serendipity_event_spamblock_bee/lang_en.inc.php @@ -81,9 +81,10 @@ @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_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_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_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:'); diff --git a/serendipity_event_spamblock_bee/serendipity_plugin_spamblock_bee.php b/serendipity_event_spamblock_bee/serendipity_plugin_spamblock_bee.php index 2aff3b51..d540e5d4 100644 --- a/serendipity_event_spamblock_bee/serendipity_plugin_spamblock_bee.php +++ b/serendipity_event_spamblock_bee/serendipity_plugin_spamblock_bee.php @@ -33,7 +33,7 @@ class serendipity_plugin_spamblock_bee extends serendipity_plugin { $propbag->add('configuration', $configuration ); } - + function introspect_config_item($name, &$propbag) { global $serendipity; @@ -71,7 +71,7 @@ Bayes:%Bayes%' $propbag->add('type', 'boolean'); $propbag->add('name', PLUGIN_SPAMBLOCK_BEE_LOGGEDIN); $propbag->add('description', PLUGIN_SPAMBLOCK_BEE_LOGGEDIN_DESC); - $propbag->add('default', true); + $propbag->add('default', true); break; default: return false; @@ -87,42 +87,59 @@ Bayes:%Bayes%' 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($stats)) { - $stats = ""; + if (!empty($statsCached)) { + $stats = $statsCached; + } + + $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;"; - $days = explode(',', $this->get_config('days')); - $searches = explode("\n", $this->get_config('db_search_pattern')); + $timestamp = $todayAtMidnight - ($timestampDay * (trim($day) -1)); + if ($day==1) { + $statsString .= '' . PLUGIN_SPAMBLOCK_BEE_TODAY . '
'; + } else { + $statsString .= '' . sprintf(PLUGIN_SPAMBLOCK_BEE_LAST_X_DAYS, $day) . '
'; + } - $todayAtMidnight = mktime(0,0,0, date("n"), date("j"), date("Y")); - //echo "today: $todayAtMidnight
"; - - $timestampDay = 60 * 60 * 24; - //echo "diffDay: $timestampDay
"; - foreach ($days as $day) { - $timestamp = $todayAtMidnight - ($timestampDay * (trim($day) -1)); - if ($day==1) { - $stats .= "Heute:
"; - } - else { - $stats .= "Die letzen $day Tage:
"; - } - //echo "ts: $timestamp
"; - foreach ($searches as $search) { - $singleSearch = explode(':', $search,2); - $singleSql = sprintf($sql, trim($singleSearch[1]), $timestamp); - $result = serendipity_db_query($singleSql,TRUE); + foreach ($searches as $search) { + $singleSearch = explode(':', $search, 2); + $singleSearch[0] = trim($singleSearch[0]); + $singleSearch[1] = trim($singleSearch[1]); + + if (empty($statsCached)) { + $sql = "SELECT COUNT(*) as total FROM {$serendipity['dbPrefix']}spamblocklog WHERE reason like '%s' and timestamp>%d;"; + $singleSql = sprintf($sql, serendipity_db_escape_string($singleSearch[1]), $timestamp); + $result = serendipity_db_query($singleSql, true); if (!empty($result['total'])) { - $stats .= "{$singleSearch[0]}: {$result['total']}
"; + $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}
"; } + } + + if (empty($statsCached)) { $this->cacheStats($stats); } - echo $stats; + + echo $statsString; } function loadCachedStats() { @@ -136,11 +153,12 @@ Bayes:%Bayes%' } fflush($fh); fclose($fh); - return $stats; + return unserialize($stats); } - return null; + return array(); } function cacheStats($stats) { + $stats = serialize($stats); $cacheFile = $this->getCacheFilename(); $fh = fopen($cacheFile, 'w'); fputs($fh, $stats, strlen($stats)); @@ -155,7 +173,7 @@ Bayes:%Bayes%' if ($this->cache_file === null) { $this->cache_file = $serendipity['serendipityPath'] . PATH_SMARTY_COMPILE . '/serendipity_plugin_spamblog_bee'; } - return $this->cache_file; + return $this->cache_file; } function cleanup() {