diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php deleted file mode 100644 index 450a4f3bd..000000000 --- a/app/Exceptions/Handler.php +++ /dev/null @@ -1,81 +0,0 @@ -> - */ - protected $dontReport = [ - // - ]; - - /** - * A list of the inputs that are never flashed for validation exceptions. - * - * @var array - */ - protected $dontFlash = [ - 'password', - 'password_confirmation', - ]; - - /** - * Catch errors with Sentry. - */ - public function register(): void - { - $this->reportable(function (Throwable $e) { - if (app()->bound('sentry')) { - app('sentry')->captureException($e); - } - }); - } - - /** - * Report or log an exception. - * - * - * @return void - * - * @throws Throwable - */ - public function report(Throwable $exception) - { - parent::report($exception); - } - - /** - * @param Request $request - * @return RedirectResponse|Response - * - * @throws Throwable - */ - public function render($request, Throwable $exception) - { - if ($exception instanceof UnauthorizedException) { - abort(401); - } - if ($exception instanceof TokenMismatchException) { - return redirect() - ->back() - ->withInput($request->except(['password', 'password_confirmation'])) - ->with('error', 'The form has expired due to inactivity. Please refresh the page and try again'); - } - - return parent::render($request, $exception); - } -} diff --git a/app/Http/Middleware/CheckForMaintenanceMode.php b/app/Http/Middleware/CheckForMaintenanceMode.php deleted file mode 100644 index 0e0ac0d35..000000000 --- a/app/Http/Middleware/CheckForMaintenanceMode.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ - protected $except = [ - // - ]; -} diff --git a/app/Http/Middleware/EnsureAuthenticatedUsersAreVerified.php b/app/Http/Middleware/EnsureAuthenticatedUsersAreVerified.php deleted file mode 100644 index b8ebf0e52..000000000 --- a/app/Http/Middleware/EnsureAuthenticatedUsersAreVerified.php +++ /dev/null @@ -1,37 +0,0 @@ -user(); - - if ($user === null) { - return $next($request); - } - - if ($user instanceof MustVerifyEmail && ! $user->hasVerifiedEmail()) { - if ($request->expectsJson()) { - abort(403, 'Your email address is not verified.'); - } - - return redirect()->route($redirectToRoute ?? 'verification.notice'); - } - - return $next($request); - } -} diff --git a/app/Http/Middleware/SetUserTimezone.php b/app/Http/Middleware/SetUserTimezone.php deleted file mode 100644 index 2163f29dc..000000000 --- a/app/Http/Middleware/SetUserTimezone.php +++ /dev/null @@ -1,28 +0,0 @@ - SubstituteBindings::class, 'clearance' => ClearanceMiddleware::class, 'apiRateLimit' => ThrottleApiRequestsByToken::class, - 'isVerified' => EnsureAuthenticatedUsersAreVerified::class, + 'isVerified' => EnsureEmailIsVerified::class, 'permission' => PermissionMiddleware::class, 'role' => RoleMiddleware::class, 'role_or_permission' => RoleOrPermissionMiddleware::class, diff --git a/tests/Feature/AuthRedirectMiddlewareTest.php b/tests/Feature/AuthRedirectMiddlewareTest.php index 193d50730..3daf80007 100644 --- a/tests/Feature/AuthRedirectMiddlewareTest.php +++ b/tests/Feature/AuthRedirectMiddlewareTest.php @@ -5,7 +5,9 @@ declare(strict_types=1); namespace Tests\Feature; use Illuminate\Auth\GenericUser; +use Illuminate\Auth\Middleware\EnsureEmailIsVerified; use Illuminate\Contracts\Console\Kernel; +use Illuminate\Routing\Router; use Illuminate\Support\Facades\Cache; use PDO; use Tests\TestCase; @@ -101,6 +103,13 @@ class AuthRedirectMiddlewareTest extends TestCase ->assertRedirect('/'); } + public function test_is_verified_alias_uses_laravels_email_verification_middleware(): void + { + $middlewareAliases = app(Router::class)->getMiddleware(); + + $this->assertSame(EnsureEmailIsVerified::class, $middlewareAliases['isVerified'] ?? null); + } + private function setEnvironmentValue(string $key, ?string $value): void { if ($value === null) { diff --git a/tests/Unit/UserViewRequestInputTest.php b/tests/Unit/UserViewRequestInputTest.php index e46c2f8cb..6d6462965 100644 --- a/tests/Unit/UserViewRequestInputTest.php +++ b/tests/Unit/UserViewRequestInputTest.php @@ -4,8 +4,12 @@ namespace Tests\Unit; use App\Http\Controllers\BasePageController; use App\Http\Controllers\SearchController; +use Illuminate\Container\Container; +use Illuminate\Contracts\Routing\UrlGenerator as UrlGeneratorContract; use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull; use Illuminate\Http\Request; +use Illuminate\Routing\RouteCollection; +use Illuminate\Routing\UrlGenerator; use PHPUnit\Framework\TestCase; use ReflectionClass; use Symfony\Component\HttpFoundation\Response; @@ -71,6 +75,46 @@ class UserViewRequestInputTest extends TestCase $this->assertSame([-1], $method->invoke($controller, Request::create('/search', 'GET', ['searchadvcat' => '']))); } + public function test_local_return_url_accepts_local_targets_and_rejects_external_urls(): void + { + $originalContainer = Container::getInstance(); + $container = new Container; + $container->instance( + UrlGeneratorContract::class, + new UrlGenerator(new RouteCollection, Request::create('https://nntmux.test')), + ); + Container::setInstance($container); + + try { + $controller = $this->controller(); + + $this->assertSame( + 'https://nntmux.test/mymovies', + $controller->returnUrl(Request::create('https://nntmux.test/mymovies'), '/mymovies'), + ); + $this->assertSame( + 'https://nntmux.test/browse', + $controller->returnUrl(Request::create('https://nntmux.test/mymovies', 'GET', ['from' => '/browse']), '/mymovies'), + ); + $this->assertSame( + 'https://nntmux.test/browse?view=covers', + $controller->returnUrl( + Request::create('https://nntmux.test/mymovies', 'GET', ['from' => 'https://nntmux.test/browse?view=covers']), + '/mymovies', + ), + ); + $this->assertSame( + 'https://nntmux.test/mymovies', + $controller->returnUrl( + Request::create('https://nntmux.test/mymovies', 'GET', ['from' => 'https://external.example/browse']), + '/mymovies', + ), + ); + } finally { + Container::setInstance($originalContainer); + } + } + private function controller(): object { return new class extends BasePageController @@ -112,6 +156,11 @@ class UserViewRequestInputTest extends TestCase { return $this->paginationOffset($page, $perPage); } + + public function returnUrl(Request $request, string $fallback): string + { + return $this->localReturnUrl($request, $fallback); + } }; } }