Skip to content

Commit 17b9516

Browse files
authored
Merge pull request #5272 from stefanpenner/patch-1
Prevent login flow from being disrupted by unrelated events
2 parents 75bad22 + 38637f0 commit 17b9516

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

app/services/session.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,15 @@ export default class SessionService extends Service {
7272
let { url } = await ajax(`/api/private/session/begin`);
7373
win.location = url;
7474

75-
let event = await race([waitForEvent(window, 'message'), this.windowCloseWatcherTask.perform(win)]);
75+
let event = await race([this.windowEventWatcherTask.perform(), this.windowCloseWatcherTask.perform(win)]);
7676
if (event.closed) {
7777
this.notifications.warning('Login was canceled because the popup window was closed.');
7878
return;
7979
}
8080

8181
win.close();
82-
if (event.origin !== window.location.origin || !event.data) {
83-
return;
84-
}
8582

86-
let { code, state } = event.data;
87-
if (!code || !state) {
88-
return;
89-
}
83+
let { code, state } = event;
9084

9185
let response = await fetch(`/api/private/session/authorize?code=${code}&state=${state}`);
9286
if (!response.ok) {
@@ -111,6 +105,23 @@ export default class SessionService extends Service {
111105
}
112106
});
113107

108+
windowEventWatcherTask = task(async () => {
109+
// eslint-disable-next-line no-constant-condition
110+
while (true) {
111+
let event = await waitForEvent(window, 'message');
112+
if (event.origin !== window.location.origin || !event.data) {
113+
continue;
114+
}
115+
116+
let { code, state } = event.data;
117+
if (!code || !state) {
118+
continue;
119+
}
120+
121+
return { code, state };
122+
}
123+
});
124+
114125
windowCloseWatcherTask = task(async window => {
115126
// eslint-disable-next-line no-constant-condition
116127
while (true) {

0 commit comments

Comments
 (0)