diff --git a/plugins/Blacklist/BlacklistPlugin.php b/plugins/Blacklist/BlacklistPlugin.php
index fb8f7306f5..a7d0942da5 100644
--- a/plugins/Blacklist/BlacklistPlugin.php
+++ b/plugins/Blacklist/BlacklistPlugin.php
@@ -62,13 +62,56 @@ class BlacklistPlugin extends Plugin
{
$confNicknames = $this->_configArray('blacklist', 'nicknames');
+ $dbNicknames = Nickname_blacklist::getPatterns();
+
$this->_nicknamePatterns = array_merge($this->nicknames,
- $confNicknames);
+ $confNicknames,
+ $dbNicknames);
$confURLs = $this->_configArray('blacklist', 'urls');
+ $dbURLs = Homepage_blacklist::getPatterns();
+
$this->_urlPatterns = array_merge($this->urls,
- $confURLs);
+ $confURLs,
+ $dbURLs);
+ }
+
+ /**
+ * Database schema setup
+ *
+ * @return boolean hook value
+ */
+
+ function onCheckSchema()
+ {
+ $schema = Schema::get();
+
+ // For storing blacklist patterns for nicknames
+
+ $schema->ensureTable('nickname_blacklist',
+ array(new ColumnDef('pattern',
+ 'varchar',
+ 255,
+ false,
+ 'PRI'),
+ new ColumnDef('created',
+ 'datetime',
+ null,
+ false)));
+
+ $schema->ensureTable('homepage_blacklist',
+ array(new ColumnDef('pattern',
+ 'varchar',
+ 255,
+ false,
+ 'PRI'),
+ new ColumnDef('created',
+ 'datetime',
+ null,
+ false)));
+
+ return true;
}
/**
@@ -280,6 +323,10 @@ class BlacklistPlugin extends Plugin
{
switch (strtolower($cls))
{
+ case 'nickname_blacklist':
+ case 'homepage_blacklist':
+ include_once INSTALLDIR.'/plugins/Blacklist/'.ucfirst($cls).'.php';
+ return false;
case 'blacklistadminpanelaction':
$base = strtolower(mb_substr($cls, 0, -6));
include_once INSTALLDIR.'/plugins/Blacklist/'.$base.'.php';
@@ -391,20 +438,14 @@ class BlacklistPlugin extends Plugin
function onEndDeleteUser($action, $user)
{
- common_debug("Action args: " . print_r($action->args, true));
-
if ($action->boolean('blacklisthomepage')) {
$pattern = $action->trimmed('blacklisthomepagepattern');
- $confURLs = $this->_configArray('blacklist', 'urls');
- $confURLs[] = $pattern;
- Config::save('blacklist', 'urls', implode("\r\n", $confURLs));
+ Homepage_blacklist::ensurePattern($pattern);
}
if ($action->boolean('blacklistnickname')) {
$pattern = $action->trimmed('blacklistnicknamepattern');
- $confNicknames = $this->_configArray('blacklist', 'nicknames');
- $confNicknames[] = $pattern;
- Config::save('blacklist', 'nicknames', implode("\r\n", $confNicknames));
+ Nickname_blacklist::ensurePattern($pattern);
}
return true;
diff --git a/plugins/Blacklist/Homepage_blacklist.php b/plugins/Blacklist/Homepage_blacklist.php
new file mode 100644
index 0000000000..32080667e1
--- /dev/null
+++ b/plugins/Blacklist/Homepage_blacklist.php
@@ -0,0 +1,189 @@
+
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
+
+/**
+ * Data class for Homepage blacklist
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * @see DB_DataObject
+ */
+
+class Homepage_blacklist extends Memcached_DataObject
+{
+ public $__table = 'homepage_blacklist'; // table name
+ public $pattern; // string pattern
+ public $created; // datetime
+
+ /**
+ * Get an instance by key
+ *
+ * This is a utility method to get a single instance with a given key value.
+ *
+ * @param string $k Key to use to lookup (usually 'user_id' for this class)
+ * @param mixed $v Value to lookup
+ *
+ * @return Homepage_blacklist object found, or null for no hits
+ *
+ */
+
+ function staticGet($k, $v=null)
+ {
+ return Memcached_DataObject::staticGet('Homepage_blacklist', $k, $v);
+ }
+
+ /**
+ * return table definition for DB_DataObject
+ *
+ * DB_DataObject needs to know something about the table to manipulate
+ * instances. This method provides all the DB_DataObject needs to know.
+ *
+ * @return array array of column definitions
+ */
+
+ function table()
+ {
+ return array('pattern' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+ 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
+ }
+
+ /**
+ * return key definitions for DB_DataObject
+ *
+ * DB_DataObject needs to know about keys that the table has; this function
+ * defines them.
+ *
+ * @return array key definitions
+ */
+
+ function keys()
+ {
+ return array('pattern' => 'K');
+ }
+
+ /**
+ * return key definitions for Memcached_DataObject
+ *
+ * Our caching system uses the same key definitions, but uses a different
+ * method to get them.
+ *
+ * @return array key definitions
+ */
+
+ function keyTypes()
+ {
+ return $this->keys();
+ }
+
+ /**
+ * Return a list of patterns to check
+ *
+ * @return array string patterns to check
+ */
+
+ static function getPatterns()
+ {
+ $patterns = self::cacheGet('homepage_blacklist:patterns');
+
+ if ($patterns === false) {
+
+ $patterns = array();
+
+ $nb = new Homepage_blacklist();
+
+ $nb->find();
+
+ while ($nb->fetch()) {
+ $patterns[] = $nb->pattern;
+ }
+
+ self::cacheSet('homepage_blacklist:patterns', $patterns);
+ }
+
+ return $patterns;
+ }
+
+ /**
+ * Save new list of patterns
+ *
+ * @return array of patterns to check
+ */
+
+ static function saveNew($newPatterns)
+ {
+ $oldPatterns = self::getPatterns();
+
+ // Delete stuff that's old that not in new
+
+ $toDelete = array_diff($oldPatterns, $newPatterns);
+
+ // Insert stuff that's in new and not in old
+
+ $toInsert = array_diff($newPatterns, $oldPatterns);
+
+ foreach ($toDelete as $pattern) {
+ $nb = Homepage_blacklist::staticGet('pattern', $pattern);
+ if (!empty($nb)) {
+ $nb->delete();
+ }
+ }
+
+ foreach ($toInsert as $pattern) {
+ $nb = new Homepage_blacklist();
+ $nb->pattern = $pattern;
+ $nb->created = common_sql_now();
+ $nb->insert();
+ }
+
+ self::blow('homepage_blacklist:patterns');
+ }
+
+ static function ensurePattern($pattern)
+ {
+ $hb = Homepage_blacklist::staticGet('pattern', $pattern);
+
+ if (empty($nb)) {
+ $hb = new Homepage_blacklist();
+ $hb->pattern = $pattern;
+ $hb->created = common_sql_now();
+ $hb->insert();
+ self::blow('homepage_blacklist:patterns');
+ }
+ }
+}
diff --git a/plugins/Blacklist/Nickname_blacklist.php b/plugins/Blacklist/Nickname_blacklist.php
new file mode 100644
index 0000000000..9810631444
--- /dev/null
+++ b/plugins/Blacklist/Nickname_blacklist.php
@@ -0,0 +1,180 @@
+
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+if (!defined('STATUSNET')) {
+ exit(1);
+}
+
+require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
+
+/**
+ * Data class for Nickname blacklist
+ *
+ * @category Action
+ * @package StatusNet
+ * @author Evan Prodromou
+ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
+ * @link http://status.net/
+ *
+ * @see DB_DataObject
+ */
+
+class Nickname_blacklist extends Memcached_DataObject
+{
+ public $__table = 'nickname_blacklist'; // table name
+ public $pattern; // string pattern
+ public $created; // datetime
+
+ /**
+ * Get an instance by key
+ *
+ * This is a utility method to get a single instance with a given key value.
+ *
+ * @param string $k Key to use to lookup
+ * @param mixed $v Value to lookup
+ *
+ * @return Nickname_blacklist object found, or null for no hits
+ *
+ */
+
+ function staticGet($k, $v=null)
+ {
+ return Memcached_DataObject::staticGet('Nickname_blacklist', $k, $v);
+ }
+
+ /**
+ * return table definition for DB_DataObject
+ *
+ * @return array array of column definitions
+ */
+
+ function table()
+ {
+ return array('pattern' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
+ 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
+ }
+
+ /**
+ * return key definitions for DB_DataObject
+ *
+ * @return array key definitions
+ */
+
+ function keys()
+ {
+ return array('pattern' => 'K');
+ }
+
+ /**
+ * return key definitions for Memcached_DataObject
+ *
+ * @return array key definitions
+ */
+
+ function keyTypes()
+ {
+ return $this->keys();
+ }
+
+ /**
+ * Return a list of patterns to check
+ *
+ * @return array string patterns to check
+ */
+
+ static function getPatterns()
+ {
+ $patterns = self::cacheGet('nickname_blacklist:patterns');
+
+ if ($patterns === false) {
+
+ $patterns = array();
+
+ $nb = new Nickname_blacklist();
+
+ $nb->find();
+
+ while ($nb->fetch()) {
+ $patterns[] = $nb->pattern;
+ }
+
+ self::cacheSet('nickname_blacklist:patterns', $patterns);
+ }
+
+ return $patterns;
+ }
+
+ /**
+ * Save new list of patterns
+ *
+ * @return array of patterns to check
+ */
+
+ static function saveNew($newPatterns)
+ {
+ $oldPatterns = self::getPatterns();
+
+ // Delete stuff that's old that not in new
+
+ $toDelete = array_diff($oldPatterns, $newPatterns);
+
+ // Insert stuff that's in new and not in old
+
+ $toInsert = array_diff($newPatterns, $oldPatterns);
+
+ foreach ($toDelete as $pattern) {
+ $nb = Nickname_blacklist::staticGet('pattern', $pattern);
+ if (!empty($nb)) {
+ $nb->delete();
+ }
+ }
+
+ foreach ($toInsert as $pattern) {
+ $nb = new Nickname_blacklist();
+ $nb->pattern = $pattern;
+ $nb->created = common_sql_now();
+ $nb->insert();
+ }
+
+ self::blow('nickname_blacklist:patterns');
+ }
+
+ static function ensurePattern($pattern)
+ {
+ $nb = Nickname_blacklist::staticGet('pattern', $pattern);
+
+ if (empty($nb)) {
+ $nb = new Nickname_blacklist();
+ $nb->pattern = $pattern;
+ $nb->created = common_sql_now();
+ $nb->insert();
+ self::blow('nickname_blacklist:patterns');
+ }
+ }
+}
diff --git a/plugins/Blacklist/blacklistadminpanel.php b/plugins/Blacklist/blacklistadminpanel.php
index 98d07080db..b996aba8dc 100644
--- a/plugins/Blacklist/blacklistadminpanel.php
+++ b/plugins/Blacklist/blacklistadminpanel.php
@@ -88,35 +88,24 @@ class BlacklistadminpanelAction extends AdminPanelAction
function saveSettings()
{
- static $settings = array(
- 'blacklist' => array('nicknames', 'urls'),
- );
+ $nickPatterns = array();
- $values = array();
+ $rawNickPatterns = explode("\n", $this->trimmed('blacklist-nicknames'));
- foreach ($settings as $section => $parts) {
- foreach ($parts as $setting) {
- $values[$section][$setting] = $this->trimmed("$section-$setting");
- }
+ foreach ($rawNickPatterns as $raw) {
+ $nickPatterns[] = trim($raw);
}
- // This throws an exception on validation errors
+ Nickname_blacklist::saveNew($nickPatterns);
- $this->validate($values);
+ $rawUrlPatterns = explode("\n", $this->trimmed('blacklist-urls'));
+ $urlPatterns = array();
- // assert(all values are valid);
-
- $config = new Config();
-
- $config->query('BEGIN');
-
- foreach ($settings as $section => $parts) {
- foreach ($parts as $setting) {
- Config::save($section, $setting, $values[$section][$setting]);
- }
+ foreach ($rawUrlPatterns as $raw) {
+ $urlPatterns[] = trim($raw);
}
- $config->query('COMMIT');
+ Homepage_blacklist::saveNew($urlPatterns);
return;
}
@@ -191,14 +180,19 @@ class BlacklistAdminPanelForm extends Form
$this->out->elementStart('ul', 'form_data');
$this->out->elementStart('li');
+
+ $nickPatterns = Nickname_blacklist::getPatterns();
+
$this->out->textarea('blacklist-nicknames', _m('Nicknames'),
- common_config('blacklist', 'nicknames'),
+ implode("\r\n", $nickPatterns),
_('Patterns of nicknames to block, one per line'));
$this->out->elementEnd('li');
+ $urlPatterns = Homepage_blacklist::getPatterns();
+
$this->out->elementStart('li');
$this->out->textarea('blacklist-urls', _m('URLs'),
- common_config('blacklist', 'urls'),
+ implode("\r\n", $urlPatterns),
_('Patterns of URLs to block, one per line'));
$this->out->elementEnd('li');