* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
-
class BlacklistPlugin extends Plugin
{
const VERSION = STATUSNET_VERSION;
public $urls = array();
public $canAdmin = true;
- private $_nicknamePatterns = array();
- private $_urlPatterns = array();
-
- /**
- * Initialize the plugin
- *
- * @return void
- */
-
- function initialize()
+ function _getNicknamePatterns()
{
$confNicknames = $this->_configArray('blacklist', 'nicknames');
$dbNicknames = Nickname_blacklist::getPatterns();
- $this->_nicknamePatterns = array_merge($this->nicknames,
- $confNicknames,
- $dbNicknames);
+ return array_merge($this->nicknames,
+ $confNicknames,
+ $dbNicknames);
+ }
+ function _getUrlPatterns()
+ {
$confURLs = $this->_configArray('blacklist', 'urls');
$dbURLs = Homepage_blacklist::getPatterns();
- $this->_urlPatterns = array_merge($this->urls,
- $confURLs,
- $dbURLs);
+ return array_merge($this->urls,
+ $confURLs,
+ $dbURLs);
}
/**
*
* @return boolean hook value
*/
-
function onCheckSchema()
{
$schema = Schema::get();
// For storing blacklist patterns for nicknames
-
$schema->ensureTable('nickname_blacklist',
array(new ColumnDef('pattern',
'varchar',
*
* @return array configuration values
*/
-
function _configArray($section, $setting)
{
$config = common_config($section, $setting);
*
* @return boolean hook value
*/
-
function onStartRegistrationTry($action)
{
$homepage = strtolower($action->trimmed('homepage'));
if (!empty($homepage)) {
if (!$this->_checkUrl($homepage)) {
- $msg = sprintf(_m("You may not register with homepage '%s'"),
+ $msg = sprintf(_m("You may not register with homepage '%s'."),
$homepage);
throw new ClientException($msg);
}
if (!empty($nickname)) {
if (!$this->_checkNickname($nickname)) {
- $msg = sprintf(_m("You may not register with nickname '%s'"),
+ $msg = sprintf(_m("You may not register with nickname '%s'."),
$nickname);
throw new ClientException($msg);
}
*
* @return boolean hook value
*/
-
function onStartProfileSaveForm($action)
{
$homepage = strtolower($action->trimmed('homepage'));
if (!empty($homepage)) {
if (!$this->_checkUrl($homepage)) {
- $msg = sprintf(_m("You may not use homepage '%s'"),
+ $msg = sprintf(_m("You may not use homepage '%s'."),
$homepage);
throw new ClientException($msg);
}
if (!empty($nickname)) {
if (!$this->_checkNickname($nickname)) {
- $msg = sprintf(_m("You may not use nickname '%s'"),
+ $msg = sprintf(_m("You may not use nickname '%s'."),
$nickname);
throw new ClientException($msg);
}
*
* @return boolean hook value
*/
-
function onStartNoticeSave(&$notice)
{
common_replace_urls_callback($notice->content,
*
* @return boolean hook value
*/
-
function checkNoticeUrl($url)
{
// It comes in special'd, so we unspecial it
$url = htmlspecialchars_decode($url);
if (!$this->_checkUrl($url)) {
- $msg = sprintf(_m("You may not use url '%s' in notices"),
+ $msg = sprintf(_m("You may not use URL \"%s\" in notices."),
$url);
throw new ClientException($msg);
}
*
* @return boolean true means it's OK, false means it's bad
*/
-
private function _checkUrl($url)
{
- foreach ($this->_urlPatterns as $pattern) {
- common_debug("Checking $url against $pattern");
- if (preg_match("/$pattern/", $url)) {
+ $patterns = $this->_getUrlPatterns();
+
+ foreach ($patterns as $pattern) {
+ if ($pattern != '' && preg_match("/$pattern/", $url)) {
return false;
}
}
*
* @return boolean true means it's OK, false means it's bad
*/
-
private function _checkNickname($nickname)
{
- foreach ($this->_nicknamePatterns as $pattern) {
- common_debug("Checking $nickname against $pattern");
- if (preg_match("/$pattern/", $nickname)) {
+ $patterns = $this->_getNicknamePatterns();
+
+ foreach ($patterns as $pattern) {
+ if ($pattern != '' && preg_match("/$pattern/", $nickname)) {
return false;
}
}
*
* @return boolean hook return
*/
-
function onRouterInitialized($m)
{
$m->connect('admin/blacklist', array('action' => 'blacklistadminpanel'));
*
* @return boolean hook return
*/
-
function onAutoload($cls)
{
switch (strtolower($cls))
*
* @return boolean hook value
*/
-
function onPluginVersion(&$versions)
{
$versions[] = array('name' => 'Blacklist',
'homepage' =>
'http://status.net/wiki/Plugin:Blacklist',
'description' =>
- _m('Keep a blacklist of forbidden nickname '.
+ _m('Keeps a blacklist of forbidden nickname '.
'and URL patterns.'));
return true;
}
*
* @return boolean hook value
*/
-
function onAdminPanelCheck($name, &$isOK)
{
if ($name == 'blacklist') {
*
* @return boolean hook value
*/
-
function onEndAdminPanelNav($nav)
{
if (AdminPanelAction::canAdmin('blacklist')) {
$action_name = $nav->action->trimmed('action');
$nav->out->menuItem(common_local_url('blacklistadminpanel'),
- _('Blacklist'),
- _('Blacklist configuration'),
+ _m('Blacklist'),
+ _m('Blacklist configuration'),
$action_name == 'blacklistadminpanel',
'nav_blacklist_admin_panel');
}
$action->elementStart('li');
$this->checkboxAndText($action,
'blacklistnickname',
- _('Add this nickname pattern to blacklist'),
+ _m('Add this nickname pattern to blacklist'),
'blacklistnicknamepattern',
$this->patternizeNickname($user->nickname));
$action->elementEnd('li');
$action->elementStart('li');
$this->checkboxAndText($action,
'blacklisthomepage',
- _('Add this homepage pattern to blacklist'),
+ _m('Add this homepage pattern to blacklist'),
'blacklisthomepagepattern',
$this->patternizeHomepage($profile->homepage));
$action->elementEnd('li');
$hostname = parse_url($homepage, PHP_URL_HOST);
return $hostname;
}
+
+ function onStartHandleFeedEntry($activity)
+ {
+ return $this->_checkActivity($activity);
+ }
+
+ function onStartHandleSalmon($activity)
+ {
+ return $this->_checkActivity($activity);
+ }
+
+ function _checkActivity($activity)
+ {
+ $actor = $activity->actor;
+
+ if (empty($actor)) {
+ return true;
+ }
+
+ $homepage = strtolower($actor->link);
+
+ if (!empty($homepage)) {
+ if (!$this->_checkUrl($homepage)) {
+ $msg = sprintf(_m("Users from '%s' blocked."),
+ $homepage);
+ throw new ClientException($msg);
+ }
+ }
+
+ $nickname = strtolower($actor->poco->preferredUsername);
+
+ if (!empty($nickname)) {
+ if (!$this->_checkNickname($nickname)) {
+ $msg = sprintf(_m("Posts from nickname '%s' disallowed."),
+ $nickname);
+ throw new ClientException($msg);
+ }
+ }
+
+ return true;
+ }
}