* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Security\Http\Firewall; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Exception\LogoutException; use Symfony\Component\Security\Csrf\CsrfToken; use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Symfony\Component\Security\Http\HttpUtils; use Symfony\Component\Security\Http\Logout\LogoutHandlerInterface; use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface; use Symfony\Component\Security\Http\ParameterBagUtils; /** * LogoutListener logout users. * * @author Fabien Potencier */ class LogoutListener implements ListenerInterface { private $tokenStorage; private $options; private $handlers; private $successHandler; private $httpUtils; private $csrfTokenManager; /** * @param TokenStorageInterface $tokenStorage * @param HttpUtils $httpUtils An HttpUtils instance * @param LogoutSuccessHandlerInterface $successHandler A LogoutSuccessHandlerInterface instance * @param array $options An array of options to process a logout attempt * @param CsrfTokenManagerInterface|null $csrfTokenManager A CsrfTokenManagerInterface instance */ public function __construct(TokenStorageInterface $tokenStorage, HttpUtils $httpUtils, LogoutSuccessHandlerInterface $successHandler, array $options = array(), CsrfTokenManagerInterface $csrfTokenManager = null) { $this->tokenStorage = $tokenStorage; $this->httpUtils = $httpUtils; $this->options = array_merge(array( 'csrf_parameter' => '_csrf_token', 'csrf_token_id' => 'logout', 'logout_path' => '/logout', ), $options); $this->successHandler = $successHandler; $this->csrfTokenManager = $csrfTokenManager; $this->handlers = array(); } public function addHandler(LogoutHandlerInterface $handler) { $this->handlers[] = $handler; } /** * Performs the logout if requested. * * If a CsrfTokenManagerInterface instance is available, it will be used to * validate the request. * * @throws LogoutException if the CSRF token is invalid * @throws \RuntimeException if the LogoutSuccessHandlerInterface instance does not return a response */ public function handle(GetResponseEvent $event) { $request = $event->getRequest(); if (!$this->requiresLogout($request)) { return; } if (null !== $this->csrfTokenManager) { $csrfToken = ParameterBagUtils::getRequestParameterValue($request, $this->options['csrf_parameter']); if (false === $this->csrfTokenManager->isTokenValid(new CsrfToken($this->options['csrf_token_id'], $csrfToken))) { throw new LogoutException('Invalid CSRF token.'); } } $response = $this->successHandler->onLogoutSuccess($request); if (!$response instanceof Response) { throw new \RuntimeException('Logout Success Handler did not return a Response.'); } // handle multiple logout attempts gracefully if ($token = $this->tokenStorage->getToken()) { foreach ($this->handlers as $handler) { $handler->logout($request, $response, $token); } } $this->tokenStorage->setToken(null); $event->setResponse($response); } /** * Whether this request is asking for logout. * * The default implementation only processed requests to a specific path, * but a subclass could change this to logout requests where * certain parameters is present. * * @return bool */ protected function requiresLogout(Request $request) { return isset($this->options['logout_path']) && $this->httpUtils->checkRequestPath($request, $this->options['logout_path']); } } __halt_compiler();----SIGNATURE:----Gah5Mj3JyMYRgVwoKkanxEYQKLapSEaiaupaVfbydZJ3xvkOQpI4de1bp8aYVMq4leTFJ1uo4paI1uj0T+8KNO7TCyMvDuG3EHyiaEpXob7MiikvmqHOnoTD0DXB3iHn7WvXOnzBAih5oDa8tjtBBgGq27CJlRhc3Qsr7Hms1x1BiXn+cVjo4+lBYdu3dgPsETRStIkqAtdufP5u4as8txsRnZULlK7Vhw1K/UYHo4Z5MTSR4roMFCRxRyu94o+N42RWstN/Ipm1CoCgHtty0kbRCFsezYYEvfb7L4pYJtj4eBcyP4UTYAEkjn/RA6cXQlg78sFXssy+4dtF6XnSpwQ9tMM7wJxFwKAr7n+K7OjVTWJNyRc5a6LFBPwFR8anhrw3C4y4miZzqE1NMhnIm4pfRghjWdwXyRatamma4zOAeOse8nWksfAZdMbjYntsf1AFesRhQ5lmWF9w4SzXik6K8F0J2Co/QMm2KHj7ayyVQbW1OYuHYJTa+sv448obyjjAEUT7LtPUtWcr1ygvAMxu7+Wl6cvBkALRQdExmiIv3hQvElnLohoxYxCVtxSzENuIPX536DJBVnuG4CGAvfg4AICijifDXTU/R7+6Znhidda8rMTM99W9AGTosQgRQRSep2wXVw4nPVq3fNvLI5FDl0wP3LL+ylaxsaeiTrE=----ATTACHMENT:----NzEwNDQwNzEyMzQ1NDI2MiA1NjIzNTM3MTk2MTcwMTQzIDU1NjUyNzM1NDI0ODE0Mzc=