Skip to content
Snippets Groups Projects
Select Git revision
  • 1ada5b7bbc0e9b0f6f9c06dba1e51fbb355c0fb0
  • master default protected
  • main
  • update_github_actions
  • 144_rocky8_support
  • 195-update-pdk-to-300
  • 144-rocky8
  • add_test_github_test_workflow
  • pdk_2.4.0
  • fix_unclosed_let_block_in_defines_client_spec
  • validation_fixes
  • freeradius_3_0_21_config_updates
  • data_types
  • PrepareBuster
  • travis
  • 4.0.1
  • 4.0.0
  • 3.9.2
  • 3.9.1
  • 3.9.0
  • 3.8.2
  • 3.8.1
  • 3.8.0
  • 3.7.0
  • 3.6.0
  • 3.5.0
  • 3.4.3
  • 3.4.2
  • 3.4.1
  • 3.4.0
  • 3.3.0
  • 3.2.0
  • 3.1.0
  • 3.0.0
  • 2.3.1
35 results

cert.pp

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    RedirectCallback.php 3.34 KiB
    <?php
    
    namespace ZfcUser\Controller;
    
    use Laminas\Mvc\Application;
    use Laminas\Router\RouteInterface;
    use Laminas\Router\Exception;
    use Laminas\Http\PhpEnvironment\Response;
    use ZfcUser\Options\ModuleOptions;
    
    /**
     * Buils a redirect response based on the current routing and parameters
     */
    class RedirectCallback
    {
    
        /** @var RouteInterface  */
        private $router;
    
        /** @var Application */
        private $application;
    
        /** @var ModuleOptions */
        private $options;
    
        /**
         * @param Application $application
         * @param RouteInterface $router
         * @param ModuleOptions $options
         */
        public function __construct(Application $application, RouteInterface $router, ModuleOptions $options)
        {
            $this->router = $router;
            $this->application = $application;
            $this->options = $options;
        }
    
        /**
         * @return Response
         */
        public function __invoke()
        {
            $routeMatch = $this->application->getMvcEvent()->getRouteMatch();
            $redirect = $this->getRedirect($routeMatch->getMatchedRouteName(), $this->getRedirectRouteFromRequest());
    
            $response = $this->application->getResponse();
            $response->getHeaders()->addHeaderLine('Location', $redirect);
            $response->setStatusCode(302);
            return $response;
        }
    
        /**
         * Return the redirect from param.
         * First checks GET then POST
         * @return string
         */
        private function getRedirectRouteFromRequest()
        {
            $request  = $this->application->getRequest();
            $redirect = $request->getQuery('redirect');
            if ($redirect && $this->routeExists($redirect)) {
                return $redirect;
            }
    
            $redirect = $request->getPost('redirect');
            if ($redirect && $this->routeExists($redirect)) {
                return $redirect;
            }
    
            return false;
        }
    
        /**
         * @param $route
         * @return bool
         */
        private function routeExists($route)
        {
            try {
                $this->router->assemble(array(), array('name' => $route));
            } catch (Exception\RuntimeException $e) {
                return false;
            }
            return true;
        }
    
        /**
         * Returns the url to redirect to based on current route.
         * If $redirect is set and the option to use redirect is set to true, it will return the $redirect url.
         *
         * @param string $currentRoute
         * @param bool $redirect
         * @return mixed
         */
        protected function getRedirect($currentRoute, $redirect = false)
        {
            $useRedirect = $this->options->getUseRedirectParameterIfPresent();
            $routeExists = ($redirect && $this->routeExists($redirect));
            if (!$useRedirect || !$routeExists) {
                $redirect = false;
            }
    
            switch ($currentRoute) {
                case 'zfcuser/register':
                case 'zfcuser/login':
                case 'zfcuser/authenticate':
                    $route = ($redirect) ?: $this->options->getLoginRedirectRoute();
                    return $this->router->assemble(array(), array('name' => $route));
                    break;
                case 'zfcuser/logout':
                    $route = ($redirect) ?: $this->options->getLogoutRedirectRoute();
                    return $this->router->assemble(array(), array('name' => $route));
                    break;
                default:
                    return $this->router->assemble(array(), array('name' => 'zfcuser'));
            }
        }
    }