* @link http://status.net/
*/
-if (!defined('STATUSNET')) {
- exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Throttle registration by IP address
*/
public $silenced = true;
+ /**
+ * Auto-silence all other users from the same registration_ip
+ * as the one being silenced. Caution: Many users may come from
+ * the same IP (even entire countries) without having any sort
+ * of relevant connection for moderation.
+ */
+ public $auto_silence_by_ip = false;
+
/**
* Whether we're enabled; prevents recursion.
*/
*
* @return boolean hook value; true means continue processing, false means stop.
*/
- function onCheckSchema()
+ public function onCheckSchema()
{
$schema = Schema::get();
// For storing user-submitted flags on profiles
- $schema->ensureTable('registration_ip',
- array(new ColumnDef('user_id', 'integer', null,
- false, 'PRI'),
- new ColumnDef('ipaddress', 'varchar', 15, false, 'MUL'),
- new ColumnDef('created', 'timestamp', null, false, 'MUL')));
-
+ $schema->ensureTable('registration_ip', Registration_ip::schemaDef());
return true;
}
- /**
- * Load related modules when needed
- *
- * @param string $cls Name of the class to be loaded
- *
- * @return boolean hook value; true means continue processing, false means stop.
- */
- function onAutoload($cls)
+ public function onRouterInitialized(URLMapper $m)
{
- $dir = dirname(__FILE__);
-
- switch ($cls)
- {
- case 'Registration_ip':
- include_once $dir . '/'.$cls.'.php';
- return false;
- default:
- return true;
- }
+ $m->connect('main/ipregistrations/:ipaddress',
+ array('action' => 'ipregistrations'),
+ array('ipaddress' => '[0-9a-f\.\:]+'));
}
/**
*
* @return boolean hook value
*/
- function onStartRegistrationTry($action)
+ public function onStartRegistrationTry($action)
{
$ipaddress = $this->_getIpAddress();
if ($this->silenced) {
$ids = Registration_ip::usersByIP($ipaddress);
foreach ($ids as $id) {
- $profile = Profile::staticGet('id', $id);
+ $profile = Profile::getKV('id', $id);
if ($profile && $profile->isSilenced()) {
// TRANS: Exception thrown when attempting to register from an IP address from which silenced users have registered.
throw new Exception(_m('A banned user has registered from this address.'));
return true;
}
+ function onEndShowSections(Action $action)
+ {
+ if (!$action instanceof ShowstreamAction) {
+ // early return for actions we're not interested in
+ return true;
+ }
+
+ $target = $action->getTarget();
+ if (!$target->isSilenced()) {
+ // Only show the IP of users who are not silenced.
+ return true;
+ }
+
+ $scoped = $action->getScoped();
+ if (!$scoped->hasRight(Right::SILENCEUSER)) {
+ // only show registration IP if we have the right to silence users
+ return true;
+ }
+
+ $ri = Registration_ip::getKV('user_id', $target->getID());
+ $ipaddress = null;
+ if ($ri instanceof Registration_ip) {
+ $ipaddress = $ri->ipaddress;
+ unset($ri);
+ }
+
+ $action->elementStart('div', array('id' => 'entity_mod_log',
+ 'class' => 'section'));
+
+ $action->element('h2', null, _('Registration IP'));
+
+ // TRANS: Label for the information about which IP a users registered from.
+ $action->element('strong', null, _('Registered from:'));
+ $el = 'span';
+ $attrs = ['class'=>'ipaddress'];
+ if (!is_null($ipaddress)) {
+ $el = 'a';
+ $attrs['href'] = common_local_url('ipregistrations', array('ipaddress'=>$ipaddress));
+ }
+ $action->element($el, $attrs,
+ // TRANS: Unknown IP address.
+ $ipaddress ?: _('unknown'));
+
+ $action->elementEnd('div');
+ }
+
/**
* Called after someone registers, by any means.
*
* We record the successful registration and IP address.
*
* @param Profile $profile new user's profile
- * @param User $user new user
*
* @return boolean hook value
*/
- function onEndUserRegister($profile, $user)
+ public function onEndUserRegister(Profile $profile)
{
$ipaddress = $this->_getIpAddress();
$reg = new Registration_ip();
- $reg->user_id = $user->id;
- $reg->ipaddress = $ipaddress;
+ $reg->user_id = $profile->getID();
+ $reg->ipaddress = mb_strtolower($ipaddress);
+ $reg->created = common_sql_now();
$result = $reg->insert();
- if (!$result) {
+ if ($result === false) {
common_log_db_error($reg, 'INSERT', __FILE__);
// @todo throw an exception?
}
*
* @return boolean hook value
*/
- function onPluginVersion(&$versions)
+ public function onPluginVersion(array &$versions)
{
$versions[] = array('name' => 'RegisterThrottle',
- 'version' => STATUSNET_VERSION,
+ 'version' => GNUSOCIAL_VERSION,
'author' => 'Evan Prodromou',
- 'homepage' => 'http://status.net/wiki/Plugin:RegisterThrottle',
+ 'homepage' => 'https://git.gnu.io/gnu/gnu-social/tree/master/plugins/RegisterThrottle',
'description' =>
// TRANS: Plugin description.
_m('Throttles excessive registration from a single IP address.'));
private function _getIpAddress()
{
$keys = array('HTTP_X_FORWARDED_FOR',
+ 'HTTP_X_CLIENT',
'CLIENT-IP',
'REMOTE_ADDR');
*
* @return boolean hook value
*/
- function onEndGrantRole($profile, $role)
+ public function onEndGrantRole($profile, $role)
{
if (!self::$enabled) {
return true;
}
- if ($role != Profile_role::SILENCED) {
+ if ($role !== Profile_role::SILENCED) {
return true;
}
- if (!$this->silenced) {
+ if (!$this->auto_silence_by_ip) {
return true;
}
- $ri = Registration_ip::staticGet('user_id', $profile->id);
+ $ri = Registration_ip::getKV('user_id', $profile->getID());
if (empty($ri)) {
return true;
$ids = Registration_ip::usersByIP($ri->ipaddress);
foreach ($ids as $id) {
- if ($id == $profile->id) {
+ if ($id == $profile->getID()) {
continue;
}
- $other = Profile::staticGet('id', $id);
-
- if (empty($other)) {
+ try {
+ $other = Profile::getByID($id);
+ } catch (NoResultException $e) {
continue;
}
continue;
}
+ // 'enabled' here is used to prevent recursion, since
+ // we'll end up in this function again on ->silence()
+ // though I actually think it doesn't matter since we
+ // do this in onEndGrantRole and that means the above
+ // $other->isSilenced() test should've 'continue'd...
$old = self::$enabled;
self::$enabled = false;
$other->silence();