]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Collective guilt for registrants from the same IP address
authorEvan Prodromou <evan@status.net>
Fri, 22 Oct 2010 17:29:51 +0000 (13:29 -0400)
committerEvan Prodromou <evan@status.net>
Fri, 22 Oct 2010 17:29:51 +0000 (13:29 -0400)
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.

plugins/RegisterThrottle/RegisterThrottlePlugin.php
plugins/RegisterThrottle/Registration_ip.php

index b6e9a902653f5a49380bd7cc3540e0a3efc0ce3d..369426d337cd9ef2da04fd7b176707ada014c86a 100644 (file)
@@ -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;
+        }
+    }
 }
index 5c7396b9b06ddb2e8935452b41a410f3378ec99d..2486e36b462d6109d81cc4978acc3ff10218806d 100644 (file)
@@ -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;
+    }
 }