diff --git a/extensions/tags/src/Access/DiscussionPolicy.php b/extensions/tags/src/Access/DiscussionPolicy.php index 423286f1a..199cf77a6 100755 --- a/extensions/tags/src/Access/DiscussionPolicy.php +++ b/extensions/tags/src/Access/DiscussionPolicy.php @@ -57,13 +57,30 @@ class DiscussionPolicy extends AbstractPolicy * @param Discussion $discussion * @return bool */ - public function after(User $actor, $ability, Discussion $discussion) + public function before(User $actor, $ability, Discussion $discussion) { // Wrap all discussion permission checks with some logic pertaining to - // the discussion's tags. If the discussion has any tags that are - // restricted, then the user *must* have permission for all of them. - foreach ($discussion->tags as $tag) { - if ($tag->is_restricted && ! $actor->hasPermission('tag' . $tag->id . '.discussion.' . $ability)) { + // the discussion's tags. If the discussion has a tag that has been + // restricted, and the user has this permission for that tag, then they + // are allowed. If the discussion only has tags that have been + // restricted, then the user *must* have permission for at least one of + // them. + $tags = $discussion->tags; + + if (count($tags)) { + $restricted = true; + + foreach ($tags as $tag) { + if ($tag->is_restricted) { + if ($actor->hasPermission('tag'.$tag->id.'.discussion.'.$ability)) { + return true; + } + } else { + $restricted = false; + } + } + + if ($restricted) { return false; } }