10000 Prevent data to be missing if a listener throws · MatTheCat/symfony@f6b2dae · GitHub
[go: up one dir, main page]

Skip to content

Commit f6b2dae

Browse files
committed
Prevent data to be missing if a listener throws
1 parent e691a09 commit f6b2dae

File tree

2 files changed

+33
-35
lines changed

2 files changed

+33
-35
lines changed

src/Symfony/Bundle/SecurityBundle/DataCollector/SecurityDataCollector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public function collect(Request $request, Response $response, ?\Throwable $excep
189189
}
190190

191191
$this->data['listeners'] = $this->firewall?->getWrappedListeners() ?? [];
192-
$this->data['authenticators'] = $this->firewall ? $this->firewall->getAuthenticatorsInfo() : [];
192+
$this->data['authenticators'] = $this->firewall?->getAuthenticatorsInfo() ?? [];
193193
}
194194

195195
public function reset(): void

src/Symfony/Bundle/SecurityBundle/Debug/TraceableFirewallListener.php

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
final class TraceableFirewallListener extends FirewallListener implements ResetInterface
2828
{
2929
private array $wrappedListeners = [];
30-
private array $authenticatorsInfo = [];
30+
private ?TraceableAuthenticatorManagerListener $authenticatorManagerListener = null;
3131

3232
public function getWrappedListeners(): array
3333
{
@@ -39,62 +39,60 @@ public function getWrappedListeners(): array
3939

4040
public function getAuthenticatorsInfo(): array
4141
{
42-
return $this->authenticatorsInfo;
42+
return $this->authenticatorManagerListener?->getAuthenticatorsInfo() ?? [];
4343
}
4444

4545
public function reset(): void
4646
{
4747
$this->wrappedListeners = [];
48-
$this->authenticatorsInfo = [];
48+
$this->authenticatorManagerListener = null;
4949
}
5050

5151
protected function callListeners(RequestEvent $event, iterable $listeners): void
5252
{
53-
$wrappedListeners = [];
54-
$authenticatorManagerListener = null;
55-
53+
$requestListeners = [];
5654
foreach ($listeners as $listener) {
5755
if ($listener instanceof LazyFirewallContext) {
58-
\Closure::bind(function () use (&$wrappedListeners, &$authenticatorManagerListener) {
59-
$listeners = [];
56+
$contextWrappedListeners = [];
57+
$contextAuthenticatorManagerListener = null;
58+
59+
\Closure::bind(function () use (&$contextWrappedListeners, &$contextAuthenticatorManagerListener) {
6060
foreach ($this->listeners as $listener) {
61-
if (!$authenticatorManagerListener && $listener instanceof TraceableAuthenticatorManagerListener) {
62-
$authenticatorManagerListener = $listener;
63-
}
64-
if ($listener instanceof FirewallListenerInterface) {
65-
$listener = new WrappedLazyListener($listener);
66-
$listeners[] = $listener;
67-
$wrappedListeners[] = $listener;
68-
} else {
69-
$listeners[] = function (RequestEvent $event) use ($listener, &$wrappedListeners) {
70-
$wrappedListener = new WrappedListener($listener);
71-
$wrappedListener($event);
72-
$wrappedListeners[] = $wrappedListener;
73-
};
61+
if ($listener instanceof TraceableAuthenticatorManagerListener) {
62+
$contextAuthenticatorManagerListener ??= $listener;
7463
}
64+
$contextWrappedListeners[] = $listener instanceof FirewallListenerInterface
65+
? new WrappedLazyListener($listener)
66+
: new WrappedListener($listener)
67+
;
7568
}
76-
$this->listeners = $listeners;
69+
$this->listeners = $contextWrappedListeners;
7770
}, $listener, FirewallContext::class)();
7871

79-
$listener($event);
72+
$this->authenticatorManagerListener ??= $contextAuthenticatorManagerListener;
73+
$this->wrappedListeners = array_merge($this->wrappedListeners, $contextWrappedListeners);
74+
75+
$requestListeners[] = $listener;
8076
} else {
81-
$wrappedListener = $listener instanceof FirewallListenerInterface ? new WrappedLazyListener($listener) : new WrappedListener($listener);
82-
$wrappedListener($event);
83-
$this->wrappedListeners[] = $wrappedListener;
84-
if (!$authenticatorManagerListener && $listener instanceof TraceableAuthenticatorManagerListener) {
85-
$authenticatorManagerListener = $listener;
77+
if ($listener instanceof TraceableAuthenticatorManagerListener) {
78+
$this->authenticatorManagerListener ??= $listener;
8679
}
87-
}
80+
$wrappedListener = $listener instanceof FirewallListenerInterface
81+
? new WrappedLazyListener($listener)
82+
: new WrappedListener($listener)
83+
;
84+
$this->wrappedListeners[] = $wrappedListener;
8885

89-
if ($event->hasResponse()) {
90-
break;
86+
$requestListeners[] = $wrappedListener;
9187
}
9288
}
9389

94-
$this->wrappedListeners = array_merge($this->wrappedListeners, $wrappedListeners);
90+
foreach ($requestListeners as $listener) {
91+
$listener($event);
9592

96-
if ($authenticatorManagerListener) {
97-
$this->authenticatorsInfo = $authenticatorManagerListener->getAuthenticatorsInfo();
93+
if ($event->hasResponse()) {
94+
break;
95+
}
9896
}
9997
}
10098
}

0 commit comments

Comments
 (0)
0