From 0d7a5ddca6f08ec78a80e6ce22f74295ef356d07 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Mon, 10 Nov 2025 15:38:49 +0100 Subject: [PATCH 1/8] fix(tags): defer policy if min primary & secondary tags 0 Deferring it rather then force allowing in that case allows other policies to take action. Consider this more of a POC --- extensions/tags/src/Access/GlobalPolicy.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/extensions/tags/src/Access/GlobalPolicy.php b/extensions/tags/src/Access/GlobalPolicy.php index feb05432a2..fdc5717b55 100644 --- a/extensions/tags/src/Access/GlobalPolicy.php +++ b/extensions/tags/src/Access/GlobalPolicy.php @@ -42,6 +42,15 @@ public function can(User $actor, string $ability) return $this->allow(); } + if ($ability === 'startDiscussion') { + $minPrimaryTags = (int) $this->settings->get('flarum-tags.min_primary_tags'); + $minSecondaryTags = (int) $this->settings->get('flarum-tags.min_secondary_tags'); + + if (($minPrimaryTags === 0 && $minSecondaryTags === 0)) { + return; + } + } + if (in_array($ability, ['viewForum', 'startDiscussion'])) { if (! isset($enoughPrimary[$actor->id][$ability])) { $primaryTagsWhereNeedsPermission = $this->settings->get('flarum-tags.min_primary_tags'); From e752b80d9e7c4bad7e27484ece504fdbf8fd10d6 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:09:27 +0100 Subject: [PATCH 2/8] test(tags): add integration test for forum attributes --- extensions/tags/composer.json | 3 +- .../integration/forum/ForumAttributeTest.php | 92 +++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 extensions/tags/tests/integration/forum/ForumAttributeTest.php diff --git a/extensions/tags/composer.json b/extensions/tags/composer.json index 91adda6616..ccbc8843dc 100644 --- a/extensions/tags/composer.json +++ b/extensions/tags/composer.json @@ -79,7 +79,8 @@ }, "require-dev": { "flarum/core": "*@dev", - "flarum/testing": "^1.0.0" + "flarum/testing": "^1.0.0", + "flarum/suspend": "*@dev" }, "repositories": [ { diff --git a/extensions/tags/tests/integration/forum/ForumAttributeTest.php b/extensions/tags/tests/integration/forum/ForumAttributeTest.php new file mode 100644 index 0000000000..0d003297b1 --- /dev/null +++ b/extensions/tags/tests/integration/forum/ForumAttributeTest.php @@ -0,0 +1,92 @@ +extension('flarum-tags'); + $this->extension('flarum-suspend'); + + $this->prepareDatabase([ + 'tags' => $this->tags(), + 'users' => [ + $this->normalUser(), + ['id' => 3, 'username' => 'suspended-user', 'email' => 'suspended-user@machine.local', 'suspended_until' => '2043-11-17 22:05:23', 'is_email_confirmed' => 1], + ] + ]); + } + + public function canStartDiscussionProvider() + { + return [ + 'admin user, min 0/0' => ['authenticatedAs' => 1, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => true], + 'normal user, min 0/0' => ['authenticatedAs' => 2, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => true], + 'suspended user, min 0/0' => ['authenticatedAs' => 3, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => false], + 'guest user, min 0/0' => ['authenticatedAs' => null, 'minPrimary' => 0, 'minSecondary' => 0, 'expected' => false], + + 'admin user, min 1/0' => ['authenticatedAs' => 1, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => true], + 'normal user, min 1/0' => ['authenticatedAs' => 2, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => true], + 'suspended user, min 1/0' => ['authenticatedAs' => 3, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => false], + 'guest user, min 1/0' => ['authenticatedAs' => null, 'minPrimary' => 1, 'minSecondary' => 0, 'expected' => false], + + 'admin user, min 0/1' => ['authenticatedAs' => 1, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => true], + 'normal user, min 0/1' => ['authenticatedAs' => 2, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => true], + 'suspended user, min 0/1' => ['authenticatedAs' => 3, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => false], + 'guest user, min 0/1' => ['authenticatedAs' => null, 'minPrimary' => 0, 'minSecondary' => 1, 'expected' => false], + + 'admin user, min 1/1' => ['authenticatedAs' => 1, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => true], + 'normal user, min 1/1' => ['authenticatedAs' => 2, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => true], + 'suspended user, min 1/1' => ['authenticatedAs' => 3, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => false], + 'guest user, min 1/1' => ['authenticatedAs' => null, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => false], + ]; +} + + /** + * @test + * + * @dataProvider canStartDiscussionProvider + */ + public function it_returns_the_expected_can_start_discussion_attribute( + ?int $authenticatedAs, + int $minPrimary, + int $minSecondary, + bool $expected + ) + { + $this->setting('flarum-tags.min_primary_tags', $minPrimary); + $this->setting('flarum-tags.min_secondary_tags', $minSecondary); + + $response = $this->send( + $this->request('GET', '/api', [ + 'authenticatedAs' => $authenticatedAs, + ]) + ); + + $this->assertEquals(200, $response->getStatusCode()); + + $json = json_decode($response->getBody()->getContents(), true); + $this->assertEquals($expected, Arr::get($json, 'data.attributes.canStartDiscussion')); + } +} From 16a73e2181cea92b2eb364e9de67a8d9954a25a8 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:09:47 +0100 Subject: [PATCH 3/8] style: formatting --- extensions/tags/tests/integration/forum/ForumAttributeTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/tags/tests/integration/forum/ForumAttributeTest.php b/extensions/tags/tests/integration/forum/ForumAttributeTest.php index 0d003297b1..0fd9aa3992 100644 --- a/extensions/tags/tests/integration/forum/ForumAttributeTest.php +++ b/extensions/tags/tests/integration/forum/ForumAttributeTest.php @@ -61,7 +61,7 @@ public function canStartDiscussionProvider() 'suspended user, min 1/1' => ['authenticatedAs' => 3, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => false], 'guest user, min 1/1' => ['authenticatedAs' => null, 'minPrimary' => 1, 'minSecondary' => 1, 'expected' => false], ]; -} + } /** * @test From 611caab2718a225fe35e9f200461545c2382b4f6 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:14:28 +0100 Subject: [PATCH 4/8] chore: skip ci commit [skip ci] From 945c0b77d3fe1a06380aaf179b4835243479d449 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:15:43 +0100 Subject: [PATCH 5/8] chore From fdd4b007e0980464d736678d7ce33f26544ae4c6 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:41:08 +0100 Subject: [PATCH 6/8] chore(tags): return `null` instead of `void` --- extensions/tags/src/Access/GlobalPolicy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/tags/src/Access/GlobalPolicy.php b/extensions/tags/src/Access/GlobalPolicy.php index fdc5717b55..bd18c2a0ab 100644 --- a/extensions/tags/src/Access/GlobalPolicy.php +++ b/extensions/tags/src/Access/GlobalPolicy.php @@ -47,7 +47,7 @@ public function can(User $actor, string $ability) $minSecondaryTags = (int) $this->settings->get('flarum-tags.min_secondary_tags'); if (($minPrimaryTags === 0 && $minSecondaryTags === 0)) { - return; + return null; } } From 1f0f7eb494f681580527784160d9f225153b6825 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:43:57 +0100 Subject: [PATCH 7/8] style(tags): change formatting --- extensions/tags/src/Access/GlobalPolicy.php | 2 +- .../tags/tests/integration/forum/ForumAttributeTest.php | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/extensions/tags/src/Access/GlobalPolicy.php b/extensions/tags/src/Access/GlobalPolicy.php index bd18c2a0ab..120ac27a08 100644 --- a/extensions/tags/src/Access/GlobalPolicy.php +++ b/extensions/tags/src/Access/GlobalPolicy.php @@ -46,7 +46,7 @@ public function can(User $actor, string $ability) $minPrimaryTags = (int) $this->settings->get('flarum-tags.min_primary_tags'); $minSecondaryTags = (int) $this->settings->get('flarum-tags.min_secondary_tags'); - if (($minPrimaryTags === 0 && $minSecondaryTags === 0)) { + if ($minPrimaryTags === 0 && $minSecondaryTags === 0) { return null; } } diff --git a/extensions/tags/tests/integration/forum/ForumAttributeTest.php b/extensions/tags/tests/integration/forum/ForumAttributeTest.php index 0fd9aa3992..21129f1f7d 100644 --- a/extensions/tags/tests/integration/forum/ForumAttributeTest.php +++ b/extensions/tags/tests/integration/forum/ForumAttributeTest.php @@ -9,8 +9,8 @@ namespace Flarum\Tags\Tests\integration\api\forum; -use Flarum\Testing\integration\RetrievesAuthorizedUsers; use Flarum\Tags\Tests\integration\RetrievesRepresentativeTags; +use Flarum\Testing\integration\RetrievesAuthorizedUsers; use Flarum\Testing\integration\TestCase; use Illuminate\Support\Arr; @@ -73,8 +73,7 @@ public function it_returns_the_expected_can_start_discussion_attribute( int $minPrimary, int $minSecondary, bool $expected - ) - { + ) { $this->setting('flarum-tags.min_primary_tags', $minPrimary); $this->setting('flarum-tags.min_secondary_tags', $minSecondary); From b1466efbc23ea487d13acfd6beab361f5d2d43d2 Mon Sep 17 00:00:00 2001 From: Davide Iadeluca Date: Tue, 11 Nov 2025 08:45:53 +0100 Subject: [PATCH 8/8] chore: change back return type --- extensions/tags/src/Access/GlobalPolicy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/tags/src/Access/GlobalPolicy.php b/extensions/tags/src/Access/GlobalPolicy.php index 120ac27a08..40532ed55a 100644 --- a/extensions/tags/src/Access/GlobalPolicy.php +++ b/extensions/tags/src/Access/GlobalPolicy.php @@ -47,7 +47,7 @@ public function can(User $actor, string $ability) $minSecondaryTags = (int) $this->settings->get('flarum-tags.min_secondary_tags'); if ($minPrimaryTags === 0 && $minSecondaryTags === 0) { - return null; + return; } }