@abp/ng.core 5.0.0-rc.1 → 5.0.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/abp-ng.core.d.ts +5 -5
- package/bundles/abp-ng.core-locale.umd.js +361 -361
- package/bundles/abp-ng.core-locale.umd.js.map +1 -1
- package/bundles/abp-ng.core-testing.umd.js +442 -442
- package/bundles/abp-ng.core.umd.js +4873 -4860
- package/bundles/abp-ng.core.umd.js.map +1 -1
- package/esm2015/abp-ng.core.js +4 -4
- package/esm2015/lib/abstracts/index.js +1 -1
- package/esm2015/lib/abstracts/ng-model.component.js +58 -58
- package/esm2015/lib/components/dynamic-layout.component.js +89 -99
- package/esm2015/lib/components/index.js +3 -3
- package/esm2015/lib/components/replaceable-route-container.component.js +37 -37
- package/esm2015/lib/components/router-outlet.component.js +14 -14
- package/esm2015/lib/constants/different-locales.js +336 -336
- package/esm2015/lib/constants/index.js +1 -1
- package/esm2015/lib/core.module.js +280 -280
- package/esm2015/lib/directives/autofocus.directive.js +29 -29
- package/esm2015/lib/directives/debounce.directive.js +35 -35
- package/esm2015/lib/directives/for.directive.js +150 -150
- package/esm2015/lib/directives/form-submit.directive.js +68 -68
- package/esm2015/lib/directives/index.js +8 -8
- package/esm2015/lib/directives/init.directive.js +20 -20
- package/esm2015/lib/directives/permission.directive.js +47 -47
- package/esm2015/lib/directives/replaceable-template.directive.js +120 -120
- package/esm2015/lib/directives/stop-propagation.directive.js +31 -31
- package/esm2015/lib/enums/common.js +1 -1
- package/esm2015/lib/enums/index.js +1 -1
- package/esm2015/lib/guards/auth.guard.js +28 -28
- package/esm2015/lib/guards/index.js +2 -2
- package/esm2015/lib/guards/permission.guard.js +43 -43
- package/esm2015/lib/handlers/oauth-configuration.handler.js +36 -36
- package/esm2015/lib/handlers/routes.handler.js +46 -46
- package/esm2015/lib/interceptors/api.interceptor.js +53 -53
- package/esm2015/lib/interceptors/index.js +1 -1
- package/esm2015/lib/localization.module.js +15 -15
- package/esm2015/lib/models/auth.js +1 -1
- package/esm2015/lib/models/common.js +1 -1
- package/esm2015/lib/models/dtos.js +118 -118
- package/esm2015/lib/models/environment.js +1 -1
- package/esm2015/lib/models/index.js +9 -9
- package/esm2015/lib/models/localization.js +1 -1
- package/esm2015/lib/models/replaceable-components.js +1 -1
- package/esm2015/lib/models/rest.js +2 -2
- package/esm2015/lib/models/session.js +1 -1
- package/esm2015/lib/models/utility.js +1 -1
- package/esm2015/lib/pipes/index.js +2 -2
- package/esm2015/lib/pipes/localization.pipe.js +32 -32
- package/esm2015/lib/pipes/sort.pipe.js +48 -48
- package/esm2015/lib/providers/cookie-language.provider.js +21 -21
- package/esm2015/lib/providers/locale.provider.js +21 -21
- package/esm2015/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.js +28 -28
- package/esm2015/lib/proxy/pages/abp/multi-tenancy/index.js +1 -1
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.js +23 -23
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/index.js +1 -1
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.js +24 -24
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/index.js +4 -4
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/models.js +1 -1
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/index.js +1 -1
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/index.js +1 -1
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models.js +1 -1
- package/esm2015/lib/proxy/volo/abp/http/modeling/index.js +1 -1
- package/esm2015/lib/proxy/volo/abp/http/modeling/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/localization/index.js +1 -1
- package/esm2015/lib/proxy/volo/abp/localization/models.js +1 -1
- package/esm2015/lib/proxy/volo/abp/models.js +1 -1
- package/esm2015/lib/services/auth.service.js +46 -46
- package/esm2015/lib/services/config-state.service.js +129 -129
- package/esm2015/lib/services/content-projection.service.js +16 -16
- package/esm2015/lib/services/dom-insertion.service.js +31 -31
- package/esm2015/lib/services/environment.service.js +34 -34
- package/esm2015/lib/services/http-error-reporter.service.js +28 -28
- package/esm2015/lib/services/http-wait.service.js +71 -71
- package/esm2015/lib/services/index.js +21 -21
- package/esm2015/lib/services/lazy-load.service.js +37 -37
- package/esm2015/lib/services/list.service.js +102 -102
- package/esm2015/lib/services/localization.service.js +181 -181
- package/esm2015/lib/services/multi-tenancy.service.js +47 -47
- package/esm2015/lib/services/permission.service.js +63 -63
- package/esm2015/lib/services/replaceable-components.service.js +48 -48
- package/esm2015/lib/services/resource-wait.service.js +38 -38
- package/esm2015/lib/services/rest.service.js +63 -59
- package/esm2015/lib/services/router-events.service.js +37 -37
- package/esm2015/lib/services/router-wait.service.js +50 -50
- package/esm2015/lib/services/routes.service.js +146 -146
- package/esm2015/lib/services/session-state.service.js +75 -75
- package/esm2015/lib/services/subscription.service.js +40 -40
- package/esm2015/lib/services/track-by.service.js +20 -20
- package/esm2015/lib/strategies/auth-flow.strategy.js +201 -201
- package/esm2015/lib/strategies/container.strategy.js +37 -37
- package/esm2015/lib/strategies/content-security.strategy.js +27 -27
- package/esm2015/lib/strategies/content.strategy.js +47 -47
- package/esm2015/lib/strategies/context.strategy.js +36 -36
- package/esm2015/lib/strategies/cross-origin.strategy.js +25 -25
- package/esm2015/lib/strategies/dom.strategy.js +26 -26
- package/esm2015/lib/strategies/index.js +8 -8
- package/esm2015/lib/strategies/loading.strategy.js +57 -57
- package/esm2015/lib/strategies/projection.strategy.js +79 -79
- package/esm2015/lib/tokens/app-config.token.js +2 -2
- package/esm2015/lib/tokens/cookie-language-key.token.js +4 -4
- package/esm2015/lib/tokens/index.js +8 -8
- package/esm2015/lib/tokens/list.token.js +2 -2
- package/esm2015/lib/tokens/localization.token.js +9 -9
- package/esm2015/lib/tokens/lodaer-delay.token.js +2 -2
- package/esm2015/lib/tokens/manage-profile.token.js +11 -11
- package/esm2015/lib/tokens/options.token.js +7 -7
- package/esm2015/lib/tokens/tenant-key.token.js +2 -2
- package/esm2015/lib/utils/array-utils.js +6 -6
- package/esm2015/lib/utils/auth-utils.js +41 -41
- package/esm2015/lib/utils/common-utils.js +28 -28
- package/esm2015/lib/utils/date-extensions.js +5 -5
- package/esm2015/lib/utils/date-utils.js +12 -12
- package/esm2015/lib/utils/environment-utils.js +35 -35
- package/esm2015/lib/utils/factory-utils.js +23 -23
- package/esm2015/lib/utils/file-utils.js +13 -13
- package/esm2015/lib/utils/form-utils.js +11 -11
- package/esm2015/lib/utils/generator-utils.js +33 -33
- package/esm2015/lib/utils/http-utils.js +18 -18
- package/esm2015/lib/utils/index.js +20 -20
- package/esm2015/lib/utils/initial-utils.js +63 -63
- package/esm2015/lib/utils/internal-store-utils.js +35 -35
- package/esm2015/lib/utils/lazy-load-utils.js +39 -39
- package/esm2015/lib/utils/localization-utils.js +49 -49
- package/esm2015/lib/utils/multi-tenancy-utils.js +82 -82
- package/esm2015/lib/utils/number-utils.js +3 -3
- package/esm2015/lib/utils/object-utils.js +36 -36
- package/esm2015/lib/utils/route-utils.js +26 -26
- package/esm2015/lib/utils/string-utils.js +25 -21
- package/esm2015/lib/utils/tree-utils.js +53 -53
- package/esm2015/lib/validators/age.validator.js +13 -13
- package/esm2015/lib/validators/credit-card.validator.js +20 -20
- package/esm2015/lib/validators/index.js +22 -22
- package/esm2015/lib/validators/range.validator.js +14 -14
- package/esm2015/lib/validators/required.validator.js +12 -12
- package/esm2015/lib/validators/string-length.validator.js +14 -14
- package/esm2015/lib/validators/url.validator.js +15 -15
- package/esm2015/locale/abp-ng.core-locale.js +4 -4
- package/esm2015/locale/public-api.js +1 -1
- package/esm2015/locale/utils/register-locale.js +43 -43
- package/esm2015/public-api.js +25 -25
- package/esm2015/testing/abp-ng.core-testing.js +4 -4
- package/esm2015/testing/lib/core-testing.module.js +61 -61
- package/esm2015/testing/lib/services/index.js +2 -2
- package/esm2015/testing/lib/services/mock-permission.service.js +34 -34
- package/esm2015/testing/lib/services/mock-rest.service.js +29 -29
- package/esm2015/testing/lib/utils/clear-page.util.js +9 -9
- package/esm2015/testing/lib/utils/index.js +2 -2
- package/esm2015/testing/lib/utils/wait.util.js +4 -4
- package/esm2015/testing/public-api.js +3 -3
- package/fesm2015/abp-ng.core-locale.js +40 -40
- package/fesm2015/abp-ng.core-locale.js.map +1 -1
- package/fesm2015/abp-ng.core-testing.js +113 -113
- package/fesm2015/abp-ng.core.js +3976 -3977
- package/fesm2015/abp-ng.core.js.map +1 -1
- package/lib/abstracts/index.d.ts +1 -1
- package/lib/abstracts/ng-model.component.d.ts +25 -25
- package/lib/components/dynamic-layout.component.d.ts +27 -27
- package/lib/components/index.d.ts +3 -3
- package/lib/components/replaceable-route-container.component.d.ts +17 -17
- package/lib/components/router-outlet.component.d.ts +5 -5
- package/lib/constants/different-locales.d.ts +334 -334
- package/lib/constants/index.d.ts +1 -1
- package/lib/core.module.d.ts +56 -56
- package/lib/directives/autofocus.directive.d.ts +12 -12
- package/lib/directives/debounce.directive.d.ts +13 -13
- package/lib/directives/for.directive.d.ts +36 -36
- package/lib/directives/form-submit.directive.d.ts +19 -19
- package/lib/directives/index.d.ts +8 -8
- package/lib/directives/init.directive.d.ts +10 -10
- package/lib/directives/permission.directive.d.ts +18 -18
- package/lib/directives/replaceable-template.directive.d.ts +30 -30
- package/lib/directives/stop-propagation.directive.d.ts +12 -12
- package/lib/enums/common.d.ts +5 -5
- package/lib/enums/index.d.ts +1 -1
- package/lib/guards/auth.guard.d.ts +13 -13
- package/lib/guards/index.d.ts +2 -2
- package/lib/guards/permission.guard.d.ts +16 -16
- package/lib/handlers/oauth-configuration.handler.d.ts +13 -13
- package/lib/handlers/routes.handler.d.ts +11 -11
- package/lib/interceptors/api.interceptor.d.ts +16 -16
- package/lib/interceptors/index.d.ts +1 -1
- package/lib/localization.module.d.ts +7 -7
- package/lib/models/auth.d.ts +6 -6
- package/lib/models/common.d.ts +77 -77
- package/lib/models/dtos.d.ts +95 -95
- package/lib/models/environment.d.ts +35 -35
- package/lib/models/index.d.ts +9 -9
- package/lib/models/localization.d.ts +5 -5
- package/lib/models/replaceable-components.d.ts +45 -45
- package/lib/models/rest.d.ts +35 -33
- package/lib/models/session.d.ts +7 -7
- package/lib/models/utility.d.ts +14 -14
- package/lib/pipes/index.d.ts +2 -2
- package/lib/pipes/localization.pipe.d.ts +12 -12
- package/lib/pipes/sort.pipe.d.ts +9 -9
- package/lib/providers/cookie-language.provider.d.ts +3 -3
- package/lib/providers/locale.provider.d.ts +9 -9
- package/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.d.ts +12 -12
- package/lib/proxy/pages/abp/multi-tenancy/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.d.ts +11 -11
- package/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.d.ts +11 -11
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/index.d.ts +4 -4
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/models.d.ts +85 -85
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/models.d.ts +71 -71
- package/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models.d.ts +14 -14
- package/lib/proxy/volo/abp/http/modeling/index.d.ts +1 -1
- package/lib/proxy/volo/abp/http/modeling/models.d.ts +70 -70
- package/lib/proxy/volo/abp/localization/index.d.ts +1 -1
- package/lib/proxy/volo/abp/localization/models.d.ts +6 -6
- package/lib/proxy/volo/abp/models.d.ts +4 -4
- package/lib/services/auth.service.d.ts +17 -17
- package/lib/services/config-state.service.d.ts +339 -339
- package/lib/services/content-projection.service.d.ts +10 -10
- package/lib/services/dom-insertion.service.d.ts +10 -10
- package/lib/services/environment.service.d.ts +96 -96
- package/lib/services/http-error-reporter.service.d.ts +12 -12
- package/lib/services/http-wait.service.d.ts +30 -30
- package/lib/services/index.d.ts +21 -21
- package/lib/services/lazy-load.service.d.ts +13 -13
- package/lib/services/list.service.d.ts +39 -39
- package/lib/services/localization.service.d.ts +47 -47
- package/lib/services/multi-tenancy.service.d.ts +22 -22
- package/lib/services/permission.service.d.ts +19 -19
- package/lib/services/replaceable-components.service.d.ts +19 -19
- package/lib/services/resource-wait.service.d.ts +15 -15
- package/lib/services/rest.service.d.ts +20 -19
- package/lib/services/router-events.service.d.ts +29 -29
- package/lib/services/router-wait.service.d.ts +20 -20
- package/lib/services/routes.service.d.ts +50 -50
- package/lib/services/session-state.service.d.ts +25 -25
- package/lib/services/subscription.service.d.ts +17 -17
- package/lib/services/track-by.service.d.ts +11 -11
- package/lib/strategies/auth-flow.strategy.d.ts +367 -367
- package/lib/strategies/container.strategy.d.ts +22 -22
- package/lib/strategies/content-security.strategy.d.ts +17 -17
- package/lib/strategies/content.strategy.d.ts +26 -26
- package/lib/strategies/context.strategy.d.ts +23 -23
- package/lib/strategies/cross-origin.strategy.d.ts +14 -14
- package/lib/strategies/dom.strategy.d.ts +13 -13
- package/lib/strategies/index.d.ts +8 -8
- package/lib/strategies/loading.strategy.d.ts +28 -28
- package/lib/strategies/projection.strategy.d.ts +39 -39
- package/lib/tokens/app-config.token.d.ts +3 -3
- package/lib/tokens/cookie-language-key.token.d.ts +2 -2
- package/lib/tokens/index.d.ts +8 -8
- package/lib/tokens/list.token.d.ts +2 -2
- package/lib/tokens/localization.token.d.ts +6 -6
- package/lib/tokens/lodaer-delay.token.d.ts +2 -2
- package/lib/tokens/manage-profile.token.d.ts +2 -2
- package/lib/tokens/options.token.d.ts +4 -4
- package/lib/tokens/tenant-key.token.d.ts +2 -2
- package/lib/utils/array-utils.d.ts +1 -1
- package/lib/utils/auth-utils.d.ts +162 -162
- package/lib/utils/common-utils.d.ts +9 -9
- package/lib/utils/date-extensions.d.ts +6 -6
- package/lib/utils/date-utils.d.ts +4 -4
- package/lib/utils/environment-utils.d.ts +3 -3
- package/lib/utils/factory-utils.d.ts +9 -9
- package/lib/utils/file-utils.d.ts +1 -1
- package/lib/utils/form-utils.d.ts +2 -2
- package/lib/utils/generator-utils.d.ts +3 -3
- package/lib/utils/http-utils.d.ts +8 -8
- package/lib/utils/index.d.ts +20 -20
- package/lib/utils/initial-utils.d.ts +159 -159
- package/lib/utils/internal-store-utils.d.ts +14 -14
- package/lib/utils/lazy-load-utils.d.ts +4 -4
- package/lib/utils/localization-utils.d.ts +5 -5
- package/lib/utils/multi-tenancy-utils.d.ts +3 -3
- package/lib/utils/number-utils.d.ts +1 -1
- package/lib/utils/object-utils.d.ts +1 -1
- package/lib/utils/route-utils.d.ts +8 -8
- package/lib/utils/string-utils.d.ts +3 -2
- package/lib/utils/tree-utils.d.ts +19 -19
- package/lib/validators/age.validator.d.ts +10 -10
- package/lib/validators/credit-card.validator.d.ts +5 -5
- package/lib/validators/index.d.ts +22 -22
- package/lib/validators/range.validator.d.ts +12 -12
- package/lib/validators/required.validator.d.ts +8 -8
- package/lib/validators/string-length.validator.d.ts +14 -14
- package/lib/validators/url.validator.d.ts +5 -5
- package/locale/abp-ng.core-locale.d.ts +5 -5
- package/locale/public-api.d.ts +1 -1
- package/locale/utils/register-locale.d.ts +13 -13
- package/package.json +2 -2
- package/public-api.d.ts +24 -24
- package/testing/abp-ng.core-testing.d.ts +5 -5
- package/testing/lib/core-testing.module.d.ts +16 -16
- package/testing/lib/services/index.d.ts +2 -2
- package/testing/lib/services/mock-permission.service.d.ts +10 -10
- package/testing/lib/services/mock-rest.service.d.ts +13 -13
- package/testing/lib/utils/clear-page.util.d.ts +2 -2
- package/testing/lib/utils/index.d.ts +2 -2
- package/testing/lib/utils/wait.util.d.ts +2 -2
- package/testing/public-api.d.ts +3 -3
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Subscription } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class SubscriptionService {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.subscription = new Subscription();
|
|
7
|
-
}
|
|
8
|
-
get isClosed() {
|
|
9
|
-
return this.subscription.closed;
|
|
10
|
-
}
|
|
11
|
-
addOne(source$, nextOrObserver, error) {
|
|
12
|
-
const subscription = source$.subscribe(nextOrObserver, error);
|
|
13
|
-
this.subscription.add(subscription);
|
|
14
|
-
return subscription;
|
|
15
|
-
}
|
|
16
|
-
closeAll() {
|
|
17
|
-
this.subscription.unsubscribe();
|
|
18
|
-
}
|
|
19
|
-
closeOne(subscription) {
|
|
20
|
-
this.removeOne(subscription);
|
|
21
|
-
subscription.unsubscribe();
|
|
22
|
-
}
|
|
23
|
-
ngOnDestroy() {
|
|
24
|
-
this.subscription.unsubscribe();
|
|
25
|
-
}
|
|
26
|
-
removeOne(subscription) {
|
|
27
|
-
if (!subscription)
|
|
28
|
-
return;
|
|
29
|
-
this.subscription.remove(subscription);
|
|
30
|
-
}
|
|
31
|
-
reset() {
|
|
32
|
-
this.subscription.unsubscribe();
|
|
33
|
-
this.subscription = new Subscription();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
SubscriptionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SubscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
37
|
-
SubscriptionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SubscriptionService });
|
|
38
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SubscriptionService, decorators: [{
|
|
39
|
-
type: Injectable
|
|
40
|
-
}] });
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Subscription } from 'rxjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export class SubscriptionService {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.subscription = new Subscription();
|
|
7
|
+
}
|
|
8
|
+
get isClosed() {
|
|
9
|
+
return this.subscription.closed;
|
|
10
|
+
}
|
|
11
|
+
addOne(source$, nextOrObserver, error) {
|
|
12
|
+
const subscription = source$.subscribe(nextOrObserver, error);
|
|
13
|
+
this.subscription.add(subscription);
|
|
14
|
+
return subscription;
|
|
15
|
+
}
|
|
16
|
+
closeAll() {
|
|
17
|
+
this.subscription.unsubscribe();
|
|
18
|
+
}
|
|
19
|
+
closeOne(subscription) {
|
|
20
|
+
this.removeOne(subscription);
|
|
21
|
+
subscription.unsubscribe();
|
|
22
|
+
}
|
|
23
|
+
ngOnDestroy() {
|
|
24
|
+
this.subscription.unsubscribe();
|
|
25
|
+
}
|
|
26
|
+
removeOne(subscription) {
|
|
27
|
+
if (!subscription)
|
|
28
|
+
return;
|
|
29
|
+
this.subscription.remove(subscription);
|
|
30
|
+
}
|
|
31
|
+
reset() {
|
|
32
|
+
this.subscription.unsubscribe();
|
|
33
|
+
this.subscription = new Subscription();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
SubscriptionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SubscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
37
|
+
SubscriptionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SubscriptionService });
|
|
38
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: SubscriptionService, decorators: [{
|
|
39
|
+
type: Injectable
|
|
40
|
+
}] });
|
|
41
41
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9saWIvc2VydmljZXMvc3Vic2NyaXB0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUlwQyxNQUFNLE9BQU8sbUJBQW1CO0lBRGhDO1FBRVUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0tBNEMzQztJQTFDQyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFRRCxNQUFNLENBQ0osT0FBc0IsRUFDdEIsY0FBNkMsRUFDN0MsS0FBNEI7UUFFNUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUF5QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUSxDQUFDLFlBQTZDO1FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0IsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUyxDQUFDLFlBQTZDO1FBQ3JELElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ3pDLENBQUM7O2lIQTVDVSxtQkFBbUI7cUhBQW5CLG1CQUFtQjs0RkFBbkIsbUJBQW1CO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHR5cGUgeyBPYnNlcnZhYmxlLCBQYXJ0aWFsT2JzZXJ2ZXIgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFN1YnNjcmlwdGlvblNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBnZXQgaXNDbG9zZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uLmNsb3NlZDtcbiAgfVxuXG4gIGFkZE9uZTxUIGV4dGVuZHMgdW5rbm93bj4oXG4gICAgc291cmNlJDogT2JzZXJ2YWJsZTxUPixcbiAgICBuZXh0PzogKHZhbHVlOiBUKSA9PiB2b2lkLFxuICAgIGVycm9yPzogKGVycm9yOiBhbnkpID0+IHZvaWQsXG4gICk6IFN1YnNjcmlwdGlvbjtcbiAgYWRkT25lPFQgZXh0ZW5kcyB1bmtub3duPihzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+LCBvYnNlcnZlcj86IFBhcnRpYWxPYnNlcnZlcjxUPik6IFN1YnNjcmlwdGlvbjtcbiAgYWRkT25lPFQgZXh0ZW5kcyB1bmtub3duPihcbiAgICBzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG5leHRPck9ic2VydmVyPzogUGFydGlhbE9ic2VydmVyPFQ+IHwgTmV4dDxUPixcbiAgICBlcnJvcj86IChlcnJvcjogYW55KSA9PiB2b2lkLFxuICApOiBTdWJzY3JpcHRpb24ge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHNvdXJjZSQuc3Vic2NyaWJlKG5leHRPck9ic2VydmVyIGFzIE5leHQ8VD4sIGVycm9yKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQoc3Vic2NyaXB0aW9uKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgY2xvc2VBbGwoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGNsb3NlT25lKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIHRoaXMucmVtb3ZlT25lKHN1YnNjcmlwdGlvbik7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcmVtb3ZlT25lKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSByZXR1cm47XG4gICAgdGhpcy5zdWJzY3JpcHRpb24ucmVtb3ZlKHN1YnNjcmlwdGlvbik7XG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICB9XG59XG5cbnR5cGUgTmV4dDxUPiA9ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiJdfQ==
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export const trackBy = (key) => (_, item) => item[key];
|
|
4
|
-
export const trackByDeep = (
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
6
|
-
...keys) => (_, item) => keys.reduce((acc, key) => acc[key], item);
|
|
7
|
-
export class TrackByService {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.by = trackBy;
|
|
10
|
-
this.byDeep = trackByDeep;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
TrackByService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: TrackByService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
14
|
-
TrackByService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: TrackByService, providedIn: 'root' });
|
|
15
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: TrackByService, decorators: [{
|
|
16
|
-
type: Injectable,
|
|
17
|
-
args: [{
|
|
18
|
-
providedIn: 'root',
|
|
19
|
-
}]
|
|
20
|
-
}] });
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export const trackBy = (key) => (_, item) => item[key];
|
|
4
|
+
export const trackByDeep = (
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
6
|
+
...keys) => (_, item) => keys.reduce((acc, key) => acc[key], item);
|
|
7
|
+
export class TrackByService {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.by = trackBy;
|
|
10
|
+
this.byDeep = trackByDeep;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
TrackByService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: TrackByService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
14
|
+
TrackByService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: TrackByService, providedIn: 'root' });
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: TrackByService, decorators: [{
|
|
16
|
+
type: Injectable,
|
|
17
|
+
args: [{
|
|
18
|
+
providedIn: 'root',
|
|
19
|
+
}]
|
|
20
|
+
}] });
|
|
21
21
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2stYnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2xpYi9zZXJ2aWNlcy90cmFjay1ieS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQW1CLE1BQU0sZUFBZSxDQUFDOztBQUc1RCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQ2xCLENBQVUsR0FBWSxFQUFzQixFQUFFLENBQzlDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRWQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUN0QjtBQUNFLHdEQUF3RDtBQUN4RCxHQUFHLElBQTJDLEVBQzFCLEVBQUUsQ0FDeEIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FDVixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBSzlDLE1BQU0sT0FBTyxjQUFjO0lBSDNCO1FBSUUsT0FBRSxHQUFHLE9BQU8sQ0FBQztRQUViLFdBQU0sR0FBRyxXQUFXLENBQUM7S0FDdEI7OzRHQUpZLGNBQWM7Z0hBQWQsY0FBYyxjQUZiLE1BQU07NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBUcmFja0J5RnVuY3Rpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE8gfSBmcm9tICd0cy10b29sYmVsdCc7XG5cbmV4cG9ydCBjb25zdCB0cmFja0J5ID1cbiAgPFQgPSBhbnk+KGtleToga2V5b2YgVCk6IFRyYWNrQnlGdW5jdGlvbjxUPiA9PlxuICAoXywgaXRlbSkgPT5cbiAgICBpdGVtW2tleV07XG5cbmV4cG9ydCBjb25zdCB0cmFja0J5RGVlcCA9XG4gIDxUID0gYW55PihcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAgIC4uLmtleXM6IFQgZXh0ZW5kcyBvYmplY3QgPyBPLlBhdGhzPFQ+IDogbmV2ZXJcbiAgKTogVHJhY2tCeUZ1bmN0aW9uPFQ+ID0+XG4gIChfLCBpdGVtKSA9PlxuICAgIGtleXMucmVkdWNlKChhY2MsIGtleSkgPT4gYWNjW2tleV0sIGl0ZW0pO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHJhY2tCeVNlcnZpY2U8SXRlbVR5cGUgPSBhbnk+IHtcbiAgYnkgPSB0cmFja0J5O1xuXG4gIGJ5RGVlcCA9IHRyYWNrQnlEZWVwO1xufVxuIl19
|
|
@@ -1,202 +1,202 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { OAuthErrorEvent, OAuthInfoEvent, OAuthService } from 'angular-oauth2-oidc';
|
|
5
|
-
import { from, of, pipe } from 'rxjs';
|
|
6
|
-
import { filter, switchMap, tap } from 'rxjs/operators';
|
|
7
|
-
import { ConfigStateService } from '../services/config-state.service';
|
|
8
|
-
import { EnvironmentService } from '../services/environment.service';
|
|
9
|
-
import { HttpErrorReporterService } from '../services/http-error-reporter.service';
|
|
10
|
-
import { SessionStateService } from '../services/session-state.service';
|
|
11
|
-
import { TENANT_KEY } from '../tokens/tenant-key.token';
|
|
12
|
-
import { removeRememberMe, setRememberMe } from '../utils/auth-utils';
|
|
13
|
-
import { noop } from '../utils/common-utils';
|
|
14
|
-
export const oAuthStorage = localStorage;
|
|
15
|
-
export class AuthFlowStrategy {
|
|
16
|
-
constructor(injector) {
|
|
17
|
-
this.injector = injector;
|
|
18
|
-
this.catchError = err => {
|
|
19
|
-
this.httpErrorReporter.reportError(err);
|
|
20
|
-
return of(null);
|
|
21
|
-
};
|
|
22
|
-
this.httpErrorReporter = injector.get(HttpErrorReporterService);
|
|
23
|
-
this.environment = injector.get(EnvironmentService);
|
|
24
|
-
this.configState = injector.get(ConfigStateService);
|
|
25
|
-
this.oAuthService = injector.get(OAuthService);
|
|
26
|
-
this.sessionState = injector.get(SessionStateService);
|
|
27
|
-
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig;
|
|
28
|
-
this.tenantKey = injector.get(TENANT_KEY);
|
|
29
|
-
this.listenToOauthErrors();
|
|
30
|
-
}
|
|
31
|
-
init() {
|
|
32
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
const shouldClear = shouldStorageClear(this.environment.getEnvironment().oAuthConfig.clientId, oAuthStorage);
|
|
34
|
-
if (shouldClear)
|
|
35
|
-
clearOAuthStorage(oAuthStorage);
|
|
36
|
-
this.oAuthService.configure(this.oAuthConfig);
|
|
37
|
-
this.oAuthService.events
|
|
38
|
-
.pipe(filter(event => event.type === 'token_refresh_error'))
|
|
39
|
-
.subscribe(() => this.navigateToLogin());
|
|
40
|
-
return this.oAuthService
|
|
41
|
-
.loadDiscoveryDocument()
|
|
42
|
-
.then(() => {
|
|
43
|
-
if (this.oAuthService.hasValidAccessToken() || !this.oAuthService.getRefreshToken()) {
|
|
44
|
-
return Promise.resolve();
|
|
45
|
-
}
|
|
46
|
-
return this.refreshToken();
|
|
47
|
-
})
|
|
48
|
-
.catch(this.catchError);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
refreshToken() {
|
|
52
|
-
return this.oAuthService.refreshToken().catch(() => clearOAuthStorage());
|
|
53
|
-
}
|
|
54
|
-
listenToOauthErrors() {
|
|
55
|
-
this.oAuthService.events
|
|
56
|
-
.pipe(filter(event => event instanceof OAuthErrorEvent), tap(() => clearOAuthStorage()), switchMap(() => this.configState.refreshAppState()))
|
|
57
|
-
.subscribe();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
export class AuthCodeFlowStrategy extends AuthFlowStrategy {
|
|
61
|
-
constructor() {
|
|
62
|
-
super(...arguments);
|
|
63
|
-
this.isInternalAuth = false;
|
|
64
|
-
}
|
|
65
|
-
init() {
|
|
66
|
-
const _super = Object.create(null, {
|
|
67
|
-
init: { get: () => super.init }
|
|
68
|
-
});
|
|
69
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
return _super.init.call(this)
|
|
71
|
-
.then(() => this.oAuthService.tryLogin().catch(noop))
|
|
72
|
-
.then(() => this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token'));
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
navigateToLogin(queryParams) {
|
|
76
|
-
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
77
|
-
}
|
|
78
|
-
checkIfInternalAuth(queryParams) {
|
|
79
|
-
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
logout(queryParams) {
|
|
83
|
-
return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams)));
|
|
84
|
-
}
|
|
85
|
-
login(queryParams) {
|
|
86
|
-
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
87
|
-
return of(null);
|
|
88
|
-
}
|
|
89
|
-
getCultureParams(queryParams) {
|
|
90
|
-
const lang = this.sessionState.getLanguage();
|
|
91
|
-
const culture = { culture: lang, 'ui-culture': lang };
|
|
92
|
-
return Object.assign(Object.assign({}, (lang && culture)), queryParams);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
|
|
96
|
-
constructor() {
|
|
97
|
-
super(...arguments);
|
|
98
|
-
this.isInternalAuth = true;
|
|
99
|
-
this.cookieKey = 'rememberMe';
|
|
100
|
-
this.storageKey = 'passwordFlow';
|
|
101
|
-
}
|
|
102
|
-
listenToTokenExpiration() {
|
|
103
|
-
this.oAuthService.events
|
|
104
|
-
.pipe(filter(event => event instanceof OAuthInfoEvent &&
|
|
105
|
-
event.type === 'token_expires' &&
|
|
106
|
-
event.info === 'access_token'))
|
|
107
|
-
.subscribe(() => {
|
|
108
|
-
if (this.oAuthService.getRefreshToken()) {
|
|
109
|
-
this.refreshToken();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
this.oAuthService.logOut();
|
|
113
|
-
removeRememberMe();
|
|
114
|
-
this.configState.refreshAppState().subscribe();
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
init() {
|
|
119
|
-
const _super = Object.create(null, {
|
|
120
|
-
init: { get: () => super.init }
|
|
121
|
-
});
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
if (!getCookieValueByName(this.cookieKey) && localStorage.getItem(this.storageKey)) {
|
|
124
|
-
this.oAuthService.logOut();
|
|
125
|
-
}
|
|
126
|
-
return _super.init.call(this).then(() => this.listenToTokenExpiration());
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
navigateToLogin(queryParams) {
|
|
130
|
-
const router = this.injector.get(Router);
|
|
131
|
-
router.navigate(['/account/login'], { queryParams });
|
|
132
|
-
}
|
|
133
|
-
checkIfInternalAuth() {
|
|
134
|
-
return true;
|
|
135
|
-
}
|
|
136
|
-
login(params) {
|
|
137
|
-
const tenant = this.sessionState.getTenant();
|
|
138
|
-
return from(this.oAuthService.fetchTokenUsingPasswordFlow(params.username, params.password, new HttpHeaders(Object.assign({}, (tenant && tenant.id && { [this.tenantKey]: tenant.id }))))).pipe(this.pipeToLogin(params));
|
|
139
|
-
}
|
|
140
|
-
pipeToLogin(params) {
|
|
141
|
-
const router = this.injector.get(Router);
|
|
142
|
-
return pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
143
|
-
setRememberMe(params.rememberMe);
|
|
144
|
-
if (params.redirectUrl)
|
|
145
|
-
router.navigate([params.redirectUrl]);
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
148
|
-
logout(queryParams) {
|
|
149
|
-
const router = this.injector.get(Router);
|
|
150
|
-
return from(this.oAuthService.revokeTokenAndLogout(queryParams)).pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
151
|
-
router.navigateByUrl('/');
|
|
152
|
-
removeRememberMe();
|
|
153
|
-
}));
|
|
154
|
-
}
|
|
155
|
-
refreshToken() {
|
|
156
|
-
return this.oAuthService.refreshToken().catch(() => {
|
|
157
|
-
clearOAuthStorage();
|
|
158
|
-
removeRememberMe();
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
export const AUTH_FLOW_STRATEGY = {
|
|
163
|
-
Code(injector) {
|
|
164
|
-
return new AuthCodeFlowStrategy(injector);
|
|
165
|
-
},
|
|
166
|
-
Password(injector) {
|
|
167
|
-
return new AuthPasswordFlowStrategy(injector);
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
export function clearOAuthStorage(storage = oAuthStorage) {
|
|
171
|
-
const keys = [
|
|
172
|
-
'access_token',
|
|
173
|
-
'id_token',
|
|
174
|
-
'refresh_token',
|
|
175
|
-
'nonce',
|
|
176
|
-
'PKCE_verifier',
|
|
177
|
-
'expires_at',
|
|
178
|
-
'id_token_claims_obj',
|
|
179
|
-
'id_token_expires_at',
|
|
180
|
-
'id_token_stored_at',
|
|
181
|
-
'access_token_stored_at',
|
|
182
|
-
'granted_scopes',
|
|
183
|
-
'session_state',
|
|
184
|
-
];
|
|
185
|
-
keys.forEach(key => storage.removeItem(key));
|
|
186
|
-
}
|
|
187
|
-
function shouldStorageClear(clientId, storage) {
|
|
188
|
-
const key = 'abpOAuthClientId';
|
|
189
|
-
if (!storage.getItem(key)) {
|
|
190
|
-
storage.setItem(key, clientId);
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
const shouldClear = storage.getItem(key) !== clientId;
|
|
194
|
-
if (shouldClear)
|
|
195
|
-
storage.setItem(key, clientId);
|
|
196
|
-
return shouldClear;
|
|
197
|
-
}
|
|
198
|
-
function getCookieValueByName(name) {
|
|
199
|
-
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
200
|
-
return match ? match[2] : '';
|
|
201
|
-
}
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { Router } from '@angular/router';
|
|
4
|
+
import { OAuthErrorEvent, OAuthInfoEvent, OAuthService } from 'angular-oauth2-oidc';
|
|
5
|
+
import { from, of, pipe } from 'rxjs';
|
|
6
|
+
import { filter, switchMap, tap } from 'rxjs/operators';
|
|
7
|
+
import { ConfigStateService } from '../services/config-state.service';
|
|
8
|
+
import { EnvironmentService } from '../services/environment.service';
|
|
9
|
+
import { HttpErrorReporterService } from '../services/http-error-reporter.service';
|
|
10
|
+
import { SessionStateService } from '../services/session-state.service';
|
|
11
|
+
import { TENANT_KEY } from '../tokens/tenant-key.token';
|
|
12
|
+
import { removeRememberMe, setRememberMe } from '../utils/auth-utils';
|
|
13
|
+
import { noop } from '../utils/common-utils';
|
|
14
|
+
export const oAuthStorage = localStorage;
|
|
15
|
+
export class AuthFlowStrategy {
|
|
16
|
+
constructor(injector) {
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.catchError = err => {
|
|
19
|
+
this.httpErrorReporter.reportError(err);
|
|
20
|
+
return of(null);
|
|
21
|
+
};
|
|
22
|
+
this.httpErrorReporter = injector.get(HttpErrorReporterService);
|
|
23
|
+
this.environment = injector.get(EnvironmentService);
|
|
24
|
+
this.configState = injector.get(ConfigStateService);
|
|
25
|
+
this.oAuthService = injector.get(OAuthService);
|
|
26
|
+
this.sessionState = injector.get(SessionStateService);
|
|
27
|
+
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig;
|
|
28
|
+
this.tenantKey = injector.get(TENANT_KEY);
|
|
29
|
+
this.listenToOauthErrors();
|
|
30
|
+
}
|
|
31
|
+
init() {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
const shouldClear = shouldStorageClear(this.environment.getEnvironment().oAuthConfig.clientId, oAuthStorage);
|
|
34
|
+
if (shouldClear)
|
|
35
|
+
clearOAuthStorage(oAuthStorage);
|
|
36
|
+
this.oAuthService.configure(this.oAuthConfig);
|
|
37
|
+
this.oAuthService.events
|
|
38
|
+
.pipe(filter(event => event.type === 'token_refresh_error'))
|
|
39
|
+
.subscribe(() => this.navigateToLogin());
|
|
40
|
+
return this.oAuthService
|
|
41
|
+
.loadDiscoveryDocument()
|
|
42
|
+
.then(() => {
|
|
43
|
+
if (this.oAuthService.hasValidAccessToken() || !this.oAuthService.getRefreshToken()) {
|
|
44
|
+
return Promise.resolve();
|
|
45
|
+
}
|
|
46
|
+
return this.refreshToken();
|
|
47
|
+
})
|
|
48
|
+
.catch(this.catchError);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
refreshToken() {
|
|
52
|
+
return this.oAuthService.refreshToken().catch(() => clearOAuthStorage());
|
|
53
|
+
}
|
|
54
|
+
listenToOauthErrors() {
|
|
55
|
+
this.oAuthService.events
|
|
56
|
+
.pipe(filter(event => event instanceof OAuthErrorEvent), tap(() => clearOAuthStorage()), switchMap(() => this.configState.refreshAppState()))
|
|
57
|
+
.subscribe();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class AuthCodeFlowStrategy extends AuthFlowStrategy {
|
|
61
|
+
constructor() {
|
|
62
|
+
super(...arguments);
|
|
63
|
+
this.isInternalAuth = false;
|
|
64
|
+
}
|
|
65
|
+
init() {
|
|
66
|
+
const _super = Object.create(null, {
|
|
67
|
+
init: { get: () => super.init }
|
|
68
|
+
});
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
return _super.init.call(this)
|
|
71
|
+
.then(() => this.oAuthService.tryLogin().catch(noop))
|
|
72
|
+
.then(() => this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token'));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
navigateToLogin(queryParams) {
|
|
76
|
+
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
77
|
+
}
|
|
78
|
+
checkIfInternalAuth(queryParams) {
|
|
79
|
+
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
logout(queryParams) {
|
|
83
|
+
return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams)));
|
|
84
|
+
}
|
|
85
|
+
login(queryParams) {
|
|
86
|
+
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
87
|
+
return of(null);
|
|
88
|
+
}
|
|
89
|
+
getCultureParams(queryParams) {
|
|
90
|
+
const lang = this.sessionState.getLanguage();
|
|
91
|
+
const culture = { culture: lang, 'ui-culture': lang };
|
|
92
|
+
return Object.assign(Object.assign({}, (lang && culture)), queryParams);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
|
|
96
|
+
constructor() {
|
|
97
|
+
super(...arguments);
|
|
98
|
+
this.isInternalAuth = true;
|
|
99
|
+
this.cookieKey = 'rememberMe';
|
|
100
|
+
this.storageKey = 'passwordFlow';
|
|
101
|
+
}
|
|
102
|
+
listenToTokenExpiration() {
|
|
103
|
+
this.oAuthService.events
|
|
104
|
+
.pipe(filter(event => event instanceof OAuthInfoEvent &&
|
|
105
|
+
event.type === 'token_expires' &&
|
|
106
|
+
event.info === 'access_token'))
|
|
107
|
+
.subscribe(() => {
|
|
108
|
+
if (this.oAuthService.getRefreshToken()) {
|
|
109
|
+
this.refreshToken();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.oAuthService.logOut();
|
|
113
|
+
removeRememberMe();
|
|
114
|
+
this.configState.refreshAppState().subscribe();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
init() {
|
|
119
|
+
const _super = Object.create(null, {
|
|
120
|
+
init: { get: () => super.init }
|
|
121
|
+
});
|
|
122
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
+
if (!getCookieValueByName(this.cookieKey) && localStorage.getItem(this.storageKey)) {
|
|
124
|
+
this.oAuthService.logOut();
|
|
125
|
+
}
|
|
126
|
+
return _super.init.call(this).then(() => this.listenToTokenExpiration());
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
navigateToLogin(queryParams) {
|
|
130
|
+
const router = this.injector.get(Router);
|
|
131
|
+
router.navigate(['/account/login'], { queryParams });
|
|
132
|
+
}
|
|
133
|
+
checkIfInternalAuth() {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
login(params) {
|
|
137
|
+
const tenant = this.sessionState.getTenant();
|
|
138
|
+
return from(this.oAuthService.fetchTokenUsingPasswordFlow(params.username, params.password, new HttpHeaders(Object.assign({}, (tenant && tenant.id && { [this.tenantKey]: tenant.id }))))).pipe(this.pipeToLogin(params));
|
|
139
|
+
}
|
|
140
|
+
pipeToLogin(params) {
|
|
141
|
+
const router = this.injector.get(Router);
|
|
142
|
+
return pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
143
|
+
setRememberMe(params.rememberMe);
|
|
144
|
+
if (params.redirectUrl)
|
|
145
|
+
router.navigate([params.redirectUrl]);
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
logout(queryParams) {
|
|
149
|
+
const router = this.injector.get(Router);
|
|
150
|
+
return from(this.oAuthService.revokeTokenAndLogout(queryParams)).pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
151
|
+
router.navigateByUrl('/');
|
|
152
|
+
removeRememberMe();
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
refreshToken() {
|
|
156
|
+
return this.oAuthService.refreshToken().catch(() => {
|
|
157
|
+
clearOAuthStorage();
|
|
158
|
+
removeRememberMe();
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export const AUTH_FLOW_STRATEGY = {
|
|
163
|
+
Code(injector) {
|
|
164
|
+
return new AuthCodeFlowStrategy(injector);
|
|
165
|
+
},
|
|
166
|
+
Password(injector) {
|
|
167
|
+
return new AuthPasswordFlowStrategy(injector);
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
export function clearOAuthStorage(storage = oAuthStorage) {
|
|
171
|
+
const keys = [
|
|
172
|
+
'access_token',
|
|
173
|
+
'id_token',
|
|
174
|
+
'refresh_token',
|
|
175
|
+
'nonce',
|
|
176
|
+
'PKCE_verifier',
|
|
177
|
+
'expires_at',
|
|
178
|
+
'id_token_claims_obj',
|
|
179
|
+
'id_token_expires_at',
|
|
180
|
+
'id_token_stored_at',
|
|
181
|
+
'access_token_stored_at',
|
|
182
|
+
'granted_scopes',
|
|
183
|
+
'session_state',
|
|
184
|
+
];
|
|
185
|
+
keys.forEach(key => storage.removeItem(key));
|
|
186
|
+
}
|
|
187
|
+
function shouldStorageClear(clientId, storage) {
|
|
188
|
+
const key = 'abpOAuthClientId';
|
|
189
|
+
if (!storage.getItem(key)) {
|
|
190
|
+
storage.setItem(key, clientId);
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
const shouldClear = storage.getItem(key) !== clientId;
|
|
194
|
+
if (shouldClear)
|
|
195
|
+
storage.setItem(key, clientId);
|
|
196
|
+
return shouldClear;
|
|
197
|
+
}
|
|
198
|
+
function getCookieValueByName(name) {
|
|
199
|
+
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
200
|
+
return match ? match[2] : '';
|
|
201
|
+
}
|
|
202
202
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1mbG93LnN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL3N0cmF0ZWdpZXMvYXV0aC1mbG93LnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLFlBQVksRUFFYixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBcUJwQyxZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBTGhDLGVBQVUsR0FBRyxHQUFHLENBQUMs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UUFDckIsb0JBQW9CO1FBQ3BCLHdCQUF3QjtRQUN4QixnQkFBZ0I7UUFDaEIsZUFBZTtLQUNoQixDQUFDO0lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLE9BQXFCO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDO0lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RCxJQUFJLFdBQVc7UUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhcmFtcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEF1dGhDb25maWcsXG4gIE9BdXRoRXJyb3JFdmVudCxcbiAgT0F1dGhJbmZvRXZlbnQsXG4gIE9BdXRoU2VydmljZSxcbiAgT0F1dGhTdG9yYWdlXG59IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIHBpcGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBMb2dpblBhcmFtcyB9IGZyb20gJy4uL21vZGVscy9hdXRoJztcbmltcG9ydCB7IENvbmZpZ1N0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVwb3J0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaHR0cC1lcnJvci1yZXBvcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlc3Npb25TdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zZXNzaW9uLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVEVOQU5UX0tFWSB9IGZyb20gJy4uL3Rva2Vucy90ZW5hbnQta2V5LnRva2VuJztcbmltcG9ydCB7IHJlbW92ZVJlbWVtYmVyTWUsIHNldFJlbWVtYmVyTWUgfSBmcm9tICcuLi91dGlscy9hdXRoLXV0aWxzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi91dGlscy9jb21tb24tdXRpbHMnO1xuXG5leHBvcnQgY29uc3Qgb0F1dGhTdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aEZsb3dTdHJhdGVneSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzSW50ZXJuYWxBdXRoOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBodHRwRXJyb3JSZXBvcnRlcjogSHR0cEVycm9yUmVwb3J0ZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50U2VydmljZTtcbiAgcHJvdGVjdGVkIGNvbmZpZ1N0YXRlOiBDb25maWdTdGF0ZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBvQXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZTtcbiAgcHJvdGVjdGVkIG9BdXRoQ29uZmlnOiBBdXRoQ29uZmlnO1xuICBwcm90ZWN0ZWQgc2Vzc2lvblN0YXRlOiBTZXNzaW9uU3RhdGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdGVuYW50S2V5OiBzdHJpbmc7XG5cbiAgYWJzdHJhY3QgY2hlY2tJZkludGVybmFsQXV0aChxdWVyeVBhcmFtcz86IFBhcmFtcyk6IGJvb2xlYW47XG4gIGFic3RyYWN0IG5hdmlnYXRlVG9Mb2dpbihxdWVyeVBhcmFtcz86IFBhcmFtcyk6IHZvaWQ7XG4gIGFic3RyYWN0IGxvZ291dChxdWVyeVBhcmFtcz86IFBhcmFtcyk6IE9ic2VydmFibGU8YW55PjtcbiAgYWJzdHJhY3QgbG9naW4ocGFyYW1zPzogTG9naW5QYXJhbXMgfCBQYXJhbXMpOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSBjYXRjaEVycm9yID0gZXJyID0+IHtcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yKGVycik7XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyID0gaW5qZWN0b3IuZ2V0KEh0dHBFcnJvclJlcG9ydGVyU2VydmljZSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGluamVjdG9yLmdldChFbnZpcm9ubWVudFNlcnZpY2UpO1xuICAgIHRoaXMuY29uZmlnU3RhdGUgPSBpbmplY3Rvci5nZXQoQ29uZmlnU3RhdGVTZXJ2aWNlKTtcbiAgICB0aGlzLm9BdXRoU2VydmljZSA9IGluamVjdG9yLmdldChPQXV0aFNlcnZpY2UpO1xuICAgIHRoaXMuc2Vzc2lvblN0YXRlID0gaW5qZWN0b3IuZ2V0KFNlc3Npb25TdGF0ZVNlcnZpY2UpO1xuICAgIHRoaXMub0F1dGhDb25maWcgPSB0aGlzLmVudmlyb25tZW50LmdldEVudmlyb25tZW50KCkub0F1dGhDb25maWc7XG4gICAgdGhpcy50ZW5hbnRLZXkgPSBpbmplY3Rvci5nZXQoVEVOQU5UX0tFWSk7XG5cbiAgICB0aGlzLmxpc3RlblRvT2F1dGhFcnJvcnMoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzaG91bGRDbGVhciA9IHNob3VsZFN0b3JhZ2VDbGVhcihcbiAgICAgIHRoaXMuZW52aXJvbm1lbnQuZ2V0RW52aXJvbm1lbnQoKS5vQXV0aENvbmZpZy5jbGllbnRJZCxcbiAgICAgIG9BdXRoU3RvcmFnZSxcbiAgICApO1xuICAgIGlmIChzaG91bGRDbGVhcikgY2xlYXJPQXV0aFN0b3JhZ2Uob0F1dGhTdG9yYWdlKTtcblxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmNvbmZpZ3VyZSh0aGlzLm9BdXRoQ29uZmlnKTtcblxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmV2ZW50c1xuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnR5cGUgPT09ICd0b2tlbl9yZWZyZXNoX2Vycm9yJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubmF2aWdhdGVUb0xvZ2luKCkpO1xuXG4gICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlXG4gICAgICAubG9hZERpc2NvdmVyeURvY3VtZW50KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub0F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKSB8fCAhdGhpcy5vQXV0aFNlcnZpY2UuZ2V0UmVmcmVzaFRva2VuKCkpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5jYXRjaEVycm9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IGNsZWFyT0F1dGhTdG9yYWdlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RlblRvT2F1dGhFcnJvcnMoKSB7XG4gICAgdGhpcy5vQXV0aFNlcnZpY2UuZXZlbnRzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgT0F1dGhFcnJvckV2ZW50KSxcbiAgICAgICAgdGFwKCgpID0+IGNsZWFyT0F1dGhTdG9yYWdlKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhDb2RlRmxvd1N0cmF0ZWd5IGV4dGVuZHMgQXV0aEZsb3dTdHJhdGVneSB7XG4gIHJlYWRvbmx5IGlzSW50ZXJuYWxBdXRoID0gZmFsc2U7XG5cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5pbml0KClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMub0F1dGhTZXJ2aWNlLnRyeUxvZ2luKCkuY2F0Y2gobm9vcCkpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm9BdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goe30sICdhY2Nlc3NfdG9rZW4nKSk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvTG9naW4ocXVlcnlQYXJhbXM/OiBQYXJhbXMpIHtcbiAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0Q29kZUZsb3coJycsIHRoaXMuZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICB9XG5cbiAgY2hlY2tJZkludGVybmFsQXV0aChxdWVyeVBhcmFtcz86IFBhcmFtcykge1xuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmluaXRDb2RlRmxvdygnJywgdGhpcy5nZXRDdWx0dXJlUGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nb3V0KHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5vQXV0aFNlcnZpY2UucmV2b2tlVG9rZW5BbmRMb2dvdXQodGhpcy5nZXRDdWx0dXJlUGFyYW1zKHF1ZXJ5UGFyYW1zKSkpO1xuICB9XG5cbiAgbG9naW4ocXVlcnlQYXJhbXM/OiBQYXJhbXMpIHtcbiAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0Q29kZUZsb3coJycsIHRoaXMuZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcz86IFBhcmFtcykge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLnNlc3Npb25TdGF0ZS5nZXRMYW5ndWFnZSgpO1xuICAgIGNvbnN0IGN1bHR1cmUgPSB7IGN1bHR1cmU6IGxhbmcsICd1aS1jdWx0dXJlJzogbGFuZyB9O1xuICAgIHJldHVybiB7IC4uLihsYW5nICYmIGN1bHR1cmUpLCAuLi5xdWVyeVBhcmFtcyB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoUGFzc3dvcmRGbG93U3RyYXRlZ3kgZXh0ZW5kcyBBdXRoRmxvd1N0cmF0ZWd5IHtcbiAgcmVhZG9ubHkgaXNJbnRlcm5hbEF1dGggPSB0cnVlO1xuICBwcml2YXRlIGNvb2tpZUtleSA9ICdyZW1lbWJlck1lJztcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5ID0gJ3Bhc3N3b3JkRmxvdyc7XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Ub1Rva2VuRXhwaXJhdGlvbigpIHtcbiAgICB0aGlzLm9BdXRoU2VydmljZS5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgZXZlbnQgPT5cbiAgICAgICAgICAgIGV2ZW50IGluc3RhbmNlb2YgT0F1dGhJbmZvRXZlbnQgJiZcbiAgICAgICAgICAgIGV2ZW50LnR5cGUgPT09ICd0b2tlbl9leHBpcmVzJyAmJlxuICAgICAgICAgICAgZXZlbnQuaW5mbyA9PT0gJ2FjY2Vzc190b2tlbicsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub0F1dGhTZXJ2aWNlLmdldFJlZnJlc2hUb2tlbigpKSB7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9BdXRoU2VydmljZS5sb2dPdXQoKTtcbiAgICAgICAgICByZW1vdmVSZW1lbWJlck1lKCk7XG4gICAgICAgICAgdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0KCkge1xuICAgIGlmICghZ2V0Q29va2llVmFsdWVCeU5hbWUodGhpcy5jb29raWVLZXkpICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSkpIHtcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmxvZ091dCgpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5pbml0KCkudGhlbigoKSA9PiB0aGlzLmxpc3RlblRvVG9rZW5FeHBpcmF0aW9uKCkpO1xuICB9XG5cbiAgbmF2aWdhdGVUb0xvZ2luKHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICByb3V0ZXIubmF2aWdhdGUoWycvYWNjb3VudC9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG5cbiAgY2hlY2tJZkludGVybmFsQXV0aCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxvZ2luKHBhcmFtczogTG9naW5QYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuc2Vzc2lvblN0YXRlLmdldFRlbmFudCgpO1xuXG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5mZXRjaFRva2VuVXNpbmdQYXNzd29yZEZsb3coXG4gICAgICAgIHBhcmFtcy51c2VybmFtZSxcbiAgICAgICAgcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICBuZXcgSHR0cEhlYWRlcnMoeyAuLi4odGVuYW50ICYmIHRlbmFudC5pZCAmJiB7IFt0aGlzLnRlbmFudEtleV06IHRlbmFudC5pZCB9KSB9KSxcbiAgICAgICksXG4gICAgKS5waXBlKHRoaXMucGlwZVRvTG9naW4ocGFyYW1zKSk7XG4gIH1cblxuICBwaXBlVG9Mb2dpbihwYXJhbXM6IFBpY2s8TG9naW5QYXJhbXMsICdyZWRpcmVjdFVybCcgfCAncmVtZW1iZXJNZSc+KSB7XG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcblxuICAgIHJldHVybiBwaXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlnU3RhdGUucmVmcmVzaEFwcFN0YXRlKCkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgc2V0UmVtZW1iZXJNZShwYXJhbXMucmVtZW1iZXJNZSk7XG4gICAgICAgIGlmIChwYXJhbXMucmVkaXJlY3RVcmwpIHJvdXRlci5uYXZpZ2F0ZShbcGFyYW1zLnJlZGlyZWN0VXJsXSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbG9nb3V0KHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcblxuICAgIHJldHVybiBmcm9tKHRoaXMub0F1dGhTZXJ2aWNlLnJldm9rZVRva2VuQW5kTG9nb3V0KHF1ZXJ5UGFyYW1zKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNvbmZpZ1N0YXRlLnJlZnJlc2hBcHBTdGF0ZSgpKSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJyk7XG4gICAgICAgIHJlbW92ZVJlbWVtYmVyTWUoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLm9BdXRoU2VydmljZS5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICBjbGVhck9BdXRoU3RvcmFnZSgpO1xuICAgICAgcmVtb3ZlUmVtZW1iZXJNZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBVVRIX0ZMT1dfU1RSQVRFR1kgPSB7XG4gIENvZGUoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgcmV0dXJuIG5ldyBBdXRoQ29kZUZsb3dTdHJhdGVneShpbmplY3Rvcik7XG4gIH0sXG4gIFBhc3N3b3JkKGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHJldHVybiBuZXcgQXV0aFBhc3N3b3JkRmxvd1N0cmF0ZWd5KGluamVjdG9yKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck9BdXRoU3RvcmFnZShzdG9yYWdlOiBPQXV0aFN0b3JhZ2UgPSBvQXV0aFN0b3JhZ2UpIHtcbiAgY29uc3Qga2V5cyA9IFtcbiAgICAnYWNjZXNzX3Rva2VuJyxcbiAgICAnaWRfdG9rZW4nLFxuICAgICdyZWZyZXNoX3Rva2VuJyxcbiAgICAnbm9uY2UnLFxuICAgICdQS0NFX3ZlcmlmaWVyJyxcbiAgICAnZXhwaXJlc19hdCcsXG4gICAgJ2lkX3Rva2VuX2NsYWltc19vYmonLFxuICAgICdpZF90b2tlbl9leHBpcmVzX2F0JyxcbiAgICAnaWRfdG9rZW5fc3RvcmVkX2F0JyxcbiAgICAnYWNjZXNzX3Rva2VuX3N0b3JlZF9hdCcsXG4gICAgJ2dyYW50ZWRfc2NvcGVzJyxcbiAgICAnc2Vzc2lvbl9zdGF0ZScsXG4gIF07XG5cbiAga2V5cy5mb3JFYWNoKGtleSA9PiBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3JhZ2VDbGVhcihjbGllbnRJZDogc3RyaW5nLCBzdG9yYWdlOiBPQXV0aFN0b3JhZ2UpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5ID0gJ2FicE9BdXRoQ2xpZW50SWQnO1xuICBpZiAoIXN0b3JhZ2UuZ2V0SXRlbShrZXkpKSB7XG4gICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgY2xpZW50SWQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZENsZWFyID0gc3RvcmFnZS5nZXRJdGVtKGtleSkgIT09IGNsaWVudElkO1xuICBpZiAoc2hvdWxkQ2xlYXIpIHN0b3JhZ2Uuc2V0SXRlbShrZXksIGNsaWVudElkKTtcbiAgcmV0dXJuIHNob3VsZENsZWFyO1xufVxuXG5mdW5jdGlvbiBnZXRDb29raWVWYWx1ZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58ICknICsgbmFtZSArICc9KFteO10rKScpKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMl0gOiAnJztcbn1cbiJdfQ==
|