]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/RegisterThrottle/RegisterThrottlePlugin.php
Merge branch 'master' into nightly
[quix0rs-gnu-social.git] / plugins / RegisterThrottle / RegisterThrottlePlugin.php
index d6ab7fc0f4b8e8ce8d31264e144330a936d8465c..5b999a4370cccd95bc9a752707f7323b1d2e21f4 100644 (file)
@@ -28,9 +28,7 @@
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * Throttle registration by IP address
@@ -62,6 +60,14 @@ class RegisterThrottlePlugin extends Plugin
      */
     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.
      */
@@ -74,7 +80,7 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return boolean hook value; true means continue processing, false means stop.
      */
-    function onCheckSchema()
+    public function onCheckSchema()
     {
         $schema = Schema::get();
 
@@ -83,25 +89,11 @@ class RegisterThrottlePlugin extends Plugin
         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\.\:]+'));
     }
 
     /**
@@ -114,7 +106,7 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return boolean hook value
      */
-    function onStartRegistrationTry($action)
+    public function onStartRegistrationTry($action)
     {
         $ipaddress = $this->_getIpAddress();
 
@@ -157,17 +149,62 @@ class RegisterThrottlePlugin extends Plugin
         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();
 
@@ -178,12 +215,13 @@ class RegisterThrottlePlugin extends Plugin
 
         $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?
         }
@@ -198,12 +236,12 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @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.'));
@@ -264,21 +302,21 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @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::getKV('user_id', $profile->id);
+        $ri = Registration_ip::getKV('user_id', $profile->getID());
 
         if (empty($ri)) {
             return true;
@@ -287,13 +325,13 @@ class RegisterThrottlePlugin extends Plugin
         $ids = Registration_ip::usersByIP($ri->ipaddress);
 
         foreach ($ids as $id) {
-            if ($id == $profile->id) {
+            if ($id == $profile->getID()) {
                 continue;
             }
 
-            $other = Profile::getKV('id', $id);
-
-            if (empty($other)) {
+            try {
+                $other = Profile::getByID($id);
+            } catch (NoResultException $e) {
                 continue;
             }
 
@@ -301,6 +339,11 @@ class RegisterThrottlePlugin extends Plugin
                 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();