. // }}} namespace App\Util\Exception; use function App\Core\I18n\_m; use App\Core\Log; use App\Core\Router; use Exception; use Symfony\Component\HttpFoundation\RedirectResponse; class RedirectException extends Exception { public ?RedirectResponse $redirect_response = null; /** * Used for responding to a request with a redirect. Either * generates a url from a $route_id_or_path and $params or fully formed, * from $url. Prevents open redirects, unless $allow_open_redirect */ public function __construct(string $route_id_or_path = '', array $params = [], string $message = '', int $code = 302, ?string $url = null, bool $allow_open_redirect = false, ?Exception $previous_exception = null) { if (!empty($route_id_or_path) || !empty($url)) { $url ??= Router::url($route_id_or_path, $params, Router::ABSOLUTE_PATH); // Absolute path doesn't include host if (!$allow_open_redirect) { if (Router::isAbsolute($url)) { Log::warning("A RedirectException that shouldn't allow open redirects attempted to redirect to {$url}"); throw new ServerException(_m('Can not redirect to outside the website from here'), 5400); // 500 Internal server error (likely a bug) } } $this->redirect_response = new RedirectResponse($url, $code); } parent::__construct($message, $code, $previous_exception); } }