forked from inrupt/solid-client-authn-js
-
Notifications
You must be signed in to change notification settings - Fork 6
/
PopUpLoginHandler.ts
81 lines (77 loc) · 3.23 KB
/
PopUpLoginHandler.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/**
* This project is a continuation of Inrupt's awesome solid-auth-fetcher project,
* see https://www.npmjs.com/package/@inrupt/solid-auth-fetcher.
* Copyright 2020 The Solid Project.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/**
* Handles login if it should be in a popup
*/
import ILoginHandler from "../ILoginHandler";
import ILoginOptions from "../ILoginOptions";
import ISolidSession from "../../solidSession/ISolidSession";
import { injectable, inject } from "tsyringe";
import { IEnvironmentDetector } from "../../util/EnvironmentDetector";
import INeededRedirectAction from "../../solidSession/INeededRedirectAction";
import URL from "url-parse";
import { ISessionCreator } from "../../solidSession/SessionCreator";
@injectable()
export default class PopUpLoginHandler implements ILoginHandler {
constructor(
@inject("environmentDetector")
private environmentDetector: IEnvironmentDetector,
@inject("postPopUpLoginHandler") private loginHandler: ILoginHandler,
@inject("sessionCreator") private sessionCreator: ISessionCreator
) {}
async canHandle(loginOptions: ILoginOptions): Promise<boolean> {
return !!(
loginOptions.popUp &&
loginOptions.popUpRedirectPath &&
this.environmentDetector.detect() === "browser"
);
}
async handle(loginOptions: ILoginOptions): Promise<ISolidSession> {
const currentUrl = new URL(window.location.href);
currentUrl.set("pathname", loginOptions.popUpRedirectPath);
const session = await this.loginHandler.handle({
...loginOptions,
redirect: currentUrl,
doNotAutoRedirect: true
});
// TODO: handle if session doesn't have redirect
const popupWindow = window.open(
(session.neededAction as INeededRedirectAction).redirectUrl,
"Log In",
"resizable,scrollbars,width=500,height=500,"
);
return new Promise((resolve, reject) => {
const interval = setInterval(async () => {
if (!popupWindow || popupWindow.closed) {
clearInterval(interval);
resolve(
// TODO: handle if this fails
(await this.sessionCreator.getSession(
loginOptions.localUserId || "global"
)) as ISolidSession
);
}
}, 500);
});
}
}