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
*
}
}
+ // Check for silenced users
+
+ if ($this->silenced) {
+ $ids = Registration_ip::usersByIP($ipaddress);
+ foreach ($ids as $id) {
+ $profile = Profile::staticGet('id', $id);
+ if ($profile && $profile->isSilenced()) {
+ throw new Exception(_m("A banned user has registered from this address."));
+ }
+ }
+ }
+
return true;
}
/**
- * Called after someone registers.
+ * Called after someone registers, by any means.
*
* We record the successful registration and IP address.
*
- * @param Action $action Action that is being executed
+ * @param Profile $profile new user's profile
+ * @param User $user new user
*
* @return boolean hook value
*
*/
- function onEndRegistrationTry($action)
+ function onEndUserRegister($profile, $user)
{
$ipaddress = $this->_getIpAddress();
if (empty($ipaddress)) {
- throw new ServerException(_m('Cannot find IP address.'));
- }
-
- $user = common_current_user();
-
- if (empty($user)) {
- throw new ServerException(_m('Cannot find user after successful registration.'));
+ // User registration can happen from command-line scripts etc.
+ return true;
}
$reg = new Registration_ip();
'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:RegisterThrottle',
'description' =>
- _m('Throttles excessive registration from a single IP.'));
+ _m('Throttles excessive registration from a single IP address.'));
return true;
}
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;
+ }
+ }
}