X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FRegisterThrottle%2FRegisterThrottlePlugin.php;h=e3982427da5053b5400aa7bce0e38a8095339a78;hb=c97048d01bea468e0cf8865b60c3c250b4515c39;hp=05709b7807b2cc408d34168409b3cfb2d05ec3ee;hpb=c89ed16d24d56879bf40a70d500509d1d42a4532;p=quix0rs-gnu-social.git diff --git a/plugins/RegisterThrottle/RegisterThrottlePlugin.php b/plugins/RegisterThrottle/RegisterThrottlePlugin.php index 05709b7807..e3982427da 100644 --- a/plugins/RegisterThrottle/RegisterThrottlePlugin.php +++ b/plugins/RegisterThrottle/RegisterThrottlePlugin.php @@ -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 * @@ -113,7 +126,6 @@ class RegisterThrottlePlugin extends Plugin * @return boolean hook value * */ - function onStartRegistrationTry($action) { $ipaddress = $this->_getIpAddress(); @@ -134,7 +146,19 @@ class RegisterThrottlePlugin extends Plugin $now = time(); $this->debug("Comparing {$regtime} to {$now}"); if ($now - $regtime < $seconds) { - throw new Exception(_("Too many registrations. Take a break and try again later.")); + throw new Exception(_m("Too many registrations. Take a break and try again later.")); + } + } + } + + // 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.")); } } } @@ -143,28 +167,24 @@ class RegisterThrottlePlugin extends Plugin } /** - * 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(); @@ -197,7 +217,7 @@ class RegisterThrottlePlugin extends Plugin '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; } @@ -246,4 +266,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; + } + } }