@odx/auth 17.2.0 → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +99 -0
- package/fesm2022/odx-auth-plugins-service-connect.mjs +3 -3
- package/fesm2022/odx-auth-plugins-service-connect.mjs.map +1 -1
- package/fesm2022/odx-auth.mjs +41 -41
- package/fesm2022/odx-auth.mjs.map +1 -1
- package/index.d.ts +744 -15
- package/package.json +4 -8
- package/plugins/service-connect/index.d.ts +184 -8
- package/esm2022/index.mjs +0 -16
- package/esm2022/lib/auth.component.mjs +0 -50
- package/esm2022/lib/auth.config.mjs +0 -71
- package/esm2022/lib/auth.directive.mjs +0 -51
- package/esm2022/lib/auth.guard.mjs +0 -44
- package/esm2022/lib/auth.i18n.mjs +0 -13
- package/esm2022/lib/auth.interceptor.mjs +0 -23
- package/esm2022/lib/auth.logger.mjs +0 -3
- package/esm2022/lib/auth.module.mjs +0 -19
- package/esm2022/lib/auth.providers.mjs +0 -136
- package/esm2022/lib/auth.service.mjs +0 -317
- package/esm2022/lib/auth.typings.mjs +0 -2
- package/esm2022/lib/components/auth-actions/auth-actions.component.mjs +0 -40
- package/esm2022/lib/components/auth-loading-screen/auth-loading-screen.component.mjs +0 -53
- package/esm2022/lib/components/index.mjs +0 -3
- package/esm2022/lib/directives/auth-action.directive.mjs +0 -30
- package/esm2022/lib/directives/index.mjs +0 -4
- package/esm2022/lib/directives/sign-in.directive.mjs +0 -52
- package/esm2022/lib/directives/sign-out.directive.mjs +0 -50
- package/esm2022/lib/helpers/create-auth-host-url.mjs +0 -18
- package/esm2022/lib/helpers/create-inititals.mjs +0 -32
- package/esm2022/lib/helpers/handle-auth-error.mjs +0 -31
- package/esm2022/lib/helpers/handle-oauth-event.mjs +0 -13
- package/esm2022/lib/helpers/index.mjs +0 -9
- package/esm2022/lib/helpers/resolve-email.mjs +0 -34
- package/esm2022/lib/helpers/resolve-username.mjs +0 -38
- package/esm2022/lib/helpers/set-http-auth-header.mjs +0 -22
- package/esm2022/lib/helpers/user-language-loader.mjs +0 -17
- package/esm2022/lib/models/auth-environment.mjs +0 -3
- package/esm2022/lib/models/auth-plugin-manager.mjs +0 -49
- package/esm2022/lib/models/authorized-handler.mjs +0 -2
- package/esm2022/lib/models/index.mjs +0 -5
- package/esm2022/lib/models/offline-auth-error-handler.mjs +0 -7
- package/esm2022/lib/plugins/core-debug.plugin.mjs +0 -29
- package/esm2022/lib/plugins/core-identity.plugin.mjs +0 -20
- package/esm2022/lib/plugins/index.mjs +0 -4
- package/esm2022/lib/plugins/user-profile-link.plugin.mjs +0 -18
- package/esm2022/lib/unauth.guard.mjs +0 -38
- package/esm2022/odx-auth.mjs +0 -5
- package/esm2022/plugins/service-connect/index.mjs +0 -9
- package/esm2022/plugins/service-connect/lib/dtos/get-service-connect-rights-response.dto.mjs +0 -2
- package/esm2022/plugins/service-connect/lib/dtos/get-service-connect-user-response.dto.mjs +0 -2
- package/esm2022/plugins/service-connect/lib/dtos/index.mjs +0 -3
- package/esm2022/plugins/service-connect/lib/helpers/build-service-connect-url.mjs +0 -16
- package/esm2022/plugins/service-connect/lib/helpers/has-roles-or-rights-handler.mjs +0 -12
- package/esm2022/plugins/service-connect/lib/helpers/has-roles-or-rights.mjs +0 -11
- package/esm2022/plugins/service-connect/lib/helpers/index.mjs +0 -5
- package/esm2022/plugins/service-connect/lib/helpers/service-connect-plugin-factory.mjs +0 -25
- package/esm2022/plugins/service-connect/lib/service-connect-rights.directive.mjs +0 -44
- package/esm2022/plugins/service-connect/lib/service-connect-rights.guard.mjs +0 -15
- package/esm2022/plugins/service-connect/lib/service-connect-rights.plugin.mjs +0 -16
- package/esm2022/plugins/service-connect/lib/service-connect-user-language.plugin.mjs +0 -34
- package/esm2022/plugins/service-connect/lib/service-connect-user-profile.plugin.mjs +0 -28
- package/esm2022/plugins/service-connect/lib/service-connect.config.mjs +0 -17
- package/esm2022/plugins/service-connect/odx-auth-plugins-service-connect.mjs +0 -5
- package/lib/auth.component.d.ts +0 -20
- package/lib/auth.config.d.ts +0 -84
- package/lib/auth.directive.d.ts +0 -25
- package/lib/auth.guard.d.ts +0 -11
- package/lib/auth.i18n.d.ts +0 -3
- package/lib/auth.interceptor.d.ts +0 -10
- package/lib/auth.logger.d.ts +0 -3
- package/lib/auth.module.d.ts +0 -10
- package/lib/auth.providers.d.ts +0 -46
- package/lib/auth.service.d.ts +0 -206
- package/lib/auth.typings.d.ts +0 -27
- package/lib/components/auth-actions/auth-actions.component.d.ts +0 -16
- package/lib/components/auth-loading-screen/auth-loading-screen.component.d.ts +0 -24
- package/lib/components/index.d.ts +0 -2
- package/lib/directives/auth-action.directive.d.ts +0 -18
- package/lib/directives/index.d.ts +0 -3
- package/lib/directives/sign-in.directive.d.ts +0 -29
- package/lib/directives/sign-out.directive.d.ts +0 -28
- package/lib/helpers/create-auth-host-url.d.ts +0 -14
- package/lib/helpers/create-inititals.d.ts +0 -18
- package/lib/helpers/handle-auth-error.d.ts +0 -13
- package/lib/helpers/handle-oauth-event.d.ts +0 -11
- package/lib/helpers/index.d.ts +0 -8
- package/lib/helpers/resolve-email.d.ts +0 -21
- package/lib/helpers/resolve-username.d.ts +0 -22
- package/lib/helpers/set-http-auth-header.d.ts +0 -11
- package/lib/helpers/user-language-loader.d.ts +0 -11
- package/lib/models/auth-environment.d.ts +0 -6
- package/lib/models/auth-plugin-manager.d.ts +0 -21
- package/lib/models/authorized-handler.d.ts +0 -3
- package/lib/models/index.d.ts +0 -4
- package/lib/models/offline-auth-error-handler.d.ts +0 -2
- package/lib/plugins/core-debug.plugin.d.ts +0 -11
- package/lib/plugins/core-identity.plugin.d.ts +0 -18
- package/lib/plugins/index.d.ts +0 -3
- package/lib/plugins/user-profile-link.plugin.d.ts +0 -18
- package/lib/unauth.guard.d.ts +0 -11
- package/plugins/service-connect/lib/dtos/get-service-connect-rights-response.dto.d.ts +0 -3
- package/plugins/service-connect/lib/dtos/get-service-connect-user-response.dto.d.ts +0 -14
- package/plugins/service-connect/lib/dtos/index.d.ts +0 -2
- package/plugins/service-connect/lib/helpers/build-service-connect-url.d.ts +0 -10
- package/plugins/service-connect/lib/helpers/has-roles-or-rights-handler.d.ts +0 -10
- package/plugins/service-connect/lib/helpers/has-roles-or-rights.d.ts +0 -11
- package/plugins/service-connect/lib/helpers/index.d.ts +0 -4
- package/plugins/service-connect/lib/helpers/service-connect-plugin-factory.d.ts +0 -20
- package/plugins/service-connect/lib/service-connect-rights.directive.d.ts +0 -21
- package/plugins/service-connect/lib/service-connect-rights.guard.d.ts +0 -11
- package/plugins/service-connect/lib/service-connect-rights.plugin.d.ts +0 -18
- package/plugins/service-connect/lib/service-connect-user-language.plugin.d.ts +0 -24
- package/plugins/service-connect/lib/service-connect-user-profile.plugin.d.ts +0 -23
- package/plugins/service-connect/lib/service-connect.config.d.ts +0 -15
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { provideHttpClient, withInterceptors } from '@angular/common/http';
|
|
2
|
-
import { APP_INITIALIZER, ENVIRONMENT_INITIALIZER, InjectionToken, inject, makeEnvironmentProviders } from '@angular/core';
|
|
3
|
-
import { WindowRef } from '@odx/angular';
|
|
4
|
-
import { DynamicViewService } from '@odx/angular/cdk/dynamic-view';
|
|
5
|
-
import { buildUrl } from '@odx/angular/utils';
|
|
6
|
-
import { OAuthStorage, provideOAuthClient } from 'angular-oauth2-oidc';
|
|
7
|
-
import { tap } from 'rxjs';
|
|
8
|
-
import { ODX_AUTH_DEFAULT_SCOPES, injectAuthConfig, provideAuthConfig } from './auth.config';
|
|
9
|
-
import { authInterceptor } from './auth.interceptor';
|
|
10
|
-
import logger from './auth.logger';
|
|
11
|
-
import { AuthService } from './auth.service';
|
|
12
|
-
import { AuthLoadingScreenComponent } from './components';
|
|
13
|
-
import { createAuthHostUrl, handleAuthError } from './helpers';
|
|
14
|
-
import { offlineAuthErrorHandler } from './models';
|
|
15
|
-
import { coreDebugPlugin, coreIdentityPlugin, userProfileUrlPlugin } from './plugins';
|
|
16
|
-
export const ODX_AUTH_ERROR_HANDLERS = new InjectionToken('@odx/auth::ErrorHandlers', {
|
|
17
|
-
providedIn: 'root',
|
|
18
|
-
factory: () => {
|
|
19
|
-
const { errorHandler } = injectAuthConfig();
|
|
20
|
-
return [offlineAuthErrorHandler, errorHandler];
|
|
21
|
-
},
|
|
22
|
-
});
|
|
23
|
-
export const ODX_AUTH_PLUGINS_ERROR_HANDLER = new InjectionToken('@odx/auth::PluginsErrorHandler', {
|
|
24
|
-
providedIn: 'root',
|
|
25
|
-
factory: () => injectAuthConfig().pluginsErrorHandler ?? null,
|
|
26
|
-
});
|
|
27
|
-
export const ODX_AUTH_CORE_PLUGINS = new InjectionToken('@odx/auth::CorePlugins', {
|
|
28
|
-
providedIn: 'root',
|
|
29
|
-
factory: () => {
|
|
30
|
-
const { showDebugInformation } = injectAuthConfig();
|
|
31
|
-
const plugins = [coreIdentityPlugin, userProfileUrlPlugin];
|
|
32
|
-
if (showDebugInformation) {
|
|
33
|
-
plugins.push(coreDebugPlugin);
|
|
34
|
-
}
|
|
35
|
-
return plugins;
|
|
36
|
-
},
|
|
37
|
-
});
|
|
38
|
-
export const ODX_AUTH_PLUGINS = new InjectionToken('@odx/auth::Plugins', {
|
|
39
|
-
providedIn: 'root',
|
|
40
|
-
factory: () => {
|
|
41
|
-
const { plugins } = injectAuthConfig();
|
|
42
|
-
const corePlugins = inject(ODX_AUTH_CORE_PLUGINS);
|
|
43
|
-
return [...corePlugins, ...plugins].map((pluginFactory) => pluginFactory());
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
/**
|
|
47
|
-
* Provides a logger for the authentication module.
|
|
48
|
-
*
|
|
49
|
-
* @returns {Provider} - The provider for the logger.
|
|
50
|
-
*/
|
|
51
|
-
export function provideAuthLogger() {
|
|
52
|
-
return {
|
|
53
|
-
provide: ENVIRONMENT_INITIALIZER,
|
|
54
|
-
useFactory: () => {
|
|
55
|
-
const { showDebugInformation } = injectAuthConfig();
|
|
56
|
-
if (!showDebugInformation)
|
|
57
|
-
logger.disable();
|
|
58
|
-
return () => void 0;
|
|
59
|
-
},
|
|
60
|
-
multi: true,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Initializes the authentication error handlers.
|
|
65
|
-
*/
|
|
66
|
-
export function initializeAuthErrorHandlers() {
|
|
67
|
-
const authService = inject(AuthService);
|
|
68
|
-
const handler = handleAuthError(inject(ODX_AUTH_ERROR_HANDLERS));
|
|
69
|
-
authService.errors$.pipe(tap((error) => handler(error))).subscribe();
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Initializes the authentication configuration.
|
|
73
|
-
*
|
|
74
|
-
* @returns {() => Promise<void>} - A function that returns a promise resolving when the configuration is initialized.
|
|
75
|
-
*/
|
|
76
|
-
export function initalizeAuthConfig() {
|
|
77
|
-
const { clientId, scopes, redirectPath, environment, postLogoutRedirectUrl, issuer, timeoutFactor, discoveryUrl, enableLoadingScreen } = injectAuthConfig();
|
|
78
|
-
const authService = inject(AuthService);
|
|
79
|
-
const redirectUri = buildUrl(inject(WindowRef).getOrigin(), redirectPath);
|
|
80
|
-
const scope = Array.from(new Set(ODX_AUTH_DEFAULT_SCOPES.concat(scopes ?? []))).join(' ');
|
|
81
|
-
if (enableLoadingScreen) {
|
|
82
|
-
AuthLoadingScreenComponent.initialize(authService, inject(DynamicViewService));
|
|
83
|
-
}
|
|
84
|
-
return () => authService.initialize({
|
|
85
|
-
clientId,
|
|
86
|
-
issuer: issuer ?? createAuthHostUrl(environment, 'oauth2/default'),
|
|
87
|
-
scope,
|
|
88
|
-
redirectUri,
|
|
89
|
-
postLogoutRedirectUri: postLogoutRedirectUrl,
|
|
90
|
-
preserveRequestedRoute: true,
|
|
91
|
-
strictDiscoveryDocumentValidation: !discoveryUrl,
|
|
92
|
-
responseType: 'code',
|
|
93
|
-
showDebugInformation: false,
|
|
94
|
-
timeoutFactor,
|
|
95
|
-
waitForTokenInMsec: 1000,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Provides the authentication configuration and dependencies.
|
|
100
|
-
*
|
|
101
|
-
* @param {ConfigProvider<Partial<AuthConfig>, D>} config - The configuration provider.
|
|
102
|
-
* @returns {EnvironmentProviders} The environment providers for authentication.
|
|
103
|
-
* @template D
|
|
104
|
-
*
|
|
105
|
-
* @example Provide the authentication configuration and dependencies
|
|
106
|
-
* ```ts
|
|
107
|
-
* providers: [
|
|
108
|
-
* provideAuth({
|
|
109
|
-
* useFactory: ({ environment, auth: { clientId, loadUserProfile } }: ApplicationEnvironment) => ({
|
|
110
|
-
* environment,
|
|
111
|
-
* clientId,
|
|
112
|
-
* loadUserProfile,
|
|
113
|
-
* }),
|
|
114
|
-
* deps: [APPLICATION_ENVIRONMENT],
|
|
115
|
-
* }),
|
|
116
|
-
* ],
|
|
117
|
-
* ```
|
|
118
|
-
*/
|
|
119
|
-
export function provideAuth(config) {
|
|
120
|
-
return makeEnvironmentProviders([
|
|
121
|
-
provideAuthConfig(config),
|
|
122
|
-
provideAuthLogger(),
|
|
123
|
-
provideOAuthClient({ resourceServer: { sendAccessToken: false, allowedUrls: [] } }),
|
|
124
|
-
provideHttpClient(withInterceptors([authInterceptor])),
|
|
125
|
-
{
|
|
126
|
-
provide: APP_INITIALIZER,
|
|
127
|
-
useFactory: initalizeAuthConfig,
|
|
128
|
-
multi: true,
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
provide: OAuthStorage,
|
|
132
|
-
useFactory: () => injectAuthConfig().storage ?? inject(WindowRef).nativeWindow.localStorage,
|
|
133
|
-
},
|
|
134
|
-
]);
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5wcm92aWRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9hdXRoLnByb3ZpZGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHVCQUF1QixFQUF3QixjQUFjLEVBQVksTUFBTSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNKLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFzQyxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLEVBQWtDLHVCQUF1QixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9ELE9BQU8sRUFBeUQsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUcsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFdBQVcsQ0FB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UUFDbkYsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3REO1lBQ0UsT0FBTyxFQUFFLGVBQWU7WUFDeEIsVUFBVSxFQUFFLG1CQUFtQjtZQUMvQixLQUFLLEVBQUUsSUFBSTtTQUNaO1FBQ0Q7WUFDRSxPQUFPLEVBQUUsWUFBWTtZQUNyQixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZO1NBQzVGO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHByb3ZpZGVIdHRwQ2xpZW50LCB3aXRoSW50ZXJjZXB0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQVBQX0lOSVRJQUxJWkVSLCBFTlZJUk9OTUVOVF9JTklUSUFMSVpFUiwgRW52aXJvbm1lbnRQcm92aWRlcnMsIEluamVjdGlvblRva2VuLCBQcm92aWRlciwgaW5qZWN0LCBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFdpbmRvd1JlZiB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBEeW5hbWljVmlld1NlcnZpY2UgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2R5bmFtaWMtdmlldyc7XG5pbXBvcnQgeyBDb25maWdEZXBlbmRlbmNpZXMsIENvbmZpZ1Byb3ZpZGVyLCBidWlsZFVybCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBPQXV0aFN0b3JhZ2UsIHByb3ZpZGVPQXV0aENsaWVudCB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdXRoQ29uZmlnLCBBdXRoRXJyb3JIYW5kbGVyRm4sIE9EWF9BVVRIX0RFRkFVTFRfU0NPUEVTLCBpbmplY3RBdXRoQ29uZmlnLCBwcm92aWRlQXV0aENvbmZpZyB9IGZyb20gJy4vYXV0aC5jb25maWcnO1xuaW1wb3J0IHsgYXV0aEludGVyY2VwdG9yIH0gZnJvbSAnLi9hdXRoLmludGVyY2VwdG9yJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9hdXRoLmxvZ2dlcic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhMb2FkaW5nU2NyZWVuQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzJztcbmltcG9ydCB7IGNyZWF0ZUF1dGhIb3N0VXJsLCBoYW5kbGVBdXRoRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQXV0aFBsdWdpbiwgQXV0aFBsdWdpbkVycm9ySGFuZGxlciwgQXV0aFBsdWdpbkZhY3RvcnksIG9mZmxpbmVBdXRoRXJyb3JIYW5kbGVyIH0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgY29yZURlYnVnUGx1Z2luLCBjb3JlSWRlbnRpdHlQbHVnaW4sIHVzZXJQcm9maWxlVXJsUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zJztcblxuZXhwb3J0IGNvbnN0IE9EWF9BVVRIX0VSUk9SX0hBTkRMRVJTID0gbmV3IEluamVjdGlvblRva2VuPEF1dGhFcnJvckhhbmRsZXJGbltdPignQG9keC9hdXRoOjpFcnJvckhhbmRsZXJzJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHtcbiAgICBjb25zdCB7IGVycm9ySGFuZGxlciB9ID0gaW5qZWN0QXV0aENvbmZpZygpO1xuXG4gICAgcmV0dXJuIFtvZmZsaW5lQXV0aEVycm9ySGFuZGxlciwgZXJyb3JIYW5kbGVyXTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgT0RYX0FVVEhfUExVR0lOU19FUlJPUl9IQU5ETEVSID0gbmV3IEluamVjdGlvblRva2VuPEF1dGhQbHVnaW5FcnJvckhhbmRsZXIgfCBudWxsPignQG9keC9hdXRoOjpQbHVnaW5zRXJyb3JIYW5kbGVyJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IGluamVjdEF1dGhDb25maWcoKS5wbHVnaW5zRXJyb3JIYW5kbGVyID8/IG51bGwsXG59KTtcblxuZXhwb3J0IGNvbnN0IE9EWF9BVVRIX0NPUkVfUExVR0lOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRoUGx1Z2luRmFjdG9yeVtdPignQG9keC9hdXRoOjpDb3JlUGx1Z2lucycsIHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxuICBmYWN0b3J5OiAoKSA9PiB7XG4gICAgY29uc3QgeyBzaG93RGVidWdJbmZvcm1hdGlvbiB9ID0gaW5qZWN0QXV0aENvbmZpZygpO1xuICAgIGNvbnN0IHBsdWdpbnMgPSBbY29yZUlkZW50aXR5UGx1Z2luLCB1c2VyUHJvZmlsZVVybFBsdWdpbl07XG4gICAgaWYgKHNob3dEZWJ1Z0luZm9ybWF0aW9uKSB7XG4gICAgICBwbHVnaW5zLnB1c2goY29yZURlYnVnUGx1Z2luKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGx1Z2lucztcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgT0RYX0FVVEhfUExVR0lOUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRoUGx1Z2luW10+KCdAb2R4L2F1dGg6OlBsdWdpbnMnLCB7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgZmFjdG9yeTogKCkgPT4ge1xuICAgIGNvbnN0IHsgcGx1Z2lucyB9ID0gaW5qZWN0QXV0aENvbmZpZygpO1xuICAgIGNvbnN0IGNvcmVQbHVnaW5zID0gaW5qZWN0KE9EWF9BVVRIX0NPUkVfUExVR0lOUyk7XG5cbiAgICByZXR1cm4gWy4uLmNvcmVQbHVnaW5zLCAuLi5wbHVnaW5zXS5tYXAoKHBsdWdpbkZhY3RvcnkpID0+IHBsdWdpbkZhY3RvcnkoKSk7XG4gIH0sXG59KTtcblxuLyoqXG4gKiBQcm92aWRlcyBhIGxvZ2dlciBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZHVsZS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvdmlkZXJ9IC0gVGhlIHByb3ZpZGVyIGZvciB0aGUgbG9nZ2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUF1dGhMb2dnZXIoKTogUHJvdmlkZXIge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGU6IEVOVklST05NRU5UX0lOSVRJQUxJWkVSLFxuICAgIHVzZUZhY3Rvcnk6ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgc2hvd0RlYnVnSW5mb3JtYXRpb24gfSA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgICAgIGlmICghc2hvd0RlYnVnSW5mb3JtYXRpb24pIGxvZ2dlci5kaXNhYmxlKCk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB2b2lkIDA7XG4gICAgfSxcbiAgICBtdWx0aTogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgYXV0aGVudGljYXRpb24gZXJyb3IgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXV0aEVycm9ySGFuZGxlcnMoKTogdm9pZCB7XG4gIGNvbnN0IGF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgaGFuZGxlciA9IGhhbmRsZUF1dGhFcnJvcihpbmplY3QoT0RYX0FVVEhfRVJST1JfSEFORExFUlMpKTtcblxuICBhdXRoU2VydmljZS5lcnJvcnMkLnBpcGUodGFwKChlcnJvcikgPT4gaGFuZGxlcihlcnJvcikpKS5zdWJzY3JpYmUoKTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgYXV0aGVudGljYXRpb24gY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHByb21pc2UgcmVzb2x2aW5nIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0YWxpemVBdXRoQ29uZmlnKCk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IGNsaWVudElkLCBzY29wZXMsIHJlZGlyZWN0UGF0aCwgZW52aXJvbm1lbnQsIHBvc3RMb2dvdXRSZWRpcmVjdFVybCwgaXNzdWVyLCB0aW1lb3V0RmFjdG9yLCBkaXNjb3ZlcnlVcmwsIGVuYWJsZUxvYWRpbmdTY3JlZW4gfSA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgY29uc3QgYXV0aFNlcnZpY2UgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBjb25zdCByZWRpcmVjdFVyaSA9IGJ1aWxkVXJsKGluamVjdChXaW5kb3dSZWYpLmdldE9yaWdpbigpLCByZWRpcmVjdFBhdGgpO1xuICBjb25zdCBzY29wZSA9IEFycmF5LmZyb20obmV3IFNldChPRFhfQVVUSF9ERUZBVUxUX1NDT1BFUy5jb25jYXQoc2NvcGVzID8/IFtdKSkpLmpvaW4oJyAnKTtcbiAgaWYgKGVuYWJsZUxvYWRpbmdTY3JlZW4pIHtcbiAgICBBdXRoTG9hZGluZ1NjcmVlbkNvbXBvbmVudC5pbml0aWFsaXplKGF1dGhTZXJ2aWNlLCBpbmplY3QoRHluYW1pY1ZpZXdTZXJ2aWNlKSk7XG4gIH1cbiAgcmV0dXJuICgpID0+XG4gICAgYXV0aFNlcnZpY2UuaW5pdGlhbGl6ZSh7XG4gICAgICBjbGllbnRJZCxcbiAgICAgIGlzc3VlcjogaXNzdWVyID8/IGNyZWF0ZUF1dGhIb3N0VXJsKGVudmlyb25tZW50LCAnb2F1dGgyL2RlZmF1bHQnKSxcbiAgICAgIHNjb3BlLFxuICAgICAgcmVkaXJlY3RVcmksXG4gICAgICBwb3N0TG9nb3V0UmVkaXJlY3RVcmk6IHBvc3RMb2dvdXRSZWRpcmVjdFVybCxcbiAgICAgIHByZXNlcnZlUmVxdWVzdGVkUm91dGU6IHRydWUsXG4gICAgICBzdHJpY3REaXNjb3ZlcnlEb2N1bWVudFZhbGlkYXRpb246ICFkaXNjb3ZlcnlVcmwsXG4gICAgICByZXNwb25zZVR5cGU6ICdjb2RlJyxcbiAgICAgIHNob3dEZWJ1Z0luZm9ybWF0aW9uOiBmYWxzZSxcbiAgICAgIHRpbWVvdXRGYWN0b3IsXG4gICAgICB3YWl0Rm9yVG9rZW5Jbk1zZWM6IDEwMDAsXG4gICAgfSk7XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAcGFyYW0ge0NvbmZpZ1Byb3ZpZGVyPFBhcnRpYWw8QXV0aENvbmZpZz4sIEQ+fSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBwcm92aWRlci5cbiAqIEByZXR1cm5zIHtFbnZpcm9ubWVudFByb3ZpZGVyc30gVGhlIGVudmlyb25tZW50IHByb3ZpZGVycyBmb3IgYXV0aGVudGljYXRpb24uXG4gKiBAdGVtcGxhdGUgRFxuICpcbiAqIEBleGFtcGxlIFByb3ZpZGUgdGhlIGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGVuZGVuY2llc1xuICogYGBgdHNcbiAqIHByb3ZpZGVyczogW1xuICogIHByb3ZpZGVBdXRoKHtcbiAqICAgdXNlRmFjdG9yeTogKHsgZW52aXJvbm1lbnQsIGF1dGg6IHsgY2xpZW50SWQsIGxvYWRVc2VyUHJvZmlsZSB9IH06IEFwcGxpY2F0aW9uRW52aXJvbm1lbnQpID0+ICh7XG4gKiAgICAgZW52aXJvbm1lbnQsXG4gKiAgICAgY2xpZW50SWQsXG4gKiAgICAgbG9hZFVzZXJQcm9maWxlLFxuICogICB9KSxcbiAqICAgZGVwczogW0FQUExJQ0FUSU9OX0VOVklST05NRU5UXSxcbiAqICB9KSxcbiAqIF0sXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVBdXRoPEQgZXh0ZW5kcyBDb25maWdEZXBlbmRlbmNpZXM+KGNvbmZpZzogQ29uZmlnUHJvdmlkZXI8UGFydGlhbDxBdXRoQ29uZmlnPiwgRD4pOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHByb3ZpZGVBdXRoQ29uZmlnKGNvbmZpZyksXG4gICAgcHJvdmlkZUF1dGhMb2dnZXIoKSxcbiAgICBwcm92aWRlT0F1dGhDbGllbnQoeyByZXNvdXJjZVNlcnZlcjogeyBzZW5kQWNjZXNzVG9rZW46IGZhbHNlLCBhbGxvd2VkVXJsczogW10gfSB9KSxcbiAgICBwcm92aWRlSHR0cENsaWVudCh3aXRoSW50ZXJjZXB0b3JzKFthdXRoSW50ZXJjZXB0b3JdKSksXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogaW5pdGFsaXplQXV0aENvbmZpZyxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogT0F1dGhTdG9yYWdlLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4gaW5qZWN0QXV0aENvbmZpZygpLnN0b3JhZ2UgPz8gaW5qZWN0KFdpbmRvd1JlZikubmF0aXZlV2luZG93LmxvY2FsU3RvcmFnZSxcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
|
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
-
import { Injectable, inject } from '@angular/core';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { WindowRef } from '@odx/angular';
|
|
5
|
-
import { OAuthErrorEvent, OAuthService } from 'angular-oauth2-oidc';
|
|
6
|
-
import { deepmerge } from 'deepmerge-ts';
|
|
7
|
-
import { BehaviorSubject, catchError, combineLatest, distinctUntilChanged, filter, fromEvent, map, merge, of, share, shareReplay, startWith, switchMap, take, tap, timeout, } from 'rxjs';
|
|
8
|
-
import { injectAuthConfig } from './auth.config';
|
|
9
|
-
import { setHttpAuthHeader } from './helpers';
|
|
10
|
-
import { AuthPluginManager } from './models';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
/**
|
|
13
|
-
* The `AuthService` class provides authentication functionality for an Angular application.
|
|
14
|
-
* It handles OAuth2/OIDC authentication, token management, and user identity claims.
|
|
15
|
-
*
|
|
16
|
-
* Key responsibilities include:
|
|
17
|
-
* - Initializing authentication with a provided configuration.
|
|
18
|
-
* - Managing tokens (access, refresh, and ID tokens).
|
|
19
|
-
* - Checking and emitting authentication and authorization states.
|
|
20
|
-
* - Handling user login and logout flows.
|
|
21
|
-
* - Supporting silent refresh and offline authentication scenarios.
|
|
22
|
-
* - Integrating authentication plugins via `AuthPluginManager`.
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* // Injecting the AuthService
|
|
27
|
-
* constructor(private authService: AuthService) {}
|
|
28
|
-
*
|
|
29
|
-
* // Using the AuthService to initialize authentication
|
|
30
|
-
* async ngOnInit() {
|
|
31
|
-
* const config: AuthConfig = { clientId: 'your-client-id', discoveryUrl: 'https://example.com/.well-known/openid-configuration' };
|
|
32
|
-
* await this.authService.initialize(config);
|
|
33
|
-
* }
|
|
34
|
-
* ```
|
|
35
|
-
*/
|
|
36
|
-
export class AuthService {
|
|
37
|
-
/**
|
|
38
|
-
* Emits whenever the `access_token` in local storage is updated or cleared.
|
|
39
|
-
* Provides an observable for tracking token updates.
|
|
40
|
-
*
|
|
41
|
-
* @type {Observable<StorageEvent | null>}
|
|
42
|
-
*/
|
|
43
|
-
get accessTokenUpdate$() {
|
|
44
|
-
return this.onAccessTokenUpdate$;
|
|
45
|
-
}
|
|
46
|
-
constructor() {
|
|
47
|
-
this.authConfig = injectAuthConfig();
|
|
48
|
-
this.authPluginManager = inject(AuthPluginManager);
|
|
49
|
-
this.oauthService = inject(OAuthService);
|
|
50
|
-
this.router = inject(Router);
|
|
51
|
-
this.windowRef = inject(WindowRef);
|
|
52
|
-
this.isInitialized$$ = new BehaviorSubject(false);
|
|
53
|
-
this.isRedirecting$$ = new BehaviorSubject(false);
|
|
54
|
-
this.onAccessTokenUpdate$ = fromEvent(this.windowRef.nativeWindow, 'storage').pipe(filter(({ key }) => key === 'access_token' || key === null), startWith(null), share());
|
|
55
|
-
this.silentRefreshHandler$ = this.isInitialized$$.pipe(filter(Boolean), switchMap(() => this.windowRef.isOnline$), tap((isOnline) => this.updateSilentRefresh(isOnline)));
|
|
56
|
-
this.onAuthStateChange$ = combineLatest([this.oauthService.events.pipe(startWith(null)), this.windowRef.isOnline$, this.onAccessTokenUpdate$]);
|
|
57
|
-
/**
|
|
58
|
-
* Emits `true` when the service has completed initialization.
|
|
59
|
-
* Emits `false` until the initialization is complete.
|
|
60
|
-
*
|
|
61
|
-
* @type {Observable<boolean>}
|
|
62
|
-
*/
|
|
63
|
-
this.isInitialized$ = this.isInitialized$$.pipe(filter(Boolean), distinctUntilChanged());
|
|
64
|
-
/**
|
|
65
|
-
* Emits `true` when the user is being redirected to the login page.
|
|
66
|
-
* Emits `false` when there is no redirection in progress.
|
|
67
|
-
*
|
|
68
|
-
* @type {Observable<boolean>}
|
|
69
|
-
*/
|
|
70
|
-
this.isRedirecting$ = this.isRedirecting$$.pipe(distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
|
|
71
|
-
/**
|
|
72
|
-
* Emits `true` when the application is in a loading state (e.g., during redirection or plugin initialization).
|
|
73
|
-
* Emits `false` when there is no ongoing loading activity.
|
|
74
|
-
*
|
|
75
|
-
* @type {Observable<boolean>}
|
|
76
|
-
*/
|
|
77
|
-
this.isLoading$ = merge(this.isRedirecting$, this.authPluginManager.pluginsLoading$).pipe(distinctUntilChanged());
|
|
78
|
-
/**
|
|
79
|
-
* Emits `true` when the user is authenticated.
|
|
80
|
-
* Emits `false` when the user is not authenticated.
|
|
81
|
-
*
|
|
82
|
-
* @type {Observable<boolean>}
|
|
83
|
-
*/
|
|
84
|
-
this.isAuthenticated$ = this.isInitialized$.pipe(switchMap(() => this.authPluginManager.pluginsReady$), switchMap(() => this.onAuthStateChange$), map(() => this.isAuthenticated()), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: true }));
|
|
85
|
-
/**
|
|
86
|
-
* Emits the identity claims of the authenticated user.
|
|
87
|
-
* If the user is not authenticated, emits `null`.
|
|
88
|
-
*
|
|
89
|
-
* @type {Observable<OdxAuth.IdentityClaims | null>}
|
|
90
|
-
*/
|
|
91
|
-
this.identityClaims$ = this.isAuthenticated$.pipe(map(() => this.getIdentityClaims()), shareReplay({ bufferSize: 1, refCount: true }));
|
|
92
|
-
/**
|
|
93
|
-
* Emits OAuth error events.
|
|
94
|
-
*
|
|
95
|
-
* @type {Observable<OAuthErrorEvent>}
|
|
96
|
-
*/
|
|
97
|
-
this.errors$ = this.oauthService.events.pipe(filter((event) => event instanceof OAuthErrorEvent), share());
|
|
98
|
-
/**
|
|
99
|
-
* Emits events when an OAuth token is successfully received.
|
|
100
|
-
*
|
|
101
|
-
* @type {Observable<Event>}
|
|
102
|
-
*/
|
|
103
|
-
this.onTokenReceived$ = this.oauthService.events.pipe(filter((event) => event.type === 'token_received'), share());
|
|
104
|
-
this.runPlugins();
|
|
105
|
-
this.silentRefreshHandler$.subscribe();
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Initializes the authentication service with the provided configuration.
|
|
109
|
-
*
|
|
110
|
-
* @param {AuthConfig} config - The authentication configuration object.
|
|
111
|
-
* @returns {Promise<void>} Resolves when initialization is complete.
|
|
112
|
-
*/
|
|
113
|
-
async initialize(config) {
|
|
114
|
-
this.assertAudience(config.clientId);
|
|
115
|
-
this.oauthService.configure({ ...config, openUri: this.redirectToLogin.bind(this) });
|
|
116
|
-
try {
|
|
117
|
-
await this.oauthService.loadDiscoveryDocument(this.authConfig.discoveryUrl);
|
|
118
|
-
await this.oauthService.tryLogin();
|
|
119
|
-
if (this.authConfig.refreshTokenOnInit) {
|
|
120
|
-
await this.tryRefreshToken();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch (error) {
|
|
124
|
-
if (!(error instanceof HttpErrorResponse || error instanceof OAuthErrorEvent)) {
|
|
125
|
-
throw error;
|
|
126
|
-
}
|
|
127
|
-
if (error.type === 'token_refresh_error' || (error instanceof HttpErrorResponse && (error.status === 401 || error.status === 400))) {
|
|
128
|
-
this.signOut(true);
|
|
129
|
-
this.signIn(this.windowRef.location.pathname);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
this.isInitialized$$.next(true);
|
|
133
|
-
if (this.authConfig.requireSignIn && !this.isAuthenticated()) {
|
|
134
|
-
this.signIn(this.windowRef.location.pathname);
|
|
135
|
-
}
|
|
136
|
-
await this.tryLoadUserProfile();
|
|
137
|
-
await this.routeToRequestedUrl();
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Runs all authentication plugins registered in the `AuthPluginManager`.
|
|
141
|
-
*/
|
|
142
|
-
runPlugins() {
|
|
143
|
-
this.authPluginManager.runPlugins(this).subscribe();
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Returns the issuer URL for the OAuth server.
|
|
147
|
-
*
|
|
148
|
-
* @returns {URL} The issuer URL.
|
|
149
|
-
*/
|
|
150
|
-
getIssuer() {
|
|
151
|
-
return new URL(this.oauthService.issuer);
|
|
152
|
-
}
|
|
153
|
-
/**
|
|
154
|
-
* Initiates the login flow for the user. Redirects to the login page.
|
|
155
|
-
*
|
|
156
|
-
* @param {string} [url] - The URL to redirect back to after login.
|
|
157
|
-
*/
|
|
158
|
-
signIn(url) {
|
|
159
|
-
this.oauthService.initLoginFlow(url);
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Logs the user out and clears their tokens.
|
|
163
|
-
*
|
|
164
|
-
* @param {boolean} [noRedirect] - If `true`, no redirection occurs after logout.
|
|
165
|
-
*/
|
|
166
|
-
signOut(noRedirect) {
|
|
167
|
-
this.oauthService.revokeTokenAndLogout(noRedirect || !this.getAccessToken());
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* Attempts to refresh the user's tokens.
|
|
171
|
-
*
|
|
172
|
-
* @returns {Promise<TokenResponse>} Resolves with the new token response.
|
|
173
|
-
*/
|
|
174
|
-
async refreshTokens() {
|
|
175
|
-
return this.oauthService.refreshToken();
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Retrieves the current access token, if available.
|
|
179
|
-
*
|
|
180
|
-
* @returns {string | null} The access token, or `null` if not available.
|
|
181
|
-
*/
|
|
182
|
-
getAccessToken() {
|
|
183
|
-
return this.oauthService.getAccessToken() ?? null;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Retrieves the current refresh token, if available.
|
|
187
|
-
*
|
|
188
|
-
* @returns {string | null} The refresh token, or `null` if not available.
|
|
189
|
-
*/
|
|
190
|
-
getRefreshToken() {
|
|
191
|
-
return this.oauthService.getRefreshToken() ?? null;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Retrieves the current ID token, if available.
|
|
195
|
-
*
|
|
196
|
-
* @returns {string | null} The ID token, or `null` if not available.
|
|
197
|
-
*/
|
|
198
|
-
getIdToken() {
|
|
199
|
-
return this.oauthService.getIdToken() ?? null;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Retrieves the identity claims of the authenticated user.
|
|
203
|
-
*
|
|
204
|
-
* @returns {OdxAuth.IdentityClaims | null} The identity claims, or `null` if not available.
|
|
205
|
-
*/
|
|
206
|
-
getIdentityClaims() {
|
|
207
|
-
if (!this.getIdToken())
|
|
208
|
-
return null;
|
|
209
|
-
return deepmerge(this.oauthService.getIdentityClaims(), this.authPluginManager.getResult());
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Retrieves the raw identity claims of the authenticated user.
|
|
213
|
-
*
|
|
214
|
-
* @returns {OdxAuth.RawIdentityClaims | null} The raw identity claims, or `null` if not available.
|
|
215
|
-
*/
|
|
216
|
-
getRawIdentityClaims() {
|
|
217
|
-
if (!this.getIdToken())
|
|
218
|
-
return null;
|
|
219
|
-
return this.oauthService.getIdentityClaims();
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* Checks if the user is currently authenticated.
|
|
223
|
-
*
|
|
224
|
-
* @returns {boolean} `true` if authenticated, otherwise `false`.
|
|
225
|
-
*/
|
|
226
|
-
isAuthenticated() {
|
|
227
|
-
if (this.windowRef.isOnline()) {
|
|
228
|
-
return this.oauthService.hasValidAccessToken() && this.oauthService.hasValidIdToken();
|
|
229
|
-
}
|
|
230
|
-
return this.hasValidOfflineToken();
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Checks if the user is authorized based on the provided handler.
|
|
234
|
-
*
|
|
235
|
-
* @param {AuthorizedHandler | null} [authorizedHandler] - A handler to determine authorization.
|
|
236
|
-
* @returns {boolean} `true` if authorized, otherwise `false`.
|
|
237
|
-
*/
|
|
238
|
-
isAuthorized(authorizedHandler) {
|
|
239
|
-
const handler = authorizedHandler ?? this.authConfig.defaultAuthorizedHandler;
|
|
240
|
-
return this.isAuthenticated() && (handler?.(this.getIdentityClaims(), this, this.router) ?? true);
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
* Emits whether the user is authorized based on the provided handler.
|
|
244
|
-
*
|
|
245
|
-
* @param {AuthorizedHandler | null} [authorizedHandler] - A handler to determine authorization.
|
|
246
|
-
* @returns {Observable<boolean>} An observable emitting the authorization status.
|
|
247
|
-
*/
|
|
248
|
-
isAuthorized$(authorizedHandler) {
|
|
249
|
-
return this.isAuthenticated$.pipe(map(() => this.isAuthorized(authorizedHandler)));
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* Prepares an HTTP request by adding the access token to its headers.
|
|
253
|
-
*
|
|
254
|
-
* @param {HttpRequest<T> | Request} req - The HTTP request to prepare.
|
|
255
|
-
* @param {boolean} requireSignIn - Whether to require the user to sign in if no token is available.
|
|
256
|
-
* @returns {Observable<R>} An observable emitting the prepared request.
|
|
257
|
-
* @template R, T
|
|
258
|
-
*/
|
|
259
|
-
prepareAuthRequest$(req, requireSignIn = false) {
|
|
260
|
-
return this.waitForAccessToken$(requireSignIn).pipe(map((token) => setHttpAuthHeader(req, token)));
|
|
261
|
-
}
|
|
262
|
-
/**
|
|
263
|
-
* Waits for a valid access token to become available.
|
|
264
|
-
*
|
|
265
|
-
* @param {boolean} requireSignIn - Whether to require the user to sign in if no token is available.
|
|
266
|
-
* @returns {Observable<string | null>} An observable emitting the access token.
|
|
267
|
-
*/
|
|
268
|
-
waitForAccessToken$(requireSignIn) {
|
|
269
|
-
const accessToken$ = of(this.getAccessToken()).pipe(filter((token) => !!token && this.isAuthenticated()));
|
|
270
|
-
const waitForAccessToken$ = this.onTokenReceived$.pipe(timeout(this.authConfig.waitForTokenInMs ?? 0), catchError(async () => this.tryRefreshToken().catch(() => null)));
|
|
271
|
-
return this.isInitialized$.pipe(switchMap(() => merge(accessToken$, waitForAccessToken$)), take(1), map(() => this.getAccessToken()), tap((token) => !token && requireSignIn && this.signIn(this.windowRef.location.pathname)));
|
|
272
|
-
}
|
|
273
|
-
async routeToRequestedUrl() {
|
|
274
|
-
if (!this.oauthService.state || !this.oauthService.hasValidAccessToken())
|
|
275
|
-
return;
|
|
276
|
-
await this.router.navigateByUrl(decodeURIComponent(this.oauthService.state));
|
|
277
|
-
}
|
|
278
|
-
hasValidOfflineToken() {
|
|
279
|
-
const issuedAt = this.getIdentityClaims()?.iat ?? 0;
|
|
280
|
-
return Date.now() - issuedAt * 1000 <= this.authConfig.maxOfflineTime * 1000;
|
|
281
|
-
}
|
|
282
|
-
redirectToLogin(uri) {
|
|
283
|
-
this.windowRef.location.assign(uri);
|
|
284
|
-
this.isRedirecting$$.next(true);
|
|
285
|
-
}
|
|
286
|
-
async tryLoadUserProfile() {
|
|
287
|
-
if (!this.authConfig.loadUserProfile || !this.isAuthenticated())
|
|
288
|
-
return;
|
|
289
|
-
await this.oauthService.loadUserProfile().catch(() => null);
|
|
290
|
-
}
|
|
291
|
-
async tryRefreshToken() {
|
|
292
|
-
if (!this.getRefreshToken())
|
|
293
|
-
return;
|
|
294
|
-
await this.oauthService.refreshToken();
|
|
295
|
-
}
|
|
296
|
-
assertAudience(clientId) {
|
|
297
|
-
const tokenClientId = this.getIdentityClaims()?.aud;
|
|
298
|
-
if (!clientId || !tokenClientId || clientId === tokenClientId)
|
|
299
|
-
return;
|
|
300
|
-
this.signOut(true);
|
|
301
|
-
}
|
|
302
|
-
updateSilentRefresh(enabled) {
|
|
303
|
-
if (enabled) {
|
|
304
|
-
this.oauthService.setupAutomaticSilentRefresh();
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
this.oauthService.stopAutomaticRefresh();
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
311
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthService, providedIn: 'root' }); }
|
|
312
|
-
}
|
|
313
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthService, decorators: [{
|
|
314
|
-
type: Injectable,
|
|
315
|
-
args: [{ providedIn: 'root' }]
|
|
316
|
-
}], ctorParameters: () => [] });
|
|
317
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBYyxlQUFlLEVBQUUsWUFBWSxFQUFpQixNQUFNLHFCQUFxQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUNMLGVBQWUsRUFFZixVQUFVLEVBQ1YsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sU0FBUyxFQUNULEdBQUcsRUFDSCxLQUFLLEVBQ0wsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osR0FBRyxFQUNILE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGlCQUFpQixFQUFxQixNQUFNLFVBQVUsQ0FBQzs7QUFFaEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUEwRnRCOzs7OztPQUtHO0lBQ0gsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUVEO1FBbkdpQixlQUFVLEdBQUcsZ0JBQWdCLEVB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RCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQzsrR0E1VVUsV0FBVzttSEFBWCxXQUFXLGNBREUsTUFBTTs7NEZBQ25CLFdBQVc7a0JBRHZCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgV2luZG93UmVmIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IEF1dGhDb25maWcsIE9BdXRoRXJyb3JFdmVudCwgT0F1dGhTZXJ2aWNlLCBUb2tlblJlc3BvbnNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XG5pbXBvcnQgeyBkZWVwbWVyZ2UgfSBmcm9tICdkZWVwbWVyZ2UtdHMnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmcm9tRXZlbnQsXG4gIG1hcCxcbiAgbWVyZ2UsXG4gIG9mLFxuICBzaGFyZSxcbiAgc2hhcmVSZXBsYXksXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YXAsXG4gIHRpbWVvdXQsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5qZWN0QXV0aENvbmZpZyB9IGZyb20gJy4vYXV0aC5jb25maWcnO1xuaW1wb3J0IHsgc2V0SHR0cEF1dGhIZWFkZXIgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgQXV0aFBsdWdpbk1hbmFnZXIsIEF1dGhvcml6ZWRIYW5kbGVyIH0gZnJvbSAnLi9tb2RlbHMnO1xuXG4vKipcbiAqIFRoZSBgQXV0aFNlcnZpY2VgIGNsYXNzIHByb3ZpZGVzIGF1dGhlbnRpY2F0aW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24uXG4gKiBJdCBoYW5kbGVzIE9BdXRoMi9PSURDIGF1dGhlbnRpY2F0aW9uLCB0b2tlbiBtYW5hZ2VtZW50LCBhbmQgdXNlciBpZGVudGl0eSBjbGFpbXMuXG4gKlxuICogS2V5IHJlc3BvbnNpYmlsaXRpZXMgaW5jbHVkZTpcbiAqIC0gSW5pdGlhbGl6aW5nIGF1dGhlbnRpY2F0aW9uIHdpdGggYSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICogLSBNYW5hZ2luZyB0b2tlbnMgKGFjY2VzcywgcmVmcmVzaCwgYW5kIElEIHRva2VucykuXG4gKiAtIENoZWNraW5nIGFuZCBlbWl0dGluZyBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiBzdGF0ZXMuXG4gKiAtIEhhbmRsaW5nIHVzZXIgbG9naW4gYW5kIGxvZ291dCBmbG93cy5cbiAqIC0gU3VwcG9ydGluZyBzaWxlbnQgcmVmcmVzaCBhbmQgb2ZmbGluZSBhdXRoZW50aWNhdGlvbiBzY2VuYXJpb3MuXG4gKiAtIEludGVncmF0aW5nIGF1dGhlbnRpY2F0aW9uIHBsdWdpbnMgdmlhIGBBdXRoUGx1Z2luTWFuYWdlcmAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEluamVjdGluZyB0aGUgQXV0aFNlcnZpY2VcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFVzaW5nIHRoZSBBdXRoU2VydmljZSB0byBpbml0aWFsaXplIGF1dGhlbnRpY2F0aW9uXG4gKiBhc3luYyBuZ09uSW5pdCgpIHtcbiAqICAgY29uc3QgY29uZmlnOiBBdXRoQ29uZmlnID0geyBjbGllbnRJZDogJ3lvdXItY2xpZW50LWlkJywgZGlzY292ZXJ5VXJsOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbicgfTtcbiAqICAgYXdhaXQgdGhpcy5hdXRoU2VydmljZS5pbml0aWFsaXplKGNvbmZpZyk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aENvbmZpZyA9IGluamVjdEF1dGhDb25maWcoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoUGx1Z2luTWFuYWdlciA9IGluamVjdChBdXRoUGx1Z2luTWFuYWdlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgb2F1dGhTZXJ2aWNlID0gaW5qZWN0KE9BdXRoU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luZG93UmVmID0gaW5qZWN0KFdpbmRvd1JlZik7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpc0luaXRpYWxpemVkJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc1JlZGlyZWN0aW5nJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkFjY2Vzc1Rva2VuVXBkYXRlJCA9IGZyb21FdmVudDxTdG9yYWdlRXZlbnQ+KHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdywgJ3N0b3JhZ2UnKS5waXBlKFxuICAgIGZpbHRlcigoeyBrZXkgfSkgPT4ga2V5ID09PSAnYWNjZXNzX3Rva2VuJyB8fCBrZXkgPT09IG51bGwpLFxuICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICBzaGFyZSgpLFxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IHNpbGVudFJlZnJlc2hIYW5kbGVyJCA9IHRoaXMuaXNJbml0aWFsaXplZCQkLnBpcGUoXG4gICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLndpbmRvd1JlZi5pc09ubGluZSQpLFxuICAgIHRhcCgoaXNPbmxpbmUpID0+IHRoaXMudXBkYXRlU2lsZW50UmVmcmVzaChpc09ubGluZSkpLFxuICApO1xuICBwcml2YXRlIHJlYWRvbmx5IG9uQXV0aFN0YXRlQ2hhbmdlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMub2F1dGhTZXJ2aWNlLmV2ZW50cy5waXBlKHN0YXJ0V2l0aChudWxsKSksIHRoaXMud2luZG93UmVmLmlzT25saW5lJCwgdGhpcy5vbkFjY2Vzc1Rva2VuVXBkYXRlJF0pO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgc2VydmljZSBoYXMgY29tcGxldGVkIGluaXRpYWxpemF0aW9uLlxuICAgKiBFbWl0cyBgZmFsc2VgIHVudGlsIHRoZSBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNJbml0aWFsaXplZCQgPSB0aGlzLmlzSW5pdGlhbGl6ZWQkJC5waXBlKGZpbHRlcihCb29sZWFuKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGB0cnVlYCB3aGVuIHRoZSB1c2VyIGlzIGJlaW5nIHJlZGlyZWN0ZWQgdG8gdGhlIGxvZ2luIHBhZ2UuXG4gICAqIEVtaXRzIGBmYWxzZWAgd2hlbiB0aGVyZSBpcyBubyByZWRpcmVjdGlvbiBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNSZWRpcmVjdGluZyQgPSB0aGlzLmlzUmVkaXJlY3RpbmckJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSkpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgaW4gYSBsb2FkaW5nIHN0YXRlIChlLmcuLCBkdXJpbmcgcmVkaXJlY3Rpb24gb3IgcGx1Z2luIGluaXRpYWxpemF0aW9uKS5cbiAgICogRW1pdHMgYGZhbHNlYCB3aGVuIHRoZXJlIGlzIG5vIG9uZ29pbmcgbG9hZGluZyBhY3Rpdml0eS5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8Ym9vbGVhbj59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNMb2FkaW5nJCA9IG1lcmdlKHRoaXMuaXNSZWRpcmVjdGluZyQsIHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucGx1Z2luc0xvYWRpbmckKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLlxuICAgKiBFbWl0cyBgZmFsc2VgIHdoZW4gdGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPGJvb2xlYW4+fVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZCQgPSB0aGlzLmlzSW5pdGlhbGl6ZWQkLnBpcGUoXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucGx1Z2luc1JlYWR5JCksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMub25BdXRoU3RhdGVDaGFuZ2UkKSxcbiAgICBtYXAoKCkgPT4gdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgaWRlbnRpdHkgY2xhaW1zIG9mIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqIElmIHRoZSB1c2VyIGlzIG5vdCBhdXRoZW50aWNhdGVkLCBlbWl0cyBgbnVsbGAuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPE9keEF1dGguSWRlbnRpdHlDbGFpbXMgfCBudWxsPn1cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpZGVudGl0eUNsYWltcyQgPSB0aGlzLmlzQXV0aGVudGljYXRlZCQucGlwZShcbiAgICBtYXAoKCkgPT4gdGhpcy5nZXRJZGVudGl0eUNsYWltcygpKSxcbiAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBPQXV0aCBlcnJvciBldmVudHMuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPE9BdXRoRXJyb3JFdmVudD59XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXJyb3JzJCA9IHRoaXMub2F1dGhTZXJ2aWNlLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcigoZXZlbnQpOiBldmVudCBpcyBPQXV0aEVycm9yRXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBPQXV0aEVycm9yRXZlbnQpLFxuICAgIHNoYXJlKCksXG4gICk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50cyB3aGVuIGFuIE9BdXRoIHRva2VuIGlzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZC5cbiAgICpcbiAgICogQHR5cGUge09ic2VydmFibGU8RXZlbnQ+fVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG9uVG9rZW5SZWNlaXZlZCQgPSB0aGlzLm9hdXRoU2VydmljZS5ldmVudHMucGlwZShcbiAgICBmaWx0ZXIoKGV2ZW50KSA9PiBldmVudC50eXBlID09PSAndG9rZW5fcmVjZWl2ZWQnKSxcbiAgICBzaGFyZSgpLFxuICApO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuZXZlciB0aGUgYGFjY2Vzc190b2tlbmAgaW4gbG9jYWwgc3RvcmFnZSBpcyB1cGRhdGVkIG9yIGNsZWFyZWQuXG4gICAqIFByb3ZpZGVzIGFuIG9ic2VydmFibGUgZm9yIHRyYWNraW5nIHRva2VuIHVwZGF0ZXMuXG4gICAqXG4gICAqIEB0eXBlIHtPYnNlcnZhYmxlPFN0b3JhZ2VFdmVudCB8IG51bGw+fVxuICAgKi9cbiAgcHVibGljIGdldCBhY2Nlc3NUb2tlblVwZGF0ZSQoKTogT2JzZXJ2YWJsZTxTdG9yYWdlRXZlbnQgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMub25BY2Nlc3NUb2tlblVwZGF0ZSQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJ1blBsdWdpbnMoKTtcbiAgICB0aGlzLnNpbGVudFJlZnJlc2hIYW5kbGVyJC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgYXV0aGVudGljYXRpb24gc2VydmljZSB3aXRoIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0F1dGhDb25maWd9IGNvbmZpZyAtIFRoZSBhdXRoZW50aWNhdGlvbiBjb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZShjb25maWc6IEF1dGhDb25maWcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmFzc2VydEF1ZGllbmNlKGNvbmZpZy5jbGllbnRJZCk7XG4gICAgdGhpcy5vYXV0aFNlcnZpY2UuY29uZmlndXJlKHsgLi4uY29uZmlnLCBvcGVuVXJpOiB0aGlzLnJlZGlyZWN0VG9Mb2dpbi5iaW5kKHRoaXMpIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS5sb2FkRGlzY292ZXJ5RG9jdW1lbnQodGhpcy5hdXRoQ29uZmlnLmRpc2NvdmVyeVVybCk7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS50cnlMb2dpbigpO1xuICAgICAgaWYgKHRoaXMuYXV0aENvbmZpZy5yZWZyZXNoVG9rZW5PbkluaXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50cnlSZWZyZXNoVG9rZW4oKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSB8fCBlcnJvciBpbnN0YW5jZW9mIE9BdXRoRXJyb3JFdmVudCkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ3Rva2VuX3JlZnJlc2hfZXJyb3InIHx8IChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIChlcnJvci5zdGF0dXMgPT09IDQwMSB8fCBlcnJvci5zdGF0dXMgPT09IDQwMCkpKSB7XG4gICAgICAgIHRoaXMuc2lnbk91dCh0cnVlKTtcbiAgICAgICAgdGhpcy5zaWduSW4odGhpcy53aW5kb3dSZWYubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkJC5uZXh0KHRydWUpO1xuICAgIGlmICh0aGlzLmF1dGhDb25maWcucmVxdWlyZVNpZ25JbiAmJiAhdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgdGhpcy5zaWduSW4odGhpcy53aW5kb3dSZWYubG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyeUxvYWRVc2VyUHJvZmlsZSgpO1xuICAgIGF3YWl0IHRoaXMucm91dGVUb1JlcXVlc3RlZFVybCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYWxsIGF1dGhlbnRpY2F0aW9uIHBsdWdpbnMgcmVnaXN0ZXJlZCBpbiB0aGUgYEF1dGhQbHVnaW5NYW5hZ2VyYC5cbiAgICovXG4gIHB1YmxpYyBydW5QbHVnaW5zKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0aFBsdWdpbk1hbmFnZXIucnVuUGx1Z2lucyh0aGlzKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpc3N1ZXIgVVJMIGZvciB0aGUgT0F1dGggc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyB7VVJMfSBUaGUgaXNzdWVyIFVSTC5cbiAgICovXG4gIHB1YmxpYyBnZXRJc3N1ZXIoKTogVVJMIHtcbiAgICByZXR1cm4gbmV3IFVSTCh0aGlzLm9hdXRoU2VydmljZS5pc3N1ZXIhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGxvZ2luIGZsb3cgZm9yIHRoZSB1c2VyLiBSZWRpcmVjdHMgdG8gdGhlIGxvZ2luIHBhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBVUkwgdG8gcmVkaXJlY3QgYmFjayB0byBhZnRlciBsb2dpbi5cbiAgICovXG4gIHB1YmxpYyBzaWduSW4odXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdyh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgdGhlIHVzZXIgb3V0IGFuZCBjbGVhcnMgdGhlaXIgdG9rZW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtub1JlZGlyZWN0XSAtIElmIGB0cnVlYCwgbm8gcmVkaXJlY3Rpb24gb2NjdXJzIGFmdGVyIGxvZ291dC5cbiAgICovXG4gIHB1YmxpYyBzaWduT3V0KG5vUmVkaXJlY3Q/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vYXV0aFNlcnZpY2UucmV2b2tlVG9rZW5BbmRMb2dvdXQobm9SZWRpcmVjdCB8fCAhdGhpcy5nZXRBY2Nlc3NUb2tlbigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZWZyZXNoIHRoZSB1c2VyJ3MgdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUb2tlblJlc3BvbnNlPn0gUmVzb2x2ZXMgd2l0aCB0aGUgbmV3IHRva2VuIHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlZnJlc2hUb2tlbnMoKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBhY2Nlc3MgdG9rZW4sIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSBhY2Nlc3MgdG9rZW4sIG9yIGBudWxsYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldEFjY2Vzc1Rva2VuKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRBY2Nlc3NUb2tlbigpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IHJlZnJlc2ggdG9rZW4sIGlmIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IFRoZSByZWZyZXNoIHRva2VuLCBvciBgbnVsbGAgaWYgbm90IGF2YWlsYWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWZyZXNoVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldFJlZnJlc2hUb2tlbigpID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBjdXJyZW50IElEIHRva2VuLCBpZiBhdmFpbGFibGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfSBUaGUgSUQgdG9rZW4sIG9yIGBudWxsYCBpZiBub3QgYXZhaWxhYmxlLlxuICAgKi9cbiAgcHVibGljIGdldElkVG9rZW4oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub2F1dGhTZXJ2aWNlLmdldElkVG9rZW4oKSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgaWRlbnRpdHkgY2xhaW1zIG9mIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPZHhBdXRoLklkZW50aXR5Q2xhaW1zIHwgbnVsbH0gVGhlIGlkZW50aXR5IGNsYWltcywgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0SWRlbnRpdHlDbGFpbXMoKTogT2R4QXV0aC5JZGVudGl0eUNsYWltcyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRJZFRva2VuKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBkZWVwbWVyZ2UodGhpcy5vYXV0aFNlcnZpY2UuZ2V0SWRlbnRpdHlDbGFpbXMoKSwgdGhpcy5hdXRoUGx1Z2luTWFuYWdlci5nZXRSZXN1bHQoKSkgYXMgT2R4QXV0aC5JZGVudGl0eUNsYWltcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJhdyBpZGVudGl0eSBjbGFpbXMgb2YgdGhlIGF1dGhlbnRpY2F0ZWQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMge09keEF1dGguUmF3SWRlbnRpdHlDbGFpbXMgfCBudWxsfSBUaGUgcmF3IGlkZW50aXR5IGNsYWltcywgb3IgYG51bGxgIGlmIG5vdCBhdmFpbGFibGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0UmF3SWRlbnRpdHlDbGFpbXMoKTogT2R4QXV0aC5SYXdJZGVudGl0eUNsYWltcyB8IG51bGwge1xuICAgIGlmICghdGhpcy5nZXRJZFRva2VuKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5nZXRJZGVudGl0eUNsYWltcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgdXNlciBpcyBjdXJyZW50bHkgYXV0aGVudGljYXRlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBhdXRoZW50aWNhdGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHB1YmxpYyBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMud2luZG93UmVmLmlzT25saW5lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkgJiYgdGhpcy5vYXV0aFNlcnZpY2UuaGFzVmFsaWRJZFRva2VuKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmhhc1ZhbGlkT2ZmbGluZVRva2VuKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aG9yaXplZEhhbmRsZXIgfCBudWxsfSBbYXV0aG9yaXplZEhhbmRsZXJdIC0gQSBoYW5kbGVyIHRvIGRldGVybWluZSBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGF1dGhvcml6ZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgcHVibGljIGlzQXV0aG9yaXplZChhdXRob3JpemVkSGFuZGxlcj86IEF1dGhvcml6ZWRIYW5kbGVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSBhdXRob3JpemVkSGFuZGxlciA/PyB0aGlzLmF1dGhDb25maWcuZGVmYXVsdEF1dGhvcml6ZWRIYW5kbGVyO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkgJiYgKGhhbmRsZXI/Lih0aGlzLmdldElkZW50aXR5Q2xhaW1zKCksIHRoaXMsIHRoaXMucm91dGVyKSA/PyB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGV0aGVyIHRoZSB1c2VyIGlzIGF1dGhvcml6ZWQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7QXV0aG9yaXplZEhhbmRsZXIgfCBudWxsfSBbYXV0aG9yaXplZEhhbmRsZXJdIC0gQSBoYW5kbGVyIHRvIGRldGVybWluZSBhdXRob3JpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxib29sZWFuPn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYXV0aG9yaXphdGlvbiBzdGF0dXMuXG4gICAqL1xuICBwdWJsaWMgaXNBdXRob3JpemVkJChhdXRob3JpemVkSGFuZGxlcj86IEF1dGhvcml6ZWRIYW5kbGVyIHwgbnVsbCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZCQucGlwZShtYXAoKCkgPT4gdGhpcy5pc0F1dGhvcml6ZWQoYXV0aG9yaXplZEhhbmRsZXIpKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgYW4gSFRUUCByZXF1ZXN0IGJ5IGFkZGluZyB0aGUgYWNjZXNzIHRva2VuIHRvIGl0cyBoZWFkZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdH0gcmVxIC0gVGhlIEhUVFAgcmVxdWVzdCB0byBwcmVwYXJlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVTaWduSW4gLSBXaGV0aGVyIHRvIHJlcXVpcmUgdGhlIHVzZXIgdG8gc2lnbiBpbiBpZiBubyB0b2tlbiBpcyBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIHtPYnNlcnZhYmxlPFI+fSBBbiBvYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSBwcmVwYXJlZCByZXF1ZXN0LlxuICAgKiBAdGVtcGxhdGUgUiwgVFxuICAgKi9cbiAgcHVibGljIHByZXBhcmVBdXRoUmVxdWVzdCQ8UiBleHRlbmRzIEh0dHBSZXF1ZXN0PFQ+IHwgUmVxdWVzdCwgVD4ocmVxOiBSLCByZXF1aXJlU2lnbkluID0gZmFsc2UpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy53YWl0Rm9yQWNjZXNzVG9rZW4kKHJlcXVpcmVTaWduSW4pLnBpcGUobWFwKCh0b2tlbikgPT4gc2V0SHR0cEF1dGhIZWFkZXIocmVxLCB0b2tlbikpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSB2YWxpZCBhY2Nlc3MgdG9rZW4gdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlU2lnbkluIC0gV2hldGhlciB0byByZXF1aXJlIHRoZSB1c2VyIHRvIHNpZ24gaW4gaWYgbm8gdG9rZW4gaXMgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyB7T2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPn0gQW4gb2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgYWNjZXNzIHRva2VuLlxuICAgKi9cbiAgcHVibGljIHdhaXRGb3JBY2Nlc3NUb2tlbiQocmVxdWlyZVNpZ25JbjogYm9vbGVhbik6IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuJCA9IG9mKHRoaXMuZ2V0QWNjZXNzVG9rZW4oKSkucGlwZShmaWx0ZXIoKHRva2VuKSA9PiAhIXRva2VuICYmIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkpKTtcbiAgICBjb25zdCB3YWl0Rm9yQWNjZXNzVG9rZW4kID0gdGhpcy5vblRva2VuUmVjZWl2ZWQkLnBpcGUoXG4gICAgICB0aW1lb3V0KHRoaXMuYXV0aENvbmZpZy53YWl0Rm9yVG9rZW5Jbk1zID8/IDApLFxuICAgICAgY2F0Y2hFcnJvcihhc3luYyAoKSA9PiB0aGlzLnRyeVJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IG51bGwpKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuaXNJbml0aWFsaXplZCQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBtZXJnZShhY2Nlc3NUb2tlbiQsIHdhaXRGb3JBY2Nlc3NUb2tlbiQpKSxcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5nZXRBY2Nlc3NUb2tlbigpKSxcbiAgICAgIHRhcCgodG9rZW4pID0+ICF0b2tlbiAmJiByZXF1aXJlU2lnbkluICYmIHRoaXMuc2lnbkluKHRoaXMud2luZG93UmVmLmxvY2F0aW9uLnBhdGhuYW1lKSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcm91dGVUb1JlcXVlc3RlZFVybCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMub2F1dGhTZXJ2aWNlLnN0YXRlIHx8ICF0aGlzLm9hdXRoU2VydmljZS5oYXNWYWxpZEFjY2Vzc1Rva2VuKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLm9hdXRoU2VydmljZS5zdGF0ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNWYWxpZE9mZmxpbmVUb2tlbigpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc3N1ZWRBdCA9IHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKT8uaWF0ID8/IDA7XG5cbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGlzc3VlZEF0ICogMTAwMCA8PSB0aGlzLmF1dGhDb25maWcubWF4T2ZmbGluZVRpbWUgKiAxMDAwO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRpcmVjdFRvTG9naW4odXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndpbmRvd1JlZi5sb2NhdGlvbi5hc3NpZ24odXJpKTtcbiAgICB0aGlzLmlzUmVkaXJlY3RpbmckJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlMb2FkVXNlclByb2ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmF1dGhDb25maWcubG9hZFVzZXJQcm9maWxlIHx8ICF0aGlzLmlzQXV0aGVudGljYXRlZCgpKSByZXR1cm47XG4gICAgYXdhaXQgdGhpcy5vYXV0aFNlcnZpY2UubG9hZFVzZXJQcm9maWxlKCkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeVJlZnJlc2hUb2tlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuZ2V0UmVmcmVzaFRva2VuKCkpIHJldHVybjtcbiAgICBhd2FpdCB0aGlzLm9hdXRoU2VydmljZS5yZWZyZXNoVG9rZW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0QXVkaWVuY2UoY2xpZW50SWQ/OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW5DbGllbnRJZCA9IHRoaXMuZ2V0SWRlbnRpdHlDbGFpbXMoKT8uYXVkO1xuICAgIGlmICghY2xpZW50SWQgfHwgIXRva2VuQ2xpZW50SWQgfHwgY2xpZW50SWQgPT09IHRva2VuQ2xpZW50SWQpIHJldHVybjtcbiAgICB0aGlzLnNpZ25PdXQodHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVNpbGVudFJlZnJlc2goZW5hYmxlZDogYm9vbGVhbikge1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICB0aGlzLm9hdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vYXV0aFNlcnZpY2Uuc3RvcEF1dG9tYXRpY1JlZnJlc2goKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC50eXBpbmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9hdXRoL3NyYy9saWIvYXV0aC50eXBpbmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIGdsb2JhbCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG4gIG5hbWVzcGFjZSBPZHhBdXRoIHtcbiAgICB0eXBlIFJhd0lkZW50aXR5Q2xhaW1zID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICBpbnRlcmZhY2UgQXV0aFBsdWdpblJlc3VsdCB7XG4gICAgICBpbnN0aXR1dGlvbk5hbWU/OiBzdHJpbmc7XG4gICAgICBsYW5ndWFnZUNvZGU/OiBzdHJpbmc7XG4gICAgICBwcmVmZXJyZWRMYW5ndWFnZT86IHN0cmluZztcbiAgICB9XG5cbiAgICBpbnRlcmZhY2UgSWRlbnRpdHlDbGFpbXMgZXh0ZW5kcyBBdXRoUGx1Z2luUmVzdWx0IHtcbiAgICAgIHN1Yjogc3RyaW5nO1xuICAgICAgb2t0YWlkOiBzdHJpbmc7XG4gICAgICBpYXQ6IG51bWJlcjtcbiAgICAgIGF1ZDogc3RyaW5nO1xuXG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICBmaXJzdG5hbWU6IHN0cmluZztcbiAgICAgIGxhc3RuYW1lOiBzdHJpbmc7XG4gICAgICBkaXNwbGF5bmFtZTogc3RyaW5nO1xuICAgICAgcHJlZmVycmVkX3VzZXJuYW1lOiBzdHJpbmc7XG4gICAgICBlbWFpbDogc3RyaW5nO1xuICAgICAgaW5pdGlhbHM6IHN0cmluZztcbiAgICAgIG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuXG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICB6b25laW5mbz86IHN0cmluZztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHt9O1xuIl19
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';
|
|
3
|
-
import { CoreModule } from '@odx/angular';
|
|
4
|
-
import { ListModule } from '@odx/angular/components/list';
|
|
5
|
-
import { CSSComponent } from '@odx/angular/internal';
|
|
6
|
-
import { TranslatePipe } from '@odx/angular/internal/translate';
|
|
7
|
-
import { injectElement } from '@odx/angular/utils';
|
|
8
|
-
import { SignOutDirective } from '../../directives';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/common";
|
|
11
|
-
import * as i2 from "@odx/angular/components/list";
|
|
12
|
-
import * as i3 from "@odx/angular/components/icon";
|
|
13
|
-
/**
|
|
14
|
-
* Displays authentication actions.
|
|
15
|
-
*/
|
|
16
|
-
let AuthActionsComponent = class AuthActionsComponent {
|
|
17
|
-
constructor() {
|
|
18
|
-
this.element = injectElement();
|
|
19
|
-
/**
|
|
20
|
-
* The identity claims.
|
|
21
|
-
*
|
|
22
|
-
* @type {OdxAuth.IdentityClaims | null}
|
|
23
|
-
* @default null
|
|
24
|
-
*/
|
|
25
|
-
this.claims = null;
|
|
26
|
-
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthActionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
28
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AuthActionsComponent, isStandalone: true, selector: "odx-auth-actions", inputs: { claims: "claims" }, ngImport: i0, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a odxListItem data-testid=\"odx-auth-user-profile-link\" [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n </a>\n }\n <button odxListItem odxAuthSignOut data-testid=\"odx-auth-sign-out-button\" style=\"width: 100%\">\n <odx-icon name=\"logout\" iconSet=\"core\" odxListItemPrefix />\n {{ 'signOutButtonText' | odxTranslate | async }}\n </button>\n</odx-list>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i2.ListComponent, selector: "odx-list" }, { kind: "component", type: i2.ListItemComponent, selector: "odx-list-item, [odxListItem]", inputs: ["danger", "variant", "muted", "selected"] }, { kind: "component", type: i3.IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }, { kind: "pipe", type: TranslatePipe, name: "odxTranslate" }, { kind: "directive", type: SignOutDirective, selector: "[odxAuthSignOut]", outputs: ["odxAuthSignOut"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
29
|
-
};
|
|
30
|
-
AuthActionsComponent = __decorate([
|
|
31
|
-
CSSComponent('auth-actions')
|
|
32
|
-
], AuthActionsComponent);
|
|
33
|
-
export { AuthActionsComponent };
|
|
34
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AuthActionsComponent, decorators: [{
|
|
35
|
-
type: Component,
|
|
36
|
-
args: [{ standalone: true, selector: 'odx-auth-actions', imports: [CoreModule, ListModule, TranslatePipe, SignOutDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<odx-list>\n @if (claims?.userProfileUrl; as url) {\n <a odxListItem data-testid=\"odx-auth-user-profile-link\" [href]=\"url\" rel=\"noopener\" target=\"_blank\">\n <odx-icon name=\"user-administration\" iconSet=\"core\" odxListItemPrefix />\n {{ 'userProfileLink' | odxTranslate | async }}\n </a>\n }\n <button odxListItem odxAuthSignOut data-testid=\"odx-auth-sign-out-button\" style=\"width: 100%\">\n <odx-icon name=\"logout\" iconSet=\"core\" odxListItemPrefix />\n {{ 'signOutButtonText' | odxTranslate | async }}\n </button>\n</odx-list>\n" }]
|
|
37
|
-
}], propDecorators: { claims: [{
|
|
38
|
-
type: Input
|
|
39
|
-
}] } });
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1hY3Rpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXV0aC9zcmMvbGliL2NvbXBvbmVudHMvYXV0aC1hY3Rpb25zL2F1dGgtYWN0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2F1dGgvc3JjL2xpYi9jb21wb25lbnRzL2F1dGgtYWN0aW9ucy9hdXRoLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQUVwRDs7R0FFRztBQVVJLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBQTFCO1FBQ1csWUFBTyxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBRTFDOzs7OztXQUtHO1FBRUksV0FBTSxHQUFrQyxJQUFJLENBQUM7S0FDckQ7K0dBWFksb0JBQW9CO21HQUFwQixvQkFBb0IsMEdDcEJqQyw4akJBWUEsMkNER1ksVUFBVSxtRkFBRSxVQUFVLGtYQUFFLGFBQWEscURBQUUsZ0JBQWdCOztBQUt0RCxvQkFBb0I7SUFUaEMsWUFBWSxDQUFDLGNBQWMsQ0FBQztHQVNoQixvQkFBb0IsQ0FXaEM7OzRGQVhZLG9CQUFvQjtrQkFSaEMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sa0JBQWtCLFdBQ25CLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsbUJBRWpELHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUk7OEJBWTlCLE1BQU07c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29yZU1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhcic7XG5pbXBvcnQgeyBMaXN0TW9kdWxlIH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvbGlzdCc7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgVHJhbnNsYXRlUGlwZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbC90cmFuc2xhdGUnO1xuaW1wb3J0IHsgaW5qZWN0RWxlbWVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBTaWduT3V0RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcyc7XG5cbi8qKlxuICogRGlzcGxheXMgYXV0aGVudGljYXRpb24gYWN0aW9ucy5cbiAqL1xuQENTU0NvbXBvbmVudCgnYXV0aC1hY3Rpb25zJylcbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ29keC1hdXRoLWFjdGlvbnMnLFxuICBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgTGlzdE1vZHVsZSwgVHJhbnNsYXRlUGlwZSwgU2lnbk91dERpcmVjdGl2ZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRoLWFjdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQXV0aEFjdGlvbnNDb21wb25lbnQge1xuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIGlkZW50aXR5IGNsYWltcy5cbiAgICpcbiAgICogQHR5cGUge09keEF1dGguSWRlbnRpdHlDbGFpbXMgfCBudWxsfVxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2xhaW1zOiBPZHhBdXRoLklkZW50aXR5Q2xhaW1zIHwgbnVsbCA9IG51bGw7XG59XG4iLCI8b2R4LWxpc3Q+XG4gIEBpZiAoY2xhaW1zPy51c2VyUHJvZmlsZVVybDsgYXMgdXJsKSB7XG4gICAgPGEgb2R4TGlzdEl0ZW0gZGF0YS10ZXN0aWQ9XCJvZHgtYXV0aC11c2VyLXByb2ZpbGUtbGlua1wiIFtocmVmXT1cInVybFwiIHJlbD1cIm5vb3BlbmVyXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgICA8b2R4LWljb24gbmFtZT1cInVzZXItYWRtaW5pc3RyYXRpb25cIiBpY29uU2V0PVwiY29yZVwiIG9keExpc3RJdGVtUHJlZml4IC8+XG4gICAgICB7eyAndXNlclByb2ZpbGVMaW5rJyB8IG9keFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gICAgPC9hPlxuICB9XG4gIDxidXR0b24gb2R4TGlzdEl0ZW0gb2R4QXV0aFNpZ25PdXQgZGF0YS10ZXN0aWQ9XCJvZHgtYXV0aC1zaWduLW91dC1idXR0b25cIiBzdHlsZT1cIndpZHRoOiAxMDAlXCI+XG4gICAgPG9keC1pY29uIG5hbWU9XCJsb2dvdXRcIiBpY29uU2V0PVwiY29yZVwiIG9keExpc3RJdGVtUHJlZml4IC8+XG4gICAge3sgJ3NpZ25PdXRCdXR0b25UZXh0JyB8IG9keFRyYW5zbGF0ZSB8IGFzeW5jIH19XG4gIDwvYnV0dG9uPlxuPC9vZHgtbGlzdD5cbiJdfQ==
|