]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/RegisterThrottle/RegisterThrottlePlugin.php
Merge branch 'statusnetworkapi' into 1.0.x
[quix0rs-gnu-social.git] / plugins / RegisterThrottle / RegisterThrottlePlugin.php
index b6e9a902653f5a49380bd7cc3540e0a3efc0ce3d..7ad7809bac9b908d1a9826ad41e71b8c4238eff0 100644 (file)
@@ -52,11 +52,21 @@ class RegisterThrottlePlugin extends Plugin
      *
      * Default is 3 registrations per hour, 5 per day, 10 per week.
      */
-
     public $regLimits = array(604800 => 10, // per week
                               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
      *
@@ -64,13 +74,11 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return boolean hook value; true means continue processing, false means stop.
      */
-
     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'),
@@ -87,7 +95,6 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return boolean hook value; true means continue processing, false means stop.
      */
-
     function onAutoload($cls)
     {
         $dir = dirname(__FILE__);
@@ -111,13 +118,13 @@ class RegisterThrottlePlugin extends Plugin
      * @param Action $action Action that is being executed
      *
      * @return boolean hook value
-     *
      */
     function onStartRegistrationTry($action)
     {
         $ipaddress = $this->_getIpAddress();
 
         if (empty($ipaddress)) {
+            // TRANS: Server exception thrown when no IP address can be found for a registation attempt.
             throw new ServerException(_m('Cannot find IP address.'));
         }
 
@@ -133,7 +140,21 @@ class RegisterThrottlePlugin extends Plugin
                 $now     = time();
                 $this->debug("Comparing {$regtime} to {$now}");
                 if ($now - $regtime < $seconds) {
-                    throw new Exception(_m("Too many registrations. Take a break and try again later."));
+                    // TRANS: Exception thrown when too many user have registered from one IP address within a given time frame.
+                    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()) {
+                    // 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.'));
                 }
             }
         }
@@ -142,28 +163,22 @@ 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();
@@ -188,7 +203,6 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return boolean hook value
      */
-
     function onPluginVersion(&$versions)
     {
         $versions[] = array('name' => 'RegisterThrottle',
@@ -196,6 +210,7 @@ class RegisterThrottlePlugin extends Plugin
                             'author' => 'Evan Prodromou',
                             'homepage' => 'http://status.net/wiki/Plugin:RegisterThrottle',
                             'description' =>
+                            // TRANS: Plugin description.
                             _m('Throttles excessive registration from a single IP address.'));
         return true;
     }
@@ -205,7 +220,6 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return string IP address or null if not found.
      */
-
     private function _getIpAddress()
     {
         $keys = array('HTTP_X_FORWARDED_FOR',
@@ -229,7 +243,6 @@ class RegisterThrottlePlugin extends Plugin
      *
      * @return Registration_ip nth registration or null if not found.
      */
-
     private function _getNthReg($ipaddress, $n)
     {
         $reg = new Registration_ip();
@@ -245,4 +258,57 @@ 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;
+        }
+    }
 }