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_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:');

View file

@ -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:');

View file

@ -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:');

View file

@ -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 .= '<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"));
//echo "today: $todayAtMidnight<br>";
$timestampDay = 60 * 60 * 24;
//echo "diffDay: $timestampDay<br>";
foreach ($days as $day) {
$timestamp = $todayAtMidnight - ($timestampDay * (trim($day) -1));
if ($day==1) {
$stats .= "<b>Heute:</b> <br>";
}
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);
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']}<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);
}
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() {