]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Silence action can only be used on non-priviliged users
authorMikael Nordfeldth <mmn@hethane.se>
Fri, 12 Feb 2016 13:22:25 +0000 (14:22 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Fri, 12 Feb 2016 13:22:25 +0000 (14:22 +0100)
actions/silence.php
actions/unsilence.php
classes/Profile.php
lib/profileformaction.php

index 6a4f84deb9a15390d89548750597af81a7735630..dccaf70a37521ae57db85472761d93d5c5bb1b8f 100644 (file)
@@ -27,9 +27,7 @@
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
  * Silence a user.
@@ -42,45 +40,11 @@ if (!defined('STATUSNET')) {
  */
 class SilenceAction extends ProfileFormAction
 {
-    /**
-     * Check parameters
-     *
-     * @param array $args action arguments (URL, GET, POST)
-     *
-     * @return boolean success flag
-     */
-    function prepare($args)
-    {
-        if (!parent::prepare($args)) {
-            return false;
-        }
-
-        $cur = common_current_user();
-
-        assert(!empty($cur)); // checked by parent
-
-        if (!$cur->hasRight(Right::SILENCEUSER)) {
-            // TRANS: Client error displayed trying to silence a user on a site where the feature is not enabled.
-            $this->clientError(_('You cannot silence users on this site.'));
-        }
-
-        assert(!empty($this->profile)); // checked by parent
-
-        if ($this->profile->isSilenced()) {
-            // TRANS: Client error displayed trying to silence an already silenced user.
-            $this->clientError(_('User is already silenced.'));
-        }
-
-        return true;
-    }
-
-    /**
-     * Silence a user.
-     *
-     * @return void
-     */
     function handlePost()
     {
-        $this->profile->silence();
+        assert($this->scoped instanceof Profile);
+        assert($this->profile instanceof Profile);
+
+        $this->profile->silenceAs($this->scoped);
     }
 }
index c01c141b1c193fd6337365b26497d9438bc71094..f1305373df4146191d1b0dd857adfcbf5ed4646c 100644 (file)
  * @link      http://status.net/
  */
 
-if (!defined('STATUSNET')) {
-    exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
 
 /**
- * Silence a user.
+ * Unsilence a user.
  *
  * @category Action
  * @package  StatusNet
@@ -42,45 +40,11 @@ if (!defined('STATUSNET')) {
  */
 class UnsilenceAction extends ProfileFormAction
 {
-    /**
-     * Check parameters
-     *
-     * @param array $args action arguments (URL, GET, POST)
-     *
-     * @return boolean success flag
-     */
-    function prepare($args)
-    {
-        if (!parent::prepare($args)) {
-            return false;
-        }
-
-        $cur = common_current_user();
-
-        assert(!empty($cur)); // checked by parent
-
-        if (!$cur->hasRight(Right::SILENCEUSER)) {
-            // TRANS: Client error on page to unsilence a user when the feature is not enabled.
-            $this->clientError(_('You cannot silence users on this site.'));
-        }
-
-        assert(!empty($this->profile)); // checked by parent
-
-        if (!$this->profile->isSilenced()) {
-            // TRANS: Client error on page to unsilence a user when the to be unsilenced user has not been silenced.
-            $this->clientError(_('User is not silenced.'));
-        }
-
-        return true;
-    }
-
-    /**
-     * Silence a user.
-     *
-     * @return void
-     */
     function handlePost()
     {
-        $this->profile->unsilence();
+        assert($this->scoped instanceof Profile);
+        assert($this->profile instanceof Profile);
+
+        $this->profile->unsilenceAs($this->scoped);
     }
 }
index e4ab508c0616c6d802a9cc541c9005391f0562ed..0eaa06120a95b03633c7b326e42319d655eeef88 100644 (file)
@@ -1174,6 +1174,22 @@ class Profile extends Managed_DataObject
         }
     }
 
+    function silenceAs(Profile $actor)
+    {
+        if (!$actor->hasRight(Right::SILENCEUSER)) {
+            throw new AuthorizationException(_('You cannot silence users on this site.'));
+        }
+        // Only administrators can silence other priviliged users (those who have the right to silence as well).
+        if ($this->hasRight(Right::SILENCEUSER) && !$actor->hasRole(Profile_role::ADMINISTRATOR)) {
+            throw new AuthorizationException(_('You cannot silence other priviliged users.'));
+        }
+        if ($this->isSilenced()) {
+            // TRANS: Client error displayed trying to silence an already silenced user.
+            throw new AlreadyFulfilledException(_('User is already silenced.'));
+        }
+        return $this->silence();
+    }
+
     function unsilence()
     {
         $this->revokeRole(Profile_role::SILENCED);
@@ -1182,6 +1198,19 @@ class Profile extends Managed_DataObject
         }
     }
 
+    function unsilenceAs(Profile $actor)
+    {
+        if (!$actor->hasRight(Right::SILENCEUSER)) {
+            // TRANS: Client error displayed trying to unsilence a user when the user does not have the right.
+            throw new AuthorizationException(_('You cannot unsilence users on this site.'));
+        }
+        if (!$this->isSilenced()) {
+            // TRANS: Client error displayed trying to unsilence a user when the target user has not been silenced.
+            throw new AlreadyFulfilledException(_('User is not silenced.'));
+        }
+        return $this->unsilence();
+    }
+
     function flushVisibility()
     {
         // Get all notices
index 9ace6676c3b82fa16797c735f4b0630518dd429d..1e00e6f12b80c5102ad454386d8c3acd48ca8c3b 100644 (file)
@@ -101,7 +101,11 @@ class ProfileFormAction extends RedirectingAction
         parent::handle($args);
 
         if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-            $this->handlePost();
+            try {
+                $this->handlePost();
+            } catch (AlreadyFulfilledException $e) {
+                // 'tis alright
+            }
             $this->returnToPrevious();
         }
     }