Direct links to the login pages for public instances could lead to a
redirect back to an external page upon login.
This adds a check to ensure the URL is a URL expected from the current
bookstack instance, or at least under the same domain.
Fixes #2073
]);
}
+ // Store the previous location for redirect after login
$previous = url()->previous('');
- if (setting('app-public') && $previous && $previous !== url('/login')) {
- redirect()->setIntendedUrl($previous);
+ if ($previous && $previous !== url('/login') && setting('app-public')) {
+ $isPreviousFromInstance = (strpos($previous, url('/')) === 0);
+ if ($isPreviousFromInstance) {
+ redirect()->setIntendedUrl($previous);
+ }
}
return view('auth.login', [
->seePageUrlIs($page->getUrl());
}
+ public function test_login_intended_redirect_does_not_redirect_to_external_pages()
+ {
+ config()->set('app.url', 'http://localhost');
+ $this->setSettings(['app-public' => true]);
+
+ $this->get('/login', ['referer' => 'https://example.com']);
+ $login = $this->post('/login', ['email' => '
[email protected]', 'password' => 'password']);
+
+ $login->assertRedirectedTo('http://localhost');
+ }
+
public function test_login_authenticates_admins_on_all_guards()
{