Skip to content
This repository was archived by the owner on May 31, 2024. It is now read-only.

Commit 385b0a5

Browse files
Merge branch '2.3' into 2.6
* 2.3: Minor fixes Towards 100% HHVM compat trigger event with right user (add test) [Security] Initialize SwitchUserEvent::targetUser on attemptExitUser [Form] Fixed: Data mappers always receive forms indexed by their names Conflicts: src/Symfony/Component/Debug/Tests/ErrorHandlerTest.php src/Symfony/Component/Filesystem/Filesystem.php src/Symfony/Component/Process/Tests/AbstractProcessTest.php
2 parents 6a96b68 + 1738333 commit 385b0a5

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

Http/Firewall/SwitchUserListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ private function attemptExitUser(Request $request)
165165
}
166166

167167
if (null !== $this->dispatcher) {
168-
$switchEvent = new SwitchUserEvent($request, $original->getUser());
168+
$user = $this->provider->refreshUser($original->getUser());
169+
$switchEvent = new SwitchUserEvent($request, $user);
169170
$this->dispatcher->dispatch(SecurityEvents::SWITCH_USER, $switchEvent);
170171
}
171172

Http/Tests/Firewall/SwitchUserListenerTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
namespace Symfony\Component\Security\Http\Tests\Firewall;
1313

14+
use Symfony\Component\Security\Http\Event\SwitchUserEvent;
1415
use Symfony\Component\Security\Http\Firewall\SwitchUserListener;
16+
use Symfony\Component\Security\Http\SecurityEvents;
1517

1618
class SwitchUserListenerTest extends \PHPUnit_Framework_TestCase
1719
{
@@ -100,6 +102,56 @@ public function testExitUserUpdatesToken()
100102
$listener->handle($this->event);
101103
}
102104

105+
public function testExitUserDispatchesEventWithRefreshedUser()
106+
{
107+
$originalUser = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
108+
$refreshedUser = $this->getMock('Symfony\Component\Security\Core\User\UserInterface');
109+
$this
110+
->userProvider
111+
->expects($this->any())
112+
->method('refreshUser')
113+
->with($originalUser)
114+
->willReturn($refreshedUser);
115+
$originalToken = $this->getToken();
116+
$originalToken
117+
->expects($this->any())
118+
->method('getUser')
119+
->willReturn($originalUser);
120+
$role = $this
121+
->getMockBuilder('Symfony\Component\Security\Core\Role\SwitchUserRole')
122+
->disableOriginalConstructor()
123+
->getMock();
124+
$role->expects($this->any())->method('getSource')->willReturn($originalToken);
125+
$this
126+
->securityContext
127+
->expects($this->any())
128+
->method('getToken')
129+
->willReturn($this->getToken(array($role)));
130+
$this
131+
->request
132+
->expects($this->any())
133+
->method('get')
134+
->with('_switch_user')
135+
->willReturn('_exit');
136+
$this
137+
->request
138+
->expects($this->any())
139+
->method('getUri')
140+
->willReturn('/');
141+
142+
$dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
143+
$dispatcher
144+
->expects($this->once())
145+
->method('dispatch')
146+
->with(SecurityEvents::SWITCH_USER, $this->callback(function (SwitchUserEvent $event) use ($refreshedUser) {
147+
return $event->getTargetUser() === $refreshedUser;
148+
}))
149+
;
150+
151+
$listener = new SwitchUserListener($this->securityContext, $this->userProvider, $this->userChecker, 'provider123', $this->accessDecisionManager, null, '_switch_user', 'ROLE_ALLOWED_TO_SWITCH', $dispatcher);
152+
$listener->handle($this->event);
153+
}
154+
103155
/**
104156
* @expectedException \Symfony\Component\Security\Core\Exception\AccessDeniedException
105157
*/

0 commit comments

Comments
 (0)