@azure/msal-angular 0.0.0-alpha1
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 +16 -0
- package/IMsalService.d.ts.map +1 -0
- package/LICENSE +21 -0
- package/README.md +151 -0
- package/azure-msal-angular.d.ts +5 -0
- package/azure-msal-angular.d.ts.map +1 -0
- package/azure-msal-angular.metadata.json +1 -0
- package/bundles/azure-msal-angular.umd.js +991 -0
- package/bundles/azure-msal-angular.umd.js.map +1 -0
- package/bundles/azure-msal-angular.umd.min.js +2 -0
- package/bundles/azure-msal-angular.umd.min.js.map +1 -0
- package/constants.d.ts +6 -0
- package/constants.d.ts.map +1 -0
- package/esm2015/IMsalService.js +6 -0
- package/esm2015/azure-msal-angular.js +5 -0
- package/esm2015/constants.js +10 -0
- package/esm2015/msal.broadcast.config.js +6 -0
- package/esm2015/msal.broadcast.service.js +46 -0
- package/esm2015/msal.guard.config.js +6 -0
- package/esm2015/msal.guard.js +189 -0
- package/esm2015/msal.interceptor.config.js +6 -0
- package/esm2015/msal.interceptor.js +208 -0
- package/esm2015/msal.module.js +46 -0
- package/esm2015/msal.navigation.client.js +53 -0
- package/esm2015/msal.redirect.component.js +33 -0
- package/esm2015/msal.service.js +77 -0
- package/esm2015/packageMetadata.js +4 -0
- package/esm2015/public-api.js +18 -0
- package/fesm2015/azure-msal-angular.js +636 -0
- package/fesm2015/azure-msal-angular.js.map +1 -0
- package/msal.broadcast.config.d.ts +4 -0
- package/msal.broadcast.config.d.ts.map +1 -0
- package/msal.broadcast.service.d.ts +15 -0
- package/msal.broadcast.service.d.ts.map +1 -0
- package/msal.guard.config.d.ts +10 -0
- package/msal.guard.config.d.ts.map +1 -0
- package/msal.guard.d.ts +41 -0
- package/msal.guard.d.ts.map +1 -0
- package/msal.interceptor.config.d.ts +18 -0
- package/msal.interceptor.config.d.ts.map +1 -0
- package/msal.interceptor.d.ts +50 -0
- package/msal.interceptor.d.ts.map +1 -0
- package/msal.module.d.ts +8 -0
- package/msal.module.d.ts.map +1 -0
- package/msal.navigation.client.d.ts +17 -0
- package/msal.navigation.client.d.ts.map +1 -0
- package/msal.redirect.component.d.ts +13 -0
- package/msal.redirect.component.d.ts.map +1 -0
- package/msal.service.d.ts +29 -0
- package/msal.service.d.ts.map +1 -0
- package/package.json +35 -0
- package/packageMetadata.d.ts +3 -0
- package/packageMetadata.d.ts.map +1 -0
- package/public-api.d.ts +18 -0
- package/public-api.d.ts.map +1 -0
|
@@ -0,0 +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
|
+
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=
|
|
@@ -0,0 +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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5pbnRlcmNlcHRvci5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEh0dHBSZXF1ZXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBQb3B1cFJlcXVlc3QsIFJlZGlyZWN0UmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLCBTaWxlbnRSZXF1ZXN0IH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgPSBPbWl0PFBvcHVwUmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFJlZGlyZWN0UmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFNpbGVudFJlcXVlc3QsIFwic2NvcGVzXCI+IDtcblxuZXhwb3J0IHR5cGUgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiA9IHtcbiAgICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZU1hcDogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nfFByb3RlY3RlZFJlc291cmNlU2NvcGVzPiB8IG51bGw+O1xuICAgIGF1dGhSZXF1ZXN0PzogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgfCAoKG1zYWxTZXJ2aWNlOiBNc2FsU2VydmljZSwgcmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgb3JpZ2luYWxBdXRoUmVxdWVzdDogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QpID0+IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0KTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3RlY3RlZFJlc291cmNlU2NvcGVzID0ge1xuICAgIGh0dHBNZXRob2Q6IHN0cmluZyxcbiAgICBzY29wZXM6IEFycmF5PHN0cmluZz5cbn07XG5cbmV4cG9ydCB0eXBlIE1hdGNoaW5nUmVzb3VyY2VzID0ge1xuICAgIGFic29sdXRlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+LFxuICAgIHJlbGF0aXZlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+XG59O1xuIl19
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { Location, DOCUMENT } from "@angular/common";
|
|
6
|
+
import { EMPTY, of } from "rxjs";
|
|
7
|
+
import { switchMap, catchError } from "rxjs/operators";
|
|
8
|
+
import { MsalService } from "./msal.service";
|
|
9
|
+
import { BrowserConfigurationAuthError, InteractionType, StringUtils, UrlString } from "@azure/msal-browser";
|
|
10
|
+
import { Injectable, Inject } from "@angular/core";
|
|
11
|
+
import { MSAL_INTERCEPTOR_CONFIG } from "./constants";
|
|
12
|
+
export class MsalInterceptor {
|
|
13
|
+
constructor(msalInterceptorConfig, authService, location,
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
|
|
15
|
+
document) {
|
|
16
|
+
this.msalInterceptorConfig = msalInterceptorConfig;
|
|
17
|
+
this.authService = authService;
|
|
18
|
+
this.location = location;
|
|
19
|
+
this._document = document;
|
|
20
|
+
}
|
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
22
|
+
intercept(req, next) {
|
|
23
|
+
if (this.msalInterceptorConfig.interactionType !== InteractionType.Popup && this.msalInterceptorConfig.interactionType !== InteractionType.Redirect) {
|
|
24
|
+
throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Interceptor. InteractionType.Popup, InteractionType.Redirect must be provided in the msalInterceptorConfiguration");
|
|
25
|
+
}
|
|
26
|
+
this.authService.getLogger().verbose("MSAL Interceptor activated");
|
|
27
|
+
const scopes = this.getScopesForEndpoint(req.url, req.method);
|
|
28
|
+
// If no scopes for endpoint, does not acquire token
|
|
29
|
+
if (!scopes || scopes.length === 0) {
|
|
30
|
+
this.authService.getLogger().verbose("Interceptor - no scopes for endpoint");
|
|
31
|
+
return next.handle(req);
|
|
32
|
+
}
|
|
33
|
+
// Sets account as active account or first account
|
|
34
|
+
let account;
|
|
35
|
+
if (!!this.authService.instance.getActiveAccount()) {
|
|
36
|
+
this.authService.getLogger().verbose("Interceptor - active account selected");
|
|
37
|
+
account = this.authService.instance.getActiveAccount();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.authService.getLogger().verbose("Interceptor - no active account, fallback to first account");
|
|
41
|
+
account = this.authService.instance.getAllAccounts()[0];
|
|
42
|
+
}
|
|
43
|
+
const authRequest = typeof this.msalInterceptorConfig.authRequest === "function"
|
|
44
|
+
? this.msalInterceptorConfig.authRequest(this.authService, req, { account: account })
|
|
45
|
+
: Object.assign(Object.assign({}, this.msalInterceptorConfig.authRequest), { account });
|
|
46
|
+
this.authService.getLogger().info(`Interceptor - ${scopes.length} scopes found for endpoint`);
|
|
47
|
+
this.authService.getLogger().infoPii(`Interceptor - [${scopes}] scopes found for ${req.url}`);
|
|
48
|
+
// Note: For MSA accounts, include openid scope when calling acquireTokenSilent to return idToken
|
|
49
|
+
return this.authService.acquireTokenSilent(Object.assign(Object.assign({}, authRequest), { scopes, account }))
|
|
50
|
+
.pipe(catchError(() => {
|
|
51
|
+
this.authService.getLogger().error("Interceptor - acquireTokenSilent rejected with error. Invoking interaction to resolve.");
|
|
52
|
+
return this.acquireTokenInteractively(authRequest, scopes);
|
|
53
|
+
}), switchMap((result) => {
|
|
54
|
+
if (!result.accessToken) {
|
|
55
|
+
this.authService.getLogger().error("Interceptor - acquireTokenSilent resolved with null access token. Known issue with B2C tenants, invoking interaction to resolve.");
|
|
56
|
+
return this.acquireTokenInteractively(authRequest, scopes);
|
|
57
|
+
}
|
|
58
|
+
return of(result);
|
|
59
|
+
}), switchMap((result) => {
|
|
60
|
+
this.authService.getLogger().verbose("Interceptor - setting authorization headers");
|
|
61
|
+
const headers = req.headers
|
|
62
|
+
.set("Authorization", `Bearer ${result.accessToken}`);
|
|
63
|
+
const requestClone = req.clone({ headers });
|
|
64
|
+
return next.handle(requestClone);
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Invoke interaction for the given set of scopes
|
|
69
|
+
* @param authRequest Request
|
|
70
|
+
* @param scopes Array of scopes for the request
|
|
71
|
+
* @returns Result from the interactive request
|
|
72
|
+
*/
|
|
73
|
+
acquireTokenInteractively(authRequest, scopes) {
|
|
74
|
+
if (this.msalInterceptorConfig.interactionType === InteractionType.Popup) {
|
|
75
|
+
this.authService.getLogger().verbose("Interceptor - error acquiring token silently, acquiring by popup");
|
|
76
|
+
return this.authService.acquireTokenPopup(Object.assign(Object.assign({}, authRequest), { scopes }));
|
|
77
|
+
}
|
|
78
|
+
this.authService.getLogger().verbose("Interceptor - error acquiring token silently, acquiring by redirect");
|
|
79
|
+
const redirectStartPage = window.location.href;
|
|
80
|
+
this.authService.acquireTokenRedirect(Object.assign(Object.assign({}, authRequest), { scopes, redirectStartPage }));
|
|
81
|
+
return EMPTY;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Looks up the scopes for the given endpoint from the protectedResourceMap
|
|
85
|
+
* @param endpoint Url of the request
|
|
86
|
+
* @param httpMethod Http method of the request
|
|
87
|
+
* @returns Array of scopes, or null if not found
|
|
88
|
+
*
|
|
89
|
+
*/
|
|
90
|
+
getScopesForEndpoint(endpoint, httpMethod) {
|
|
91
|
+
this.authService.getLogger().verbose("Interceptor - getting scopes for endpoint");
|
|
92
|
+
// Ensures endpoints and protected resources compared are normalized
|
|
93
|
+
const normalizedEndpoint = this.location.normalize(endpoint);
|
|
94
|
+
const protectedResourcesArray = Array.from(this.msalInterceptorConfig.protectedResourceMap.keys());
|
|
95
|
+
const matchingProtectedResources = this.matchResourcesToEndpoint(protectedResourcesArray, normalizedEndpoint);
|
|
96
|
+
// Check absolute urls of resources first before checking relative to prevent incorrect matching where multiple resources have similar relative urls
|
|
97
|
+
if (matchingProtectedResources.absoluteResources.length > 0) {
|
|
98
|
+
return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources.absoluteResources, httpMethod);
|
|
99
|
+
}
|
|
100
|
+
else if (matchingProtectedResources.relativeResources.length > 0) {
|
|
101
|
+
return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources.relativeResources, httpMethod);
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Finds resource endpoints that match request endpoint
|
|
107
|
+
* @param protectedResourcesEndpoints
|
|
108
|
+
* @param endpoint
|
|
109
|
+
* @returns
|
|
110
|
+
*/
|
|
111
|
+
matchResourcesToEndpoint(protectedResourcesEndpoints, endpoint) {
|
|
112
|
+
const matchingResources = { absoluteResources: [], relativeResources: [] };
|
|
113
|
+
protectedResourcesEndpoints.forEach(key => {
|
|
114
|
+
// Normalizes and adds resource to matchingResources.absoluteResources if key matches endpoint. StringUtils.matchPattern accounts for wildcards
|
|
115
|
+
const normalizedKey = this.location.normalize(key);
|
|
116
|
+
if (StringUtils.matchPattern(normalizedKey, endpoint)) {
|
|
117
|
+
matchingResources.absoluteResources.push(key);
|
|
118
|
+
}
|
|
119
|
+
// Get url components for relative urls
|
|
120
|
+
const absoluteKey = this.getAbsoluteUrl(key);
|
|
121
|
+
const keyComponents = new UrlString(absoluteKey).getUrlComponents();
|
|
122
|
+
const absoluteEndpoint = this.getAbsoluteUrl(endpoint);
|
|
123
|
+
const endpointComponents = new UrlString(absoluteEndpoint).getUrlComponents();
|
|
124
|
+
// Normalized key should include query strings if applicable
|
|
125
|
+
const relativeNormalizedKey = keyComponents.QueryString ? `${keyComponents.AbsolutePath}?${keyComponents.QueryString}` : this.location.normalize(keyComponents.AbsolutePath);
|
|
126
|
+
// Add resource to matchingResources.relativeResources if same origin, relativeKey matches endpoint, and is not empty
|
|
127
|
+
if (keyComponents.HostNameAndPort === endpointComponents.HostNameAndPort && StringUtils.matchPattern(relativeNormalizedKey, absoluteEndpoint) && relativeNormalizedKey !== "" && relativeNormalizedKey !== "/*") {
|
|
128
|
+
matchingResources.relativeResources.push(key);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
return matchingResources;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Transforms relative urls to absolute urls
|
|
135
|
+
* @param url
|
|
136
|
+
* @returns
|
|
137
|
+
*/
|
|
138
|
+
getAbsoluteUrl(url) {
|
|
139
|
+
const link = this._document.createElement("a");
|
|
140
|
+
link.href = url;
|
|
141
|
+
return link.href;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Finds scopes from first matching endpoint with HTTP method that matches request
|
|
145
|
+
* @param protectedResourceMap Protected resource map
|
|
146
|
+
* @param endpointArray Array of resources that match request endpoint
|
|
147
|
+
* @param httpMethod Http method of the request
|
|
148
|
+
* @returns
|
|
149
|
+
*/
|
|
150
|
+
matchScopesToEndpoint(protectedResourceMap, endpointArray, httpMethod) {
|
|
151
|
+
const allMatchedScopes = [];
|
|
152
|
+
// Check each matched endpoint for matching HttpMethod and scopes
|
|
153
|
+
endpointArray.forEach(matchedEndpoint => {
|
|
154
|
+
const scopesForEndpoint = [];
|
|
155
|
+
const methodAndScopesArray = protectedResourceMap.get(matchedEndpoint);
|
|
156
|
+
// Return if resource is unprotected
|
|
157
|
+
if (methodAndScopesArray === null) {
|
|
158
|
+
allMatchedScopes.push(null);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
methodAndScopesArray.forEach(entry => {
|
|
162
|
+
// Entry is either array of scopes or ProtectedResourceScopes object
|
|
163
|
+
if (typeof entry === "string") {
|
|
164
|
+
scopesForEndpoint.push(entry);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// Ensure methods being compared are normalized
|
|
168
|
+
const normalizedRequestMethod = httpMethod.toLowerCase();
|
|
169
|
+
const normalizedResourceMethod = entry.httpMethod.toLowerCase();
|
|
170
|
+
// Method in protectedResourceMap matches request http method
|
|
171
|
+
if (normalizedResourceMethod === normalizedRequestMethod) {
|
|
172
|
+
// Validate if scopes comes null to unprotect the resource in a certain http method
|
|
173
|
+
if (entry.scopes === null) {
|
|
174
|
+
allMatchedScopes.push(null);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
entry.scopes.forEach((scope) => {
|
|
178
|
+
scopesForEndpoint.push(scope);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
// Only add to all scopes if scopes for endpoint and method is found
|
|
185
|
+
if (scopesForEndpoint.length > 0) {
|
|
186
|
+
allMatchedScopes.push(scopesForEndpoint);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
if (allMatchedScopes.length > 0) {
|
|
190
|
+
if (allMatchedScopes.length > 1) {
|
|
191
|
+
this.authService.getLogger().warning("Interceptor - More than 1 matching scopes for endpoint found.");
|
|
192
|
+
}
|
|
193
|
+
// Returns scopes for first matching endpoint
|
|
194
|
+
return allMatchedScopes[0];
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
MsalInterceptor.decorators = [
|
|
200
|
+
{ type: Injectable }
|
|
201
|
+
];
|
|
202
|
+
MsalInterceptor.ctorParameters = () => [
|
|
203
|
+
{ type: undefined, decorators: [{ type: Inject, args: [MSAL_INTERCEPTOR_CONFIG,] }] },
|
|
204
|
+
{ type: MsalService },
|
|
205
|
+
{ type: Location },
|
|
206
|
+
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
|
|
207
|
+
];
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQVFILE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFxQyw2QkFBNkIsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl0RCxNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUM2QyxxQkFBbUQsRUFDcEYsV0FBd0IsRUFDeEIsUUFBa0I7SUFDMUIsaUhBQWlIO0lBQy9GLFFBQWM7UUFKUywwQkFBcUIsR0FBckIscUJBQXFCLENBQThCO1FBQ3BGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFvQixDQUFDO0lBQzFDLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDOUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxLQUFLLGVBQWUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQ2pKLE1BQU0sSUFB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SyxFQUFFLEVBQUU7Z0NBQzNCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbEMsQ0FBQyxDQUFDLENBQUM7eUJBQ047cUJBQ0o7aUJBQ0o7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILG9FQUFvRTtZQUNwRSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzVDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2FBQ3pHO1lBQ0QsNkNBQTZDO1lBQzdDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7WUExTkosVUFBVTs7OzRDQUtGLE1BQU0sU0FBQyx1QkFBdUI7WUFYOUIsV0FBVztZQUhYLFFBQVE7NENBa0JSLE1BQU0sU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgSHR0cFJlcXVlc3QsXG4gICAgSHR0cEhhbmRsZXIsXG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBJbnRlcmNlcHRvclxufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IExvY2F0aW9uLCBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIEVNUFRZLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBY2NvdW50SW5mbywgQXV0aGVudGljYXRpb25SZXN1bHQsIEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLCBJbnRlcmFjdGlvblR5cGUsIFN0cmluZ1V0aWxzLCBVcmxTdHJpbmcgfSBmcm9tIFwiQGF6dXJlL21zYWwtYnJvd3NlclwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1TQUxfSU5URVJDRVBUT1JfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCwgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiwgUHJvdGVjdGVkUmVzb3VyY2VTY29wZXMsIE1hdGNoaW5nUmVzb3VyY2VzIH0gZnJvbSBcIi4vbXNhbC5pbnRlcmNlcHRvci5jb25maWdcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1zYWxJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgcHJpdmF0ZSBfZG9jdW1lbnQ/OiBEb2N1bWVudDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1TQUxfSU5URVJDRVBUT1JfQ09ORklHKSBwcml2YXRlIG1zYWxJbnRlcmNlcHRvckNvbmZpZzogTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbixcbiAgICAgICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTXNhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudD86IGFueVxuICAgICkge1xuICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50IGFzIERvY3VtZW50O1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIGlmICh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCAmJiB0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKFwiaW52YWxpZF9pbnRlcmFjdGlvbl90eXBlXCIsIFwiSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgSW50ZXJjZXB0b3IuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIG1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJNU0FMIEludGVyY2VwdG9yIGFjdGl2YXRlZFwiKTtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gdGhpcy5nZXRTY29wZXNGb3JFbmRwb2ludChyZXEudXJsLCByZXEubWV0aG9kKTtcblxuICAgICAgICAvLyBJZiBubyBzY29wZXMgZm9yIGVuZHBvaW50LCBkb2VzIG5vdCBhY3F1aXJlIHRva2VuXG4gICAgICAgIGlmICghc2NvcGVzIHx8IHNjb3Blcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gbm8gc2NvcGVzIGZvciBlbmRwb2ludFwiKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0cyBhY2NvdW50IGFzIGFjdGl2ZSBhY2NvdW50IG9yIGZpcnN0IGFjY291bnRcbiAgICAgICAgbGV0IGFjY291bnQ6IEFjY291bnRJbmZvO1xuICAgICAgICBpZiAoISF0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBhY3RpdmUgYWNjb3VudCBzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIGFjY291bnQgPSB0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gbm8gYWN0aXZlIGFjY291bnQsIGZhbGxiYWNrIHRvIGZpcnN0IGFjY291bnRcIik7XG4gICAgICAgICAgICBhY2NvdW50ID0gdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXV0aFJlcXVlc3QgPSB0eXBlb2YgdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuYXV0aFJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyB0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5hdXRoUmVxdWVzdCh0aGlzLmF1dGhTZXJ2aWNlLCByZXEsIHsgYWNjb3VudDogYWNjb3VudCB9KVxuICAgICAgICAgICAgOiB7IC4uLnRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLmF1dGhSZXF1ZXN0LCBhY2NvdW50IH07XG5cbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5pbmZvKGBJbnRlcmNlcHRvciAtICR7c2NvcGVzLmxlbmd0aH0gc2NvcGVzIGZvdW5kIGZvciBlbmRwb2ludGApO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmluZm9QaWkoYEludGVyY2VwdG9yIC0gWyR7c2NvcGVzfV0gc2NvcGVzIGZvdW5kIGZvciAke3JlcS51cmx9YCk7XG5cbiAgICAgICAgLy8gTm90ZTogRm9yIE1TQSBhY2NvdW50cywgaW5jbHVkZSBvcGVuaWQgc2NvcGUgd2hlbiBjYWxsaW5nIGFjcXVpcmVUb2tlblNpbGVudCB0byByZXR1cm4gaWRUb2tlblxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5hY3F1aXJlVG9rZW5TaWxlbnQoey4uLmF1dGhSZXF1ZXN0LCBzY29wZXMsIGFjY291bnQgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmVycm9yKFwiSW50ZXJjZXB0b3IgLSBhY3F1aXJlVG9rZW5TaWxlbnQgcmVqZWN0ZWQgd2l0aCBlcnJvci4gSW52b2tpbmcgaW50ZXJhY3Rpb24gdG8gcmVzb2x2ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbkludGVyYWN0aXZlbHkoYXV0aFJlcXVlc3QsIHNjb3Blcyk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvcihcIkludGVyY2VwdG9yIC0gYWNxdWlyZVRva2VuU2lsZW50IHJlc29sdmVkIHdpdGggbnVsbCBhY2Nlc3MgdG9rZW4uIEtub3duIGlzc3VlIHdpdGggQjJDIHRlbmFudHMsIGludm9raW5nIGludGVyYWN0aW9uIHRvIHJlc29sdmUuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuSW50ZXJhY3RpdmVseShhdXRoUmVxdWVzdCwgc2NvcGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBzZXR0aW5nIGF1dGhvcml6YXRpb24gaGVhZGVyc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7cmVzdWx0LmFjY2Vzc1Rva2VufWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RDbG9uZSA9IHJlcS5jbG9uZSh7aGVhZGVyc30pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdENsb25lKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgaW50ZXJhY3Rpb24gZm9yIHRoZSBnaXZlbiBzZXQgb2Ygc2NvcGVzXG4gICAgICogQHBhcmFtIGF1dGhSZXF1ZXN0IFJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2NvcGVzIEFycmF5IG9mIHNjb3BlcyBmb3IgdGhlIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyBSZXN1bHQgZnJvbSB0aGUgaW50ZXJhY3RpdmUgcmVxdWVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgYWNxdWlyZVRva2VuSW50ZXJhY3RpdmVseShhdXRoUmVxdWVzdDogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QsIHNjb3Blczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0aW9uUmVzdWx0PiB7XG4gICAgICAgIGlmICh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBlcnJvciBhY3F1aXJpbmcgdG9rZW4gc2lsZW50bHksIGFjcXVpcmluZyBieSBwb3B1cFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblBvcHVwKHsgLi4uYXV0aFJlcXVlc3QsIHNjb3BlcyB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJJbnRlcmNlcHRvciAtIGVycm9yIGFjcXVpcmluZyB0b2tlbiBzaWxlbnRseSwgYWNxdWlyaW5nIGJ5IHJlZGlyZWN0XCIpO1xuICAgICAgICBjb25zdCByZWRpcmVjdFN0YXJ0UGFnZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblJlZGlyZWN0KHsuLi5hdXRoUmVxdWVzdCwgc2NvcGVzLCByZWRpcmVjdFN0YXJ0UGFnZSB9KTtcbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIHRoZSBzY29wZXMgZm9yIHRoZSBnaXZlbiBlbmRwb2ludCBmcm9tIHRoZSBwcm90ZWN0ZWRSZXNvdXJjZU1hcFxuICAgICAqIEBwYXJhbSBlbmRwb2ludCBVcmwgb2YgdGhlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCBIdHRwIG1ldGhvZCBvZiB0aGUgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIHNjb3Blcywgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0U2NvcGVzRm9yRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZywgaHR0cE1ldGhvZDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPnxudWxsIHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBnZXR0aW5nIHNjb3BlcyBmb3IgZW5kcG9pbnRcIik7XG5cbiAgICAgICAgLy8gRW5zdXJlcyBlbmRwb2ludHMgYW5kIHByb3RlY3RlZCByZXNvdXJjZXMgY29tcGFyZWQgYXJlIG5vcm1hbGl6ZWRcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVuZHBvaW50ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoZW5kcG9pbnQpO1xuXG4gICAgICAgIGNvbnN0IHByb3RlY3RlZFJlc291cmNlc0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5wcm90ZWN0ZWRSZXNvdXJjZU1hcC5rZXlzKCkpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nUHJvdGVjdGVkUmVzb3VyY2VzID0gdGhpcy5tYXRjaFJlc291cmNlc1RvRW5kcG9pbnQocHJvdGVjdGVkUmVzb3VyY2VzQXJyYXksIG5vcm1hbGl6ZWRFbmRwb2ludCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgYWJzb2x1dGUgdXJscyBvZiByZXNvdXJjZXMgZmlyc3QgYmVmb3JlIGNoZWNraW5nIHJlbGF0aXZlIHRvIHByZXZlbnQgaW5jb3JyZWN0IG1hdGNoaW5nIHdoZXJlIG11bHRpcGxlIHJlc291cmNlcyBoYXZlIHNpbWlsYXIgcmVsYXRpdmUgdXJsc1xuICAgICAgICBpZiAobWF0Y2hpbmdQcm90ZWN0ZWRSZXNvdXJjZXMuYWJzb2x1dGVSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTY29wZXNUb0VuZHBvaW50KHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLnByb3RlY3RlZFJlc291cmNlTWFwLCBtYXRjaGluZ1Byb3RlY3RlZFJlc291cmNlcy5hYnNvbHV0ZVJlc291cmNlcywgaHR0cE1ldGhvZCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmdQcm90ZWN0ZWRSZXNvdXJjZXMucmVsYXRpdmVSZXNvdXJjZXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFNjb3Blc1RvRW5kcG9pbnQodGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcucHJvdGVjdGVkUmVzb3VyY2VNYXAsIG1hdGNoaW5nUHJvdGVjdGVkUmVzb3VyY2VzLnJlbGF0aXZlUmVzb3VyY2VzLCBodHRwTWV0aG9kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHJlc291cmNlIGVuZHBvaW50cyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcbiAgICAgKiBAcGFyYW0gcHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzXG4gICAgICogQHBhcmFtIGVuZHBvaW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHByaXZhdGUgbWF0Y2hSZXNvdXJjZXNUb0VuZHBvaW50KHByb3RlY3RlZFJlc291cmNlc0VuZHBvaW50czogc3RyaW5nW10sIGVuZHBvaW50OiBzdHJpbmcpOiBNYXRjaGluZ1Jlc291cmNlcyB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nUmVzb3VyY2VzOiBNYXRjaGluZ1Jlc291cmNlcyA9IHthYnNvbHV0ZVJlc291cmNlczogW10sIHJlbGF0aXZlUmVzb3VyY2VzOiBbXX07XG5cbiAgICAgICAgcHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZXMgYW5kIGFkZHMgcmVzb3VyY2UgdG8gbWF0Y2hpbmdSZXNvdXJjZXMuYWJzb2x1dGVSZXNvdXJjZXMgaWYga2V5IG1hdGNoZXMgZW5kcG9pbnQuIFN0cmluZ1V0aWxzLm1hdGNoUGF0dGVybiBhY2NvdW50cyBmb3Igd2lsZGNhcmRzXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoa2V5KTtcbiAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5tYXRjaFBhdHRlcm4obm9ybWFsaXplZEtleSwgZW5kcG9pbnQpKXtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ1Jlc291cmNlcy5hYnNvbHV0ZVJlc291cmNlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEdldCB1cmwgY29tcG9uZW50cyBmb3IgcmVsYXRpdmUgdXJsc1xuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVLZXkgPSB0aGlzLmdldEFic29sdXRlVXJsKGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyhhYnNvbHV0ZUtleSkuZ2V0VXJsQ29tcG9uZW50cygpO1xuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVFbmRwb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVVcmwoZW5kcG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnRDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyhhYnNvbHV0ZUVuZHBvaW50KS5nZXRVcmxDb21wb25lbnRzKCk7XG5cbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZWQga2V5IHNob3VsZCBpbmNsdWRlIHF1ZXJ5IHN0cmluZ3MgaWYgYXBwbGljYWJsZVxuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVOb3JtYWxpemVkS2V5ID0ga2V5Q29tcG9uZW50cy5RdWVyeVN0cmluZyA/IGAke2tleUNvbXBvbmVudHMuQWJzb2x1dGVQYXRofT8ke2tleUNvbXBvbmVudHMuUXVlcnlTdHJpbmd9YCA6IHRoaXMubG9jYXRpb24ubm9ybWFsaXplKGtleUNvbXBvbmVudHMuQWJzb2x1dGVQYXRoKTtcblxuICAgICAgICAgICAgLy8gQWRkIHJlc291cmNlIHRvIG1hdGNoaW5nUmVzb3VyY2VzLnJlbGF0aXZlUmVzb3VyY2VzIGlmIHNhbWUgb3JpZ2luLCByZWxhdGl2ZUtleSBtYXRjaGVzIGVuZHBvaW50LCBhbmQgaXMgbm90IGVtcHR5XG4gICAgICAgICAgICBpZiAoa2V5Q29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgPT09IGVuZHBvaW50Q29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgJiYgU3RyaW5nVXRpbHMubWF0Y2hQYXR0ZXJuKHJlbGF0aXZlTm9ybWFsaXplZEtleSwgYWJzb2x1dGVFbmRwb2ludCkgJiYgcmVsYXRpdmVOb3JtYWxpemVkS2V5ICE9PSBcIlwiICYmIHJlbGF0aXZlTm9ybWFsaXplZEtleSAhPT0gXCIvKlwiKXtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ1Jlc291cmNlcy5yZWxhdGl2ZVJlc291cmNlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtYXRjaGluZ1Jlc291cmNlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIHJlbGF0aXZlIHVybHMgdG8gYWJzb2x1dGUgdXJsc1xuICAgICAqIEBwYXJhbSB1cmwgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBYnNvbHV0ZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICByZXR1cm4gbGluay5ocmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHNjb3BlcyBmcm9tIGZpcnN0IG1hdGNoaW5nIGVuZHBvaW50IHdpdGggSFRUUCBtZXRob2QgdGhhdCBtYXRjaGVzIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcHJvdGVjdGVkUmVzb3VyY2VNYXAgUHJvdGVjdGVkIHJlc291cmNlIG1hcFxuICAgICAqIEBwYXJhbSBlbmRwb2ludEFycmF5IEFycmF5IG9mIHJlc291cmNlcyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcbiAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCBIdHRwIG1ldGhvZCBvZiB0aGUgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHByaXZhdGUgbWF0Y2hTY29wZXNUb0VuZHBvaW50KHByb3RlY3RlZFJlc291cmNlTWFwOiBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmd8UHJvdGVjdGVkUmVzb3VyY2VTY29wZXM+IHwgbnVsbD4sIGVuZHBvaW50QXJyYXk6IHN0cmluZ1tdLCBodHRwTWV0aG9kOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+fG51bGwge1xuICAgICAgICBjb25zdCBhbGxNYXRjaGVkU2NvcGVzID0gW107XG5cbiAgICAgICAgLy8gQ2hlY2sgZWFjaCBtYXRjaGVkIGVuZHBvaW50IGZvciBtYXRjaGluZyBIdHRwTWV0aG9kIGFuZCBzY29wZXNcbiAgICAgICAgZW5kcG9pbnRBcnJheS5mb3JFYWNoKG1hdGNoZWRFbmRwb2ludCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY29wZXNGb3JFbmRwb2ludCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kQW5kU2NvcGVzQXJyYXkgPSBwcm90ZWN0ZWRSZXNvdXJjZU1hcC5nZXQobWF0Y2hlZEVuZHBvaW50KTtcblxuICAgICAgICAgICAgLy8gUmV0dXJuIGlmIHJlc291cmNlIGlzIHVucHJvdGVjdGVkXG4gICAgICAgICAgICBpZiAobWV0aG9kQW5kU2NvcGVzQXJyYXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhbGxNYXRjaGVkU2NvcGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXRob2RBbmRTY29wZXNBcnJheS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAvLyBFbnRyeSBpcyBlaXRoZXIgYXJyYXkgb2Ygc2NvcGVzIG9yIFByb3RlY3RlZFJlc291cmNlU2NvcGVzIG9iamVjdFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVzRm9yRW5kcG9pbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIG1ldGhvZHMgYmVpbmcgY29tcGFyZWQgYXJlIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RNZXRob2QgPSBodHRwTWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvdXJjZU1ldGhvZCA9IGVudHJ5Lmh0dHBNZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWV0aG9kIGluIHByb3RlY3RlZFJlc291cmNlTWFwIG1hdGNoZXMgcmVxdWVzdCBodHRwIG1ldGhvZFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFJlc291cmNlTWV0aG9kID09PSBub3JtYWxpemVkUmVxdWVzdE1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgc2NvcGVzIGNvbWVzIG51bGwgdG8gdW5wcm90ZWN0IHRoZSByZXNvdXJjZSBpbiBhIGNlcnRhaW4gaHR0cCBtZXRob2QgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc2NvcGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWF0Y2hlZFNjb3Blcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zY29wZXMuZm9yRWFjaCgoc2NvcGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVzRm9yRW5kcG9pbnQucHVzaChzY29wZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gT25seSBhZGQgdG8gYWxsIHNjb3BlcyBpZiBzY29wZXMgZm9yIGVuZHBvaW50IGFuZCBtZXRob2QgaXMgZm91bmRcbiAgICAgICAgICAgIGlmIChzY29wZXNGb3JFbmRwb2ludC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYWxsTWF0Y2hlZFNjb3Blcy5wdXNoKHNjb3Blc0ZvckVuZHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkud2FybmluZyhcIkludGVyY2VwdG9yIC0gTW9yZSB0aGFuIDEgbWF0Y2hpbmcgc2NvcGVzIGZvciBlbmRwb2ludCBmb3VuZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXR1cm5zIHNjb3BlcyBmb3IgZmlyc3QgbWF0Y2hpbmcgZW5kcG9pbnRcbiAgICAgICAgICAgIHJldHVybiBhbGxNYXRjaGVkU2NvcGVzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG59XG4iXX0=
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { NgModule } from "@angular/core";
|
|
6
|
+
import { CommonModule } from "@angular/common";
|
|
7
|
+
import { MsalGuard } from "./msal.guard";
|
|
8
|
+
import { MsalBroadcastService } from "./msal.broadcast.service";
|
|
9
|
+
import { MsalService } from "./msal.service";
|
|
10
|
+
import { MSAL_INSTANCE, MSAL_GUARD_CONFIG, MSAL_INTERCEPTOR_CONFIG } from "./constants";
|
|
11
|
+
import { MsalRedirectComponent } from "./msal.redirect.component";
|
|
12
|
+
export class MsalModule {
|
|
13
|
+
static forRoot(msalInstance, guardConfig, interceptorConfig) {
|
|
14
|
+
return {
|
|
15
|
+
ngModule: MsalModule,
|
|
16
|
+
providers: [
|
|
17
|
+
{
|
|
18
|
+
provide: MSAL_INSTANCE,
|
|
19
|
+
useValue: msalInstance
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
provide: MSAL_GUARD_CONFIG,
|
|
23
|
+
useValue: guardConfig
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
provide: MSAL_INTERCEPTOR_CONFIG,
|
|
27
|
+
useValue: interceptorConfig
|
|
28
|
+
},
|
|
29
|
+
MsalService
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
MsalModule.decorators = [
|
|
35
|
+
{ type: NgModule, args: [{
|
|
36
|
+
declarations: [MsalRedirectComponent],
|
|
37
|
+
imports: [
|
|
38
|
+
CommonModule
|
|
39
|
+
],
|
|
40
|
+
providers: [
|
|
41
|
+
MsalGuard,
|
|
42
|
+
MsalBroadcastService
|
|
43
|
+
]
|
|
44
|
+
},] }
|
|
45
|
+
];
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSS9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUcsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFZbEUsTUFBTSxPQUFPLFVBQVU7SUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FDVixZQUFzQyxFQUN0QyxXQUFtQyxFQUNuQyxpQkFBK0M7UUFFL0MsT0FBTztZQUNILFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFNBQVMsRUFBRTtnQkFDUDtvQkFDSSxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLFlBQVk7aUJBQ3pCO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSxXQUFXO2lCQUN4QjtnQkFDRDtvQkFDSSxPQUFPLEVBQUUsdUJBQXVCO29CQUNoQyxRQUFRLEVBQUUsaUJBQWlCO2lCQUM5QjtnQkFDRCxXQUFXO2FBQ2Q7U0FDSixDQUFDO0lBQ04sQ0FBQzs7O1lBbENKLFFBQVEsU0FBQztnQkFDTixZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDckMsT0FBTyxFQUFFO29CQUNMLFlBQVk7aUJBQ2Y7Z0JBQ0QsU0FBUyxFQUFFO29CQUNQLFNBQVM7b0JBQ1Qsb0JBQW9CO2lCQUN2QjthQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IElQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiB9IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBNc2FsR3VhcmRDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vbXNhbC5ndWFyZC5jb25maWdcIjtcbmltcG9ydCB7IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9tc2FsLmludGVyY2VwdG9yLmNvbmZpZ1wiO1xuaW1wb3J0IHsgTXNhbEd1YXJkIH0gZnJvbSBcIi4vbXNhbC5ndWFyZFwiO1xuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgTVNBTF9JTlNUQU5DRSAsIE1TQUxfR1VBUkRfQ09ORklHLCBNU0FMX0lOVEVSQ0VQVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTXNhbFJlZGlyZWN0Q29tcG9uZW50IH0gZnJvbSBcIi4vbXNhbC5yZWRpcmVjdC5jb21wb25lbnRcIjtcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtNc2FsUmVkaXJlY3RDb21wb25lbnRdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTXNhbEd1YXJkLFxuICAgICAgICBNc2FsQnJvYWRjYXN0U2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTXNhbE1vZHVsZSB7XG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICAgIG1zYWxJbnN0YW5jZTogSVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLFxuICAgICAgICBndWFyZENvbmZpZzogTXNhbEd1YXJkQ29uZmlndXJhdGlvbixcbiAgICAgICAgaW50ZXJjZXB0b3JDb25maWc6IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cbiAgICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE1zYWxNb2R1bGU+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBNc2FsTW9kdWxlLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBNU0FMX0lOU1RBTkNFLFxuICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogbXNhbEluc3RhbmNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1TQUxfR1VBUkRfQ09ORklHLFxuICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogZ3VhcmRDb25maWdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTVNBTF9JTlRFUkNFUFRPUl9DT05GSUcsXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBpbnRlcmNlcHRvckNvbmZpZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgTXNhbFNlcnZpY2VcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
* Licensed under the MIT License.
|
|
4
|
+
*/
|
|
5
|
+
import { __awaiter } from "tslib";
|
|
6
|
+
import { NavigationClient, UrlString } from "@azure/msal-browser";
|
|
7
|
+
import { Router } from "@angular/router";
|
|
8
|
+
import { Location } from "@angular/common";
|
|
9
|
+
import { MsalService } from "./msal.service";
|
|
10
|
+
import { Injectable } from "@angular/core";
|
|
11
|
+
/**
|
|
12
|
+
* Custom navigation used for Angular client-side navigation.
|
|
13
|
+
* See performance doc for details:
|
|
14
|
+
* https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-angular/docs/v2-docs/performance.md
|
|
15
|
+
*/
|
|
16
|
+
export class MsalCustomNavigationClient extends NavigationClient {
|
|
17
|
+
constructor(authService, router, location) {
|
|
18
|
+
super();
|
|
19
|
+
this.authService = authService;
|
|
20
|
+
this.router = router;
|
|
21
|
+
this.location = location;
|
|
22
|
+
}
|
|
23
|
+
navigateInternal(url, options) {
|
|
24
|
+
const _super = Object.create(null, {
|
|
25
|
+
navigateInternal: { get: () => super.navigateInternal }
|
|
26
|
+
});
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
this.authService.getLogger().trace("MsalCustomNavigationClient called");
|
|
29
|
+
this.authService.getLogger().verbose("MsalCustomNavigationClient - navigating");
|
|
30
|
+
this.authService.getLogger().verbosePii(`MsalCustomNavigationClient - navigating to url: ${url}`);
|
|
31
|
+
// Prevent hash clearing from causing an issue with Client-side navigation after redirect is handled
|
|
32
|
+
if (options.noHistory) {
|
|
33
|
+
return _super.navigateInternal.call(this, url, options);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Normalizing newUrl if no query string
|
|
37
|
+
const urlComponents = new UrlString(url).getUrlComponents();
|
|
38
|
+
const newUrl = urlComponents.QueryString ? `${urlComponents.AbsolutePath}?${urlComponents.QueryString}` : this.location.normalize(urlComponents.AbsolutePath);
|
|
39
|
+
this.router.navigateByUrl(newUrl, { replaceUrl: options.noHistory });
|
|
40
|
+
}
|
|
41
|
+
return Promise.resolve(options.noHistory);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
MsalCustomNavigationClient.decorators = [
|
|
46
|
+
{ type: Injectable }
|
|
47
|
+
];
|
|
48
|
+
MsalCustomNavigationClient.ctorParameters = () => [
|
|
49
|
+
{ type: MsalService },
|
|
50
|
+
{ type: Router },
|
|
51
|
+
{ type: Location }
|
|
52
|
+
];
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5uYXZpZ2F0aW9uLmNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLm5hdmlnYXRpb24uY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRzs7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQXFCLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0M7Ozs7R0FJRztBQUVILE1BQU0sT0FBTywwQkFBMkIsU0FBUSxnQkFBZ0I7SUFFNUQsWUFDWSxXQUF3QixFQUN4QixNQUFjLEVBQ2QsUUFBa0I7UUFFMUIsS0FBSyxFQUFFLENBQUM7UUFKQSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUc5QixDQUFDO0lBRUssZ0JBQWdCLENBQUMsR0FBVSxFQUFFLE9BQTBCOzs7OztZQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBRXhFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsbURBQW1ELEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFbEcsb0dBQW9HO1lBQ3BHLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxPQUFNLGdCQUFnQixZQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7YUFDL0M7aUJBQU07Z0JBQ0gsd0NBQXdDO2dCQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxZQUFZLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlKLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUN4RTtZQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUFBOzs7WUEzQkosVUFBVTs7O1lBUkYsV0FBVztZQUZYLE1BQU07WUFDTixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE5hdmlnYXRpb25DbGllbnQsIE5hdmlnYXRpb25PcHRpb25zLCBVcmxTdHJpbmcgfSBmcm9tIFwiQGF6dXJlL21zYWwtYnJvd3NlclwiO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbi8qKlxuICogQ3VzdG9tIG5hdmlnYXRpb24gdXNlZCBmb3IgQW5ndWxhciBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uLlxuICogU2VlIHBlcmZvcm1hbmNlIGRvYyBmb3IgZGV0YWlsczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy90cmVlL2Rldi9saWIvbXNhbC1hbmd1bGFyL2RvY3MvdjItZG9jcy9wZXJmb3JtYW5jZS5tZFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTXNhbEN1c3RvbU5hdmlnYXRpb25DbGllbnQgZXh0ZW5kcyBOYXZpZ2F0aW9uQ2xpZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBNc2FsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmF2aWdhdGVJbnRlcm5hbCh1cmw6c3RyaW5nLCBvcHRpb25zOiBOYXZpZ2F0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnRyYWNlKFwiTXNhbEN1c3RvbU5hdmlnYXRpb25DbGllbnQgY2FsbGVkXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiTXNhbEN1c3RvbU5hdmlnYXRpb25DbGllbnQgLSBuYXZpZ2F0aW5nXCIpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2VQaWkoYE1zYWxDdXN0b21OYXZpZ2F0aW9uQ2xpZW50IC0gbmF2aWdhdGluZyB0byB1cmw6ICR7dXJsfWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUHJldmVudCBoYXNoIGNsZWFyaW5nIGZyb20gY2F1c2luZyBhbiBpc3N1ZSB3aXRoIENsaWVudC1zaWRlIG5hdmlnYXRpb24gYWZ0ZXIgcmVkaXJlY3QgaXMgaGFuZGxlZFxuICAgICAgICBpZiAob3B0aW9ucy5ub0hpc3RvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5uYXZpZ2F0ZUludGVybmFsKHVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3JtYWxpemluZyBuZXdVcmwgaWYgbm8gcXVlcnkgc3RyaW5nXG4gICAgICAgICAgICBjb25zdCB1cmxDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyh1cmwpLmdldFVybENvbXBvbmVudHMoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1VybCA9IHVybENvbXBvbmVudHMuUXVlcnlTdHJpbmcgPyBgJHt1cmxDb21wb25lbnRzLkFic29sdXRlUGF0aH0/JHt1cmxDb21wb25lbnRzLlF1ZXJ5U3RyaW5nfWAgOiB0aGlzLmxvY2F0aW9uLm5vcm1hbGl6ZSh1cmxDb21wb25lbnRzLkFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKG5ld1VybCwgeyByZXBsYWNlVXJsOiBvcHRpb25zLm5vSGlzdG9yeSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9wdGlvbnMubm9IaXN0b3J5KTtcbiAgICB9XG59XG4iXX0=
|