We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Commit 1caa0842 authored by Evan Prodromou's avatar Evan Prodromou

Collective guilt for registrants from the same IP address

If someone tries to register from an IP address that a silenced user
has registered from, prevent it.

When silencing someone, silence everyone else who registered from the
same IP address.
parent 1d85bfec
......@@ -57,6 +57,19 @@ class RegisterThrottlePlugin extends Plugin
86400 => 5, // per day
3600 => 3); // per hour
/**
* Disallow registration if a silenced user has registered from
* this IP address.
*/
public $silenced = true;
/**
* Whether we're enabled; prevents recursion.
*/
static private $enabled = true;
/**
* Database schema setup
*
......@@ -138,6 +151,18 @@ class RegisterThrottlePlugin extends Plugin
}
}
// Check for silenced users
if ($this->silenced) {
$ids = Registration_ip::usersByIP($ipaddress);
foreach ($ids as $id) {
$profile = Profile::staticGet('id', $id);
if ($profile->isSilenced()) {
throw new Exception(_("A banned user has registered from this address."));
}
}
}
return true;
}
......@@ -245,4 +270,59 @@ class RegisterThrottlePlugin extends Plugin
return null;
}
}
/**
* When silencing a user, silence all other users registered from that IP
* address.
*
* @param Profile $profile Person getting a new role
* @param string $role Role being assigned like 'moderator' or 'silenced'
*
* @return boolean hook value
*/
function onEndGrantRole($profile, $role)
{
if (!self::$enabled) {
return true;
}
if ($role != Profile_role::SILENCED) {
return true;
}
if (!$this->silenced) {
return true;
}
$ri = Registration_ip::staticGet('user_id', $profile->id);
if (empty($ri)) {
return true;
}
$ids = Registration_ip::usersByIP($ri->ipaddress);
foreach ($ids as $id) {
if ($id == $profile->id) {
continue;
}
$other = Profile::staticGet('id', $id);
if (empty($other)) {
continue;
}
if ($other->isSilenced()) {
continue;
}
$old = self::$enabled;
self::$enabled = false;
$other->silence();
self::$enabled = $old;
}
}
}
......@@ -111,8 +111,33 @@ class Registration_ip extends Memcached_DataObject
*
* @return array magic three-false array that stops auto-incrementing.
*/
function sequenceKey()
{
return array(false, false, false);
}
/**
* Get the users who've registered with this ip address.
*
* @param Array $ipaddress IP address to check for
*
* @return Array IDs of users who registered with this address.
*/
static function usersByIP($ipaddress)
{
$ids = array();
$ri = new Registration_ip();
$ri->ipaddress = $ipaddress;
if ($ri->find()) {
while ($ri->fetch()) {
$ids[] = $ri->user_id;
}
}
return $ids;
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment