@azure/msal-angular 2.0.3 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/IMsalService.d.ts +14 -14
- package/LICENSE +20 -20
- package/README.md +150 -149
- package/azure-msal-angular.d.ts +4 -4
- package/azure-msal-angular.metadata.json +1 -1
- package/bundles/azure-msal-angular.umd.js +920 -892
- package/bundles/azure-msal-angular.umd.js.map +1 -1
- package/bundles/azure-msal-angular.umd.min.js +2 -2
- package/bundles/azure-msal-angular.umd.min.js.map +1 -1
- package/constants.d.ts +4 -4
- package/esm2015/IMsalService.js +6 -6
- package/esm2015/azure-msal-angular.js +4 -4
- package/esm2015/constants.js +9 -9
- package/esm2015/msal.broadcast.service.js +36 -36
- package/esm2015/msal.guard.config.js +6 -6
- package/esm2015/msal.guard.js +189 -168
- package/esm2015/msal.interceptor.config.js +6 -6
- package/esm2015/msal.interceptor.js +208 -208
- package/esm2015/msal.module.js +46 -46
- package/esm2015/msal.navigation.client.js +53 -53
- package/esm2015/msal.redirect.component.js +30 -30
- package/esm2015/msal.service.js +74 -74
- package/esm2015/packageMetadata.js +4 -4
- package/esm2015/public-api.js +18 -17
- package/fesm2015/azure-msal-angular.js +590 -569
- package/fesm2015/azure-msal-angular.js.map +1 -1
- package/msal.broadcast.service.d.ts +12 -12
- package/msal.guard.config.d.ts +9 -9
- package/msal.guard.d.ts +40 -39
- package/msal.guard.d.ts.map +1 -1
- package/msal.interceptor.config.d.ts +17 -17
- package/msal.interceptor.d.ts +49 -49
- package/msal.module.d.ts +7 -7
- package/msal.navigation.client.d.ts +16 -16
- package/msal.redirect.component.d.ts +12 -12
- package/msal.service.d.ts +27 -27
- package/msal.service.d.ts.map +1 -1
- package/package.json +7 -2
- package/packageMetadata.d.ts +2 -2
- package/public-api.d.ts +16 -15
- package/public-api.d.ts.map +1 -1
package/esm2015/msal.guard.js
CHANGED
|
@@ -1,168 +1,189 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
import { Router } from "@angular/router";
|
|
6
|
-
import { MsalService } from "./msal.service";
|
|
7
|
-
import { Injectable, Inject, VERSION } from "@angular/core";
|
|
8
|
-
import { Location } from "@angular/common";
|
|
9
|
-
import { InteractionType, BrowserConfigurationAuthError, BrowserUtils, UrlString } from "@azure/msal-browser";
|
|
10
|
-
import { MSAL_GUARD_CONFIG } from "./constants";
|
|
11
|
-
import { concatMap, catchError, map } from "rxjs/operators";
|
|
12
|
-
import { of } from "rxjs";
|
|
13
|
-
import { MsalBroadcastService } from "./msal.broadcast.service";
|
|
14
|
-
export class MsalGuard {
|
|
15
|
-
constructor(msalGuardConfig, msalBroadcastService, authService, location, router) {
|
|
16
|
-
this.msalGuardConfig = msalGuardConfig;
|
|
17
|
-
this.msalBroadcastService = msalBroadcastService;
|
|
18
|
-
this.authService = authService;
|
|
19
|
-
this.location = location;
|
|
20
|
-
this.router = router;
|
|
21
|
-
// Subscribing so events in MsalGuard will set inProgress$ observable
|
|
22
|
-
this.msalBroadcastService.inProgress$.subscribe();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Parses url string to UrlTree
|
|
26
|
-
* @param url
|
|
27
|
-
*/
|
|
28
|
-
parseUrl(url) {
|
|
29
|
-
return this.router.parseUrl(url);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Builds the absolute url for the destination page
|
|
33
|
-
* @param path Relative path of requested page
|
|
34
|
-
* @returns Full destination url
|
|
35
|
-
*/
|
|
36
|
-
getDestinationUrl(path) {
|
|
37
|
-
this.authService.getLogger().verbose("Guard - getting destination url");
|
|
38
|
-
// Absolute base url for the application (default to origin if base element not present)
|
|
39
|
-
const baseElements = document.getElementsByTagName("base");
|
|
40
|
-
const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);
|
|
41
|
-
// Path of page (including hash, if using hash routing)
|
|
42
|
-
const pathUrl = this.location.prepareExternalUrl(path);
|
|
43
|
-
// Hash location strategy
|
|
44
|
-
if (pathUrl.startsWith("#")) {
|
|
45
|
-
this.authService.getLogger().verbose("Guard - destination by hash routing");
|
|
46
|
-
return `${baseUrl}/${pathUrl}`;
|
|
47
|
-
}
|
|
48
|
-
/*
|
|
49
|
-
* If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).
|
|
50
|
-
* Since baseUrl also includes /base, can just concatentate baseUrl + path
|
|
51
|
-
*/
|
|
52
|
-
return `${baseUrl}${path}`;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Interactively prompt the user to login
|
|
56
|
-
* @param url Path of the requested page
|
|
57
|
-
*/
|
|
58
|
-
loginInteractively(state) {
|
|
59
|
-
const authRequest = typeof this.msalGuardConfig.authRequest === "function"
|
|
60
|
-
? this.msalGuardConfig.authRequest(this.authService, state)
|
|
61
|
-
: Object.assign({}, this.msalGuardConfig.authRequest);
|
|
62
|
-
if (this.msalGuardConfig.interactionType === InteractionType.Popup) {
|
|
63
|
-
this.authService.getLogger().verbose("Guard - logging in by popup");
|
|
64
|
-
return this.authService.loginPopup(authRequest)
|
|
65
|
-
.pipe(map((response) => {
|
|
66
|
-
this.authService.getLogger().verbose("Guard - login by popup successful, can activate, setting active account");
|
|
67
|
-
this.authService.instance.setActiveAccount(response.account);
|
|
68
|
-
return true;
|
|
69
|
-
}));
|
|
70
|
-
}
|
|
71
|
-
this.authService.getLogger().verbose("Guard - logging in by redirect");
|
|
72
|
-
const redirectStartPage = this.getDestinationUrl(state.url);
|
|
73
|
-
return this.authService.loginRedirect(Object.assign({ redirectStartPage }, authRequest))
|
|
74
|
-
.pipe(map(() => false));
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Helper which checks for the correct interaction type, prevents page with Guard to be set as reidrect, and calls handleRedirectObservable
|
|
78
|
-
* @param state
|
|
79
|
-
*/
|
|
80
|
-
activateHelper(state) {
|
|
81
|
-
if (this.msalGuardConfig.interactionType !== InteractionType.Popup && this.msalGuardConfig.interactionType !== InteractionType.Redirect) {
|
|
82
|
-
throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Guard. InteractionType.Popup or InteractionType.Redirect must be provided in the MsalGuardConfiguration");
|
|
83
|
-
}
|
|
84
|
-
this.authService.getLogger().verbose("MSAL Guard activated");
|
|
85
|
-
/*
|
|
86
|
-
* If a page with MSAL Guard is set as the redirect for acquireTokenSilent,
|
|
87
|
-
* short-circuit to prevent redirecting or popups.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
this.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBZ0csTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUF1RCxNQUFNLHFCQUFxQixDQUFDO0FBRW5LLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR2hFLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQ3VDLGVBQXVDLEVBQ2xFLG9CQUEwQyxFQUMxQyxXQUF3QixFQUN4QixRQUFrQixFQUNsQixNQUFjO1FBSmEsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ2xFLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFD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LE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IENhbkFjdGl2YXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZUNoaWxkLCBDYW5Mb2FkLCBVcmxUcmVlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgVkVSU0lPTiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBJbnRlcmFjdGlvblR5cGUsIEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLCBCcm93c2VyVXRpbHMsIFVybFN0cmluZywgUG9wdXBSZXF1ZXN0LCBSZWRpcmVjdFJlcXVlc3QsIEF1dGhlbnRpY2F0aW9uUmVzdWx0IH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcclxuaW1wb3J0IHsgTXNhbEd1YXJkQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL21zYWwuZ3VhcmQuY29uZmlnXCI7XHJcbmltcG9ydCB7IE1TQUxfR1VBUkRfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IGNvbmNhdE1hcCwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNc2FsR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgQ2FuTG9hZCB7XHJcbiAgICBwcml2YXRlIGxvZ2luRmFpbGVkUm91dGU/OiBVcmxUcmVlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBJbmplY3QoTVNBTF9HVUFSRF9DT05GSUcpIHByaXZhdGUgbXNhbEd1YXJkQ29uZmlnOiBNc2FsR3VhcmRDb25maWd1cmF0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgbXNhbEJyb2FkY2FzdFNlcnZpY2U6IE1zYWxCcm9hZGNhc3RTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IE1zYWxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcclxuICAgICkgeyBcclxuICAgICAgICAvLyBTdWJzY3JpYmluZyBzbyBldmVudHMgaW4gTXNhbEd1YXJkIHdpbGwgc2V0IGluUHJvZ3Jlc3MkIG9ic2VydmFibGVcclxuICAgICAgICB0aGlzLm1zYWxCcm9hZGNhc3RTZXJ2aWNlLmluUHJvZ3Jlc3MkLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGFyc2VzIHVybCBzdHJpbmcgdG8gVXJsVHJlZVxyXG4gICAgICogQHBhcmFtIHVybCBcclxuICAgICAqL1xyXG4gICAgcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBVcmxUcmVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yb3V0ZXIucGFyc2VVcmwodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkcyB0aGUgYWJzb2x1dGUgdXJsIGZvciB0aGUgZGVzdGluYXRpb24gcGFnZVxyXG4gICAgICogQHBhcmFtIHBhdGggUmVsYXRpdmUgcGF0aCBvZiByZXF1ZXN0ZWQgcGFnZVxyXG4gICAgICogQHJldHVybnMgRnVsbCBkZXN0aW5hdGlvbiB1cmxcclxuICAgICAqL1xyXG4gICAgZ2V0RGVzdGluYXRpb25VcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGdldHRpbmcgZGVzdGluYXRpb24gdXJsXCIpO1xyXG4gICAgICAgIC8vIEFic29sdXRlIGJhc2UgdXJsIGZvciB0aGUgYXBwbGljYXRpb24gKGRlZmF1bHQgdG8gb3JpZ2luIGlmIGJhc2UgZWxlbWVudCBub3QgcHJlc2VudClcclxuICAgICAgICBjb25zdCBiYXNlRWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJhc2VcIik7XHJcbiAgICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMubG9jYXRpb24ubm9ybWFsaXplKGJhc2VFbGVtZW50cy5sZW5ndGggPyBiYXNlRWxlbWVudHNbMF0uaHJlZiA6IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xyXG5cclxuICAgICAgICAvLyBQYXRoIG9mIHBhZ2UgKGluY2x1ZGluZyBoYXNoLCBpZiB1c2luZyBoYXNoIHJvdXRpbmcpXHJcbiAgICAgICAgY29uc3QgcGF0aFVybCA9IHRoaXMubG9jYXRpb24ucHJlcGFyZUV4dGVybmFsVXJsKHBhdGgpO1xyXG5cclxuICAgICAgICAvLyBIYXNoIGxvY2F0aW9uIHN0cmF0ZWd5XHJcbiAgICAgICAgaWYgKHBhdGhVcmwuc3RhcnRzV2l0aChcIiNcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBkZXN0aW5hdGlvbiBieSBoYXNoIHJvdXRpbmdcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3BhdGhVcmx9YDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgICogSWYgdXNpbmcgcGF0aCBsb2NhdGlvbiBzdHJhdGVneSwgcGF0aFVybCB3aWxsIGluY2x1ZGUgdGhlIHJlbGF0aXZlIHBvcnRpb24gb2YgdGhlIGJhc2UgcGF0aCAoZS5nLiAvYmFzZS9wYWdlKS5cclxuICAgICAgICAgKiBTaW5jZSBiYXNlVXJsIGFsc28gaW5jbHVkZXMgL2Jhc2UsIGNhbiBqdXN0IGNvbmNhdGVudGF0ZSBiYXNlVXJsICsgcGF0aFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHJldHVybiBgJHtiYXNlVXJsfSR7cGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW50ZXJhY3RpdmVseSBwcm9tcHQgdGhlIHVzZXIgdG8gbG9naW5cclxuICAgICAqIEBwYXJhbSB1cmwgUGF0aCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2VcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBsb2dpbkludGVyYWN0aXZlbHkoc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBhdXRoUmVxdWVzdCA9IHR5cGVvZiB0aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdCA9PT0gXCJmdW5jdGlvblwiXHJcbiAgICAgICAgICAgID8gdGhpcy5tc2FsR3VhcmRDb25maWcuYXV0aFJlcXVlc3QodGhpcy5hdXRoU2VydmljZSwgc3RhdGUpXHJcbiAgICAgICAgICAgIDogeyAuLi50aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdCB9O1xyXG4gICAgICAgIGlmICh0aGlzLm1zYWxHdWFyZENvbmZpZy5pbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCkge1xyXG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2dpbmcgaW4gYnkgcG9wdXBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmxvZ2luUG9wdXAoYXV0aFJlcXVlc3QgYXMgUG9wdXBSZXF1ZXN0KVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgbWFwKChyZXNwb25zZTogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dpbiBieSBwb3B1cCBzdWNjZXNzZnVsLCBjYW4gYWN0aXZhdGUsIHNldHRpbmcgYWN0aXZlIGFjY291bnRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChyZXNwb25zZS5hY2NvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2dpbmcgaW4gYnkgcmVkaXJlY3RcIik7XHJcbiAgICAgICAgY29uc3QgcmVkaXJlY3RTdGFydFBhZ2UgPSB0aGlzLmdldERlc3RpbmF0aW9uVXJsKHN0YXRlLnVybCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UubG9naW5SZWRpcmVjdCh7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0U3RhcnRQYWdlLFxyXG4gICAgICAgICAgICAuLi5hdXRoUmVxdWVzdFxyXG4gICAgICAgIH0gYXMgUmVkaXJlY3RSZXF1ZXN0KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiBmYWxzZSlcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIHR5cGUsIHByZXZlbnRzIHBhZ2Ugd2l0aCBHdWFyZCB0byBiZSBzZXQgYXMgcmVpZHJlY3QsIGFuZCBjYWxscyBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcclxuICAgICAqIEBwYXJhbSBzdGF0ZSBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZUhlbHBlcihzdGF0ZT86IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1zYWxHdWFyZENvbmZpZy5pbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCAmJiB0aGlzLm1zYWxHdWFyZENvbmZpZy5pbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IoXCJpbnZhbGlkX2ludGVyYWN0aW9uX3R5cGVcIiwgXCJJbnZhbGlkIGludGVyYWN0aW9uIHR5cGUgcHJvdmlkZWQgdG8gTVNBTCBHdWFyZC4gSW50ZXJhY3Rpb25UeXBlLlBvcHVwIG9yIEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBNc2FsR3VhcmRDb25maWd1cmF0aW9uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJNU0FMIEd1YXJkIGFjdGl2YXRlZFwiKTtcclxuXHJcbiAgICAgICAgLypcclxuICAgICAgICAgKiBJZiBhIHBhZ2Ugd2l0aCBNU0FMIEd1YXJkIGlzIHNldCBhcyB0aGUgcmVkaXJlY3QgZm9yIGFjcXVpcmVUb2tlblNpbGVudCxcclxuICAgICAgICAgKiBzaG9ydC1jaXJjdWl0IHRvIHByZXZlbnQgcmVkaXJlY3Rpbmcgb3IgcG9wdXBzLlxyXG4gICAgICAgICAqIFRPRE86IFVwZGF0ZSB0byBhbGxvdyBydW5uaW5nIGluIGlmcmFtZSBvbmNlIGFsbG93UmVkaXJlY3RJbklmcmFtZSBpcyBpbXBsZW1lbnRlZFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChVcmxTdHJpbmcuaGFzaENvbnRhaW5zS25vd25Qcm9wZXJ0aWVzKHdpbmRvdy5sb2NhdGlvbi5oYXNoKSAmJiBCcm93c2VyVXRpbHMuaXNJbklmcmFtZSgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLndhcm5pbmcoXCJHdWFyZCAtIHJlZGlyZWN0VXJpIHNldCB0byBwYWdlIHdpdGggTVNBTCBHdWFyZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbm90IHNldCByZWRpcmVjdFVyaSB0byBhIHBhZ2UgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi5cIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5pbmZvKFwiR3VhcmQgLSB3aW5kb3cgaXMgdW5kZWZpbmVkLCBNU0FMIGRvZXMgbm90IHN1cHBvcnQgc2VydmVyLXNpZGUgdG9rZW4gYWNxdWlzaXRpb25cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQgaW4gdGhlIGNvbmZpZywgc2V0IHRoaXMgYXMgdGhlIGxvZ2luRmFpbGVkUm91dGVcclxuICAgICAgICAgKi9cclxuICAgICAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcubG9naW5GYWlsZWRSb3V0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2luRmFpbGVkUm91dGUgPSB0aGlzLnBhcnNlVXJsKHRoaXMubXNhbEd1YXJkQ29uZmlnLmxvZ2luRmFpbGVkUm91dGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ2FwdHVyZSBjdXJyZW50IHBhdGggYmVmb3JlIGl0IGdldHMgY2hhbmdlZCBieSBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcclxuICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHRoaXMubG9jYXRpb24ucGF0aCh0cnVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbm8gYWNjb3VudHMgcmV0cmlldmVkLCBsb2cgaW4gcmVxdWlyZWQgdG8gYWN0aXZhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpbkludGVyYWN0aXZlbHkoc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIG5vIGFjY291bnRzIHJldHJpZXZlZCwgbm8gc3RhdGUsIGNhbm5vdCBsb2FkXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBhdCBsZWFzdCAxIGFjY291bnQgZXhpc3RzLCBjYW4gYWN0aXZhdGUgb3IgbG9hZFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCBuYXZpZ2F0aW5nIHRoZSBhcHAgdG8gLyNjb2RlPSBvciAvY29kZT1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgJiYgc3RhdGUudXJsLmluZGV4T2YoXCJjb2RlPVwiKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuaW5mbyhcIkd1YXJkIC0gSGFzaCBjb250YWlucyBrbm93biBjb2RlIHJlc3BvbnNlLCBzdG9wcGluZyBuYXZpZ2F0aW9uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggcm91dGluZyAobmF2aWdhdGUgdG8gY3VycmVudCBwYXRoIHdpdGhvdXQgaGFzaClcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXRoLmluZGV4T2YoXCIjXCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih0aGlzLnBhcnNlVXJsKHRoaXMubG9jYXRpb24ucGF0aCgpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhc2ggcm91dGluZyAobmF2aWdhdGUgdG8gcm9vdCBwYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybChcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmVycm9yKFwiR3VhcmQgLSBlcnJvciB3aGlsZSBsb2dnaW5nIGluLCB1bmFibGUgdG8gYWN0aXZhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvclBpaShgR3VhcmQgLSBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQsIGNoZWNrcyB0byBzZWUgaWYgQW5ndWxhciAxMCsgaXMgdXNlZCBhbmQgc3RhdGUgaXMgcGFzc2VkIGluIGJlZm9yZSByZXR1cm5pbmcgcm91dGVcclxuICAgICAgICAgICAgICAgICAgICAgKiBBcHBzIHVzaW5nIEFuZ3VsYXIgOSB3aWxsIHJlY2VpdmUgb2YoZmFsc2UpIGluIGNhbkxvYWQgaW50ZXJmYWNlLCBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IFVybFRyZWUgcmV0dXJuIHR5cGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubG9naW5GYWlsZWRSb3V0ZSAmJiBwYXJzZUludChWRVJTSU9OLm1ham9yLCAxMCkgPiA5ICYmIHN0YXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbG9naW5GYWlsZWRSb3V0ZSBzZXQsIHJlZGlyZWN0aW5nXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5sb2dpbkZhaWxlZFJvdXRlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTxib29sZWFufFVybFRyZWU+IHtcclxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkFjdGl2YXRlXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlSGVscGVyKHN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBjYW5BY3RpdmF0ZUNoaWxkKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbnxVcmxUcmVlPiB7XHJcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBjYW5BY3RpdmF0ZUNoaWxkXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlSGVscGVyKHN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICBjYW5Mb2FkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gY2FuTG9hZFwiKTtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVIZWxwZXIoKTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { Router } from "@angular/router";
|
|
6
|
+
import { MsalService } from "./msal.service";
|
|
7
|
+
import { Injectable, Inject, VERSION } from "@angular/core";
|
|
8
|
+
import { Location } from "@angular/common";
|
|
9
|
+
import { InteractionType, BrowserConfigurationAuthError, BrowserUtils, UrlString } from "@azure/msal-browser";
|
|
10
|
+
import { MSAL_GUARD_CONFIG } from "./constants";
|
|
11
|
+
import { concatMap, catchError, map } from "rxjs/operators";
|
|
12
|
+
import { of } from "rxjs";
|
|
13
|
+
import { MsalBroadcastService } from "./msal.broadcast.service";
|
|
14
|
+
export class MsalGuard {
|
|
15
|
+
constructor(msalGuardConfig, msalBroadcastService, authService, location, router) {
|
|
16
|
+
this.msalGuardConfig = msalGuardConfig;
|
|
17
|
+
this.msalBroadcastService = msalBroadcastService;
|
|
18
|
+
this.authService = authService;
|
|
19
|
+
this.location = location;
|
|
20
|
+
this.router = router;
|
|
21
|
+
// Subscribing so events in MsalGuard will set inProgress$ observable
|
|
22
|
+
this.msalBroadcastService.inProgress$.subscribe();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Parses url string to UrlTree
|
|
26
|
+
* @param url
|
|
27
|
+
*/
|
|
28
|
+
parseUrl(url) {
|
|
29
|
+
return this.router.parseUrl(url);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Builds the absolute url for the destination page
|
|
33
|
+
* @param path Relative path of requested page
|
|
34
|
+
* @returns Full destination url
|
|
35
|
+
*/
|
|
36
|
+
getDestinationUrl(path) {
|
|
37
|
+
this.authService.getLogger().verbose("Guard - getting destination url");
|
|
38
|
+
// Absolute base url for the application (default to origin if base element not present)
|
|
39
|
+
const baseElements = document.getElementsByTagName("base");
|
|
40
|
+
const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);
|
|
41
|
+
// Path of page (including hash, if using hash routing)
|
|
42
|
+
const pathUrl = this.location.prepareExternalUrl(path);
|
|
43
|
+
// Hash location strategy
|
|
44
|
+
if (pathUrl.startsWith("#")) {
|
|
45
|
+
this.authService.getLogger().verbose("Guard - destination by hash routing");
|
|
46
|
+
return `${baseUrl}/${pathUrl}`;
|
|
47
|
+
}
|
|
48
|
+
/*
|
|
49
|
+
* If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).
|
|
50
|
+
* Since baseUrl also includes /base, can just concatentate baseUrl + path
|
|
51
|
+
*/
|
|
52
|
+
return `${baseUrl}${path}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Interactively prompt the user to login
|
|
56
|
+
* @param url Path of the requested page
|
|
57
|
+
*/
|
|
58
|
+
loginInteractively(state) {
|
|
59
|
+
const authRequest = typeof this.msalGuardConfig.authRequest === "function"
|
|
60
|
+
? this.msalGuardConfig.authRequest(this.authService, state)
|
|
61
|
+
: Object.assign({}, this.msalGuardConfig.authRequest);
|
|
62
|
+
if (this.msalGuardConfig.interactionType === InteractionType.Popup) {
|
|
63
|
+
this.authService.getLogger().verbose("Guard - logging in by popup");
|
|
64
|
+
return this.authService.loginPopup(authRequest)
|
|
65
|
+
.pipe(map((response) => {
|
|
66
|
+
this.authService.getLogger().verbose("Guard - login by popup successful, can activate, setting active account");
|
|
67
|
+
this.authService.instance.setActiveAccount(response.account);
|
|
68
|
+
return true;
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
this.authService.getLogger().verbose("Guard - logging in by redirect");
|
|
72
|
+
const redirectStartPage = this.getDestinationUrl(state.url);
|
|
73
|
+
return this.authService.loginRedirect(Object.assign({ redirectStartPage }, authRequest))
|
|
74
|
+
.pipe(map(() => false));
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Helper which checks for the correct interaction type, prevents page with Guard to be set as reidrect, and calls handleRedirectObservable
|
|
78
|
+
* @param state
|
|
79
|
+
*/
|
|
80
|
+
activateHelper(state) {
|
|
81
|
+
if (this.msalGuardConfig.interactionType !== InteractionType.Popup && this.msalGuardConfig.interactionType !== InteractionType.Redirect) {
|
|
82
|
+
throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Guard. InteractionType.Popup or InteractionType.Redirect must be provided in the MsalGuardConfiguration");
|
|
83
|
+
}
|
|
84
|
+
this.authService.getLogger().verbose("MSAL Guard activated");
|
|
85
|
+
/*
|
|
86
|
+
* If a page with MSAL Guard is set as the redirect for acquireTokenSilent,
|
|
87
|
+
* short-circuit to prevent redirecting or popups.
|
|
88
|
+
*/
|
|
89
|
+
if (typeof window !== "undefined") {
|
|
90
|
+
if (UrlString.hashContainsKnownProperties(window.location.hash) && BrowserUtils.isInIframe() && !this.authService.instance.getConfiguration().system.allowRedirectInIframe) {
|
|
91
|
+
this.authService.getLogger().warning("Guard - redirectUri set to page with MSAL Guard. It is recommended to not set redirectUri to a page that requires authentication.");
|
|
92
|
+
return of(false);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
this.authService.getLogger().info("Guard - window is undefined, MSAL does not support server-side token acquisition");
|
|
97
|
+
return of(true);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* If a loginFailedRoute is set in the config, set this as the loginFailedRoute
|
|
101
|
+
*/
|
|
102
|
+
if (this.msalGuardConfig.loginFailedRoute) {
|
|
103
|
+
this.loginFailedRoute = this.parseUrl(this.msalGuardConfig.loginFailedRoute);
|
|
104
|
+
}
|
|
105
|
+
// Capture current path before it gets changed by handleRedirectObservable
|
|
106
|
+
const currentPath = this.location.path(true);
|
|
107
|
+
return this.authService.handleRedirectObservable()
|
|
108
|
+
.pipe(concatMap(() => {
|
|
109
|
+
if (!this.authService.instance.getAllAccounts().length) {
|
|
110
|
+
if (state) {
|
|
111
|
+
this.authService.getLogger().verbose("Guard - no accounts retrieved, log in required to activate");
|
|
112
|
+
return this.loginInteractively(state);
|
|
113
|
+
}
|
|
114
|
+
this.authService.getLogger().verbose("Guard - no accounts retrieved, no state, cannot load");
|
|
115
|
+
return of(false);
|
|
116
|
+
}
|
|
117
|
+
this.authService.getLogger().verbose("Guard - at least 1 account exists, can activate or load");
|
|
118
|
+
// Prevent navigating the app to /#code= or /code=
|
|
119
|
+
if (state) {
|
|
120
|
+
/*
|
|
121
|
+
* Path routing:
|
|
122
|
+
* state.url: /#code=...
|
|
123
|
+
* state.root.fragment: code=...
|
|
124
|
+
*/
|
|
125
|
+
/*
|
|
126
|
+
* Hash routing:
|
|
127
|
+
* state.url: /code
|
|
128
|
+
* state.root.fragment: null
|
|
129
|
+
*/
|
|
130
|
+
const urlContainsCode = this.includesCode(state.url);
|
|
131
|
+
const fragmentContainsCode = !!state.root && !!state.root.fragment && this.includesCode(`#${state.root.fragment}`);
|
|
132
|
+
const hashRouting = this.location.prepareExternalUrl(state.url).indexOf("#") === 0;
|
|
133
|
+
// Ensure code parameter is in fragment (and not in query parameter), or that hash hash routing is used
|
|
134
|
+
if (urlContainsCode && (fragmentContainsCode || hashRouting)) {
|
|
135
|
+
this.authService.getLogger().info("Guard - Hash contains known code response, stopping navigation.");
|
|
136
|
+
// Path routing (navigate to current path without hash)
|
|
137
|
+
if (currentPath.indexOf("#") > -1) {
|
|
138
|
+
return of(this.parseUrl(this.location.path()));
|
|
139
|
+
}
|
|
140
|
+
// Hash routing (navigate to root path)
|
|
141
|
+
return of(this.parseUrl(""));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return of(true);
|
|
145
|
+
}), catchError((error) => {
|
|
146
|
+
this.authService.getLogger().error("Guard - error while logging in, unable to activate");
|
|
147
|
+
this.authService.getLogger().errorPii(`Guard - error: ${error.message}`);
|
|
148
|
+
/**
|
|
149
|
+
* If a loginFailedRoute is set, checks to see if Angular 10+ is used and state is passed in before returning route
|
|
150
|
+
* Apps using Angular 9 will receive of(false) in canLoad interface, as it does not support UrlTree return types
|
|
151
|
+
*/
|
|
152
|
+
if (this.loginFailedRoute && parseInt(VERSION.major, 10) > 9 && state) {
|
|
153
|
+
this.authService.getLogger().verbose("Guard - loginFailedRoute set, redirecting");
|
|
154
|
+
return of(this.loginFailedRoute);
|
|
155
|
+
}
|
|
156
|
+
return of(false);
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
includesCode(path) {
|
|
160
|
+
return (path.lastIndexOf("/code") > -1 &&
|
|
161
|
+
path.lastIndexOf("/code") === path.length - "/code".length) || // path.endsWith("/code")
|
|
162
|
+
path.indexOf("#code=") > -1 ||
|
|
163
|
+
path.indexOf("&code=") > -1;
|
|
164
|
+
}
|
|
165
|
+
canActivate(route, state) {
|
|
166
|
+
this.authService.getLogger().verbose("Guard - canActivate");
|
|
167
|
+
return this.activateHelper(state);
|
|
168
|
+
}
|
|
169
|
+
canActivateChild(route, state) {
|
|
170
|
+
this.authService.getLogger().verbose("Guard - canActivateChild");
|
|
171
|
+
return this.activateHelper(state);
|
|
172
|
+
}
|
|
173
|
+
canLoad() {
|
|
174
|
+
this.authService.getLogger().verbose("Guard - canLoad");
|
|
175
|
+
// @ts-ignore
|
|
176
|
+
return this.activateHelper();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
MsalGuard.decorators = [
|
|
180
|
+
{ type: Injectable }
|
|
181
|
+
];
|
|
182
|
+
MsalGuard.ctorParameters = () => [
|
|
183
|
+
{ type: undefined, decorators: [{ type: Inject, args: [MSAL_GUARD_CONFIG,] }] },
|
|
184
|
+
{ type: MsalBroadcastService },
|
|
185
|
+
{ type: MsalService },
|
|
186
|
+
{ type: Location },
|
|
187
|
+
{ type: Router }
|
|
188
|
+
];
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBZ0csTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUF1RCxNQUFNLHFCQUFxQixDQUFDO0FBRW5LLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR2hFLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQ3VDLGVBQXVDLEVBQ2xFLG9CQUEwQyxFQUMxQyxXQUF3QixFQUN4QixRQUFrQixFQUNsQixNQUFjO1FBSmEsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ2xFLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFD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Q0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkseUJBQXlCO1lBQ3hGLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RCxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQzs7O1lBeE1KLFVBQVU7Ozs0Q0FLRixNQUFNLFNBQUMsaUJBQWlCO1lBUHhCLG9CQUFvQjtZQVJwQixXQUFXO1lBRVgsUUFBUTtZQUhzRixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENhbkFjdGl2YXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZUNoaWxkLCBDYW5Mb2FkLCBVcmxUcmVlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBWRVJTSU9OIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25UeXBlLCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvciwgQnJvd3NlclV0aWxzLCBVcmxTdHJpbmcsIFBvcHVwUmVxdWVzdCwgUmVkaXJlY3RSZXF1ZXN0LCBBdXRoZW50aWNhdGlvblJlc3VsdCB9IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBNc2FsR3VhcmRDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vbXNhbC5ndWFyZC5jb25maWdcIjtcbmltcG9ydCB7IE1TQUxfR1VBUkRfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjb25jYXRNYXAsIGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNc2FsR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgQ2FuTG9hZCB7XG4gICAgcHJpdmF0ZSBsb2dpbkZhaWxlZFJvdXRlPzogVXJsVHJlZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1TQUxfR1VBUkRfQ09ORklHKSBwcml2YXRlIG1zYWxHdWFyZENvbmZpZzogTXNhbEd1YXJkQ29uZmlndXJhdGlvbixcbiAgICAgICAgcHJpdmF0ZSBtc2FsQnJvYWRjYXN0U2VydmljZTogTXNhbEJyb2FkY2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IE1zYWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICAgICkgeyBcbiAgICAgICAgLy8gU3Vic2NyaWJpbmcgc28gZXZlbnRzIGluIE1zYWxHdWFyZCB3aWxsIHNldCBpblByb2dyZXNzJCBvYnNlcnZhYmxlXG4gICAgICAgIHRoaXMubXNhbEJyb2FkY2FzdFNlcnZpY2UuaW5Qcm9ncmVzcyQuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHVybCBzdHJpbmcgdG8gVXJsVHJlZVxuICAgICAqIEBwYXJhbSB1cmwgXG4gICAgICovXG4gICAgcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBVcmxUcmVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnBhcnNlVXJsKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBhYnNvbHV0ZSB1cmwgZm9yIHRoZSBkZXN0aW5hdGlvbiBwYWdlXG4gICAgICogQHBhcmFtIHBhdGggUmVsYXRpdmUgcGF0aCBvZiByZXF1ZXN0ZWQgcGFnZVxuICAgICAqIEByZXR1cm5zIEZ1bGwgZGVzdGluYXRpb24gdXJsXG4gICAgICovXG4gICAgZ2V0RGVzdGluYXRpb25VcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBnZXR0aW5nIGRlc3RpbmF0aW9uIHVybFwiKTtcbiAgICAgICAgLy8gQWJzb2x1dGUgYmFzZSB1cmwgZm9yIHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCB0byBvcmlnaW4gaWYgYmFzZSBlbGVtZW50IG5vdCBwcmVzZW50KVxuICAgICAgICBjb25zdCBiYXNlRWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJhc2VcIik7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmxvY2F0aW9uLm5vcm1hbGl6ZShiYXNlRWxlbWVudHMubGVuZ3RoID8gYmFzZUVsZW1lbnRzWzBdLmhyZWYgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcblxuICAgICAgICAvLyBQYXRoIG9mIHBhZ2UgKGluY2x1ZGluZyBoYXNoLCBpZiB1c2luZyBoYXNoIHJvdXRpbmcpXG4gICAgICAgIGNvbnN0IHBhdGhVcmwgPSB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChwYXRoKTtcblxuICAgICAgICAvLyBIYXNoIGxvY2F0aW9uIHN0cmF0ZWd5XG4gICAgICAgIGlmIChwYXRoVXJsLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGRlc3RpbmF0aW9uIGJ5IGhhc2ggcm91dGluZ1wiKTtcbiAgICAgICAgICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3BhdGhVcmx9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIElmIHVzaW5nIHBhdGggbG9jYXRpb24gc3RyYXRlZ3ksIHBhdGhVcmwgd2lsbCBpbmNsdWRlIHRoZSByZWxhdGl2ZSBwb3J0aW9uIG9mIHRoZSBiYXNlIHBhdGggKGUuZy4gL2Jhc2UvcGFnZSkuXG4gICAgICAgICAqIFNpbmNlIGJhc2VVcmwgYWxzbyBpbmNsdWRlcyAvYmFzZSwgY2FuIGp1c3QgY29uY2F0ZW50YXRlIGJhc2VVcmwgKyBwYXRoXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0ke3BhdGh9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmFjdGl2ZWx5IHByb21wdCB0aGUgdXNlciB0byBsb2dpblxuICAgICAqIEBwYXJhbSB1cmwgUGF0aCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvZ2luSW50ZXJhY3RpdmVseShzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBhdXRoUmVxdWVzdCA9IHR5cGVvZiB0aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0KHRoaXMuYXV0aFNlcnZpY2UsIHN0YXRlKVxuICAgICAgICAgICAgOiB7IC4uLnRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0IH07XG4gICAgICAgIGlmICh0aGlzLm1zYWxHdWFyZENvbmZpZy5pbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dnaW5nIGluIGJ5IHBvcHVwXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UubG9naW5Qb3B1cChhdXRoUmVxdWVzdCBhcyBQb3B1cFJlcXVlc3QpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2luIGJ5IHBvcHVwIHN1Y2Nlc3NmdWwsIGNhbiBhY3RpdmF0ZSwgc2V0dGluZyBhY3RpdmUgYWNjb3VudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChyZXNwb25zZS5hY2NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2dpbmcgaW4gYnkgcmVkaXJlY3RcIik7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0U3RhcnRQYWdlID0gdGhpcy5nZXREZXN0aW5hdGlvblVybChzdGF0ZS51cmwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5sb2dpblJlZGlyZWN0KHtcbiAgICAgICAgICAgIHJlZGlyZWN0U3RhcnRQYWdlLFxuICAgICAgICAgICAgLi4uYXV0aFJlcXVlc3RcbiAgICAgICAgfSBhcyBSZWRpcmVjdFJlcXVlc3QpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gZmFsc2UpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIHR5cGUsIHByZXZlbnRzIHBhZ2Ugd2l0aCBHdWFyZCB0byBiZSBzZXQgYXMgcmVpZHJlY3QsIGFuZCBjYWxscyBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgXG4gICAgICovXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZUhlbHBlcihzdGF0ZT86IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xuICAgICAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiYgdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihcImludmFsaWRfaW50ZXJhY3Rpb25fdHlwZVwiLCBcIkludmFsaWQgaW50ZXJhY3Rpb24gdHlwZSBwcm92aWRlZCB0byBNU0FMIEd1YXJkLiBJbnRlcmFjdGlvblR5cGUuUG9wdXAgb3IgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIE1zYWxHdWFyZENvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiTVNBTCBHdWFyZCBhY3RpdmF0ZWRcIik7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogSWYgYSBwYWdlIHdpdGggTVNBTCBHdWFyZCBpcyBzZXQgYXMgdGhlIHJlZGlyZWN0IGZvciBhY3F1aXJlVG9rZW5TaWxlbnQsXG4gICAgICAgICAqIHNob3J0LWNpcmN1aXQgdG8gcHJldmVudCByZWRpcmVjdGluZyBvciBwb3B1cHMuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgaWYgKFVybFN0cmluZy5oYXNoQ29udGFpbnNLbm93blByb3BlcnRpZXMod2luZG93LmxvY2F0aW9uLmhhc2gpICYmIEJyb3dzZXJVdGlscy5pc0luSWZyYW1lKCkgJiYgIXRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2UuZ2V0Q29uZmlndXJhdGlvbigpLnN5c3RlbS5hbGxvd1JlZGlyZWN0SW5JZnJhbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLndhcm5pbmcoXCJHdWFyZCAtIHJlZGlyZWN0VXJpIHNldCB0byBwYWdlIHdpdGggTVNBTCBHdWFyZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbm90IHNldCByZWRpcmVjdFVyaSB0byBhIHBhZ2UgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuaW5mbyhcIkd1YXJkIC0gd2luZG93IGlzIHVuZGVmaW5lZCwgTVNBTCBkb2VzIG5vdCBzdXBwb3J0IHNlcnZlci1zaWRlIHRva2VuIGFjcXVpc2l0aW9uXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQgaW4gdGhlIGNvbmZpZywgc2V0IHRoaXMgYXMgdGhlIGxvZ2luRmFpbGVkUm91dGVcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLm1zYWxHdWFyZENvbmZpZy5sb2dpbkZhaWxlZFJvdXRlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luRmFpbGVkUm91dGUgPSB0aGlzLnBhcnNlVXJsKHRoaXMubXNhbEd1YXJkQ29uZmlnLmxvZ2luRmFpbGVkUm91dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FwdHVyZSBjdXJyZW50IHBhdGggYmVmb3JlIGl0IGdldHMgY2hhbmdlZCBieSBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcbiAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBubyBhY2NvdW50cyByZXRyaWV2ZWQsIGxvZyBpbiByZXF1aXJlZCB0byBhY3RpdmF0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpbkludGVyYWN0aXZlbHkoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbm8gYWNjb3VudHMgcmV0cmlldmVkLCBubyBzdGF0ZSwgY2Fubm90IGxvYWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBhdCBsZWFzdCAxIGFjY291bnQgZXhpc3RzLCBjYW4gYWN0aXZhdGUgb3IgbG9hZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG5hdmlnYXRpbmcgdGhlIGFwcCB0byAvI2NvZGU9IG9yIC9jb2RlPVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXRoIHJvdXRpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZS51cmw6IC8jY29kZT0uLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnJvb3QuZnJhZ21lbnQ6IGNvZGU9Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEhhc2ggcm91dGluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnVybDogL2NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnJvb3QuZnJhZ21lbnQ6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQ29udGFpbnNDb2RlOiBib29sZWFuID0gdGhpcy5pbmNsdWRlc0NvZGUoc3RhdGUudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50Q29udGFpbnNDb2RlOiBib29sZWFuID0gISFzdGF0ZS5yb290ICYmICEhc3RhdGUucm9vdC5mcmFnbWVudCAmJiB0aGlzLmluY2x1ZGVzQ29kZShgIyR7c3RhdGUucm9vdC5mcmFnbWVudH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hSb3V0aW5nOiBib29sZWFuID0gdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwoc3RhdGUudXJsKS5pbmRleE9mKFwiI1wiKSA9PT0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGNvZGUgcGFyYW1ldGVyIGlzIGluIGZyYWdtZW50IChhbmQgbm90IGluIHF1ZXJ5IHBhcmFtZXRlciksIG9yIHRoYXQgaGFzaCBoYXNoIHJvdXRpbmcgaXMgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybENvbnRhaW5zQ29kZSAmJiAoZnJhZ21lbnRDb250YWluc0NvZGUgfHwgaGFzaFJvdXRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5pbmZvKFwiR3VhcmQgLSBIYXNoIGNvbnRhaW5zIGtub3duIGNvZGUgcmVzcG9uc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggcm91dGluZyAobmF2aWdhdGUgdG8gY3VycmVudCBwYXRoIHdpdGhvdXQgaGFzaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhdGguaW5kZXhPZihcIiNcIikgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybCh0aGlzLmxvY2F0aW9uLnBhdGgoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXNoIHJvdXRpbmcgKG5hdmlnYXRlIHRvIHJvb3QgcGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybChcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvcihcIkd1YXJkIC0gZXJyb3Igd2hpbGUgbG9nZ2luZyBpbiwgdW5hYmxlIHRvIGFjdGl2YXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmVycm9yUGlpKGBHdWFyZCAtIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGxvZ2luRmFpbGVkUm91dGUgaXMgc2V0LCBjaGVja3MgdG8gc2VlIGlmIEFuZ3VsYXIgMTArIGlzIHVzZWQgYW5kIHN0YXRlIGlzIHBhc3NlZCBpbiBiZWZvcmUgcmV0dXJuaW5nIHJvdXRlXG4gICAgICAgICAgICAgICAgICAgICAqIEFwcHMgdXNpbmcgQW5ndWxhciA5IHdpbGwgcmVjZWl2ZSBvZihmYWxzZSkgaW4gY2FuTG9hZCBpbnRlcmZhY2UsIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgVXJsVHJlZSByZXR1cm4gdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ2luRmFpbGVkUm91dGUgJiYgcGFyc2VJbnQoVkVSU0lPTi5tYWpvciwgMTApID4gOSAmJiBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dpbkZhaWxlZFJvdXRlIHNldCwgcmVkaXJlY3RpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5sb2dpbkZhaWxlZFJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGluY2x1ZGVzQ29kZShwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChwYXRoLmxhc3RJbmRleE9mKFwiL2NvZGVcIikgPiAtMSAmJlxuICAgICAgICAgICAgcGF0aC5sYXN0SW5kZXhPZihcIi9jb2RlXCIpID09PSBwYXRoLmxlbmd0aCAtIFwiL2NvZGVcIi5sZW5ndGgpIHx8IC8vIHBhdGguZW5kc1dpdGgoXCIvY29kZVwiKVxuICAgICAgICAgICAgcGF0aC5pbmRleE9mKFwiI2NvZGU9XCIpID4gLTEgfHwgXG4gICAgICAgICAgICBwYXRoLmluZGV4T2YoXCImY29kZT1cIikgPiAtMTtcbiAgICB9XG5cbiAgICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkFjdGl2YXRlXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUhlbHBlcihzdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FuQWN0aXZhdGVDaGlsZChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkFjdGl2YXRlQ2hpbGRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlSGVscGVyKHN0YXRlKTtcbiAgICB9XG5cbiAgICBjYW5Mb2FkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkxvYWRcIik7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVIZWxwZXIoKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
-
* Licensed under the MIT License.
|
|
4
|
-
*/
|
|
5
|
-
export {};
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5pbnRlcmNlcHRvci5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEh0dHBSZXF1ZXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBQb3B1cFJlcXVlc3QsIFJlZGlyZWN0UmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLCBTaWxlbnRSZXF1ZXN0IH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgPSBPbWl0PFBvcHVwUmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFJlZGlyZWN0UmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFNpbGVudFJlcXVlc3QsIFwic2NvcGVzXCI+IDtcblxuZXhwb3J0IHR5cGUgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiA9IHtcbiAgICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZU1hcDogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nfFByb3RlY3RlZFJlc291cmNlU2NvcGVzPiB8IG51bGw+O1xuICAgIGF1dGhSZXF1ZXN0PzogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgfCAoKG1zYWxTZXJ2aWNlOiBNc2FsU2VydmljZSwgcmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgb3JpZ2luYWxBdXRoUmVxdWVzdDogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QpID0+IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0KTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3RlY3RlZFJlc291cmNlU2NvcGVzID0ge1xuICAgIGh0dHBNZXRob2Q6IHN0cmluZyxcbiAgICBzY29wZXM6IEFycmF5PHN0cmluZz5cbn07XG5cbmV4cG9ydCB0eXBlIE1hdGNoaW5nUmVzb3VyY2VzID0ge1xuICAgIGFic29sdXRlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+LFxuICAgIHJlbGF0aXZlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+XG59O1xuIl19
|