Skip to content

Commit

Permalink
feat: URL exclusions
Browse files Browse the repository at this point in the history
  • Loading branch information
SychO9 committed Dec 6, 2023
1 parent 9e43b66 commit a8c47c8
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 4 deletions.
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"flarum/core": "^1.2.0"
},
"require-dev": {
"flarum/testing": "^1.0.0"
"flarum/testing": "^1.0.0",
"symfony/var-dumper": "*"
},
"authors": [
{
Expand Down
3 changes: 3 additions & 0 deletions extend.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@
->serializeToForum('sycho-private-facade.route_exclusions', 'sycho-private-facade.route_exclusions', function ($value) {
return PrivateFacadeMiddleware::getFrontendRouteExclusions($value);
})
->serializeToForum('sycho-private-facade.url_exclusions', 'sycho-private-facade.url_exclusions', function (?string $value) {
return explode(',', str_replace(' ', '', $value ?? ''));
})
->serializeToForum('sycho-private-facade.illustration_url', 'sycho-private-facade.illustration_path', ExposeIllustration::class)
->serializeToForum('sycho-private-facade.header_layout', 'sycho-private-facade.header_layout')
->serializeToForum('sycho-private-facade.primary_color_bg', 'sycho-private-facade.primary_color_bg', 'boolval')
Expand Down
5 changes: 5 additions & 0 deletions js/src/admin/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ app.initializers.add('sycho/flarum-private-facade', (app) => {
label: app.translator.trans('sycho-private-facade.admin.settings.route_exclusions'),
type: 'text',
})
.registerSetting({
setting: 'sycho-private-facade.url_exclusions',
label: app.translator.trans('sycho-private-facade.admin.settings.url_exclusions'),
type: 'text',
})
.registerSetting(() => {
return (
<div className="Form-group HeroImageForm">
Expand Down
5 changes: 4 additions & 1 deletion js/src/forum/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,13 @@ app.initializers.add('sycho/flarum-private-facade', () => {
});

override(DefaultResolver.prototype, 'onmatch', function (orig, args, requestedPath, route) {
const urlExclusions = app.forum.attribute<Array<string>>('sycho-private-facade.url_exclusions');

if (
!app.session.user &&
app.forum.attribute<boolean>('sycho-private-facade.force_redirect') &&
!app.forum.attribute<Array<string>>('sycho-private-facade.route_exclusions').includes(this.routeName)
!app.forum.attribute<Array<string>>('sycho-private-facade.route_exclusions').includes(this.routeName) &&
!urlExclusions.some((url) => url.includes('*') ? new RegExp(url.replace(/\*/g, '.*').replace(/\//g, '\\/')).test(requestedPath) : url === requestedPath)
) {
return m.route.set(app.route('sycho-private-facade.login'));
}
Expand Down
1 change: 1 addition & 0 deletions locale/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ sycho-private-facade:
illustration_path: Illustration Image
primary_color_bg: Use a Primary Color Background
route_exclusions: Routes to Exclude From Redirection to Login/Signup Page.
url_exclusions: URLs to Exclude From Redirection to Login/Signup Page.
screen_banner_description: Screen Message
screen_banner_heading: Screen Banner
screen_banner_title: Screen Title
Expand Down
25 changes: 24 additions & 1 deletion src/PrivateFacadeMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ class PrivateFacadeMiddleware implements MiddlewareInterface
'login', 'register', 'sycho-private-facade.login', 'sycho-private-facade.signup',
'resetPassword', 'confirmEmail', 'savePassword', 'confirmEmail.submit',
// FoF-OAuth
'auth.twitter', 'fof-oauth',
'auth.twitter', 'fof-oauth', 'askvortsov-pwa.webmanifest',
'askvortsov-pwa.sw', 'askvortsov-pwa.offline'
];
public const FRONTEND_ROUTE_EXCLUSIONS = [
'sycho-private-facade.login', 'sycho-private-facade.signup',
Expand All @@ -44,10 +45,32 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
$actor = RequestUtil::getActor($request);

$userExcludedRoutes = $this->settings->get('sycho-private-facade.route_exclusions') ?: '';
$userExcludedUrls = $this->settings->get('sycho-private-facade.url_exclusions') ?: '';

$extensionExcludedRoutes = self::getBackendRouteExclusions($userExcludedRoutes);
$extensionExcludedUrls = explode(',', str_replace(' ', '', $userExcludedUrls));

$excludedRoute = in_array($request->getAttribute('routeName'), $extensionExcludedRoutes, true);

if (! $excludedRoute) {
$currentUri = $request->getUri()->getPath();

foreach ($extensionExcludedUrls as $url) {
// allow for wildcards
if (strpos($url, '*') !== false) {
$url = str_replace('*', '.*', preg_quote($url, '/'));

if (preg_match('/' . $url . '/', $currentUri)) {
$excludedRoute = true;
break;
}
} elseif ($currentUri === $url) {
$excludedRoute = true;
break;
}
}
}

$isPrivateFacade = in_array(
$request->getAttribute('routeName'),
['sycho-private-facade.login', 'sycho-private-facade.signup'],
Expand Down
36 changes: 35 additions & 1 deletion tests/integration/PrivateFacadeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace SychO\PrivateFacade\Tests\integration;

use Carbon\Carbon;
use Flarum\Testing\integration\RetrievesAuthorizedUsers;
use Flarum\Testing\integration\TestCase;
use Flarum\Extend;
Expand All @@ -21,6 +22,15 @@ protected function setUp(): void
);

$this->extension('sycho-private-facade');

$this->prepareDatabase([
'discussions' => [
['id' => 3, 'title' => __CLASS__, 'created_at' => Carbon::now(), 'last_posted_at' => Carbon::now(), 'user_id' => 1, 'first_post_id' => 1, 'comment_count' => 5, 'last_post_number' => 5, 'last_post_id' => 10],
],
'posts' => [
['id' => 5, 'discussion_id' => 3, 'created_at' => Carbon::createFromDate(1975, 5, 21)->toDateTimeString(), 'user_id' => 1, 'type' => 'comment', 'content' => '<t><p>foo bar</p></t>', 'number' => 1],
],
]);
}

/** @test */
Expand Down Expand Up @@ -101,7 +111,7 @@ public function guests_force_redirected_to_login_if_signup_is_off()
}

/** @test */
public function guests_not_force_redirected_in_client_exluded_routes()
public function guests_not_force_redirected_in_user_excluded_routes()
{
$this->setting('sycho-private-facade.route_exclusions', 'default');

Expand All @@ -112,6 +122,30 @@ public function guests_not_force_redirected_in_client_exluded_routes()
$this->assertEquals(200, $response->getStatusCode());
}

/** @test */
public function guests_not_force_redirected_in_user_excluded_urls()
{
$this->setting('sycho-private-facade.url_exclusions', '/d/3');

$response = $this->send(
$this->request('GET', '/d/3')
);

$this->assertEquals(200, $response->getStatusCode());
}

/** @test */
public function guests_not_force_redirected_in_user_excluded_urls_wildcard()
{
$this->setting('sycho-private-facade.url_exclusions', '/d/3*');

$response = $this->send(
$this->request('GET', '/d/3-slug')
);

$this->assertEquals(200, $response->getStatusCode());
}

/** @test */
public function guests_not_force_redirected_by_choice()
{
Expand Down

0 comments on commit a8c47c8

Please sign in to comment.