@osovitny/anatoly 3.17.160 → 3.19.2
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/fesm2022/osovitny-anatoly.mjs +569 -532
- package/fesm2022/osovitny-anatoly.mjs.map +1 -1
- package/lib/billing/utils.d.ts +2 -1
- package/lib/core/converts/convert.d.ts +1 -1
- package/lib/core/guid.d.ts +1 -1
- package/lib/core/is.d.ts +5 -5
- package/lib/ui/components/base/components/component.d.ts +1 -1
- package/lib/ui/components/base/components/edit.component.d.ts +1 -1
- package/lib/ui/components/base/components/enum-edit.component.d.ts +1 -1
- package/lib/ui/components/data-grid/control-panel.component.d.ts +6 -5
- package/lib/ui/components/dropdownlists/country/country.dropdownlist.d.ts +1 -3
- package/lib/ui/components/identity/signin-button.component.d.ts +0 -1
- package/lib/ui/components/identity/signout-button.component.d.ts +0 -1
- package/lib/ui/components/identity/signup-button.component.d.ts +0 -1
- package/lib/ui/directives/index.d.ts +1 -1
- package/lib/ui/directives/replacer/replacer.base.directive.d.ts +2 -1
- package/package.json +58 -60
- package/esm2022/lib/anatoly.module.mjs +0 -62
- package/esm2022/lib/billing/billing.module.mjs +0 -81
- package/esm2022/lib/billing/components/buttons/buyaccess-button.component.mjs +0 -104
- package/esm2022/lib/billing/components/buttons/subscribe-plan-button.component.mjs +0 -113
- package/esm2022/lib/billing/components/exports.mjs +0 -28
- package/esm2022/lib/billing/components/index.mjs +0 -31
- package/esm2022/lib/billing/components/order-summary/order-summary.component.mjs +0 -154
- package/esm2022/lib/billing/components/payment-methods/payment-methods.component.mjs +0 -106
- package/esm2022/lib/billing/components/payment-options/payment-options.component.mjs +0 -97
- package/esm2022/lib/billing/components/pm/braintree/braintree.component.mjs +0 -155
- package/esm2022/lib/billing/components/pm/paypal/paypal-button.component.mjs +0 -159
- package/esm2022/lib/billing/components/pm/paypal/paypal-subscribe-button.component.mjs +0 -149
- package/esm2022/lib/billing/components/pm/paypal/paypal.component.mjs +0 -317
- package/esm2022/lib/billing/components/pm/stripe/stripe.component.mjs +0 -109
- package/esm2022/lib/billing/exports.mjs +0 -19
- package/esm2022/lib/billing/models/paypal-models.mjs +0 -16
- package/esm2022/lib/billing/services/payments.service.mjs +0 -170
- package/esm2022/lib/billing/services/paypal-script.service.mjs +0 -90
- package/esm2022/lib/billing/utils.mjs +0 -28
- package/esm2022/lib/core/browser.mjs +0 -24
- package/esm2022/lib/core/consts/app-settings.mjs +0 -55
- package/esm2022/lib/core/consts/core-settings.mjs +0 -29
- package/esm2022/lib/core/consts/formats.mjs +0 -27
- package/esm2022/lib/core/consts/ga.mjs +0 -26
- package/esm2022/lib/core/consts/storageKeys.mjs +0 -23
- package/esm2022/lib/core/converts/convert.mjs +0 -103
- package/esm2022/lib/core/converts/dateConvert.mjs +0 -60
- package/esm2022/lib/core/converts/tz/tzParseTimezone.mjs +0 -122
- package/esm2022/lib/core/converts/tz/tzTokenizeDate.mjs +0 -101
- package/esm2022/lib/core/converts/xmlFormatter.mjs +0 -34
- package/esm2022/lib/core/core.module.mjs +0 -112
- package/esm2022/lib/core/dom.mjs +0 -153
- package/esm2022/lib/core/enums/billing.mjs +0 -56
- package/esm2022/lib/core/enums/enums.mjs +0 -35
- package/esm2022/lib/core/enums/index.mjs +0 -17
- package/esm2022/lib/core/exports.mjs +0 -67
- package/esm2022/lib/core/go/apps-go.service.mjs +0 -88
- package/esm2022/lib/core/go/go.service.mjs +0 -86
- package/esm2022/lib/core/guards/once-import.guard.mjs +0 -21
- package/esm2022/lib/core/guards/starter.guard.mjs +0 -46
- package/esm2022/lib/core/guid.mjs +0 -22
- package/esm2022/lib/core/interceptors/httpInterceptor.mjs +0 -161
- package/esm2022/lib/core/is.mjs +0 -98
- package/esm2022/lib/core/localization/localization.module.mjs +0 -45
- package/esm2022/lib/core/localization/localization.service.mjs +0 -164
- package/esm2022/lib/core/localization/localize.pipe.mjs +0 -83
- package/esm2022/lib/core/localization/settings.module.mjs +0 -103
- package/esm2022/lib/core/localization/utils.mjs +0 -41
- package/esm2022/lib/core/logging/globalErrorHandler.mjs +0 -41
- package/esm2022/lib/core/logging/logging.service.mjs +0 -40
- package/esm2022/lib/core/models/qs.mjs +0 -17
- package/esm2022/lib/core/notifications/alerts.mjs +0 -116
- package/esm2022/lib/core/notifications/interfaces/notification.mjs +0 -17
- package/esm2022/lib/core/notifications/services/notification-service.mjs +0 -83
- package/esm2022/lib/core/performance/stopwatch.mjs +0 -50
- package/esm2022/lib/core/services/appcontext.service.mjs +0 -186
- package/esm2022/lib/core/services/dm.service.mjs +0 -69
- package/esm2022/lib/core/services/google-analytics.service.mjs +0 -75
- package/esm2022/lib/core/services/idle.service.mjs +0 -77
- package/esm2022/lib/core/services/loading.service.mjs +0 -67
- package/esm2022/lib/core/services/script.service.mjs +0 -77
- package/esm2022/lib/core/services/starter.service.mjs +0 -85
- package/esm2022/lib/core/services/web-storage.service.mjs +0 -66
- package/esm2022/lib/core/subs.mjs +0 -31
- package/esm2022/lib/core/utils/qsutils.mjs +0 -84
- package/esm2022/lib/core/utils/utils.mjs +0 -112
- package/esm2022/lib/data/base/api.service.mjs +0 -94
- package/esm2022/lib/data/base/grid/grid-edit.service.mjs +0 -80
- package/esm2022/lib/data/base/grid/grid-read.service.mjs +0 -60
- package/esm2022/lib/data/data.module.mjs +0 -66
- package/esm2022/lib/data/exports.mjs +0 -29
- package/esm2022/lib/data/services/billing/currencies-api.service.mjs +0 -41
- package/esm2022/lib/data/services/billing/currencies-storage.service.mjs +0 -92
- package/esm2022/lib/data/services/billing/discountcodes-api.service.mjs +0 -37
- package/esm2022/lib/data/services/billing/payments-api.service.mjs +0 -64
- package/esm2022/lib/data/services/billing/subscriptions-api.service.mjs +0 -61
- package/esm2022/lib/data/services/billing/transactions-api.service.mjs +0 -43
- package/esm2022/lib/data/services/core-api.service.mjs +0 -44
- package/esm2022/lib/data/services/emails-api.service.mjs +0 -47
- package/esm2022/lib/external/fa.module.mjs +0 -45
- package/esm2022/lib/external/kendo.module.mjs +0 -179
- package/esm2022/lib/iam/b2c/b2c.mjs +0 -40
- package/esm2022/lib/iam/b2c/consts.mjs +0 -25
- package/esm2022/lib/iam/b2c/index.mjs +0 -21
- package/esm2022/lib/iam/configs.mjs +0 -109
- package/esm2022/lib/iam/consts.mjs +0 -22
- package/esm2022/lib/iam/exports.mjs +0 -22
- package/esm2022/lib/iam/guards/admin.guard.mjs +0 -46
- package/esm2022/lib/iam/guards/authentication.guard.mjs +0 -30
- package/esm2022/lib/iam/guards/index.mjs +0 -20
- package/esm2022/lib/iam/iam-pages.module.mjs +0 -57
- package/esm2022/lib/iam/iam-pages.routes.mjs +0 -45
- package/esm2022/lib/iam/iam.module.mjs +0 -84
- package/esm2022/lib/iam/pages/signin.page.mjs +0 -40
- package/esm2022/lib/iam/pages/signout.page.mjs +0 -40
- package/esm2022/lib/iam/pages/signup.page.mjs +0 -40
- package/esm2022/lib/iam/redirect.mjs +0 -29
- package/esm2022/lib/iam/services/auth.service.mjs +0 -436
- package/esm2022/lib/iam/storage.mjs +0 -42
- package/esm2022/lib/iam/utils.mjs +0 -49
- package/esm2022/lib/ui/components/base/components/component.mjs +0 -76
- package/esm2022/lib/ui/components/base/components/edit.component.mjs +0 -146
- package/esm2022/lib/ui/components/base/components/enum-edit.component.mjs +0 -92
- package/esm2022/lib/ui/components/base/dialog.mjs +0 -71
- package/esm2022/lib/ui/components/base/list.mjs +0 -100
- package/esm2022/lib/ui/components/base/pages/edit.page.mjs +0 -32
- package/esm2022/lib/ui/components/base/pages/page.mjs +0 -32
- package/esm2022/lib/ui/components/base/pages/paged.page.mjs +0 -68
- package/esm2022/lib/ui/components/card/card-body.component.mjs +0 -37
- package/esm2022/lib/ui/components/card/card-footer.component.mjs +0 -37
- package/esm2022/lib/ui/components/card/card-header.component.mjs +0 -51
- package/esm2022/lib/ui/components/card/card.component.mjs +0 -41
- package/esm2022/lib/ui/components/check-icon/check-icon.component.mjs +0 -43
- package/esm2022/lib/ui/components/copy-2-clipboard/copy-2-clipboard.component.mjs +0 -57
- package/esm2022/lib/ui/components/data-grid/control-panel.component.mjs +0 -201
- package/esm2022/lib/ui/components/datapager/datapager.component.mjs +0 -95
- package/esm2022/lib/ui/components/dropdownlists/country/country.dropdownlist.mjs +0 -96
- package/esm2022/lib/ui/components/dropdownlists/moderationstatus/moderationstatus.dropdownlist.mjs +0 -88
- package/esm2022/lib/ui/components/dropdownlists/publishstatus/publishstatus.dropdownlist.mjs +0 -88
- package/esm2022/lib/ui/components/dropdownlists/timezone/timezone.dropdownlist.mjs +0 -112
- package/esm2022/lib/ui/components/exports.mjs +0 -53
- package/esm2022/lib/ui/components/feature-will-be-ready/feature-will-be-ready.component.mjs +0 -55
- package/esm2022/lib/ui/components/html-editor/base-editor.component.mjs +0 -94
- package/esm2022/lib/ui/components/html-editor/defaultoptions.mjs +0 -87
- package/esm2022/lib/ui/components/html-editor/html-editor.component.mjs +0 -114
- package/esm2022/lib/ui/components/identity/signin-button.component.mjs +0 -105
- package/esm2022/lib/ui/components/identity/signout-button.component.mjs +0 -105
- package/esm2022/lib/ui/components/identity/signup-button.component.mjs +0 -105
- package/esm2022/lib/ui/components/index.mjs +0 -57
- package/esm2022/lib/ui/components/no-mobile-support/no-mobile-support.component.mjs +0 -45
- package/esm2022/lib/ui/components/nodata/nodata.component.mjs +0 -76
- package/esm2022/lib/ui/components/spinners/loading/loading.component.mjs +0 -53
- package/esm2022/lib/ui/components/spinners/pagespinner/pagespinner.component.mjs +0 -85
- package/esm2022/lib/ui/components/spinners/pagespinner/spinkits.mjs +0 -12
- package/esm2022/lib/ui/components/urlslug/urlslug.component.mjs +0 -130
- package/esm2022/lib/ui/components/you-agree-to-our-terms/you-agree-to-our-terms.component.mjs +0 -63
- package/esm2022/lib/ui/dialogs/contact-us/contact-us.dialog.mjs +0 -78
- package/esm2022/lib/ui/dialogs/exports.mjs +0 -16
- package/esm2022/lib/ui/dialogs/index.mjs +0 -19
- package/esm2022/lib/ui/directives/exports.mjs +0 -19
- package/esm2022/lib/ui/directives/hover.directive.mjs +0 -50
- package/esm2022/lib/ui/directives/index.mjs +0 -22
- package/esm2022/lib/ui/directives/native-element.directive.mjs +0 -37
- package/esm2022/lib/ui/directives/replacer/a-replacer.directive.mjs +0 -48
- package/esm2022/lib/ui/directives/replacer/image-replacer.directive.mjs +0 -44
- package/esm2022/lib/ui/directives/replacer/replacer.base.directive.mjs +0 -44
- package/esm2022/lib/ui/exports.mjs +0 -22
- package/esm2022/lib/ui/forms/components/address/address.component.mjs +0 -240
- package/esm2022/lib/ui/forms/components/company/company.component.mjs +0 -138
- package/esm2022/lib/ui/forms/contact-us/contact-us.mjs +0 -213
- package/esm2022/lib/ui/forms/exports.mjs +0 -20
- package/esm2022/lib/ui/forms/index.mjs +0 -21
- package/esm2022/lib/ui/pipes/exports.mjs +0 -19
- package/esm2022/lib/ui/pipes/filesize.pipe.mjs +0 -42
- package/esm2022/lib/ui/pipes/index.mjs +0 -22
- package/esm2022/lib/ui/pipes/replace-text.pipe.mjs +0 -37
- package/esm2022/lib/ui/pipes/safeHtml.pipe.mjs +0 -34
- package/esm2022/lib/ui/ui.module.mjs +0 -122
- package/esm2022/lib/ui/validation/exports.mjs +0 -19
- package/esm2022/lib/ui/validation/form-validation-summary.component.mjs +0 -90
- package/esm2022/lib/ui/validation/index.mjs +0 -21
- package/esm2022/lib/ui/validation/item-validation-summary.component.mjs +0 -53
- package/esm2022/lib/ui/validation/validation-summary.component.mjs +0 -124
- package/esm2022/osovitny-anatoly.mjs +0 -5
- package/esm2022/public-api.mjs +0 -22
|
@@ -1,436 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { Subject, catchError, filter, map, of, takeUntil } from 'rxjs';
|
|
3
|
-
import { MSAL_GUARD_CONFIG } from '@azure/msal-angular';
|
|
4
|
-
import { EventType, InteractionRequiredAuthError, InteractionStatus, InteractionType, PromptValue } from '@azure/msal-browser';
|
|
5
|
-
//App
|
|
6
|
-
import { ApiServiceBase } from '../../data/base/api.service';
|
|
7
|
-
import { MSALRedirect } from '../redirect';
|
|
8
|
-
import { MSALUtils } from '../utils';
|
|
9
|
-
import { MSALB2C, PolicyType } from '../b2c';
|
|
10
|
-
import { QSUtils } from '../../core/exports';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@angular/common/http";
|
|
13
|
-
import * as i2 from "@angular/router";
|
|
14
|
-
import * as i3 from "../../core/services/appcontext.service";
|
|
15
|
-
import * as i4 from "@azure/msal-angular";
|
|
16
|
-
export class AuthService extends ApiServiceBase {
|
|
17
|
-
constructor(http, router, appContext, msalGuardConfig, msalService, msalBroadcastService) {
|
|
18
|
-
super(http);
|
|
19
|
-
this.http = http;
|
|
20
|
-
this.router = router;
|
|
21
|
-
this.appContext = appContext;
|
|
22
|
-
this.msalGuardConfig = msalGuardConfig;
|
|
23
|
-
this.msalService = msalService;
|
|
24
|
-
this.msalBroadcastService = msalBroadcastService;
|
|
25
|
-
this.msalDestroying$ = new Subject();
|
|
26
|
-
this.initialized = false;
|
|
27
|
-
this.init();
|
|
28
|
-
}
|
|
29
|
-
ngOnDestroy() {
|
|
30
|
-
this.msalDestroying$.next(undefined);
|
|
31
|
-
this.msalDestroying$.complete();
|
|
32
|
-
}
|
|
33
|
-
init() {
|
|
34
|
-
this.setDefaults();
|
|
35
|
-
this.msalService.initialize().subscribe(() => {
|
|
36
|
-
this.initialized = true;
|
|
37
|
-
console.log(`msal.app: initMSAL started`);
|
|
38
|
-
this.initMSAL();
|
|
39
|
-
console.log(`msal.app: initMSAL finished`);
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
setDefaults() {
|
|
43
|
-
}
|
|
44
|
-
/*
|
|
45
|
-
https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/samples/msal-angular-v3-samples/angular-b2c-sample-app/src/app/app.component.ts
|
|
46
|
-
|
|
47
|
-
Token Validation:
|
|
48
|
-
https://jwt.io
|
|
49
|
-
|
|
50
|
-
Token types:
|
|
51
|
-
https://learn.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview
|
|
52
|
-
ID token - A JWT that contains claims that you can use to identify users in your application
|
|
53
|
-
Access token - A JWT that contains claims that you can use to identify the granted permissions to your APIs.
|
|
54
|
-
Access tokens are signed, but they aren't encrypted
|
|
55
|
-
Refresh token - Refresh tokens are used to acquire new ID tokens and access tokens in an OAuth 2.0 flow.
|
|
56
|
-
*/
|
|
57
|
-
initMSAL() {
|
|
58
|
-
//B2C
|
|
59
|
-
this.signUpSignInPolicy = MSALB2C.getPolicyByType(PolicyType.signUpSignIn);
|
|
60
|
-
this.signUpPolicy = MSALB2C.getPolicyByType(PolicyType.signUp);
|
|
61
|
-
this.editProfilePolicy = MSALB2C.getPolicyByType(PolicyType.editProfile);
|
|
62
|
-
this.resetPasswordPolicy = MSALB2C.getPolicyByType(PolicyType.resetPassword);
|
|
63
|
-
this.msalService.handleRedirectObservable().subscribe({
|
|
64
|
-
next: (result) => {
|
|
65
|
-
console.log(`msal.app: handleRedirectObservable`);
|
|
66
|
-
},
|
|
67
|
-
error: (error) => {
|
|
68
|
-
console.log(error);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
this.msalService.instance.enableAccountStorageEvents();
|
|
72
|
-
this.msalBroadcastService.msalSubject$.pipe(filter((msg) => msg.eventType === EventType.INITIALIZE_END ||
|
|
73
|
-
//ACCOUNT_ADDED and ACCOUNT_REMOVED events emitted when a user logs in or out of another tab or window
|
|
74
|
-
msg.eventType === EventType.ACCOUNT_ADDED ||
|
|
75
|
-
msg.eventType === EventType.ACCOUNT_REMOVED ||
|
|
76
|
-
//Login Failure
|
|
77
|
-
msg.eventType === EventType.LOGIN_FAILURE ||
|
|
78
|
-
msg.eventType === EventType.ACQUIRE_TOKEN_FAILURE ||
|
|
79
|
-
//LogOut
|
|
80
|
-
msg.eventType === EventType.LOGOUT_SUCCESS ||
|
|
81
|
-
//LogIn
|
|
82
|
-
msg.eventType === EventType.LOGIN_SUCCESS ||
|
|
83
|
-
msg.eventType === EventType.ACQUIRE_TOKEN_SUCCESS ||
|
|
84
|
-
msg.eventType === EventType.SSO_SILENT_SUCCESS), takeUntil(this.msalDestroying$))
|
|
85
|
-
.subscribe((msg) => {
|
|
86
|
-
switch (msg.eventType) {
|
|
87
|
-
case EventType.INITIALIZE_END:
|
|
88
|
-
console.log(`msal.app: INITIALIZE_END fired`);
|
|
89
|
-
break;
|
|
90
|
-
case EventType.ACCOUNT_ADDED:
|
|
91
|
-
case EventType.ACCOUNT_REMOVED:
|
|
92
|
-
if (this.msalService.instance.getAllAccounts().length === 0) {
|
|
93
|
-
window.location.pathname = "/";
|
|
94
|
-
}
|
|
95
|
-
break;
|
|
96
|
-
case EventType.LOGIN_FAILURE:
|
|
97
|
-
case EventType.ACQUIRE_TOKEN_FAILURE:
|
|
98
|
-
if (!MSALUtils.isB2C()) {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
//Check for forgot password error. Learn more about AAD error codes at
|
|
102
|
-
//https://docs.microsoft.com/en-us/azure/active-directory/develop/reference-aadsts-error-codes
|
|
103
|
-
if (msg.error && msg.error.message.indexOf('AADB2C90118') > -1) {
|
|
104
|
-
let resetPasswordFlowRequest = {
|
|
105
|
-
authority: this.resetPasswordPolicy.authority,
|
|
106
|
-
scopes: [],
|
|
107
|
-
};
|
|
108
|
-
this.login(resetPasswordFlowRequest);
|
|
109
|
-
}
|
|
110
|
-
;
|
|
111
|
-
break;
|
|
112
|
-
case EventType.LOGOUT_SUCCESS:
|
|
113
|
-
break;
|
|
114
|
-
case EventType.LOGIN_SUCCESS:
|
|
115
|
-
case EventType.ACQUIRE_TOKEN_SUCCESS:
|
|
116
|
-
case EventType.SSO_SILENT_SUCCESS:
|
|
117
|
-
let payload = msg.payload;
|
|
118
|
-
if (!payload) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (!MSALUtils.isB2C()) {
|
|
122
|
-
this.msalService.instance.setActiveAccount(payload.account);
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
//B2C
|
|
126
|
-
let token = payload.idTokenClaims;
|
|
127
|
-
/**
|
|
128
|
-
*
|
|
129
|
-
* signUpSignIn
|
|
130
|
-
*
|
|
131
|
-
*/
|
|
132
|
-
if (token.acr === this.signUpSignInPolicy.name || token.tfp === this.signUpSignInPolicy.name) {
|
|
133
|
-
this.msalService.instance.setActiveAccount(payload.account);
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
*
|
|
137
|
-
* signUpPolicy
|
|
138
|
-
*
|
|
139
|
-
*/
|
|
140
|
-
if (token.acr === this.signUpPolicy.name || token.tfp === this.signUpPolicy.name) {
|
|
141
|
-
this.msalService.instance.setActiveAccount(payload.account);
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
*
|
|
145
|
-
* editProfile
|
|
146
|
-
*
|
|
147
|
-
* For the purpose of setting an active account for UI update, we want to consider only the auth response resulting
|
|
148
|
-
* from SUSI flow. "acr" claim in the id token tells us the policy (NOTE: newer policies may use the "tfp" claim instead).
|
|
149
|
-
* To learn more about B2C tokens, visit https://docs.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview
|
|
150
|
-
*/
|
|
151
|
-
if (token.acr === this.editProfilePolicy.name || token.tfp === this.editProfilePolicy.name) {
|
|
152
|
-
const signInAccount = this.msalService.instance.getAllAccounts().find((account) => account.idTokenClaims?.oid === token.oid &&
|
|
153
|
-
account.idTokenClaims?.sub === token.sub &&
|
|
154
|
-
(account.idTokenClaims.acr === this.signUpSignInPolicy.name ||
|
|
155
|
-
account.idTokenClaims.tfp === this.signUpSignInPolicy.name));
|
|
156
|
-
this.forceReauthenticate(signInAccount);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
*
|
|
160
|
-
* resetPassword
|
|
161
|
-
*
|
|
162
|
-
* Below we are checking if the user is returning from the reset password flow.
|
|
163
|
-
* If so, we will ask the user to reauthenticate with their new password.
|
|
164
|
-
* If you do not want this behavior and prefer your users to stay signed in instead,
|
|
165
|
-
* you can replace the code below with the same pattern used for handling the return from
|
|
166
|
-
* profile edit flow
|
|
167
|
-
*/
|
|
168
|
-
if (token.acr === this.resetPasswordPolicy.name || token.tfp === this.resetPasswordPolicy.name) {
|
|
169
|
-
this.forceReauthenticate();
|
|
170
|
-
}
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
return msg;
|
|
174
|
-
});
|
|
175
|
-
this.msalBroadcastService.inProgress$.pipe(filter((status) => status === InteractionStatus.Startup ||
|
|
176
|
-
status === InteractionStatus.None), takeUntil(this.msalDestroying$))
|
|
177
|
-
.subscribe((status) => {
|
|
178
|
-
switch (status) {
|
|
179
|
-
/**
|
|
180
|
-
* Initial status before interaction occurs
|
|
181
|
-
*/
|
|
182
|
-
case InteractionStatus.Startup:
|
|
183
|
-
console.log(`msal.app: InteractionStatus.Startup`);
|
|
184
|
-
break;
|
|
185
|
-
/**
|
|
186
|
-
* Status set when interaction is complete
|
|
187
|
-
*/
|
|
188
|
-
case InteractionStatus.None:
|
|
189
|
-
console.log(`msal.app: InteractionStatus.None`);
|
|
190
|
-
MSALRedirect.handle(this.router, 'msalBroadcastService.inProgress$ InteractionStatus.None');
|
|
191
|
-
this.checkAndSetActiveAccount();
|
|
192
|
-
this.appContext.updateCurrent();
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
checkAndSetActiveAccount() {
|
|
198
|
-
let activeAccount = this.msalService.instance.getActiveAccount();
|
|
199
|
-
let accounts = this.msalService.instance.getAllAccounts();
|
|
200
|
-
if (!activeAccount && accounts.length > 0) {
|
|
201
|
-
this.msalService.instance.setActiveAccount(accounts[0]);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
isPopup(popup) {
|
|
205
|
-
if (typeof popup === "undefined") {
|
|
206
|
-
return this.msalGuardConfig.interactionType === InteractionType.Popup;
|
|
207
|
-
}
|
|
208
|
-
return popup;
|
|
209
|
-
}
|
|
210
|
-
acquireToken() {
|
|
211
|
-
let request = {
|
|
212
|
-
scopes: MSALUtils.getApiScopes()
|
|
213
|
-
};
|
|
214
|
-
if (this.isPopup()) {
|
|
215
|
-
return this.msalService.acquireTokenPopup(request).pipe(map(response => {
|
|
216
|
-
return response ? response.accessToken : null;
|
|
217
|
-
}));
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
return this.msalService.acquireTokenRedirect(request).pipe(map(() => {
|
|
221
|
-
return null;
|
|
222
|
-
}));
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
// Public funcs
|
|
226
|
-
getActiveAccount() {
|
|
227
|
-
this.checkAndSetActiveAccount();
|
|
228
|
-
return this.msalService.instance.getActiveAccount();
|
|
229
|
-
}
|
|
230
|
-
getUserEmail() {
|
|
231
|
-
let user = this.appContext.user;
|
|
232
|
-
let activeAccount = this.getActiveAccount();
|
|
233
|
-
if (activeAccount) {
|
|
234
|
-
return activeAccount.username;
|
|
235
|
-
}
|
|
236
|
-
return user ? user.Email : '';
|
|
237
|
-
}
|
|
238
|
-
getUserName() {
|
|
239
|
-
let user = this.appContext.user;
|
|
240
|
-
let activeAccount = this.getActiveAccount();
|
|
241
|
-
if (activeAccount) {
|
|
242
|
-
return activeAccount.name ? activeAccount.name : user ? user.displayNameOrFullName : '';
|
|
243
|
-
}
|
|
244
|
-
return user ? user.displayNameOrFullName : '';
|
|
245
|
-
}
|
|
246
|
-
getAccessToken() {
|
|
247
|
-
//1. Check SSO
|
|
248
|
-
/*
|
|
249
|
-
https://learn.microsoft.com/en-us/entra/identity-platform/msal-js-sso
|
|
250
|
-
*/
|
|
251
|
-
if (QSUtils.isSSOinProgress()) {
|
|
252
|
-
let cls = QSUtils.getValueByName("cls");
|
|
253
|
-
let login = QSUtils.getValueByName("login");
|
|
254
|
-
let sid = QSUtils.getValueByName("sid");
|
|
255
|
-
let ssoSilentRequest;
|
|
256
|
-
if (login) {
|
|
257
|
-
ssoSilentRequest = {
|
|
258
|
-
scopes: MSALUtils.getApiScopes(),
|
|
259
|
-
loginHint: login
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
else if (sid) {
|
|
263
|
-
ssoSilentRequest = {
|
|
264
|
-
scopes: MSALUtils.getApiScopes(),
|
|
265
|
-
sid: sid
|
|
266
|
-
};
|
|
267
|
-
}
|
|
268
|
-
//Logging
|
|
269
|
-
console.log("SSO in progress");
|
|
270
|
-
if (cls) {
|
|
271
|
-
QSUtils.clearKey("cls=1", true, true);
|
|
272
|
-
}
|
|
273
|
-
return this.msalService.ssoSilent(ssoSilentRequest).pipe(map(response => {
|
|
274
|
-
QSUtils.clearSSO();
|
|
275
|
-
//Logging
|
|
276
|
-
console.log("SSO have been successfully done");
|
|
277
|
-
return response.accessToken;
|
|
278
|
-
}), catchError(error => {
|
|
279
|
-
QSUtils.clearSSO();
|
|
280
|
-
//Logging
|
|
281
|
-
console.log("SSO silent token acquisition fails");
|
|
282
|
-
console.error(error);
|
|
283
|
-
if (error instanceof InteractionRequiredAuthError) {
|
|
284
|
-
return this.acquireToken();
|
|
285
|
-
}
|
|
286
|
-
return of(null);
|
|
287
|
-
}));
|
|
288
|
-
}
|
|
289
|
-
//2. if isUserAuthenticated
|
|
290
|
-
let activeAccount = this.getActiveAccount();
|
|
291
|
-
if (activeAccount) {
|
|
292
|
-
let silentRequest = {
|
|
293
|
-
scopes: MSALUtils.getApiScopes(),
|
|
294
|
-
account: activeAccount
|
|
295
|
-
};
|
|
296
|
-
return this.msalService.acquireTokenSilent(silentRequest).pipe(map(response => {
|
|
297
|
-
return response.accessToken;
|
|
298
|
-
}), catchError(error => {
|
|
299
|
-
console.log("Silent token acquisition fails.");
|
|
300
|
-
if (error instanceof InteractionRequiredAuthError) {
|
|
301
|
-
return this.acquireToken();
|
|
302
|
-
}
|
|
303
|
-
return of(null);
|
|
304
|
-
}));
|
|
305
|
-
}
|
|
306
|
-
return of(null);
|
|
307
|
-
}
|
|
308
|
-
forceReauthenticate(account) {
|
|
309
|
-
if (MSALUtils.isB2C()) {
|
|
310
|
-
let signUpSignInFlowRequest = {
|
|
311
|
-
authority: this.signUpSignInPolicy.authority,
|
|
312
|
-
scopes: [],
|
|
313
|
-
prompt: PromptValue.LOGIN, // force user to reauthenticate with their new password
|
|
314
|
-
account: account
|
|
315
|
-
};
|
|
316
|
-
this.login(signUpSignInFlowRequest);
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
login(userFlowRequest, popup) {
|
|
322
|
-
let authRequestCfg = this.msalGuardConfig.authRequest;
|
|
323
|
-
let authRequest = null;
|
|
324
|
-
if (!userFlowRequest) {
|
|
325
|
-
let signUpSignInFlowRequest = {
|
|
326
|
-
authority: this.signUpSignInPolicy.authority,
|
|
327
|
-
scopes: []
|
|
328
|
-
};
|
|
329
|
-
userFlowRequest = signUpSignInFlowRequest;
|
|
330
|
-
}
|
|
331
|
-
if (authRequestCfg) {
|
|
332
|
-
authRequest = authRequestCfg(this.msalService, this.router.routerState.snapshot);
|
|
333
|
-
}
|
|
334
|
-
if (this.isPopup(popup)) {
|
|
335
|
-
if (authRequest) {
|
|
336
|
-
this.msalService.loginPopup({ ...authRequest, ...userFlowRequest }).subscribe((response) => {
|
|
337
|
-
this.msalService.instance.setActiveAccount(response.account);
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
this.msalService.loginPopup(userFlowRequest).subscribe((response) => {
|
|
342
|
-
this.msalService.instance.setActiveAccount(response.account);
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
if (authRequest) {
|
|
348
|
-
this.msalService.loginRedirect({ ...authRequest, ...userFlowRequest });
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
this.msalService.loginRedirect(userFlowRequest);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
logout(popup) {
|
|
356
|
-
let activeAccount = this.getActiveAccount();
|
|
357
|
-
if (this.isPopup(popup)) {
|
|
358
|
-
if (activeAccount) {
|
|
359
|
-
this.msalService.logoutPopup({ account: activeAccount, mainWindowRedirectUri: "/" }).subscribe(() => {
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
else {
|
|
363
|
-
this.msalService.logoutPopup({ mainWindowRedirectUri: "/" }).subscribe(() => {
|
|
364
|
-
});
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
if (activeAccount) {
|
|
369
|
-
this.msalService.logoutRedirect({ account: activeAccount });
|
|
370
|
-
}
|
|
371
|
-
else {
|
|
372
|
-
this.msalService.logoutRedirect();
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
//MSAL check
|
|
377
|
-
isUserAuthenticated() {
|
|
378
|
-
return this.msalService.instance.getActiveAccount() != null;
|
|
379
|
-
}
|
|
380
|
-
//MSAL + appContext check
|
|
381
|
-
isUserSignedIn() {
|
|
382
|
-
if (!this.isUserAuthenticated()) {
|
|
383
|
-
return false;
|
|
384
|
-
}
|
|
385
|
-
if (this.appContext.current.isUserSignedIn && this.appContext.user) {
|
|
386
|
-
return true;
|
|
387
|
-
}
|
|
388
|
-
return false;
|
|
389
|
-
}
|
|
390
|
-
isUserAdmin() {
|
|
391
|
-
return this.isUserSignedIn() && this.appContext.current.isUserAdmin;
|
|
392
|
-
}
|
|
393
|
-
//B2C
|
|
394
|
-
signUp() {
|
|
395
|
-
if (!MSALUtils.isB2C()) {
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
let signUpFlowRequest = {
|
|
399
|
-
authority: this.signUpPolicy.authority,
|
|
400
|
-
scopes: []
|
|
401
|
-
};
|
|
402
|
-
this.login(signUpFlowRequest);
|
|
403
|
-
}
|
|
404
|
-
editProfile() {
|
|
405
|
-
if (!MSALUtils.isB2C()) {
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
let editProfileFlowRequest = {
|
|
409
|
-
authority: this.editProfilePolicy.authority,
|
|
410
|
-
scopes: []
|
|
411
|
-
};
|
|
412
|
-
this.login(editProfileFlowRequest);
|
|
413
|
-
}
|
|
414
|
-
resetPassword() {
|
|
415
|
-
if (!MSALUtils.isB2C()) {
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
let resetPasswordFlowRequest = {
|
|
419
|
-
authority: this.resetPasswordPolicy.authority,
|
|
420
|
-
scopes: []
|
|
421
|
-
};
|
|
422
|
-
this.login(resetPasswordFlowRequest);
|
|
423
|
-
}
|
|
424
|
-
static { this.ɵfac = function AuthService_Factory(t) { return new (t || AuthService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.Router), i0.ɵɵinject(i3.AppContextService), i0.ɵɵinject(MSAL_GUARD_CONFIG), i0.ɵɵinject(i4.MsalService), i0.ɵɵinject(i4.MsalBroadcastService)); }; }
|
|
425
|
-
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthService, factory: AuthService.ɵfac, providedIn: 'root' }); }
|
|
426
|
-
}
|
|
427
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthService, [{
|
|
428
|
-
type: Injectable,
|
|
429
|
-
args: [{
|
|
430
|
-
providedIn: 'root'
|
|
431
|
-
}]
|
|
432
|
-
}], () => [{ type: i1.HttpClient }, { type: i2.Router }, { type: i3.AppContextService }, { type: undefined, decorators: [{
|
|
433
|
-
type: Inject,
|
|
434
|
-
args: [MSAL_GUARD_CONFIG]
|
|
435
|
-
}] }, { type: i4.MsalService }, { type: i4.MsalBroadcastService }], null); })();
|
|
436
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5hdG9seS9zcmMvbGliL2lhbS9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQTZELE1BQU0scUJBQXFCLENBQUM7QUFDbkgsT0FBTyxFQUFtRCxTQUFTLEVBQWlCLDRCQUE0QixFQUM5RyxpQkFBaUIsRUFBRSxlQUFlLEVBQWdCLFdBQVcsRUFDOUQsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixLQUFLO0FBQ0wsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQVU3QyxNQUFNLE9BQU8sV0FBWSxTQUFRLGNBQWM7SUFVN0MsWUFDWSxJQUFnQixFQUNsQixNQUFjLEVBQ2QsVUFBNkIsRUFHN0IsZUFBdUMsRUFDdkMsV0FBd0IsRUFDeEIsb0JBQTBDO1FBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJGLFNBQUksR0FBSixJQUFJLENBQVk7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBRzdCLG9C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QWdCSSxNQUFNO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbjxmaWxlPlxyXG4gIFByb2plY3Q6XHJcbiAgICBAb3Nvdml0bnkvYW5hdG9seVxyXG5cclxuICBBdXRob3JzOlxyXG4gICAgVmFkaW0gT3Nvdml0bnkgdmFkaW0ub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcbiAgICBBbmF0b2x5IE9zb3ZpdG55IGFuYXRvbHkub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcblxyXG4gIENyZWF0ZWQ6XHJcbiAgICA2IERlYyAyMDE4XHJcblxyXG4gIERlc2NyaXB0aW9uOlxyXG4gICAgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50XHJcblxyXG4gIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IE9zb3ZpdG55IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuPC9maWxlPlxyXG4qL1xyXG5cclxuLy9Ob2RlXHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGNhdGNoRXJyb3IsIGZpbHRlciwgbWFwLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1TQUxfR1VBUkRfQ09ORklHLCBNc2FsQnJvYWRjYXN0U2VydmljZSwgTXNhbEd1YXJkQ29uZmlndXJhdGlvbiwgTXNhbFNlcnZpY2UgfSBmcm9tICdAYXp1cmUvbXNhbC1hbmd1bGFyJztcclxuaW1wb3J0IHsgQWNjb3VudEluZm8sIEF1dGhlbnRpY2F0aW9uUmVzdWx0LCBFdmVudE1lc3NhZ2UsIEV2ZW50VHlwZSwgSWRUb2tlbkNsYWltcywgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcixcclxuICBJbnRlcmFjdGlvblN0YXR1cywgSW50ZXJhY3Rpb25UeXBlLCBQb3B1cFJlcXVlc3QsIFByb21wdFZhbHVlLCBSZWRpcmVjdFJlcXVlc3QsIFNpbGVudFJlcXVlc3QsIFNzb1NpbGVudFJlcXVlc3RcclxufSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcclxuXHJcbi8vQXBwXHJcbmltcG9ydCB7IEFwaVNlcnZpY2VCYXNlIH0gZnJvbSAnLi4vLi4vZGF0YS9iYXNlL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2FwcGNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1TQUxSZWRpcmVjdCB9IGZyb20gJy4uL3JlZGlyZWN0JztcclxuaW1wb3J0IHsgTVNBTFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBNU0FMQjJDLCBQb2xpY3lUeXBlIH0gZnJvbSAnLi4vYjJjJztcclxuaW1wb3J0IHsgUVNVdGlscyB9IGZyb20gJy4uLy4uL2NvcmUvZXhwb3J0cyc7XHJcblxyXG50eXBlIElkVG9rZW5DbGFpbXNXaXRoUG9saWN5SWQgPSBJZFRva2VuQ2xhaW1zICYge1xyXG4gIGFjcj86IHN0cmluZyxcclxuICB0ZnA/OiBzdHJpbmcsXHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSBleHRlbmRzIEFwaVNlcnZpY2VCYXNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1zYWxEZXN0cm95aW5nJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL0IyQyBQb2xpY2llc1xyXG4gIHByaXZhdGUgc2lnblVwU2lnbkluUG9saWN5XHJcbiAgcHJpdmF0ZSBzaWduVXBQb2xpY3k7XHJcbiAgcHJpdmF0ZSBlZGl0UHJvZmlsZVBvbGljeTtcclxuICBwcml2YXRlIHJlc2V0UGFzc3dvcmRQb2xpY3k7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhcHBDb250ZXh0OiBBcHBDb250ZXh0U2VydmljZSxcclxuXHJcbiAgICBASW5qZWN0KE1TQUxfR1VBUkRfQ09ORklHKVxyXG4gICAgcHJpdmF0ZSBtc2FsR3VhcmRDb25maWc6IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24sXHJcbiAgICBwcml2YXRlIG1zYWxTZXJ2aWNlOiBNc2FsU2VydmljZSxcclxuICAgIHByaXZhdGUgbXNhbEJyb2FkY2FzdFNlcnZpY2U6IE1zYWxCcm9hZGNhc3RTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihodHRwKTtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLm1zYWxEZXN0cm95aW5nJC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLm1zYWxEZXN0cm95aW5nJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgdGhpcy5zZXREZWZhdWx0cygpO1xyXG5cclxuICAgIHRoaXMubXNhbFNlcnZpY2UuaW5pdGlhbGl6ZSgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBpbml0TVNBTCBzdGFydGVkYCk7XHJcbiAgICAgIHRoaXMuaW5pdE1TQUwoKTtcclxuICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBpbml0TVNBTCBmaW5pc2hlZGApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERlZmF1bHRzKCkge1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy9ibG9iL2Rldi9zYW1wbGVzL21zYWwtYW5ndWxhci12My1zYW1wbGVzL2FuZ3VsYXItYjJjLXNhbXBsZS1hcHAvc3JjL2FwcC9hcHAuY29tcG9uZW50LnRzXHJcblxyXG4gICAgVG9rZW4gVmFsaWRhdGlvbjpcclxuICAgICAgaHR0cHM6Ly9qd3QuaW9cclxuXHJcbiAgICBUb2tlbiB0eXBlczpcclxuICAgICAgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2FjdGl2ZS1kaXJlY3RvcnktYjJjL3Rva2Vucy1vdmVydmlld1xyXG4gICAgICBJRCB0b2tlbiAtIEEgSldUIHRoYXQgY29udGFpbnMgY2xhaW1zIHRoYXQgeW91IGNhbiB1c2UgdG8gaWRlbnRpZnkgdXNlcnMgaW4geW91ciBhcHBsaWNhdGlvblxyXG4gICAgICBBY2Nlc3MgdG9rZW4gLSBBIEpXVCB0aGF0IGNvbnRhaW5zIGNsYWltcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGlkZW50aWZ5IHRoZSBncmFudGVkIHBlcm1pc3Npb25zIHRvIHlvdXIgQVBJcy5cclxuICAgICAgICAgICAgICAgICAgICAgQWNjZXNzIHRva2VucyBhcmUgc2lnbmVkLCBidXQgdGhleSBhcmVuJ3QgZW5jcnlwdGVkXHJcbiAgICAgIFJlZnJlc2ggdG9rZW4gLSBSZWZyZXNoIHRva2VucyBhcmUgdXNlZCB0byBhY3F1aXJlIG5ldyBJRCB0b2tlbnMgYW5kIGFjY2VzcyB0b2tlbnMgaW4gYW4gT0F1dGggMi4wIGZsb3cuXHJcbiAgKi9cclxuICBwcml2YXRlIGluaXRNU0FMKCkge1xyXG4gICAgLy9CMkNcclxuICAgIHRoaXMuc2lnblVwU2lnbkluUG9saWN5ID0gTVNBTEIyQy5nZXRQb2xpY3lCeVR5cGUoUG9saWN5VHlwZS5zaWduVXBTaWduSW4pO1xyXG4gICAgdGhpcy5zaWduVXBQb2xpY3kgPSBNU0FMQjJDLmdldFBvbGljeUJ5VHlwZShQb2xpY3lUeXBlLnNpZ25VcCk7XHJcbiAgICB0aGlzLmVkaXRQcm9maWxlUG9saWN5ID0gTVNBTEIyQy5nZXRQb2xpY3lCeVR5cGUoUG9saWN5VHlwZS5lZGl0UHJvZmlsZSk7XHJcbiAgICB0aGlzLnJlc2V0UGFzc3dvcmRQb2xpY3kgPSBNU0FMQjJDLmdldFBvbGljeUJ5VHlwZShQb2xpY3lUeXBlLnJlc2V0UGFzc3dvcmQpO1xyXG5cclxuICAgIHRoaXMubXNhbFNlcnZpY2UuaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3VsdDogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgbXNhbC5hcHA6IGhhbmRsZVJlZGlyZWN0T2JzZXJ2YWJsZWApO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCk7XHJcbiAgICB0aGlzLm1zYWxCcm9hZGNhc3RTZXJ2aWNlLm1zYWxTdWJqZWN0JC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigobXNnOiBFdmVudE1lc3NhZ2UpID0+XHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuSU5JVElBTElaRV9FTkQgfHxcclxuXHJcbiAgICAgICAgICAvL0FDQ09VTlRfQURERUQgYW5kIEFDQ09VTlRfUkVNT1ZFRCBldmVudHMgZW1pdHRlZCB3aGVuIGEgdXNlciBsb2dzIGluIG9yIG91dCBvZiBhbm90aGVyIHRhYiBvciB3aW5kb3dcclxuICAgICAgICAgIG1zZy5ldmVudFR5cGUgPT09IEV2ZW50VHlwZS5BQ0NPVU5UX0FEREVEIHx8XHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuQUNDT1VOVF9SRU1PVkVEIHx8XHJcblxyXG4gICAgICAgICAgLy9Mb2dpbiBGYWlsdXJlXHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTE9HSU5fRkFJTFVSRSB8fFxyXG4gICAgICAgICAgbXNnLmV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSB8fFxyXG5cclxuICAgICAgICAgIC8vTG9nT3V0XHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTE9HT1VUX1NVQ0NFU1MgfHxcclxuXHJcbiAgICAgICAgICAvL0xvZ0luXHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTE9HSU5fU1VDQ0VTUyB8fFxyXG4gICAgICAgICAgbXNnLmV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUyB8fFxyXG4gICAgICAgICAgbXNnLmV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLlNTT19TSUxFTlRfU1VDQ0VTU1xyXG4gICAgICAgICksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubXNhbERlc3Ryb3lpbmckKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKG1zZzogRXZlbnRNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChtc2cuZXZlbnRUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5JTklUSUFMSVpFX0VORDpcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBJTklUSUFMSVpFX0VORCBmaXJlZGApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5BQ0NPVU5UX0FEREVEOlxyXG4gICAgICAgICAgY2FzZSBFdmVudFR5cGUuQUNDT1VOVF9SRU1PVkVEOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5tc2FsU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9IFwiL1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkxPR0lOX0ZBSUxVUkU6XHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6XHJcbiAgICAgICAgICAgIGlmICghTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGZvcmdvdCBwYXNzd29yZCBlcnJvci4gTGVhcm4gbW9yZSBhYm91dCBBQUQgZXJyb3IgY29kZXMgYXRcclxuICAgICAgICAgICAgLy9odHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9hY3RpdmUtZGlyZWN0b3J5L2RldmVsb3AvcmVmZXJlbmNlLWFhZHN0cy1lcnJvci1jb2Rlc1xyXG4gICAgICAgICAgICBpZiAobXNnLmVycm9yICYmIG1zZy5lcnJvci5tZXNzYWdlLmluZGV4T2YoJ0FBREIyQzkwMTE4JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGxldCByZXNldFBhc3N3b3JkRmxvd1JlcXVlc3Q6IFJlZGlyZWN0UmVxdWVzdCB8IFBvcHVwUmVxdWVzdCAgPSB7XHJcbiAgICAgICAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5yZXNldFBhc3N3b3JkUG9saWN5LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmxvZ2luKHJlc2V0UGFzc3dvcmRGbG93UmVxdWVzdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkxPR09VVF9TVUNDRVNTOlxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5MT0dJTl9TVUNDRVNTOlxyXG4gICAgICAgICAgY2FzZSBFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9TVUNDRVNTOlxyXG4gICAgICAgICAgY2FzZSBFdmVudFR5cGUuU1NPX1NJTEVOVF9TVUNDRVNTOlxyXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IG1zZy5wYXlsb2FkIGFzIEF1dGhlbnRpY2F0aW9uUmVzdWx0O1xyXG4gICAgICAgICAgICBpZiAoIXBheWxvYWQpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQocGF5bG9hZC5hY2NvdW50KTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vQjJDXHJcbiAgICAgICAgICAgIGxldCB0b2tlbiA9IHBheWxvYWQuaWRUb2tlbkNsYWltcyBhcyBJZFRva2VuQ2xhaW1zV2l0aFBvbGljeUlkXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogc2lnblVwU2lnbkluXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG9rZW4uYWNyID09PSB0aGlzLnNpZ25VcFNpZ25JblBvbGljeS5uYW1lIHx8IHRva2VuLnRmcCA9PT0gdGhpcy5zaWduVXBTaWduSW5Qb2xpY3kubmFtZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChwYXlsb2FkLmFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogc2lnblVwUG9saWN5XHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG9rZW4uYWNyID09PSB0aGlzLnNpZ25VcFBvbGljeS5uYW1lIHx8IHRva2VuLnRmcCA9PT0gdGhpcy5zaWduVXBQb2xpY3kubmFtZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChwYXlsb2FkLmFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogZWRpdFByb2ZpbGVcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHNldHRpbmcgYW4gYWN0aXZlIGFjY291bnQgZm9yIFVJIHVwZGF0ZSwgd2Ugd2FudCB0byBjb25zaWRlciBvbmx5IHRoZSBhdXRoIHJlc3BvbnNlIHJlc3VsdGluZ1xyXG4gICAgICAgICAgICAgKiBmcm9tIFNVU0kgZmxvdy4gXCJhY3JcIiBjbGFpbSBpbiB0aGUgaWQgdG9rZW4gdGVsbHMgdXMgdGhlIHBvbGljeSAoTk9URTogbmV3ZXIgcG9saWNpZXMgbWF5IHVzZSB0aGUgXCJ0ZnBcIiBjbGFpbSBpbnN0ZWFkKS5cclxuICAgICAgICAgICAgICogVG8gbGVhcm4gbW9yZSBhYm91dCBCMkMgdG9rZW5zLCB2aXNpdCBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9hY3RpdmUtZGlyZWN0b3J5LWIyYy90b2tlbnMtb3ZlcnZpZXdcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0b2tlbi5hY3IgPT09IHRoaXMuZWRpdFByb2ZpbGVQb2xpY3kubmFtZSB8fCB0b2tlbi50ZnAgPT09IHRoaXMuZWRpdFByb2ZpbGVQb2xpY3kubmFtZSkge1xyXG4gICAgICAgICAgICAgICBjb25zdCBzaWduSW5BY2NvdW50ID0gdGhpcy5tc2FsU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmZpbmQoKGFjY291bnQ6IEFjY291bnRJbmZvKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQuaWRUb2tlbkNsYWltcz8ub2lkID09PSB0b2tlbi5vaWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LmlkVG9rZW5DbGFpbXM/LnN1YiA9PT0gdG9rZW4uc3ViICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKChhY2NvdW50LmlkVG9rZW5DbGFpbXMgYXMgSWRUb2tlbkNsYWltc1dpdGhQb2xpY3lJZCkuYWNyID09PSB0aGlzLnNpZ25VcFNpZ25JblBvbGljeS5uYW1lIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY2NvdW50LmlkVG9rZW5DbGFpbXMgYXMgSWRUb2tlbkNsYWltc1dpdGhQb2xpY3lJZCkudGZwID09PSB0aGlzLnNpZ25VcFNpZ25JblBvbGljeS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlYXV0aGVudGljYXRlKHNpZ25JbkFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogcmVzZXRQYXNzd29yZFxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBCZWxvdyB3ZSBhcmUgY2hlY2tpbmcgaWYgdGhlIHVzZXIgaXMgcmV0dXJuaW5nIGZyb20gdGhlIHJlc2V0IHBhc3N3b3JkIGZsb3cuXHJcbiAgICAgICAgICAgICAqIElmIHNvLCB3ZSB3aWxsIGFzayB0aGUgdXNlciB0byByZWF1dGhlbnRpY2F0ZSB3aXRoIHRoZWlyIG5ldyBwYXNzd29yZC5cclxuICAgICAgICAgICAgICogSWYgeW91IGRvIG5vdCB3YW50IHRoaXMgYmVoYXZpb3IgYW5kIHByZWZlciB5b3VyIHVzZXJzIHRvIHN0YXkgc2lnbmVkIGluIGluc3RlYWQsXHJcbiAgICAgICAgICAgICAqIHlvdSBjYW4gcmVwbGFjZSB0aGUgY29kZSBiZWxvdyB3aXRoIHRoZSBzYW1lIHBhdHRlcm4gdXNlZCBmb3IgaGFuZGxpbmcgdGhlIHJldHVybiBmcm9tXHJcbiAgICAgICAgICAgICAqIHByb2ZpbGUgZWRpdCBmbG93XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG9rZW4uYWNyID09PSB0aGlzLnJlc2V0UGFzc3dvcmRQb2xpY3kubmFtZSB8fCB0b2tlbi50ZnAgPT09IHRoaXMucmVzZXRQYXNzd29yZFBvbGljeS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlYXV0aGVudGljYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1zZztcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigoc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cykgPT5cclxuICAgICAgICAgIHN0YXR1cyA9PT0gSW50ZXJhY3Rpb25TdGF0dXMuU3RhcnR1cCB8fFxyXG4gICAgICAgICAgc3RhdHVzID09PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5tc2FsRGVzdHJveWluZyQpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cykgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XHJcbiAgICAgICAgICAvKipcclxuICAgICAgICAgICAqIEluaXRpYWwgc3RhdHVzIGJlZm9yZSBpbnRlcmFjdGlvbiBvY2N1cnNcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgY2FzZSBJbnRlcmFjdGlvblN0YXR1cy5TdGFydHVwOlxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbXNhbC5hcHA6IEludGVyYWN0aW9uU3RhdHVzLlN0YXJ0dXBgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAqIFN0YXR1cyBzZXQgd2hlbiBpbnRlcmFjdGlvbiBpcyBjb21wbGV0ZVxyXG4gICAgICAgICAgKi9cclxuICAgICAgICAgIGNhc2UgSW50ZXJhY3Rpb25TdGF0dXMuTm9uZTpcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBJbnRlcmFjdGlvblN0YXR1cy5Ob25lYCk7XHJcblxyXG4gICAgICAgICAgICBNU0FMUmVkaXJlY3QuaGFuZGxlKHRoaXMucm91dGVyLCAnbXNhbEJyb2FkY2FzdFNlcnZpY2UuaW5Qcm9ncmVzcyQgSW50ZXJhY3Rpb25TdGF0dXMuTm9uZScpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldEFjdGl2ZUFjY291bnQoKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBDb250ZXh0LnVwZGF0ZUN1cnJlbnQoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tBbmRTZXRBY3RpdmVBY2NvdW50KCkge1xyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcclxuICAgIGxldCBhY2NvdW50cyA9IHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKTtcclxuXHJcbiAgICBpZiAoIWFjdGl2ZUFjY291bnQgJiYgYWNjb3VudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQoYWNjb3VudHNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1BvcHVwKHBvcHVwPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHR5cGVvZiBwb3B1cCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICByZXR1cm4gdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUG9wdXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBvcHVwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhY3F1aXJlVG9rZW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXF1ZXN0ID0ge1xyXG4gICAgICBzY29wZXM6IE1TQUxVdGlscy5nZXRBcGlTY29wZXMoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzUG9wdXAoKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5tc2FsU2VydmljZS5hY3F1aXJlVG9rZW5Qb3B1cChyZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UgPyByZXNwb25zZS5hY2Nlc3NUb2tlbiA6IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5tc2FsU2VydmljZS5hY3F1aXJlVG9rZW5SZWRpcmVjdChyZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUHVibGljIGZ1bmNzXHJcbiAgZ2V0QWN0aXZlQWNjb3VudCgpOiBBY2NvdW50SW5mbyB8IG51bGwge1xyXG4gICAgdGhpcy5jaGVja0FuZFNldEFjdGl2ZUFjY291bnQoKTtcclxuICAgIHJldHVybiB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJFbWFpbCgpIHtcclxuICAgIGxldCB1c2VyID0gdGhpcy5hcHBDb250ZXh0LnVzZXI7XHJcbiAgICBsZXQgYWN0aXZlQWNjb3VudCA9IHRoaXMuZ2V0QWN0aXZlQWNjb3VudCgpO1xyXG5cclxuICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgIHJldHVybiBhY3RpdmVBY2NvdW50LnVzZXJuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1c2VyID8gdXNlci5FbWFpbCA6ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICBsZXQgdXNlciA9IHRoaXMuYXBwQ29udGV4dC51c2VyO1xyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtcclxuXHJcbiAgICBpZiAoYWN0aXZlQWNjb3VudCkge1xyXG4gICAgICByZXR1cm4gYWN0aXZlQWNjb3VudC5uYW1lID8gYWN0aXZlQWNjb3VudC5uYW1lIDogdXNlciA/IHVzZXIuZGlzcGxheU5hbWVPckZ1bGxOYW1lIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVzZXIgPyB1c2VyLmRpc3BsYXlOYW1lT3JGdWxsTmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWNjZXNzVG9rZW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIC8vMS4gQ2hlY2sgU1NPXHJcbiAgICAvKlxyXG4gICAgICBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvZW50cmEvaWRlbnRpdHktcGxhdGZvcm0vbXNhbC1qcy1zc29cclxuICAgICovXHJcbiAgICBpZiAoUVNVdGlscy5pc1NTT2luUHJvZ3Jlc3MoKSkge1xyXG4gICAgICBsZXQgY2xzID0gUVNVdGlscy5nZXRWYWx1ZUJ5TmFtZShcImNsc1wiKTtcclxuICAgICAgbGV0IGxvZ2luID0gUVNVdGlscy5nZXRWYWx1ZUJ5TmFtZShcImxvZ2luXCIpO1xyXG4gICAgICBsZXQgc2lkID0gUVNVdGlscy5nZXRWYWx1ZUJ5TmFtZShcInNpZFwiKTtcclxuICAgICAgbGV0IHNzb1NpbGVudFJlcXVlc3Q6IFNzb1NpbGVudFJlcXVlc3Q7XHJcblxyXG4gICAgICBpZiAobG9naW4pIHtcclxuICAgICAgICBzc29TaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgc2NvcGVzOiBNU0FMVXRpbHMuZ2V0QXBpU2NvcGVzKCksXHJcbiAgICAgICAgICBsb2dpbkhpbnQ6IGxvZ2luXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChzaWQpIHtcclxuICAgICAgICBzc29TaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgc2NvcGVzOiBNU0FMVXRpbHMuZ2V0QXBpU2NvcGVzKCksXHJcbiAgICAgICAgICBzaWQ6IHNpZFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vTG9nZ2luZ1xyXG4gICAgICBjb25zb2xlLmxvZyhcIlNTTyBpbiBwcm9ncmVzc1wiKTtcclxuICAgICAgaWYgKGNscykge1xyXG4gICAgICAgIFFTVXRpbHMuY2xlYXJLZXkoXCJjbHM9MVwiLCB0cnVlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMubXNhbFNlcnZpY2Uuc3NvU2lsZW50KHNzb1NpbGVudFJlcXVlc3QpLnBpcGUoXHJcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIFFTVXRpbHMuY2xlYXJTU08oKTtcclxuXHJcbiAgICAgICAgICAvL0xvZ2dpbmdcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU1NPIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZG9uZVwiKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICBRU1V0aWxzLmNsZWFyU1NPKCk7XHJcblxyXG4gICAgICAgICAgLy9Mb2dnaW5nXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNTTyBzaWxlbnQgdG9rZW4gYWNxdWlzaXRpb24gZmFpbHNcIik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbigpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vMi4gaWYgaXNVc2VyQXV0aGVudGljYXRlZFxyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtcclxuICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgIGxldCBzaWxlbnRSZXF1ZXN0OiBTaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgIHNjb3BlczogTVNBTFV0aWxzLmdldEFwaVNjb3BlcygpLFxyXG4gICAgICAgIGFjY291bnQ6IGFjdGl2ZUFjY291bnRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLm1zYWxTZXJ2aWNlLmFjcXVpcmVUb2tlblNpbGVudChzaWxlbnRSZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNpbGVudCB0b2tlbiBhY3F1aXNpdGlvbiBmYWlscy5cIik7XHJcblxyXG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW4oKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgfVxyXG5cclxuICBmb3JjZVJlYXV0aGVudGljYXRlKGFjY291bnQ/KSB7XHJcbiAgICBpZiAoTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgbGV0IHNpZ25VcFNpZ25JbkZsb3dSZXF1ZXN0OiBSZWRpcmVjdFJlcXVlc3QgfCBQb3B1cFJlcXVlc3QgID0ge1xyXG4gICAgICAgIGF1dGhvcml0eTogdGhpcy5zaWduVXBTaWduSW5Qb2xpY3kuYXV0aG9yaXR5LFxyXG4gICAgICAgIHNjb3BlczogW10sXHJcbiAgICAgICAgcHJvbXB0OiBQcm9tcHRWYWx1ZS5MT0dJTiwgLy8gZm9yY2UgdXNlciB0byByZWF1dGhlbnRpY2F0ZSB3aXRoIHRoZWlyIG5ldyBwYXNzd29yZFxyXG4gICAgICAgIGFjY291bnQ6IGFjY291bnRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMubG9naW4oc2lnblVwU2lnbkluRmxvd1JlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2dpbih1c2VyRmxvd1JlcXVlc3Q/OiBSZWRpcmVjdFJlcXVlc3QgfCBQb3B1cFJlcXVlc3QsIHBvcHVwPzogYm9vbGVhbikge1xyXG4gICAgbGV0IGF1dGhSZXF1ZXN0Q2ZnOiBhbnkgPSB0aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdDtcclxuICAgIGxldCBhdXRoUmVxdWVzdCA9IG51bGw7XHJcblxyXG4gICAgaWYgKCF1c2VyRmxvd1JlcXVlc3QpIHtcclxuICAgICAgbGV0IHNpZ25VcFNpZ25JbkZsb3dSZXF1ZXN0OiBSZWRpcmVjdFJlcXVlc3QgfCBQb3B1cFJlcXVlc3QgID0ge1xyXG4gICAgICAgIGF1dGhvcml0eTogdGhpcy5zaWduVXBTaWduSW5Qb2xpY3kuYXV0aG9yaXR5LFxyXG4gICAgICAgIHNjb3BlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHVzZXJGbG93UmVxdWVzdCA9IHNpZ25VcFNpZ25JbkZsb3dSZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdXRoUmVxdWVzdENmZykge1xyXG4gICAgICBhdXRoUmVxdWVzdCA9IGF1dGhSZXF1ZXN0Q2ZnKHRoaXMubXNhbFNlcnZpY2UsIHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1BvcHVwKHBvcHVwKSkge1xyXG4gICAgICBpZiAoYXV0aFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmxvZ2luUG9wdXAoeyAuLi5hdXRoUmVxdWVzdCwgLi4udXNlckZsb3dSZXF1ZXN0IH0gYXMgUG9wdXBSZXF1ZXN0KS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBBdXRoZW50aWNhdGlvblJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tc2FsU2VydmljZS5pbnN0YW5jZS5zZXRBY3RpdmVBY2NvdW50KHJlc3BvbnNlLmFjY291bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMubXNhbFNlcnZpY2UubG9naW5Qb3B1cCh1c2VyRmxvd1JlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQocmVzcG9uc2UuYWNjb3VudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoYXV0aFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmxvZ2luUmVkaXJlY3QoeyAuLi5hdXRoUmVxdWVzdCwgLi4udXNlckZsb3dSZXF1ZXN0IH0gYXMgUmVkaXJlY3RSZXF1ZXN0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmxvZ2luUmVkaXJlY3QodXNlckZsb3dSZXF1ZXN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9nb3V0KHBvcHVwPzogYm9vbGVhbikge1xyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1BvcHVwKHBvcHVwKSkge1xyXG4gICAgICBpZiAoYWN0aXZlQWNjb3VudCkge1xyXG4gICAgICAgIHRoaXMubXNhbFNlcnZpY2UubG9nb3V0UG9wdXAoeyBhY2NvdW50OiBhY3RpdmVBY2NvdW50LCBtYWluV2luZG93UmVkaXJlY3RVcmk6IFwiL1wiIH0pLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tc2FsU2VydmljZS5sb2dvdXRQb3B1cCh7IG1haW5XaW5kb3dSZWRpcmVjdFVyaTogXCIvXCIgfSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgICAgdGhpcy5tc2FsU2VydmljZS5sb2dvdXRSZWRpcmVjdCh7IGFjY291bnQ6IGFjdGl2ZUFjY291bnQgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tc2FsU2VydmljZS5sb2dvdXRSZWRpcmVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL01TQUwgY2hlY2tcclxuICBpc1VzZXJBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWN0aXZlQWNjb3VudCgpICE9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvL01TQUwgKyBhcHBDb250ZXh0IGNoZWNrXHJcbiAgaXNVc2VyU2lnbmVkSW4oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuaXNVc2VyQXV0aGVudGljYXRlZCgpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hcHBDb250ZXh0LmN1cnJlbnQuaXNVc2VyU2lnbmVkSW4gJiYgdGhpcy5hcHBDb250ZXh0LnVzZXIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNVc2VyQWRtaW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1VzZXJTaWduZWRJbigpICYmIHRoaXMuYXBwQ29udGV4dC5jdXJyZW50LmlzVXNlckFkbWluO1xyXG4gIH1cclxuXHJcbiAgLy9CMkNcclxuICBzaWduVXAoKSB7XHJcbiAgICBpZiAoIU1TQUxVdGlscy5pc0IyQygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2lnblVwRmxvd1JlcXVlc3Q6IFJlZGlyZWN0UmVxdWVzdCB8IFBvcHVwUmVxdWVzdCAgPSB7XHJcbiAgICAgIGF1dGhvcml0eTogdGhpcy5zaWduVXBQb2xpY3kuYXV0aG9yaXR5LFxyXG4gICAgICBzY29wZXM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubG9naW4oc2lnblVwRmxvd1JlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgZWRpdFByb2ZpbGUoKSB7XHJcbiAgICBpZiAoIU1TQUxVdGlscy5pc0IyQygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZWRpdFByb2ZpbGVGbG93UmVxdWVzdDogUmVkaXJlY3RSZXF1ZXN0IHwgUG9wdXBSZXF1ZXN0ICA9IHtcclxuICAgICAgYXV0aG9yaXR5OiB0aGlzLmVkaXRQcm9maWxlUG9saWN5LmF1dGhvcml0eSxcclxuICAgICAgc2NvcGVzOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2luKGVkaXRQcm9maWxlRmxvd1JlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRQYXNzd29yZCgpIHtcclxuICAgIGlmICghTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNldFBhc3N3b3JkRmxvd1JlcXVlc3Q6IFJlZGlyZWN0UmVxdWVzdCB8IFBvcHVwUmVxdWVzdCAgPSB7XHJcbiAgICAgIGF1dGhvcml0eTogdGhpcy5yZXNldFBhc3N3b3JkUG9saWN5LmF1dGhvcml0eSxcclxuICAgICAgc2NvcGVzOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2luKHJlc2V0UGFzc3dvcmRGbG93UmVxdWVzdCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
<file>
|
|
3
|
-
Project:
|
|
4
|
-
@osovitny/anatoly
|
|
5
|
-
|
|
6
|
-
Authors:
|
|
7
|
-
Vadim Osovitny vadim.osovitny@osovitny.com
|
|
8
|
-
Anatoly Osovitny anatoly.osovitny@osovitny.com
|
|
9
|
-
|
|
10
|
-
Created:
|
|
11
|
-
20 Sep 2023
|
|
12
|
-
|
|
13
|
-
Description:
|
|
14
|
-
Identity and Access Management
|
|
15
|
-
|
|
16
|
-
Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
|
|
17
|
-
</file>
|
|
18
|
-
*/
|
|
19
|
-
export const MSALStorageKeys = {
|
|
20
|
-
//LocalStorage
|
|
21
|
-
redirectTo: 'msal.app.redirectTo'
|
|
22
|
-
//SessionStorage
|
|
23
|
-
};
|
|
24
|
-
export class MSALStorage {
|
|
25
|
-
static saveRedirectState(redirectTo, calledBy) {
|
|
26
|
-
if (redirectTo.indexOf('iam') >= 0) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
localStorage.setItem(MSALStorageKeys.redirectTo, redirectTo);
|
|
30
|
-
console.log(`msal.app: redirect state saved: ${redirectTo}. Called by: ${calledBy}`);
|
|
31
|
-
}
|
|
32
|
-
static getRedirectState(calledBy) {
|
|
33
|
-
let redirectTo = localStorage.getItem(MSALStorageKeys.redirectTo);
|
|
34
|
-
console.log(`msal.app: redirect state requested: ${redirectTo}. Called by: ${calledBy}`);
|
|
35
|
-
return redirectTo;
|
|
36
|
-
}
|
|
37
|
-
static clearRedirectState(calledBy) {
|
|
38
|
-
localStorage.removeItem(MSALStorageKeys.redirectTo);
|
|
39
|
-
console.log(`msal.app: redirect state cleared. Called by: ${calledBy}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuYXRvbHkvc3JjL2xpYi9pYW0vc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQkU7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0IsY0FBYztJQUNkLFVBQVUsRUFBRSxxQkFBcUI7SUFFakMsZ0JBQWdCO0NBQ2pCLENBQUE7QUFFRCxNQUFNLE9BQU8sV0FBVztJQUNmLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxVQUFrQixFQUFFLFFBQWdCO1FBQ2xFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxVQUFVLGdCQUFnQixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDN0MsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsVUFBVSxnQkFBZ0IsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6RixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWdCO1FBQy9DLFlBQVksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuPGZpbGU+XHJcbiAgUHJvamVjdDpcclxuICAgIEBvc292aXRueS9hbmF0b2x5XHJcblxyXG4gIEF1dGhvcnM6XHJcbiAgICBWYWRpbSBPc292aXRueSB2YWRpbS5vc292aXRueUBvc292aXRueS5jb21cclxuICAgIEFuYXRvbHkgT3Nvdml0bnkgYW5hdG9seS5vc292aXRueUBvc292aXRueS5jb21cclxuXHJcblx0Q3JlYXRlZDpcclxuXHRcdDIwIFNlcCAyMDIzXHJcblxyXG4gIERlc2NyaXB0aW9uOlxyXG4gICAgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50XHJcblxyXG5cdENvcHlyaWdodCAoYykgMjAxNi0yMDI1IE9zb3ZpdG55IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuPC9maWxlPlxyXG4qL1xyXG5cclxuZXhwb3J0IGNvbnN0IE1TQUxTdG9yYWdlS2V5cyA9IHtcclxuICAvL0xvY2FsU3RvcmFnZVxyXG4gIHJlZGlyZWN0VG86ICdtc2FsLmFwcC5yZWRpcmVjdFRvJ1xyXG5cclxuICAvL1Nlc3Npb25TdG9yYWdlXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNU0FMU3RvcmFnZSB7XHJcbiAgcHVibGljIHN0YXRpYyBzYXZlUmVkaXJlY3RTdGF0ZShyZWRpcmVjdFRvOiBzdHJpbmcsIGNhbGxlZEJ5OiBzdHJpbmcpIHtcclxuICAgIGlmIChyZWRpcmVjdFRvLmluZGV4T2YoJ2lhbScpID49IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKE1TQUxTdG9yYWdlS2V5cy5yZWRpcmVjdFRvLCByZWRpcmVjdFRvKTtcclxuICAgIGNvbnNvbGUubG9nKGBtc2FsLmFwcDogcmVkaXJlY3Qgc3RhdGUgc2F2ZWQ6ICR7cmVkaXJlY3RUb30uIENhbGxlZCBieTogJHtjYWxsZWRCeX1gKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UmVkaXJlY3RTdGF0ZShjYWxsZWRCeTogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVkaXJlY3RUbyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKE1TQUxTdG9yYWdlS2V5cy5yZWRpcmVjdFRvKTtcclxuICAgIGNvbnNvbGUubG9nKGBtc2FsLmFwcDogcmVkaXJlY3Qgc3RhdGUgcmVxdWVzdGVkOiAke3JlZGlyZWN0VG99LiBDYWxsZWQgYnk6ICR7Y2FsbGVkQnl9YCk7XHJcblxyXG4gICAgcmV0dXJuIHJlZGlyZWN0VG87XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVkaXJlY3RTdGF0ZShjYWxsZWRCeTogc3RyaW5nKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShNU0FMU3RvcmFnZUtleXMucmVkaXJlY3RUbyk7XHJcbiAgICBjb25zb2xlLmxvZyhgbXNhbC5hcHA6IHJlZGlyZWN0IHN0YXRlIGNsZWFyZWQuIENhbGxlZCBieTogJHtjYWxsZWRCeX1gKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
<file>
|
|
3
|
-
Project:
|
|
4
|
-
@osovitny/anatoly
|
|
5
|
-
|
|
6
|
-
Authors:
|
|
7
|
-
Vadim Osovitny vadim.osovitny@osovitny.com
|
|
8
|
-
Anatoly Osovitny anatoly.osovitny@osovitny.com
|
|
9
|
-
|
|
10
|
-
Created:
|
|
11
|
-
27 Nov 2023
|
|
12
|
-
|
|
13
|
-
Description:
|
|
14
|
-
Identity and Access Management
|
|
15
|
-
|
|
16
|
-
Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
|
|
17
|
-
</file>
|
|
18
|
-
*/
|
|
19
|
-
//Node
|
|
20
|
-
import { BrowserUtils } from '@azure/msal-browser';
|
|
21
|
-
//App
|
|
22
|
-
import { MSALApiConfig, MSALB2CConfig } from './consts';
|
|
23
|
-
export class MSALUtils {
|
|
24
|
-
static isB2C() {
|
|
25
|
-
if (MSALB2CConfig) {
|
|
26
|
-
return true;
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
// Don't perform initial navigation in iframes or popups
|
|
31
|
-
static initialNavigation() {
|
|
32
|
-
return !BrowserUtils.isInIframe() && !BrowserUtils.isInPopup() ? 'enabledNonBlocking' : 'disabled';
|
|
33
|
-
}
|
|
34
|
-
static getApi() {
|
|
35
|
-
let map = new Map();
|
|
36
|
-
let api = MSALApiConfig;
|
|
37
|
-
map.set(api.uri, api.scopes);
|
|
38
|
-
return map;
|
|
39
|
-
}
|
|
40
|
-
static getApiScopes() {
|
|
41
|
-
let scopes = [];
|
|
42
|
-
let api = MSALApiConfig;
|
|
43
|
-
for (const scope of api.scopes) {
|
|
44
|
-
scopes.push(scope);
|
|
45
|
-
}
|
|
46
|
-
return scopes;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmF0b2x5L3NyYy9saWIvaWFtL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztFQWlCRTtBQUVGLE1BQU07QUFDTixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsS0FBSztBQUNMLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhELE1BQU0sT0FBTyxTQUFTO0lBQ2IsTUFBTSxDQUFDLEtBQUs7UUFDakIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3REFBd0Q7SUFDakQsTUFBTSxDQUFDLGlCQUFpQjtRQUM3QixPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3JHLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBTTtRQUNsQixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUMzQyxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUM7UUFFeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWTtRQUN4QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDO1FBRXhCLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbjxmaWxlPlxyXG4gIFByb2plY3Q6XHJcbiAgICBAb3Nvdml0bnkvYW5hdG9seVxyXG5cclxuICBBdXRob3JzOlxyXG4gICAgVmFkaW0gT3Nvdml0bnkgdmFkaW0ub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcbiAgICBBbmF0b2x5IE9zb3ZpdG55IGFuYXRvbHkub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcblxyXG5cdENyZWF0ZWQ6XHJcblx0XHQyNyBOb3YgMjAyM1xyXG5cclxuICBEZXNjcmlwdGlvbjpcclxuICAgIElkZW50aXR5IGFuZCBBY2Nlc3MgTWFuYWdlbWVudFxyXG5cclxuXHRDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBPc292aXRueSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbjwvZmlsZT5cclxuKi9cclxuXHJcbi8vTm9kZVxyXG5pbXBvcnQgeyBCcm93c2VyVXRpbHMgfSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcclxuXHJcbi8vQXBwXHJcbmltcG9ydCB7IE1TQUxBcGlDb25maWcsIE1TQUxCMkNDb25maWcgfSBmcm9tICcuL2NvbnN0cyc7XHJcblxyXG5leHBvcnQgY2xhc3MgTVNBTFV0aWxzIHtcclxuICBwdWJsaWMgc3RhdGljIGlzQjJDKCkge1xyXG4gICAgaWYgKE1TQUxCMkNDb25maWcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gRG9uJ3QgcGVyZm9ybSBpbml0aWFsIG5hdmlnYXRpb24gaW4gaWZyYW1lcyBvciBwb3B1cHNcclxuICBwdWJsaWMgc3RhdGljIGluaXRpYWxOYXZpZ2F0aW9uKCkge1xyXG4gICAgcmV0dXJuICFCcm93c2VyVXRpbHMuaXNJbklmcmFtZSgpICYmICFCcm93c2VyVXRpbHMuaXNJblBvcHVwKCkgPyAnZW5hYmxlZE5vbkJsb2NraW5nJyA6ICdkaXNhYmxlZCc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEFwaSgpIDogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nPj4ge1xyXG4gICAgbGV0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmc+PigpO1xyXG4gICAgbGV0IGFwaSA9IE1TQUxBcGlDb25maWc7XHJcblxyXG4gICAgbWFwLnNldChhcGkudXJpLCBhcGkuc2NvcGVzKTtcclxuICAgIHJldHVybiBtYXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEFwaVNjb3BlcygpIDogYW55W10ge1xyXG4gICAgbGV0IHNjb3BlcyA9IFtdO1xyXG4gICAgbGV0IGFwaSA9IE1TQUxBcGlDb25maWc7XHJcblxyXG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBhcGkuc2NvcGVzKSB7XHJcbiAgICAgIHNjb3Blcy5wdXNoKHNjb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2NvcGVzO1xyXG4gIH1cclxufVxyXG4iXX0=
|