@lifeready/core 0.6.0-beta.1
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/README.md +62 -0
- package/bundles/lifeready-core.umd.js +15939 -0
- package/bundles/lifeready-core.umd.js.map +1 -0
- package/bundles/lifeready-core.umd.min.js +2 -0
- package/bundles/lifeready-core.umd.min.js.map +1 -0
- package/esm2015/lib/_common/ast.js +40 -0
- package/esm2015/lib/_common/deferred-promise.js +24 -0
- package/esm2015/lib/_common/exceptions.js +157 -0
- package/esm2015/lib/_common/queries.gql.js +190 -0
- package/esm2015/lib/_common/run-outside-angular.js +79 -0
- package/esm2015/lib/_common/types.js +1 -0
- package/esm2015/lib/_common/utils.js +44 -0
- package/esm2015/lib/api/contact-card.gql.js +79 -0
- package/esm2015/lib/api/contact-card.service.js +154 -0
- package/esm2015/lib/api/contact-card2.gql.js +60 -0
- package/esm2015/lib/api/contact-card2.service.js +103 -0
- package/esm2015/lib/api/file.service.js +74 -0
- package/esm2015/lib/api/item2.gql.js +110 -0
- package/esm2015/lib/api/item2.service.js +311 -0
- package/esm2015/lib/api/key-exchange.gql.js +188 -0
- package/esm2015/lib/api/key-exchange.service.js +442 -0
- package/esm2015/lib/api/key-exchange.types.js +18 -0
- package/esm2015/lib/api/key-exchange2.gql.js +171 -0
- package/esm2015/lib/api/key-exchange2.service.js +479 -0
- package/esm2015/lib/api/lock.gql.js +40 -0
- package/esm2015/lib/api/lock.service.js +64 -0
- package/esm2015/lib/api/lr-apollo.service.js +46 -0
- package/esm2015/lib/api/lr-graphql/index.js +6 -0
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
- package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
- package/esm2015/lib/api/message.service.js +138 -0
- package/esm2015/lib/api/persist.service.js +181 -0
- package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
- package/esm2015/lib/api/query-processor/index.js +3 -0
- package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
- package/esm2015/lib/api/shared-contact-card.service.js +119 -0
- package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/api/time.service.js +146 -0
- package/esm2015/lib/api/types/graphql.types.js +7 -0
- package/esm2015/lib/api/types/index.js +3 -0
- package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
- package/esm2015/lib/auth/auth.config.js +57 -0
- package/esm2015/lib/auth/auth.gql.js +48 -0
- package/esm2015/lib/auth/auth.types.js +27 -0
- package/esm2015/lib/auth/idle.service.js +168 -0
- package/esm2015/lib/auth/idle.types.js +7 -0
- package/esm2015/lib/auth/lbop.service.js +355 -0
- package/esm2015/lib/auth/life-ready-auth.service.js +333 -0
- package/esm2015/lib/auth/password.service.js +320 -0
- package/esm2015/lib/auth/register.service.js +172 -0
- package/esm2015/lib/auth/two-factor.service.js +74 -0
- package/esm2015/lib/category/category-meta.service.js +99 -0
- package/esm2015/lib/category/category.gql.js +406 -0
- package/esm2015/lib/category/category.service.js +390 -0
- package/esm2015/lib/category/category.types.js +29 -0
- package/esm2015/lib/cryptography/cryptography.types.js +11 -0
- package/esm2015/lib/cryptography/encryption.service.js +189 -0
- package/esm2015/lib/cryptography/key-factory.service.js +237 -0
- package/esm2015/lib/cryptography/key-graph.service.js +280 -0
- package/esm2015/lib/cryptography/key-meta.service.js +200 -0
- package/esm2015/lib/cryptography/key.service.js +124 -0
- package/esm2015/lib/cryptography/slip39.service.js +169 -0
- package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
- package/esm2015/lib/life-ready.config.js +84 -0
- package/esm2015/lib/life-ready.module.js +74 -0
- package/esm2015/lib/plan/plan.gql.js +123 -0
- package/esm2015/lib/plan/plan.service.js +149 -0
- package/esm2015/lib/plan/plan.types.js +11 -0
- package/esm2015/lib/record/record-attachment.service.js +101 -0
- package/esm2015/lib/record/record.gql.js +179 -0
- package/esm2015/lib/record/record.service.js +206 -0
- package/esm2015/lib/record/record.types.js +15 -0
- package/esm2015/lib/record-type/record-type.service.js +75 -0
- package/esm2015/lib/record-type/record-type.types.js +28 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
- package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
- package/esm2015/lib/scenario/scenario.gql.js +368 -0
- package/esm2015/lib/scenario/scenario.service.js +611 -0
- package/esm2015/lib/scenario/scenario.types.js +64 -0
- package/esm2015/lib/search/search.gql.js +62 -0
- package/esm2015/lib/search/search.service.js +156 -0
- package/esm2015/lib/search/search.types.js +6 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +266 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +300 -0
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
- package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
- package/esm2015/lib/users/profile-details.service.js +214 -0
- package/esm2015/lib/users/profile.gql.js +97 -0
- package/esm2015/lib/users/profile.service.js +169 -0
- package/esm2015/lib/users/profile.types.js +34 -0
- package/esm2015/lib/users/user.gql.js +60 -0
- package/esm2015/lib/users/user.service.js +79 -0
- package/esm2015/lib/users/user.types.js +5 -0
- package/esm2015/lifeready-core.js +10 -0
- package/esm2015/public-api.js +81 -0
- package/fesm2015/lifeready-core.js +13290 -0
- package/fesm2015/lifeready-core.js.map +1 -0
- package/lib/_common/ast.d.ts +11 -0
- package/lib/_common/deferred-promise.d.ts +12 -0
- package/lib/_common/exceptions.d.ts +109 -0
- package/lib/_common/queries.gql.d.ts +10 -0
- package/lib/_common/run-outside-angular.d.ts +14 -0
- package/lib/_common/types.d.ts +10 -0
- package/lib/_common/utils.d.ts +3 -0
- package/lib/api/contact-card.gql.d.ts +7 -0
- package/lib/api/contact-card.service.d.ts +52 -0
- package/lib/api/contact-card2.gql.d.ts +34 -0
- package/lib/api/contact-card2.service.d.ts +49 -0
- package/lib/api/file.service.d.ts +18 -0
- package/lib/api/item2.gql.d.ts +96 -0
- package/lib/api/item2.service.d.ts +177 -0
- package/lib/api/key-exchange.gql.d.ts +9 -0
- package/lib/api/key-exchange.service.d.ts +39 -0
- package/lib/api/key-exchange.types.d.ts +196 -0
- package/lib/api/key-exchange2.gql.d.ts +125 -0
- package/lib/api/key-exchange2.service.d.ts +187 -0
- package/lib/api/lock.gql.d.ts +27 -0
- package/lib/api/lock.service.d.ts +25 -0
- package/lib/api/lr-apollo.service.d.ts +15 -0
- package/lib/api/lr-graphql/index.d.ts +5 -0
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
- package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
- package/lib/api/lr-graphql/lr.service.d.ts +9 -0
- package/lib/api/message.service.d.ts +58 -0
- package/lib/api/persist.service.d.ts +31 -0
- package/lib/api/query-processor/common-processors.service.d.ts +36 -0
- package/lib/api/query-processor/index.d.ts +2 -0
- package/lib/api/query-processor/query-processor.service.d.ts +18 -0
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
- package/lib/api/shared-contact-card.service.d.ts +33 -0
- package/lib/api/shared-contact-card2.gql.d.ts +36 -0
- package/lib/api/shared-contact-card2.service.d.ts +45 -0
- package/lib/api/time.service.d.ts +16 -0
- package/lib/api/types/graphql.types.d.ts +29 -0
- package/lib/api/types/index.d.ts +2 -0
- package/lib/api/types/lr-graphql.types.d.ts +385 -0
- package/lib/auth/auth.config.d.ts +5 -0
- package/lib/auth/auth.gql.d.ts +15 -0
- package/lib/auth/auth.types.d.ts +66 -0
- package/lib/auth/idle.service.d.ts +40 -0
- package/lib/auth/idle.types.d.ts +10 -0
- package/lib/auth/lbop.service.d.ts +91 -0
- package/lib/auth/life-ready-auth.service.d.ts +46 -0
- package/lib/auth/password.service.d.ts +78 -0
- package/lib/auth/register.service.d.ts +25 -0
- package/lib/auth/two-factor.service.d.ts +15 -0
- package/lib/category/category-meta.service.d.ts +23 -0
- package/lib/category/category.gql.d.ts +45 -0
- package/lib/category/category.service.d.ts +67 -0
- package/lib/category/category.types.d.ts +79 -0
- package/lib/cryptography/cryptography.types.d.ts +83 -0
- package/lib/cryptography/encryption.service.d.ts +41 -0
- package/lib/cryptography/key-factory.service.d.ts +38 -0
- package/lib/cryptography/key-graph.service.d.ts +33 -0
- package/lib/cryptography/key-meta.service.d.ts +44 -0
- package/lib/cryptography/key.service.d.ts +36 -0
- package/lib/cryptography/slip39.service.d.ts +43 -0
- package/lib/cryptography/web-crypto.service.d.ts +5 -0
- package/lib/life-ready.config.d.ts +14 -0
- package/lib/life-ready.module.d.ts +5 -0
- package/lib/plan/plan.gql.d.ts +11 -0
- package/lib/plan/plan.service.d.ts +33 -0
- package/lib/plan/plan.types.d.ts +31 -0
- package/lib/record/record-attachment.service.d.ts +16 -0
- package/lib/record/record.gql.d.ts +14 -0
- package/lib/record/record.service.d.ts +25 -0
- package/lib/record/record.types.d.ts +57 -0
- package/lib/record-type/record-type.service.d.ts +11 -0
- package/lib/record-type/record-type.types.d.ts +50 -0
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
- package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
- package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
- package/lib/scenario/scenario-setup.service.d.ts +22 -0
- package/lib/scenario/scenario.gql.d.ts +34 -0
- package/lib/scenario/scenario.service.d.ts +58 -0
- package/lib/scenario/scenario.types.d.ts +217 -0
- package/lib/search/search.gql.d.ts +1 -0
- package/lib/search/search.service.d.ts +25 -0
- package/lib/search/search.types.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +41 -0
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
- package/lib/trusted-parties/tp-password-reset.service.d.ts +131 -0
- package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
- package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
- package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
- package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
- package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
- package/lib/users/profile-details.service.d.ts +21 -0
- package/lib/users/profile.gql.d.ts +11 -0
- package/lib/users/profile.service.d.ts +35 -0
- package/lib/users/profile.types.d.ts +96 -0
- package/lib/users/user.gql.d.ts +9 -0
- package/lib/users/user.service.d.ts +12 -0
- package/lib/users/user.types.d.ts +23 -0
- package/lifeready-core.d.ts +9 -0
- package/lifeready-core.metadata.json +1 -0
- package/package.json +29 -0
- package/public-api.d.ts +77 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
|
+
import { Idle, DEFAULT_INTERRUPTSOURCES } from '@ng-idle/core';
|
|
4
|
+
import { Keepalive } from '@ng-idle/keepalive';
|
|
5
|
+
import { KeyService } from '../cryptography/key.service';
|
|
6
|
+
import { LrBadArgumentException, LrBadStateException, } from '../_common/exceptions';
|
|
7
|
+
import { LR_CONFIG } from '../life-ready.config';
|
|
8
|
+
import { HttpClient } from '@angular/common/http';
|
|
9
|
+
import { Config } from './idle.types';
|
|
10
|
+
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "../life-ready.config";
|
|
13
|
+
import * as i2 from "@angular/common/http";
|
|
14
|
+
import * as i3 from "@ng-idle/core";
|
|
15
|
+
import * as i4 from "@ng-idle/keepalive";
|
|
16
|
+
import * as i5 from "../cryptography/key.service";
|
|
17
|
+
import * as i6 from "@aws-amplify/auth/lib-esm/Auth";
|
|
18
|
+
export class IdleService {
|
|
19
|
+
constructor(config, http, idle, keepalive, keyService, auth) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.http = http;
|
|
22
|
+
this.idle = idle;
|
|
23
|
+
this.keepalive = keepalive;
|
|
24
|
+
this.keyService = keyService;
|
|
25
|
+
this.auth = auth;
|
|
26
|
+
this.IDLE_EXPIRY_KEY = 'ng2Idle.main.expiry';
|
|
27
|
+
this.IDLING_KEY = 'ng2Idle.main.idling';
|
|
28
|
+
this.initCalled = false;
|
|
29
|
+
}
|
|
30
|
+
assertInit() {
|
|
31
|
+
if (!this.initCalled) {
|
|
32
|
+
throw new LrBadStateException('Call IdleService.init() first.');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
init(params) {
|
|
36
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
37
|
+
if (this.initCalled) {
|
|
38
|
+
throw new LrBadStateException('IdleService.init() can only be called once. IdleService.start() calls init() with default values if init() has not been called yet.');
|
|
39
|
+
}
|
|
40
|
+
this.initCalled = true;
|
|
41
|
+
// Defaults
|
|
42
|
+
params = Object.assign({ onTimeout: null, onKeepalive: null, idleSec: Config.IDLE, timeoutSec: Config.TIMEOUT, keepAliveIntervalSec: Config.KEEP_ALIVE_INTERVAL }, params);
|
|
43
|
+
// If timeoutSec == 0 then the onTimeout() callback is never called.
|
|
44
|
+
if (params.timeoutSec < 0.01) {
|
|
45
|
+
throw new LrBadArgumentException('Minimum value for IdleService.init({ timeoutSec }) is 0.01');
|
|
46
|
+
}
|
|
47
|
+
this.onTimeout = params.onTimeout;
|
|
48
|
+
this.onKeepalive = params.onKeepalive;
|
|
49
|
+
// ------------------------------------------------------------------------
|
|
50
|
+
// Setup Idle
|
|
51
|
+
// ------------------------------------------------------------------------
|
|
52
|
+
// sets an idle timeout of 5 seconds, for testing purposes.
|
|
53
|
+
this.idle.setIdle(params.idleSec);
|
|
54
|
+
// sets a timeout period of 5 seconds. after 10 seconds of inactivity, the user will be considered timed out.
|
|
55
|
+
this.idle.setTimeout(params.timeoutSec);
|
|
56
|
+
// sets the default interrupts, in this case, things like clicks, scrolls, touches to the document
|
|
57
|
+
this.idle.setInterrupts(DEFAULT_INTERRUPTSOURCES);
|
|
58
|
+
this.idle.onIdleEnd.subscribe(() => console.log('Idle stopped'));
|
|
59
|
+
this.idle.onIdleStart.subscribe(() => console.log('Idle started'));
|
|
60
|
+
this.idle.onTimeout.subscribe(() => __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
console.log('Idle timed out');
|
|
62
|
+
this.reset();
|
|
63
|
+
yield Promise.resolve(this.onTimeout && this.onTimeout());
|
|
64
|
+
}));
|
|
65
|
+
this.idle.onTimeoutWarning.subscribe((countdown) => console.log(`Will timeout in ${countdown} seconds!`));
|
|
66
|
+
// ------------------------------------------------------------------------
|
|
67
|
+
// Setup Keepalive
|
|
68
|
+
// ------------------------------------------------------------------------
|
|
69
|
+
// Ref: https://github.com/moribvndvs/ng2-idle#readme
|
|
70
|
+
// ng-idle will instruct @ng-idle/keepalive to ping while the user is active, and stop once
|
|
71
|
+
// they go idle or time out. When the user resumes activity or the idle state is reset, it will
|
|
72
|
+
// ping immediately and then resume pinging.
|
|
73
|
+
this.keepalive.interval(params.keepAliveIntervalSec);
|
|
74
|
+
console.log(`Keep alive interval set at: ${Config.KEEP_ALIVE_INTERVAL} seconds`);
|
|
75
|
+
this.keepalive.onPing.subscribe(() => this.onPing());
|
|
76
|
+
// If the browser tab has been closed for a period longer thant the inactivity
|
|
77
|
+
// period, then we should logout right from the start.
|
|
78
|
+
const idleExpiry = localStorage.getItem(this.IDLE_EXPIRY_KEY);
|
|
79
|
+
if (idleExpiry &&
|
|
80
|
+
parseInt(idleExpiry, 10) + this.idle.getTimeout() * 1000 < Date.now()) {
|
|
81
|
+
this.reset();
|
|
82
|
+
yield Promise.resolve(this.onTimeout && this.onTimeout());
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
keepalivePost() {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
// currentAuthenticatedUser() refreshes the access token if required.
|
|
89
|
+
const cognitoUser = yield this.auth.currentAuthenticatedUser();
|
|
90
|
+
const keepaliveResult = yield this.http
|
|
91
|
+
.post(`${this.config.authUrl}auth/keepalive/`, null, {
|
|
92
|
+
withCredentials: true,
|
|
93
|
+
headers: {
|
|
94
|
+
Authorization: `Bearer ${cognitoUser
|
|
95
|
+
.getSignInUserSession()
|
|
96
|
+
.getAccessToken()
|
|
97
|
+
.getJwtToken()}`,
|
|
98
|
+
},
|
|
99
|
+
})
|
|
100
|
+
.toPromise();
|
|
101
|
+
return {
|
|
102
|
+
keepaliveResult,
|
|
103
|
+
expiresAfterSeconds: this.idle.getIdle() +
|
|
104
|
+
this.idle.getTimeout() +
|
|
105
|
+
this.keepalive.interval(),
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
persistMasterKey(masterKey) {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
// The keepalive API call extends the server-side session, the session cookie expiry, refresh key cookie
|
|
112
|
+
// expiry, and returns the session expiry.
|
|
113
|
+
// NOTE Use time delta rather than absolute time, since client clock and server clock maybe
|
|
114
|
+
// out of sync. We can't use the serverTime() functionality because the cookie expiry still
|
|
115
|
+
// run on local clock.
|
|
116
|
+
const { expiresAfterSeconds } = yield this.keepalivePost();
|
|
117
|
+
// Persist the derived passKey
|
|
118
|
+
yield this.keyService.persistMasterKey(masterKey, expiresAfterSeconds);
|
|
119
|
+
console.log('setMasterKey() done');
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
onPing() {
|
|
123
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
console.log(`Keep alive triggered at time: ${Date.now()}. Interval set at: ${this.keepalive.interval()} seconds`);
|
|
125
|
+
// Keepalive API will extend the session expiry.
|
|
126
|
+
const { expiresAfterSeconds } = yield this.keepalivePost();
|
|
127
|
+
// Extend the expiry of the persisted key
|
|
128
|
+
yield this.keyService.setMasterKeyExpiresAfterSeconds(expiresAfterSeconds);
|
|
129
|
+
yield Promise.resolve(this.onKeepalive && this.onKeepalive());
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
start() {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
if (!this.initCalled) {
|
|
135
|
+
yield this.init();
|
|
136
|
+
}
|
|
137
|
+
if (this.idle.isRunning()) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Ping does not seem to happen right at the start. So we call it explicitly
|
|
141
|
+
yield this.onPing();
|
|
142
|
+
this.idle.watch();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
stop() {
|
|
146
|
+
this.idle.stop();
|
|
147
|
+
this.reset();
|
|
148
|
+
}
|
|
149
|
+
reset() {
|
|
150
|
+
localStorage.removeItem(this.IDLE_EXPIRY_KEY);
|
|
151
|
+
localStorage.removeItem(this.IDLING_KEY);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
IdleService.ɵprov = i0.ɵɵdefineInjectable({ factory: function IdleService_Factory() { return new IdleService(i0.ɵɵinject(i1.LR_CONFIG), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.Idle), i0.ɵɵinject(i4.Keepalive), i0.ɵɵinject(i5.KeyService), i0.ɵɵinject(i6.AuthClass)); }, token: IdleService, providedIn: "root" });
|
|
155
|
+
IdleService.decorators = [
|
|
156
|
+
{ type: Injectable, args: [{
|
|
157
|
+
providedIn: 'root',
|
|
158
|
+
},] }
|
|
159
|
+
];
|
|
160
|
+
IdleService.ctorParameters = () => [
|
|
161
|
+
{ type: undefined, decorators: [{ type: Inject, args: [LR_CONFIG,] }] },
|
|
162
|
+
{ type: HttpClient },
|
|
163
|
+
{ type: Idle },
|
|
164
|
+
{ type: Keepalive },
|
|
165
|
+
{ type: KeyService },
|
|
166
|
+
{ type: AuthClass }
|
|
167
|
+
];
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL3Rlc3QvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXV0aC9pZGxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBbUIsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBR3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7Ozs7QUFjM0QsTUFBTSxPQUFPLFdBQVc7SUFRdEIsWUFDNkIsTUFBdUIsRUFDMUMsSUFBZ0IsRUFDaEIsSUFBVSxFQUNWLFNBQW9CLEVBQ3BCLFVBQXNCLEVBQ3RCLElBQWU7UUFMSSxXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUMxQyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLFNBQUksR0FBSixJQUFJLENBQU07UUFDVixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBVztRQWJSLG9CQUFlLEdBQUcscUJBQXFCLENBQUM7UUFDeEMsZUFBVSxHQUFHLHFCQUFxQixDQUFDO1FBRTVDLGVBQVUsR0FB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QUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFTyxLQUFLO1FBQ1gsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7OztZQXRMRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs0Q0FVSSxNQUFNLFNBQUMsU0FBUztZQTNCWixVQUFVO1lBUlYsSUFBSTtZQUNKLFNBQVM7WUFDVCxVQUFVO1lBVVYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJZGxlLCBERUZBVUxUX0lOVEVSUlVQVFNPVVJDRVMgfSBmcm9tICdAbmctaWRsZS9jb3JlJztcclxuaW1wb3J0IHsgS2VlcGFsaXZlIH0gZnJvbSAnQG5nLWlkbGUva2VlcGFsaXZlJztcclxuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9rZXkuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbixcclxuICBMckJhZFN0YXRlRXhjZXB0aW9uLFxyXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XHJcbmltcG9ydCB7IExpZmVSZWFkeUNvbmZpZywgTFJfQ09ORklHIH0gZnJvbSAnLi4vbGlmZS1yZWFkeS5jb25maWcnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBDb25maWcsIEtlZXBhbGl2ZVJlc3VsdCB9IGZyb20gJy4vaWRsZS50eXBlcyc7XHJcbmltcG9ydCB7IEtleSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9jcnlwdG9ncmFwaHkudHlwZXMnO1xyXG5pbXBvcnQgeyBDb2duaXRvVXNlciB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoJztcclxuaW1wb3J0IHsgQXV0aENsYXNzIH0gZnJvbSAnQGF3cy1hbXBsaWZ5L2F1dGgvbGliLWVzbS9BdXRoJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSWRsZVNlcnZpY2VJbml0IHtcclxuICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSBFdmVudEVtaXR0ZXIgaW5zdGVhZCBvZiBhIGNhbGxiYWNrLlxyXG4gIG9uVGltZW91dD86ICgoKSA9PiBhbnkpIHwgKCgpID0+IFByb21pc2U8YW55PikgfCBudWxsO1xyXG4gIG9uS2VlcGFsaXZlPzogKCgpID0+IGFueSkgfCAoKCkgPT4gUHJvbWlzZTxhbnk+KSB8IG51bGw7XHJcbiAgaWRsZVNlYz86IG51bWJlcjtcclxuICB0aW1lb3V0U2VjPzogbnVtYmVyO1xyXG4gIGtlZXBBbGl2ZUludGVydmFsU2VjPzogbnVtYmVyO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSWRsZVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgSURMRV9FWFBJUllfS0VZID0gJ25nMklkbGUubWFpbi5leHBpcnknO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgSURMSU5HX0tFWSA9ICduZzJJZGxlLm1haW4uaWRsaW5nJztcclxuXHJcbiAgcHJpdmF0ZSBpbml0Q2FsbGVkID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBvblRpbWVvdXQ6ICgoKSA9PiBhbnkpIHwgKCgpID0+IFByb21pc2U8YW55PikgfCBudWxsO1xyXG4gIHByaXZhdGUgb25LZWVwYWxpdmU6ICgoKSA9PiBhbnkpIHwgKCgpID0+IFByb21pc2U8YW55PikgfCBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoTFJfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogTGlmZVJlYWR5Q29uZmlnLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBpZGxlOiBJZGxlLFxyXG4gICAgcHJpdmF0ZSBrZWVwYWxpdmU6IEtlZXBhbGl2ZSxcclxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aDogQXV0aENsYXNzXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGFzc2VydEluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaW5pdENhbGxlZCkge1xyXG4gICAgICB0aHJvdyBuZXcgTHJCYWRTdGF0ZUV4Y2VwdGlvbignQ2FsbCBJZGxlU2VydmljZS5pbml0KCkgZmlyc3QuJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdChwYXJhbXM/OiBJZGxlU2VydmljZUluaXQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0aGlzLmluaXRDYWxsZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IExyQmFkU3RhdGVFeGNlcHRpb24oXHJcbiAgICAgICAgJ0lkbGVTZXJ2aWNlLmluaXQoKSBjYW4gb25seSBiZSBjYWxsZWQgb25jZS4gSWRsZVNlcnZpY2Uuc3RhcnQoKSBjYWxscyBpbml0KCkgd2l0aCBkZWZhdWx0IHZhbHVlcyBpZiBpbml0KCkgaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5pdENhbGxlZCA9IHRydWU7XHJcblxyXG4gICAgLy8gRGVmYXVsdHNcclxuICAgIHBhcmFtcyA9IHtcclxuICAgICAgb25UaW1lb3V0OiBudWxsLFxyXG4gICAgICBvbktlZXBhbGl2ZTogbnVsbCxcclxuICAgICAgaWRsZVNlYzogQ29uZmlnLklETEUsXHJcbiAgICAgIHRpbWVvdXRTZWM6IENvbmZpZy5USU1FT1VULFxyXG4gICAgICBrZWVwQWxpdmVJbnRlcnZhbFNlYzogQ29uZmlnLktFRVBfQUxJVkVfSU5URVJWQUwsXHJcbiAgICAgIC4uLnBhcmFtcyxcclxuICAgIH07XHJcblxyXG4gICAgLy8gSWYgdGltZW91dFNlYyA9PSAwIHRoZW4gdGhlIG9uVGltZW91dCgpIGNhbGxiYWNrIGlzIG5ldmVyIGNhbGxlZC5cclxuICAgIGlmIChwYXJhbXMudGltZW91dFNlYyA8IDAuMDEpIHtcclxuICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24oXHJcbiAgICAgICAgJ01pbmltdW0gdmFsdWUgZm9yIElkbGVTZXJ2aWNlLmluaXQoeyB0aW1lb3V0U2VjIH0pIGlzIDAuMDEnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vblRpbWVvdXQgPSBwYXJhbXMub25UaW1lb3V0O1xyXG4gICAgdGhpcy5vbktlZXBhbGl2ZSA9IHBhcmFtcy5vbktlZXBhbGl2ZTtcclxuXHJcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vIFNldHVwIElkbGVcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gc2V0cyBhbiBpZGxlIHRpbWVvdXQgb2YgNSBzZWNvbmRzLCBmb3IgdGVzdGluZyBwdXJwb3Nlcy5cclxuICAgIHRoaXMuaWRsZS5zZXRJZGxlKHBhcmFtcy5pZGxlU2VjKTtcclxuICAgIC8vIHNldHMgYSB0aW1lb3V0IHBlcmlvZCBvZiA1IHNlY29uZHMuIGFmdGVyIDEwIHNlY29uZHMgb2YgaW5hY3Rpdml0eSwgdGhlIHVzZXIgd2lsbCBiZSBjb25zaWRlcmVkIHRpbWVkIG91dC5cclxuICAgIHRoaXMuaWRsZS5zZXRUaW1lb3V0KHBhcmFtcy50aW1lb3V0U2VjKTtcclxuICAgIC8vIHNldHMgdGhlIGRlZmF1bHQgaW50ZXJydXB0cywgaW4gdGhpcyBjYXNlLCB0aGluZ3MgbGlrZSBjbGlja3MsIHNjcm9sbHMsIHRvdWNoZXMgdG8gdGhlIGRvY3VtZW50XHJcbiAgICB0aGlzLmlkbGUuc2V0SW50ZXJydXB0cyhERUZBVUxUX0lOVEVSUlVQVFNPVVJDRVMpO1xyXG5cclxuICAgIHRoaXMuaWRsZS5vbklkbGVFbmQuc3Vic2NyaWJlKCgpID0+IGNvbnNvbGUubG9nKCdJZGxlIHN0b3BwZWQnKSk7XHJcbiAgICB0aGlzLmlkbGUub25JZGxlU3RhcnQuc3Vic2NyaWJlKCgpID0+IGNvbnNvbGUubG9nKCdJZGxlIHN0YXJ0ZWQnKSk7XHJcblxyXG4gICAgdGhpcy5pZGxlLm9uVGltZW91dC5zdWJzY3JpYmUoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnSWRsZSB0aW1lZCBvdXQnKTtcclxuICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5vblRpbWVvdXQgJiYgdGhpcy5vblRpbWVvdXQoKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuaWRsZS5vblRpbWVvdXRXYXJuaW5nLnN1YnNjcmliZSgoY291bnRkb3duOiBhbnkpID0+XHJcbiAgICAgIGNvbnNvbGUubG9nKGBXaWxsIHRpbWVvdXQgaW4gJHtjb3VudGRvd259IHNlY29uZHMhYClcclxuICAgICk7XHJcblxyXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAvLyBTZXR1cCBLZWVwYWxpdmVcclxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgLy8gUmVmOiBodHRwczovL2dpdGh1Yi5jb20vbW9yaWJ2bmR2cy9uZzItaWRsZSNyZWFkbWVcclxuICAgIC8vIG5nLWlkbGUgd2lsbCBpbnN0cnVjdCBAbmctaWRsZS9rZWVwYWxpdmUgdG8gcGluZyB3aGlsZSB0aGUgdXNlciBpcyBhY3RpdmUsIGFuZCBzdG9wIG9uY2VcclxuICAgIC8vIHRoZXkgZ28gaWRsZSBvciB0aW1lIG91dC4gV2hlbiB0aGUgdXNlciByZXN1bWVzIGFjdGl2aXR5IG9yIHRoZSBpZGxlIHN0YXRlIGlzIHJlc2V0LCBpdCB3aWxsXHJcbiAgICAvLyBwaW5nIGltbWVkaWF0ZWx5IGFuZCB0aGVuIHJlc3VtZSBwaW5naW5nLlxyXG4gICAgdGhpcy5rZWVwYWxpdmUuaW50ZXJ2YWwocGFyYW1zLmtlZXBBbGl2ZUludGVydmFsU2VjKTtcclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBgS2VlcCBhbGl2ZSBpbnRlcnZhbCBzZXQgYXQ6ICR7Q29uZmlnLktFRVBfQUxJVkVfSU5URVJWQUx9IHNlY29uZHNgXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMua2VlcGFsaXZlLm9uUGluZy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblBpbmcoKSk7XHJcblxyXG4gICAgLy8gSWYgdGhlIGJyb3dzZXIgdGFiIGhhcyBiZWVuIGNsb3NlZCBmb3IgYSBwZXJpb2QgbG9uZ2VyIHRoYW50IHRoZSBpbmFjdGl2aXR5XHJcbiAgICAvLyBwZXJpb2QsIHRoZW4gd2Ugc2hvdWxkIGxvZ291dCByaWdodCBmcm9tIHRoZSBzdGFydC5cclxuICAgIGNvbnN0IGlkbGVFeHBpcnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLklETEVfRVhQSVJZX0tFWSk7XHJcbiAgICBpZiAoXHJcbiAgICAgIGlkbGVFeHBpcnkgJiZcclxuICAgICAgcGFyc2VJbnQoaWRsZUV4cGlyeSwgMTApICsgdGhpcy5pZGxlLmdldFRpbWVvdXQoKSAqIDEwMDAgPCBEYXRlLm5vdygpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5yZXNldCgpO1xyXG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5vblRpbWVvdXQgJiYgdGhpcy5vblRpbWVvdXQoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMga2VlcGFsaXZlUG9zdCgpOiBQcm9taXNlPHtcclxuICAgIGV4cGlyZXNBZnRlclNlY29uZHM6IG51bWJlcjtcclxuICAgIGtlZXBhbGl2ZVJlc3VsdDogS2VlcGFsaXZlUmVzdWx0O1xyXG4gIH0+IHtcclxuICAgIC8vIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcigpIHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGlmIHJlcXVpcmVkLlxyXG4gICAgY29uc3QgY29nbml0b1VzZXI6IENvZ25pdG9Vc2VyID0gYXdhaXQgdGhpcy5hdXRoLmN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcigpO1xyXG5cclxuICAgIGNvbnN0IGtlZXBhbGl2ZVJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxLZWVwYWxpdmVSZXN1bHQ+KGAke3RoaXMuY29uZmlnLmF1dGhVcmx9YXV0aC9rZWVwYWxpdmUvYCwgbnVsbCwge1xyXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZSwgLy8gL2F1dGgva2VlcGFsaXZlLyB3aWxsIGJlIGV4dGVuZGluZyB0aGUgc2Vzc2lvbnMgY29va2llLlxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjb2duaXRvVXNlclxyXG4gICAgICAgICAgICAuZ2V0U2lnbkluVXNlclNlc3Npb24oKVxyXG4gICAgICAgICAgICAuZ2V0QWNjZXNzVG9rZW4oKVxyXG4gICAgICAgICAgICAuZ2V0Snd0VG9rZW4oKX1gLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pXHJcbiAgICAgIC50b1Byb21pc2UoKTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBrZWVwYWxpdmVSZXN1bHQsXHJcbiAgICAgIGV4cGlyZXNBZnRlclNlY29uZHM6XHJcbiAgICAgICAgdGhpcy5pZGxlLmdldElkbGUoKSArXHJcbiAgICAgICAgdGhpcy5pZGxlLmdldFRpbWVvdXQoKSArXHJcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUuaW50ZXJ2YWwoKSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcGVyc2lzdE1hc3RlcktleShtYXN0ZXJLZXk6IEtleSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgLy8gVGhlIGtlZXBhbGl2ZSBBUEkgY2FsbCBleHRlbmRzIHRoZSBzZXJ2ZXItc2lkZSBzZXNzaW9uLCB0aGUgc2Vzc2lvbiBjb29raWUgZXhwaXJ5LCByZWZyZXNoIGtleSBjb29raWVcclxuICAgIC8vIGV4cGlyeSwgYW5kIHJldHVybnMgdGhlIHNlc3Npb24gZXhwaXJ5LlxyXG4gICAgLy8gTk9URSBVc2UgdGltZSBkZWx0YSByYXRoZXIgdGhhbiBhYnNvbHV0ZSB0aW1lLCBzaW5jZSBjbGllbnQgY2xvY2sgYW5kIHNlcnZlciBjbG9jayBtYXliZVxyXG4gICAgLy8gb3V0IG9mIHN5bmMuIFdlIGNhbid0IHVzZSB0aGUgc2VydmVyVGltZSgpIGZ1bmN0aW9uYWxpdHkgYmVjYXVzZSB0aGUgY29va2llIGV4cGlyeSBzdGlsbFxyXG4gICAgLy8gcnVuIG9uIGxvY2FsIGNsb2NrLlxyXG4gICAgY29uc3QgeyBleHBpcmVzQWZ0ZXJTZWNvbmRzIH0gPSBhd2FpdCB0aGlzLmtlZXBhbGl2ZVBvc3QoKTtcclxuXHJcbiAgICAvLyBQZXJzaXN0IHRoZSBkZXJpdmVkIHBhc3NLZXlcclxuICAgIGF3YWl0IHRoaXMua2V5U2VydmljZS5wZXJzaXN0TWFzdGVyS2V5KG1hc3RlcktleSwgZXhwaXJlc0FmdGVyU2Vjb25kcyk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ3NldE1hc3RlcktleSgpIGRvbmUnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25QaW5nKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIGBLZWVwIGFsaXZlIHRyaWdnZXJlZCBhdCB0aW1lOiAke0RhdGUubm93KCl9LiBJbnRlcnZhbCBzZXQgYXQ6ICR7dGhpcy5rZWVwYWxpdmUuaW50ZXJ2YWwoKX0gc2Vjb25kc2BcclxuICAgICk7XHJcblxyXG4gICAgLy8gS2VlcGFsaXZlIEFQSSB3aWxsIGV4dGVuZCB0aGUgc2Vzc2lvbiBleHBpcnkuXHJcbiAgICBjb25zdCB7IGV4cGlyZXNBZnRlclNlY29uZHMgfSA9IGF3YWl0IHRoaXMua2VlcGFsaXZlUG9zdCgpO1xyXG5cclxuICAgIC8vIEV4dGVuZCB0aGUgZXhwaXJ5IG9mIHRoZSBwZXJzaXN0ZWQga2V5XHJcbiAgICBhd2FpdCB0aGlzLmtleVNlcnZpY2Uuc2V0TWFzdGVyS2V5RXhwaXJlc0FmdGVyU2Vjb25kcyhleHBpcmVzQWZ0ZXJTZWNvbmRzKTtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUodGhpcy5vbktlZXBhbGl2ZSAmJiB0aGlzLm9uS2VlcGFsaXZlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF0aGlzLmluaXRDYWxsZWQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaWRsZS5pc1J1bm5pbmcoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUGluZyBkb2VzIG5vdCBzZWVtIHRvIGhhcHBlbiByaWdodCBhdCB0aGUgc3RhcnQuIFNvIHdlIGNhbGwgaXQgZXhwbGljaXRseVxyXG4gICAgYXdhaXQgdGhpcy5vblBpbmcoKTtcclxuXHJcbiAgICB0aGlzLmlkbGUud2F0Y2goKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pZGxlLnN0b3AoKTtcclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzZXQoKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLklETEVfRVhQSVJZX0tFWSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLklETElOR19LRVkpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export var Config;
|
|
2
|
+
(function (Config) {
|
|
3
|
+
Config[Config["TIMEOUT"] = 0.01] = "TIMEOUT";
|
|
4
|
+
Config[Config["IDLE"] = 1200] = "IDLE";
|
|
5
|
+
Config[Config["KEEP_ALIVE_INTERVAL"] = 60] = "KEEP_ALIVE_INTERVAL";
|
|
6
|
+
})(Config || (Config = {}));
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy90ZXN0L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL2F1dGgvaWRsZS50eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxNQUlYO0FBSkQsV0FBWSxNQUFNO0lBQ2hCLDRDQUFjLENBQUE7SUFDZCxzQ0FBYyxDQUFBO0lBQ2Qsa0VBQTRCLENBQUE7QUFDOUIsQ0FBQyxFQUpXLE1BQU0sS0FBTixNQUFNLFFBSWpCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gQ29uZmlnIHtcclxuICBUSU1FT1VUID0gMC4wMSwgLy8gc2Vjb25kcywgbWluIHZhbHVlIDAuMDEsIGFmdGVyIHN0YXRlIGlzIGlkbGUsIHdhaXQgZm9yIFRJTUVPVVQgc2Vjb25kcyBiZWZvcmUgdGFraW5nIGFjdGlvblxyXG4gIElETEUgPSA2MCAqIDIwLCAvLyBzZWNvbmRzLCBwZXJpb2Qgb2YgaW5hY3Rpdml0eSB0byBjb25zaWRlciBzdGF0ZSBhcyBpZGxlXHJcbiAgS0VFUF9BTElWRV9JTlRFUlZBTCA9IDYwICogMSwgLy8gc2Vjb25kcywgdHJpZ2dlcmVkIG9uIGEgcmVndWxhciBiYXNpcyB3aGlsZSBhY3RpdmUgKGkuZS4gd2hpbGUgbm90IGlkbGluZylcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBLZWVwYWxpdmVSZXN1bHQge1xyXG4gIHNlc3Npb246IHtcclxuICAgIGV4cGlyZXNfYWZ0ZXJfc2Vjb25kczogbnVtYmVyO1xyXG4gIH07XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { LrApolloService } from '../api/lr-apollo.service';
|
|
3
|
+
import { HttpClient } from '@angular/common/http';
|
|
4
|
+
import { Inject, Injectable } from '@angular/core';
|
|
5
|
+
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
6
|
+
import gql from 'graphql-tag';
|
|
7
|
+
import { EncryptionService } from '../cryptography/encryption.service';
|
|
8
|
+
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
9
|
+
import { KeyService } from '../cryptography/key.service';
|
|
10
|
+
import { LR_CONFIG } from '../life-ready.config';
|
|
11
|
+
import { LrException, LrBadLogicException, } from '../_common/exceptions';
|
|
12
|
+
import { LifeReadyAuthService } from './life-ready-auth.service';
|
|
13
|
+
import { PasswordService } from './password.service';
|
|
14
|
+
import { Slip39Helper } from 'slip39';
|
|
15
|
+
import { KeyFactoryService as KFS } from '../cryptography/key-factory.service';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
import * as i1 from "../life-ready.config";
|
|
18
|
+
import * as i2 from "@angular/common/http";
|
|
19
|
+
import * as i3 from "../api/lr-apollo.service";
|
|
20
|
+
import * as i4 from "@aws-amplify/auth/lib-esm/Auth";
|
|
21
|
+
import * as i5 from "./life-ready-auth.service";
|
|
22
|
+
import * as i6 from "../cryptography/key-factory.service";
|
|
23
|
+
import * as i7 from "../cryptography/key.service";
|
|
24
|
+
import * as i8 from "../cryptography/encryption.service";
|
|
25
|
+
import * as i9 from "../cryptography/key-graph.service";
|
|
26
|
+
import * as i10 from "./password.service";
|
|
27
|
+
export const CreateLbopQuery = gql `
|
|
28
|
+
mutation CreateLbop($input: CreateLbopInput!) {
|
|
29
|
+
createLbop(input: $input) {
|
|
30
|
+
lbop {
|
|
31
|
+
id
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
export const DeleteLbopQuery = gql `
|
|
37
|
+
mutation DeleteLbop($input: DeleteLbopInput!) {
|
|
38
|
+
deleteLbop(input: $input) {
|
|
39
|
+
id
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
export const UpdateLbopQuery = gql `
|
|
44
|
+
mutation UpdateLbop($input: UpdateLbopInput!) {
|
|
45
|
+
updateLbop(input: $input) {
|
|
46
|
+
lbop {
|
|
47
|
+
id
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
export const LbopQuery = gql `
|
|
53
|
+
query Lbop($id: LrRelayIdInput!) {
|
|
54
|
+
lbop(id: $id) {
|
|
55
|
+
id
|
|
56
|
+
cipherMeta
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
`;
|
|
60
|
+
export const LbopsQuery = gql `
|
|
61
|
+
query Lbops {
|
|
62
|
+
lbops {
|
|
63
|
+
edges {
|
|
64
|
+
node {
|
|
65
|
+
id
|
|
66
|
+
cipherMeta
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
72
|
+
export class LbopService {
|
|
73
|
+
constructor(config, http, lrApollo, auth, authService, keyFactory, keyService, encryptionService, keyGraph, passwordService) {
|
|
74
|
+
this.config = config;
|
|
75
|
+
this.http = http;
|
|
76
|
+
this.lrApollo = lrApollo;
|
|
77
|
+
this.auth = auth;
|
|
78
|
+
this.authService = authService;
|
|
79
|
+
this.keyFactory = keyFactory;
|
|
80
|
+
this.keyService = keyService;
|
|
81
|
+
this.encryptionService = encryptionService;
|
|
82
|
+
this.keyGraph = keyGraph;
|
|
83
|
+
this.passwordService = passwordService;
|
|
84
|
+
this.CLIENT_NONCE_LENGTH = 32;
|
|
85
|
+
// There are 1024 words (10 bits), so 25 words should give ~256 bits of entropy.
|
|
86
|
+
this.LBOP_WORDS = 25;
|
|
87
|
+
}
|
|
88
|
+
getPartial(lbopString) {
|
|
89
|
+
return lbopString.split(' ')[0];
|
|
90
|
+
}
|
|
91
|
+
remove(id) {
|
|
92
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
93
|
+
const res = yield this.lrApollo.mutate({
|
|
94
|
+
mutation: DeleteLbopQuery,
|
|
95
|
+
variables: {
|
|
96
|
+
input: {
|
|
97
|
+
id,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
return res.deleteLbop.id;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
update({ id, name }) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
const lbop = yield this.get(id);
|
|
107
|
+
lbop.name = name;
|
|
108
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
109
|
+
const cipherMeta = yield this.encryptionService.encrypt(masterKey.jwk, lbop);
|
|
110
|
+
const res = yield this.lrApollo.mutate({
|
|
111
|
+
mutation: UpdateLbopQuery,
|
|
112
|
+
variables: {
|
|
113
|
+
input: {
|
|
114
|
+
id,
|
|
115
|
+
cipherMeta: JSON.stringify(cipherMeta),
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
return res.updateLbop;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
get(id) {
|
|
123
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
+
const res = yield this.lrApollo.query({
|
|
125
|
+
query: LbopQuery,
|
|
126
|
+
variables: {
|
|
127
|
+
id,
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
131
|
+
const plainCipherMeta = yield this.encryptionService.decrypt(masterKey.jwk, JSON.parse(res.lbop.cipherMeta));
|
|
132
|
+
return Object.assign({ id: res.id }, plainCipherMeta);
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
list() {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
const res = yield this.lrApollo.query({
|
|
138
|
+
query: LbopsQuery,
|
|
139
|
+
});
|
|
140
|
+
const masterKey = yield this.keyService.getCurrentMasterKey();
|
|
141
|
+
return Promise.all(res.lbops.edges.map((edge) => __awaiter(this, void 0, void 0, function* () {
|
|
142
|
+
const plainCipherMeta = yield this.encryptionService.decrypt(masterKey.jwk, JSON.parse(edge.node.cipherMeta));
|
|
143
|
+
return Object.assign({ id: edge.node.id }, plainCipherMeta);
|
|
144
|
+
})));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
create({ name }) {
|
|
148
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
149
|
+
if (Slip39Helper.WORD_LIST.length !== 1024) {
|
|
150
|
+
throw new LrBadLogicException('Slip39Helper.WORD_LIST.length != 1024');
|
|
151
|
+
}
|
|
152
|
+
// Get existing to make sure there are not duplicate first words
|
|
153
|
+
const lbops = yield this.list();
|
|
154
|
+
// Generate new one
|
|
155
|
+
let lbopString;
|
|
156
|
+
while (true) {
|
|
157
|
+
lbopString = this.keyFactory
|
|
158
|
+
.randomChoices(Slip39Helper.WORD_LIST, this.LBOP_WORDS)
|
|
159
|
+
.join(' ');
|
|
160
|
+
const partial = this.getPartial(lbopString);
|
|
161
|
+
if (!lbops.some((lbop) => lbop.partial === partial)) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const lbopKeyParams = yield this.keyFactory.createLbopKeyParams();
|
|
166
|
+
const lbopKey = (yield this.keyFactory.deriveLbopKey(Object.assign({ password: lbopString }, lbopKeyParams))).jwk;
|
|
167
|
+
const lbopKeyVerifier = yield this.keyFactory.createSignKey();
|
|
168
|
+
const wrappedLbopKeyVerifier = yield this.encryptionService.encrypt(lbopKey, lbopKeyVerifier.toJSON(true));
|
|
169
|
+
// Re-encrypt master key with new key
|
|
170
|
+
const currentUser = yield this.authService.getUser();
|
|
171
|
+
const masterKey = yield this.keyGraph.getKey(currentUser.currentUserKey.masterKey.id);
|
|
172
|
+
const wrappedMasterKey = yield this.encryptionService.encrypt(lbopKey, masterKey.jwk.toJSON(true));
|
|
173
|
+
const meta = Object.assign(Object.assign({}, (name && { name })), { partial: this.getPartial(lbopString) });
|
|
174
|
+
const cipherMeta = yield this.encryptionService.encrypt(masterKey.jwk, meta);
|
|
175
|
+
const res = yield this.lrApollo.mutate({
|
|
176
|
+
mutation: CreateLbopQuery,
|
|
177
|
+
variables: {
|
|
178
|
+
input: {
|
|
179
|
+
cipherMeta: JSON.stringify(cipherMeta),
|
|
180
|
+
lbopKeyParams: JSON.stringify(lbopKeyParams),
|
|
181
|
+
lbopKeyVerifier: JSON.stringify(lbopKeyVerifier.toJSON(true)),
|
|
182
|
+
wrappedLbopKeyVerifier: JSON.stringify(wrappedLbopKeyVerifier),
|
|
183
|
+
masterKeyId: currentUser.currentUserKey.masterKey.id,
|
|
184
|
+
wrappedMasterKey: JSON.stringify(wrappedMasterKey),
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
return Object.assign(Object.assign({}, res.createLbop.lbop), { lbopString });
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
192
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
193
|
+
// Flow below are for password reset via LBOP
|
|
194
|
+
//
|
|
195
|
+
// --Potential Failure Point xxx--
|
|
196
|
+
//
|
|
197
|
+
// Look for the above and you can test by interrupting at these points.
|
|
198
|
+
//
|
|
199
|
+
// The LBOP reset process can be restarted at any point before the call to "set-password/". Once "set-password/" has been
|
|
200
|
+
// called, we assume the client has a short period of time to change the Idp password to the one they've chosen. The "set-password/"
|
|
201
|
+
// will set the Idp password to a temporary random password. The user can no longer login using their current password. If the Idp
|
|
202
|
+
// password change process does not complete or takes longer than the lockout period, the account will not be accessible and a new
|
|
203
|
+
// LBOP password reset must be carried out.
|
|
204
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
205
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
206
|
+
verifyLbops(challengeResult, lbopString) {
|
|
207
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
208
|
+
const clientNonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
|
|
209
|
+
for (const lbop of challengeResult.lbops) {
|
|
210
|
+
const lbopKey = (yield this.keyFactory.deriveLbopKey(Object.assign({ password: lbopString }, lbop.lbopKeyParams))).jwk;
|
|
211
|
+
// If decoding successful then it's the correct lbop
|
|
212
|
+
try {
|
|
213
|
+
const lbopKeyVerifier = (yield this.encryptionService.decrypt(lbopKey, lbop.wrappedLbopKeyVerifier));
|
|
214
|
+
// Force a bad signature.
|
|
215
|
+
// const serverNonce = challengeResult.challenge.serverNonce + "1",
|
|
216
|
+
const serverNonce = challengeResult.challenge.serverNonce;
|
|
217
|
+
const signedChallenge = yield this.encryptionService.sign(lbopKeyVerifier, {
|
|
218
|
+
serverNonce,
|
|
219
|
+
clientNonce,
|
|
220
|
+
});
|
|
221
|
+
return {
|
|
222
|
+
lbop,
|
|
223
|
+
signedChallenge,
|
|
224
|
+
lbopKey,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
throw new LrException({
|
|
232
|
+
source: 'LBOP',
|
|
233
|
+
code: 'INVALID_PASSPHRASE',
|
|
234
|
+
message: 'Invalid passphrase.',
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
verifyContact(params) {
|
|
239
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
240
|
+
const ret = this.http
|
|
241
|
+
.post(`${this.config.authUrl}users/lbop-reset/verify-contact/`, params)
|
|
242
|
+
.toPromise();
|
|
243
|
+
// --Potential Failure Point 1 --
|
|
244
|
+
// The contact verifications are throttled. But otherwise harmless.
|
|
245
|
+
return ret;
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
confirmContact(params) {
|
|
249
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
250
|
+
return this.http
|
|
251
|
+
.post(`${this.config.authUrl}cove/respond/`, {
|
|
252
|
+
claim_id: params.claimId,
|
|
253
|
+
v_code: params.vCode,
|
|
254
|
+
})
|
|
255
|
+
.toPromise();
|
|
256
|
+
// --Potential Failure Point 2 --
|
|
257
|
+
// A verified claim for a contact does not prevent new ones from being generated. So it should be fine to just start again.
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
verify(params) {
|
|
261
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
262
|
+
const challengeResult = yield this.http
|
|
263
|
+
.post(`${this.config.authUrl}users/lbop-reset/get-challenge/`, {
|
|
264
|
+
claimId: params.claimId,
|
|
265
|
+
claimToken: params.claimToken,
|
|
266
|
+
})
|
|
267
|
+
.toPromise();
|
|
268
|
+
// --Potential Failure Point 3 --
|
|
269
|
+
// This does not lock anything. A second call to "get-challenge/" will create a new challenge amd invalidate the first one.
|
|
270
|
+
const { signedChallenge, lbop, lbopKey } = yield this.verifyLbops(challengeResult, params.lbop);
|
|
271
|
+
const res = yield this.http
|
|
272
|
+
.post(`${this.config.authUrl}users/lbop-reset/verify-challenge/`, {
|
|
273
|
+
lbopId: lbop.lbopId,
|
|
274
|
+
signedChallenge,
|
|
275
|
+
})
|
|
276
|
+
.toPromise();
|
|
277
|
+
// --Potential Failure Point 4 --
|
|
278
|
+
// This does not lock anything. So ok to restart.
|
|
279
|
+
return {
|
|
280
|
+
lbopId: lbop.lbopId,
|
|
281
|
+
verifiedToken: res.verifiedToken,
|
|
282
|
+
masterKeyId: res.masterKeyId,
|
|
283
|
+
masterKey: yield KFS.asKey(yield this.encryptionService.decrypt(lbopKey, res.wrappedMasterKey)),
|
|
284
|
+
};
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
setPassword(params) {
|
|
288
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
289
|
+
// Generate the new password derived keys
|
|
290
|
+
const passKeyBundle = yield this.passwordService.createPassKeyBundle(params.newPassword);
|
|
291
|
+
// Re-encrypt master key with new key
|
|
292
|
+
const newWrappedMasterKey = yield this.encryptionService.encrypt(passKeyBundle.passKey, params.masterKey.toJSON(true));
|
|
293
|
+
const result = yield this.http
|
|
294
|
+
.post(`${this.config.authUrl}users/lbop-reset/set-password/`, {
|
|
295
|
+
lbopId: params.lbopId,
|
|
296
|
+
verifiedToken: params.verifiedToken,
|
|
297
|
+
masterKeyId: params.masterKeyId,
|
|
298
|
+
newWrappedMasterKey,
|
|
299
|
+
newPassKey: {
|
|
300
|
+
passKeyParams: passKeyBundle.passKeyParams,
|
|
301
|
+
passIdpParams: passKeyBundle.passIdpParams,
|
|
302
|
+
passIdpVerifierPbk: passKeyBundle.passIdpVerifier.toJSON(),
|
|
303
|
+
wrappedPassIdpVerifierPrk: passKeyBundle.wrappedPassIdpVerifierPrk,
|
|
304
|
+
},
|
|
305
|
+
})
|
|
306
|
+
.toPromise();
|
|
307
|
+
// --Potential Failure Point 5 --
|
|
308
|
+
// A timed mutex is locked. The Idp password change must occur within a period of time.
|
|
309
|
+
// If interrupted here, the user can not login with their old password again. They must
|
|
310
|
+
// start the whole LBOP password reset process again.
|
|
311
|
+
// This call will go through the LR proxy which is OK since the LR server knows
|
|
312
|
+
// the temporary password anyway.
|
|
313
|
+
let user = yield this.auth.signIn(result.username, result.idpPassword, {
|
|
314
|
+
noProxy: 'true',
|
|
315
|
+
});
|
|
316
|
+
if (user.challengeName !== 'NEW_PASSWORD_REQUIRED') {
|
|
317
|
+
throw new LrException({
|
|
318
|
+
message: 'Internal error. Expecting Cognito to have done a password reset.',
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
// --Potential Failure Point 6 --
|
|
322
|
+
// Must restart the LBOP password reset process again.
|
|
323
|
+
// Set new password on Idp
|
|
324
|
+
user = yield this.auth.completeNewPassword(user, this.passwordService.getPassIdpString(passKeyBundle.passIdp), {});
|
|
325
|
+
// --Potential Failure Point 7 --
|
|
326
|
+
// Must restart the LBOP password reset process again.
|
|
327
|
+
yield this.auth.signOut();
|
|
328
|
+
return yield this.http
|
|
329
|
+
.post(`${this.config.authUrl}users/lbop-reset/complete/`, {
|
|
330
|
+
lbopId: params.lbopId,
|
|
331
|
+
setPasswordToken: result.setPasswordToken,
|
|
332
|
+
})
|
|
333
|
+
.toPromise();
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
LbopService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LbopService_Factory() { return new LbopService(i0.ɵɵinject(i1.LR_CONFIG), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.AuthClass), i0.ɵɵinject(i5.LifeReadyAuthService), i0.ɵɵinject(i6.KeyFactoryService), i0.ɵɵinject(i7.KeyService), i0.ɵɵinject(i8.EncryptionService), i0.ɵɵinject(i9.KeyGraphService), i0.ɵɵinject(i10.PasswordService)); }, token: LbopService, providedIn: "root" });
|
|
338
|
+
LbopService.decorators = [
|
|
339
|
+
{ type: Injectable, args: [{
|
|
340
|
+
providedIn: 'root',
|
|
341
|
+
},] }
|
|
342
|
+
];
|
|
343
|
+
LbopService.ctorParameters = () => [
|
|
344
|
+
{ type: undefined, decorators: [{ type: Inject, args: [LR_CONFIG,] }] },
|
|
345
|
+
{ type: HttpClient },
|
|
346
|
+
{ type: LrApolloService },
|
|
347
|
+
{ type: AuthClass },
|
|
348
|
+
{ type: LifeReadyAuthService },
|
|
349
|
+
{ type: KFS },
|
|
350
|
+
{ type: KeyService },
|
|
351
|
+
{ type: EncryptionService },
|
|
352
|
+
{ type: KeyGraphService },
|
|
353
|
+
{ type: PasswordService }
|
|
354
|
+
];
|
|
355
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGJvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IkM6L1Byb2plY3RzL3Rlc3QvcHJvamVjdHMvY29yZS9zcmMvIiwic291cmNlcyI6WyJsaWIvYXV0aC9sYm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUU5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBbUIsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUNMLFdBQVcsRUFFWCxtQkFBbUIsR0FDcEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsaUJBQWlCLElBQUksR0FBRyxFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7OztBQXlFL0UsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7Q0FRakMsQ0FBQztBQU1GLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUE7Ozs7OztDQU1qQyxD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QUFDO0tBQUE7Ozs7WUEzWEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7NENBT0ksTUFBTSxTQUFDLFNBQVM7WUF0S1osVUFBVTtZQURWLGVBQWU7WUFHZixTQUFTO1lBWVQsb0JBQW9CO1lBR0MsR0FBRztZQVZ4QixVQUFVO1lBRlYsaUJBQWlCO1lBQ2pCLGVBQWU7WUFTZixlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTHJBcG9sbG9TZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2xyLWFwb2xsby5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEF1dGhDbGFzcyB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoL2xpYi1lc20vQXV0aCc7XHJcbmltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnO1xyXG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xyXG5pbXBvcnQgeyBFbmNyeXB0aW9uU2VydmljZSB9IGZyb20gJy4uL2NyeXB0b2dyYXBoeS9lbmNyeXB0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWdyYXBoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGlmZVJlYWR5Q29uZmlnLCBMUl9DT05GSUcgfSBmcm9tICcuLi9saWZlLXJlYWR5LmNvbmZpZyc7XHJcbmltcG9ydCB7XHJcbiAgTHJFeGNlcHRpb24sXHJcbiAgTHJFcnJvckNvZGUsXHJcbiAgTHJCYWRMb2dpY0V4Y2VwdGlvbixcclxufSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xyXG5pbXBvcnQgeyBMaWZlUmVhZHlBdXRoU2VydmljZSB9IGZyb20gJy4vbGlmZS1yZWFkeS1hdXRoLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYXNzd29yZFNlcnZpY2UgfSBmcm9tICcuL3Bhc3N3b3JkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTbGlwMzlIZWxwZXIgfSBmcm9tICdzbGlwMzknO1xyXG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSBhcyBLRlMgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWZhY3Rvcnkuc2VydmljZSc7XHJcblxyXG5pbnRlcmZhY2UgU2V0UGFzc3dvcmRBcGlSZXN1bHQge1xyXG4gIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgaWRwUGFzc3dvcmQ6IHN0cmluZztcclxuICBzZXRQYXNzd29yZFRva2VuOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2V0UGFzc3dvcmRQYXJhbXMge1xyXG4gIGxib3BJZDogc3RyaW5nO1xyXG4gIG5ld1Bhc3N3b3JkOiBzdHJpbmc7XHJcbiAgdmVyaWZpZWRUb2tlbjogc3RyaW5nO1xyXG4gIG1hc3RlcktleUlkOiBzdHJpbmc7XHJcbiAgbWFzdGVyS2V5OiBKV0suS2V5O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUNvbnRhY3RQYXJhbXMge1xyXG4gIGVtYWlsPzogc3RyaW5nO1xyXG4gIHBob25lPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUNvbnRhY3RSZXN1bHQge1xyXG4gIC8vIFRoZSBjbGFpbV9pZCBpZGVudGlmaWVzIHRoZSBFbWFpbC9TTVMgY29uZmlybWF0aW9uXHJcbiAgY2xhaW1JZDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpcm1Db250YWN0UGFyYW1zIHtcclxuICBjbGFpbUlkOiBzdHJpbmc7XHJcbiAgdkNvZGU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25maXJtQ29udGFjdFJlc3VsdCB7XHJcbiAgLy8gVGhlIHRva2VuIHRvIHByb3ZlIHRoZSBjbGllbnQgaGFkIHRoZSBjb3JyZWN0IGNvbmZpcm1hdGlvbiBjb2RlLlxyXG4gIHRva2VuOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5UGFyYW1zIHtcclxuICBjbGFpbUlkOiBzdHJpbmc7XHJcbiAgY2xhaW1Ub2tlbjogc3RyaW5nO1xyXG4gIGxib3A6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlSZXN1bHQge1xyXG4gIC8vIHVzZXJJZDogc3RyaW5nO1xyXG4gIGxib3BJZDogc3RyaW5nO1xyXG4gIHZlcmlmaWVkVG9rZW46IHN0cmluZztcclxuICBtYXN0ZXJLZXlJZDogc3RyaW5nO1xyXG4gIG1hc3RlcktleTogSldLLktleTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDaGFsbGVuZ2VSZXN1bHQge1xyXG4gIGNoYWxsZW5nZTogYW55O1xyXG4gIGxib3BzOiBhbnk7XHJcbiAgLy8gdXNlcklkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGJvcCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBwYXJ0aWFsPzogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgbGJvcFN0cmluZz86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVMYm9wUGFyYW1zIHtcclxuICBuYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQ3JlYXRlTGJvcFF1ZXJ5IHtcclxuICBjcmVhdGVMYm9wOiB7XHJcbiAgICBsYm9wOiBMYm9wO1xyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDcmVhdGVMYm9wUXVlcnkgPSBncWxgXHJcbiAgbXV0YXRpb24gQ3JlYXRlTGJvcCgkaW5wdXQ6IENyZWF0ZUxib3BJbnB1dCEpIHtcclxuICAgIGNyZWF0ZUxib3AoaW5wdXQ6ICRpbnB1dCkge1xyXG4gICAgICBsYm9wIHtcclxuICAgICAgICBpZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gO1xyXG5cclxuaW50ZXJmYWNlIERlbGV0ZUxib3BRdWVyeSB7XHJcbiAgZGVsZXRlTGJvcDogTGJvcDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERlbGV0ZUxib3BRdWVyeSA9IGdxbGBcclxuICBtdXRhdGlvbiBEZWxldGVMYm9wKCRpbnB1dDogRGVsZXRlTGJvcElucHV0ISkge1xyXG4gICAgZGVsZXRlTGJvcChpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgIGlkXHJcbiAgICB9XHJcbiAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVMYm9wUGFyYW1zIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxufVxyXG5cclxuaW50ZXJmYWNlIFVwZGF0ZUxib3BRdWVyeSB7XHJcbiAgdXBkYXRlTGJvcDogTGJvcDtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFVwZGF0ZUxib3BRdWVyeSA9IGdxbGBcclxuICBtdXRhdGlvbiBVcGRhdGVMYm9wKCRpbnB1dDogVXBkYXRlTGJvcElucHV0ISkge1xyXG4gICAgdXBkYXRlTGJvcChpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgIGxib3Age1xyXG4gICAgICAgIGlkXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgTGJvcFF1ZXJ5ID0gZ3FsYFxyXG4gIHF1ZXJ5IExib3AoJGlkOiBMclJlbGF5SWRJbnB1dCEpIHtcclxuICAgIGxib3AoaWQ6ICRpZCkge1xyXG4gICAgICBpZFxyXG4gICAgICBjaXBoZXJNZXRhXHJcbiAgICB9XHJcbiAgfVxyXG5gO1xyXG5cclxuaW50ZXJmYWNlIExib3BzUXVlcnkge1xyXG4gIGxib3BzOiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBMYm9wc1F1ZXJ5ID0gZ3FsYFxyXG4gIHF1ZXJ5IExib3BzIHtcclxuICAgIGxib3BzIHtcclxuICAgICAgZWRnZXMge1xyXG4gICAgICAgIG5vZGUge1xyXG4gICAgICAgICAgaWRcclxuICAgICAgICAgIGNpcGhlck1ldGFcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmA7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGJvcFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgQ0xJRU5UX05PTkNFX0xFTkdUSCA9IDMyO1xyXG4gIC8vIFRoZXJlIGFyZSAxMDI0IHdvcmRzICgxMCBiaXRzKSwgc28gMjUgd29yZHMgc2hvdWxkIGdpdmUgfjI1NiBiaXRzIG9mIGVudHJvcHkuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBMQk9QX1dPUkRTID0gMjU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdChMUl9DT05GSUcpIHByaXZhdGUgY29uZmlnOiBMaWZlUmVhZHlDb25maWcsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhDbGFzcyxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IExpZmVSZWFkeUF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBrZXlGYWN0b3J5OiBLRlMsXHJcbiAgICBwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUga2V5R3JhcGg6IEtleUdyYXBoU2VydmljZSxcclxuICAgIHByaXZhdGUgcGFzc3dvcmRTZXJ2aWNlOiBQYXNzd29yZFNlcnZpY2VcclxuICApIHt9XHJcblxyXG4gIHByaXZhdGUgZ2V0UGFydGlhbChsYm9wU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGxib3BTdHJpbmcuc3BsaXQoJyAnKVswXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyByZW1vdmUoaWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxyQXBvbGxvLm11dGF0ZTxhbnk+KHtcclxuICAgICAgbXV0YXRpb246IERlbGV0ZUxib3BRdWVyeSxcclxuICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgaW5wdXQ6IHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzLmRlbGV0ZUxib3AuaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHsgaWQsIG5hbWUgfTogVXBkYXRlTGJvcFBhcmFtcyk6IFByb21pc2U8TGJvcD4ge1xyXG4gICAgY29uc3QgbGJvcCA9IGF3YWl0IHRoaXMuZ2V0KGlkKTtcclxuICAgIGxib3AubmFtZSA9IG5hbWU7XHJcblxyXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRNYXN0ZXJLZXkoKTtcclxuICAgIGNvbnN0IGNpcGhlck1ldGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIG1hc3RlcktleS5qd2ssXHJcbiAgICAgIGxib3BcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckFwb2xsby5tdXRhdGU8VXBkYXRlTGJvcFF1ZXJ5Pih7XHJcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVMYm9wUXVlcnksXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiB7XHJcbiAgICAgICAgICBpZCxcclxuICAgICAgICAgIGNpcGhlck1ldGE6IEpTT04uc3RyaW5naWZ5KGNpcGhlck1ldGEpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzLnVwZGF0ZUxib3A7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0KGlkOiBzdHJpbmcpOiBQcm9taXNlPExib3A+IHtcclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XHJcbiAgICAgIHF1ZXJ5OiBMYm9wUXVlcnksXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlkLFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlTZXJ2aWNlLmdldEN1cnJlbnRNYXN0ZXJLZXkoKTtcclxuXHJcbiAgICBjb25zdCBwbGFpbkNpcGhlck1ldGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXHJcbiAgICAgIG1hc3RlcktleS5qd2ssXHJcbiAgICAgIEpTT04ucGFyc2UocmVzLmxib3AuY2lwaGVyTWV0YSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHJlcy5pZCxcclxuICAgICAgLi4ucGxhaW5DaXBoZXJNZXRhLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8TGJvcFtdPiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmxyQXBvbGxvLnF1ZXJ5PExib3BzUXVlcnk+KHtcclxuICAgICAgcXVlcnk6IExib3BzUXVlcnksXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudE1hc3RlcktleSgpO1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLmFsbChcclxuICAgICAgcmVzLmxib3BzLmVkZ2VzLm1hcChhc3luYyAoZWRnZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBsYWluQ2lwaGVyTWV0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcclxuICAgICAgICAgIG1hc3RlcktleS5qd2ssXHJcbiAgICAgICAgICBKU09OLnBhcnNlKGVkZ2Uubm9kZS5jaXBoZXJNZXRhKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGlkOiBlZGdlLm5vZGUuaWQsXHJcbiAgICAgICAgICAuLi5wbGFpbkNpcGhlck1ldGEsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY3JlYXRlKHsgbmFtZSB9OiBDcmVhdGVMYm9wUGFyYW1zKTogUHJvbWlzZTxMYm9wPiB7XHJcbiAgICBpZiAoU2xpcDM5SGVscGVyLldPUkRfTElTVC5sZW5ndGggIT09IDEwMjQpIHtcclxuICAgICAgdGhyb3cgbmV3IExyQmFkTG9naWNFeGNlcHRpb24oJ1NsaXAzOUhlbHBlci5XT1JEX0xJU1QubGVuZ3RoICE9IDEwMjQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBHZXQgZXhpc3RpbmcgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlIGZpcnN0IHdvcmRzXHJcbiAgICBjb25zdCBsYm9wcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xyXG5cclxuICAgIC8vIEdlbmVyYXRlIG5ldyBvbmVcclxuICAgIGxldCBsYm9wU3RyaW5nO1xyXG4gICAgd2hpbGUgKHRydWUpIHtcclxuICAgICAgbGJvcFN0cmluZyA9IHRoaXMua2V5RmFjdG9yeVxyXG4gICAgICAgIC5yYW5kb21DaG9pY2VzKFNsaXAzOUhlbHBlci5XT1JEX0xJU1QsIHRoaXMuTEJPUF9XT1JEUylcclxuICAgICAgICAuam9pbignICcpO1xyXG4gICAgICBjb25zdCBwYXJ0aWFsID0gdGhpcy5nZXRQYXJ0aWFsKGxib3BTdHJpbmcpO1xyXG5cclxuICAgICAgaWYgKCFsYm9wcy5zb21lKChsYm9wKSA9PiBsYm9wLnBhcnRpYWwgPT09IHBhcnRpYWwpKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBsYm9wS2V5UGFyYW1zID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUxib3BLZXlQYXJhbXMoKTtcclxuICAgIGNvbnN0IGxib3BLZXkgPSAoXHJcbiAgICAgIGF3YWl0IHRoaXMua2V5RmFjdG9yeS5kZXJpdmVMYm9wS2V5KHtcclxuICAgICAgICBwYXNzd29yZDogbGJvcFN0cmluZyxcclxuICAgICAgICAuLi5sYm9wS2V5UGFyYW1zLFxyXG4gICAgICB9KVxyXG4gICAgKS5qd2s7XHJcblxyXG4gICAgY29uc3QgbGJvcEtleVZlcmlmaWVyID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZVNpZ25LZXkoKTtcclxuICAgIGNvbnN0IHdyYXBwZWRMYm9wS2V5VmVyaWZpZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXHJcbiAgICAgIGxib3BLZXksXHJcbiAgICAgIGxib3BLZXlWZXJpZmllci50b0pTT04odHJ1ZSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gUmUtZW5jcnlwdCBtYXN0ZXIga2V5IHdpdGggbmV3IGtleVxyXG4gICAgY29uc3QgY3VycmVudFVzZXIgPSBhd2FpdCB0aGlzLmF1dGhTZXJ2aWNlLmdldFVzZXIoKTtcclxuICAgIGNvbnN0IG1hc3RlcktleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxyXG4gICAgICBjdXJyZW50VXNlci5jdXJyZW50VXNlcktleS5tYXN0ZXJLZXkuaWRcclxuICAgICk7XHJcbiAgICBjb25zdCB3cmFwcGVkTWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxyXG4gICAgICBsYm9wS2V5LFxyXG4gICAgICBtYXN0ZXJLZXkuandrLnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBtZXRhID0ge1xyXG4gICAgICAuLi4obmFtZSAmJiB7IG5hbWUgfSksXHJcbiAgICAgIHBhcnRpYWw6IHRoaXMuZ2V0UGFydGlhbChsYm9wU3RyaW5nKSxcclxuICAgIH07XHJcbiAgICBjb25zdCBjaXBoZXJNZXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxyXG4gICAgICBtYXN0ZXJLZXkuandrLFxyXG4gICAgICBtZXRhXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPENyZWF0ZUxib3BRdWVyeT4oe1xyXG4gICAgICBtdXRhdGlvbjogQ3JlYXRlTGJvcFF1ZXJ5LFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgY2lwaGVyTWV0YTogSlNPTi5zdHJpbmdpZnkoY2lwaGVyTWV0YSksXHJcbiAgICAgICAgICBsYm9wS2V5UGFyYW1zOiBKU09OLnN0cmluZ2lmeShsYm9wS2V5UGFyYW1zKSxcclxuICAgICAgICAgIGxib3BLZXlWZXJpZmllcjogSlNPTi5zdHJpbmdpZnkobGJvcEtleVZlcmlmaWVyLnRvSlNPTih0cnVlKSksXHJcbiAgICAgICAgICB3cmFwcGVkTGJvcEtleVZlcmlmaWVyOiBKU09OLnN0cmluZ2lmeSh3cmFwcGVkTGJvcEtleVZlcmlmaWVyKSxcclxuICAgICAgICAgIG1hc3RlcktleUlkOiBjdXJyZW50VXNlci5jdXJyZW50VXNlcktleS5tYXN0ZXJLZXkuaWQsXHJcbiAgICAgICAgICB3cmFwcGVkTWFzdGVyS2V5OiBKU09OLnN0cmluZ2lmeSh3cmFwcGVkTWFzdGVyS2V5KSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgLi4ucmVzLmNyZWF0ZUxib3AubGJvcCxcclxuICAgICAgbGJvcFN0cmluZyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gRmxvdyBiZWxvdyBhcmUgZm9yIHBhc3N3b3JkIHJlc2V0IHZpYSBMQk9QXHJcbiAgLy9cclxuICAvLyAtLVBvdGVudGlhbCBGYWlsdXJlIFBvaW50IHh4eC0tXHJcbiAgLy9cclxuICAvLyBMb29rIGZvciB0aGUgYWJvdmUgYW5kIHlvdSBjYW4gdGVzdCBieSBpbnRlcnJ1cHRpbmcgYXQgdGhlc2UgcG9pbnRzLlxyXG4gIC8vXHJcbiAgLy8gVGhlIExCT1AgcmVzZXQgcHJvY2VzcyBjYW4gYmUgcmVzdGFydGVkIGF0IGFueSBwb2ludCBiZWZvcmUgdGhlIGNhbGwgdG8gXCJzZXQtcGFzc3dvcmQvXCIuIE9uY2UgXCJzZXQtcGFzc3dvcmQvXCIgaGFzIGJlZW5cclxuICAvLyBjYWxsZWQsIHdlIGFzc3VtZSB0aGUgY2xpZW50IGhhcyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lIHRvIGNoYW5nZSB0aGUgSWRwIHBhc3N3b3JkIHRvIHRoZSBvbmUgdGhleSd2ZSBjaG9zZW4uIFRoZSBcInNldC1wYXNzd29yZC9cIlxyXG4gIC8vIHdpbGwgc2V0IHRoZSBJZHAgcGFzc3dvcmQgdG8gYSB0ZW1wb3JhcnkgcmFuZG9tIHBhc3N3b3JkLiBUaGUgdXNlciBjYW4gbm8gbG9uZ2VyIGxvZ2luIHVzaW5nIHRoZWlyIGN1cnJlbnQgcGFzc3dvcmQuIElmIHRoZSBJZHBcclxuICAvLyBwYXNzd29yZCBjaGFuZ2UgcHJvY2VzcyBkb2VzIG5vdCBjb21wbGV0ZSBvciB0YWtlcyBsb25nZXIgdGhhbiB0aGUgbG9ja291dCBwZXJpb2QsIHRoZSBhY2NvdW50IHdpbGwgbm90IGJlIGFjY2Vzc2libGUgYW5kIGEgbmV3XHJcbiAgLy8gTEJPUCBwYXNzd29yZCByZXNldCBtdXN0IGJlIGNhcnJpZWQgb3V0LlxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBwcml2YXRlIGFzeW5jIHZlcmlmeUxib3BzKFxyXG4gICAgY2hhbGxlbmdlUmVzdWx0OiBDaGFsbGVuZ2VSZXN1bHQsXHJcbiAgICBsYm9wU3RyaW5nOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHsgbGJvcDogYW55OyBzaWduZWRDaGFsbGVuZ2U6IGFueTsgbGJvcEtleTogSldLLktleSB9PiB7XHJcbiAgICBjb25zdCBjbGllbnROb25jZSA9IHRoaXMua2V5RmFjdG9yeS5yYW5kb21TdHJpbmcodGhpcy5DTElFTlRfTk9OQ0VfTEVOR1RIKTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGxib3Agb2YgY2hhbGxlbmdlUmVzdWx0Lmxib3BzKSB7XHJcbiAgICAgIGNvbnN0IGxib3BLZXkgPSAoXHJcbiAgICAgICAgYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmRlcml2ZUxib3BLZXkoe1xyXG4gICAgICAgICAgcGFzc3dvcmQ6IGxib3BTdHJpbmcsXHJcbiAgICAgICAgICAuLi5sYm9wLmxib3BLZXlQYXJhbXMsXHJcbiAgICAgICAgfSlcclxuICAgICAgKS5qd2s7XHJcblxyXG4gICAgICAvLyBJZiBkZWNvZGluZyBzdWNjZXNzZnVsIHRoZW4gaXQncyB0aGUgY29ycmVjdCBsYm9wXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbGJvcEtleVZlcmlmaWVyID0gKGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChcclxuICAgICAgICAgIGxib3BLZXksXHJcbiAgICAgICAgICBsYm9wLndyYXBwZWRMYm9wS2V5VmVyaWZpZXJcclxuICAgICAgICApKSBhcyBhbnk7XHJcblxyXG4gICAgICAgIC8vIEZvcmNlIGEgYmFkIHNpZ25hdHVyZS5cclxuICAgICAgICAvLyBjb25zdCBzZXJ2ZXJOb25jZSA9IGNoYWxsZW5nZVJlc3VsdC5jaGFsbGVuZ2Uuc2VydmVyTm9uY2UgKyBcIjFcIixcclxuXHJcbiAgICAgICAgY29uc3Qgc2VydmVyTm9uY2UgPSBjaGFsbGVuZ2VSZXN1bHQuY2hhbGxlbmdlLnNlcnZlck5vbmNlO1xyXG5cclxuICAgICAgICBjb25zdCBzaWduZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oXHJcbiAgICAgICAgICBsYm9wS2V5VmVyaWZpZXIsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHNlcnZlck5vbmNlLFxyXG4gICAgICAgICAgICBjbGllbnROb25jZSxcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbGJvcCxcclxuICAgICAgICAgIHNpZ25lZENoYWxsZW5nZSxcclxuICAgICAgICAgIGxib3BLZXksXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhyb3cgbmV3IExyRXhjZXB0aW9uKHtcclxuICAgICAgc291cmNlOiAnTEJPUCcsXHJcbiAgICAgIGNvZGU6ICdJTlZBTElEX1BBU1NQSFJBU0UnLFxyXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBwYXNzcGhyYXNlLicsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlDb250YWN0KFxyXG4gICAgcGFyYW1zOiBWZXJpZnlDb250YWN0UGFyYW1zXHJcbiAgKTogUHJvbWlzZTxWZXJpZnlDb250YWN0UmVzdWx0PiB7XHJcbiAgICBjb25zdCByZXQgPSB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8VmVyaWZ5Q29udGFjdFJlc3VsdD4oXHJcbiAgICAgICAgYCR7dGhpcy5jb25maWcuYXV0aFVybH11c2Vycy9sYm9wLXJlc2V0L3ZlcmlmeS1jb250YWN0L2AsXHJcbiAgICAgICAgcGFyYW1zXHJcbiAgICAgIClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMSAtLVxyXG4gICAgLy8gVGhlIGNvbnRhY3QgdmVyaWZpY2F0aW9ucyBhcmUgdGhyb3R0bGVkLiBCdXQgb3RoZXJ3aXNlIGhhcm1sZXNzLlxyXG5cclxuICAgIHJldHVybiByZXQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY29uZmlybUNvbnRhY3QoXHJcbiAgICBwYXJhbXM6IENvbmZpcm1Db250YWN0UGFyYW1zXHJcbiAgKTogUHJvbWlzZTxDb25maXJtQ29udGFjdFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxDb25maXJtQ29udGFjdFJlc3VsdD4oYCR7dGhpcy5jb25maWcuYXV0aFVybH1jb3ZlL3Jlc3BvbmQvYCwge1xyXG4gICAgICAgIGNsYWltX2lkOiBwYXJhbXMuY2xhaW1JZCxcclxuICAgICAgICB2X2NvZGU6IHBhcmFtcy52Q29kZSxcclxuICAgICAgfSlcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMiAtLVxyXG4gICAgLy8gQSB2ZXJpZmllZCBjbGFpbSBmb3IgYSBjb250YWN0IGRvZXMgbm90IHByZXZlbnQgbmV3IG9uZXMgZnJvbSBiZWluZyBnZW5lcmF0ZWQuIFNvIGl0IHNob3VsZCBiZSBmaW5lIHRvIGp1c3Qgc3RhcnQgYWdhaW4uXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdmVyaWZ5KHBhcmFtczogVmVyaWZ5UGFyYW1zKTogUHJvbWlzZTxWZXJpZnlSZXN1bHQ+IHtcclxuICAgIGNvbnN0IGNoYWxsZW5nZVJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxDaGFsbGVuZ2VSZXN1bHQ+KFxyXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmF1dGhVcmx9dXNlcnMvbGJvcC1yZXNldC9nZXQtY2hhbGxlbmdlL2AsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY2xhaW1JZDogcGFyYW1zLmNsYWltSWQsXHJcbiAgICAgICAgICBjbGFpbVRva2VuOiBwYXJhbXMuY2xhaW1Ub2tlbixcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMyAtLVxyXG4gICAgLy8gVGhpcyBkb2VzIG5vdCBsb2NrIGFueXRoaW5nLiBBIHNlY29uZCBjYWxsIHRvIFwiZ2V0LWNoYWxsZW5nZS9cIiB3aWxsIGNyZWF0ZSBhIG5ldyBjaGFsbGVuZ2UgYW1kIGludmFsaWRhdGUgdGhlIGZpcnN0IG9uZS5cclxuICAgIGNvbnN0IHsgc2lnbmVkQ2hhbGxlbmdlLCBsYm9wLCBsYm9wS2V5IH0gPSBhd2FpdCB0aGlzLnZlcmlmeUxib3BzKFxyXG4gICAgICBjaGFsbGVuZ2VSZXN1bHQsXHJcbiAgICAgIHBhcmFtcy5sYm9wXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KGAke3RoaXMuY29uZmlnLmF1dGhVcmx9dXNlcnMvbGJvcC1yZXNldC92ZXJpZnktY2hhbGxlbmdlL2AsIHtcclxuICAgICAgICBsYm9wSWQ6IGxib3AubGJvcElkLFxyXG4gICAgICAgIHNpZ25lZENoYWxsZW5nZSxcclxuICAgICAgfSlcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgNCAtLVxyXG4gICAgLy8gVGhpcyBkb2VzIG5vdCBsb2NrIGFueXRoaW5nLiBTbyBvayB0byByZXN0YXJ0LlxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGxib3BJZDogbGJvcC5sYm9wSWQsXHJcbiAgICAgIHZlcmlmaWVkVG9rZW46IHJlcy52ZXJpZmllZFRva2VuLFxyXG4gICAgICBtYXN0ZXJLZXlJZDogcmVzLm1hc3RlcktleUlkLFxyXG4gICAgICBtYXN0ZXJLZXk6IGF3YWl0IEtGUy5hc0tleShcclxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQobGJvcEtleSwgcmVzLndyYXBwZWRNYXN0ZXJLZXkpXHJcbiAgICAgICksXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldFBhc3N3b3JkKHBhcmFtczogU2V0UGFzc3dvcmRQYXJhbXMpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgLy8gR2VuZXJhdGUgdGhlIG5ldyBwYXNzd29yZCBkZXJpdmVkIGtleXNcclxuICAgIGNvbnN0IHBhc3NLZXlCdW5kbGUgPSBhd2FpdCB0aGlzLnBhc3N3b3JkU2VydmljZS5jcmVhdGVQYXNzS2V5QnVuZGxlKFxyXG4gICAgICBwYXJhbXMubmV3UGFzc3dvcmRcclxuICAgICk7XHJcblxyXG4gICAgLy8gUmUtZW5jcnlwdCBtYXN0ZXIga2V5IHdpdGggbmV3IGtleVxyXG4gICAgY29uc3QgbmV3V3JhcHBlZE1hc3RlcktleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcclxuICAgICAgcGFzc0tleUJ1bmRsZS5wYXNzS2V5LFxyXG4gICAgICBwYXJhbXMubWFzdGVyS2V5LnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8U2V0UGFzc3dvcmRBcGlSZXN1bHQ+KFxyXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmF1dGhVcmx9dXNlcnMvbGJvcC1yZXNldC9zZXQtcGFzc3dvcmQvYCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsYm9wSWQ6IHBhcmFtcy5sYm9wSWQsXHJcbiAgICAgICAgICB2ZXJpZmllZFRva2VuOiBwYXJhbXMudmVyaWZpZWRUb2tlbixcclxuICAgICAgICAgIG1hc3RlcktleUlkOiBwYXJhbXMubWFzdGVyS2V5SWQsXHJcbiAgICAgICAgICBuZXdXcmFwcGVkTWFzdGVyS2V5LFxyXG4gICAgICAgICAgbmV3UGFzc0tleToge1xyXG4gICAgICAgICAgICBwYXNzS2V5UGFyYW1zOiBwYXNzS2V5QnVuZGxlLnBhc3NLZXlQYXJhbXMsXHJcbiAgICAgICAgICAgIHBhc3NJZHBQYXJhbXM6IHBhc3NLZXlCdW5kbGUucGFzc0lkcFBhcmFtcyxcclxuICAgICAgICAgICAgcGFzc0lkcFZlcmlmaWVyUGJrOiBwYXNzS2V5QnVuZGxlLnBhc3NJZHBWZXJpZmllci50b0pTT04oKSxcclxuICAgICAgICAgICAgd3JhcHBlZFBhc3NJZHBWZXJpZmllclByazogcGFzc0tleUJ1bmRsZS53cmFwcGVkUGFzc0lkcFZlcmlmaWVyUHJrLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgNSAtLVxyXG4gICAgLy8gQSB0aW1lZCBtdXRleCBpcyBsb2NrZWQuIFRoZSBJZHAgcGFzc3dvcmQgY2hhbmdlIG11c3Qgb2NjdXIgd2l0aGluIGEgcGVyaW9kIG9mIHRpbWUuXHJcbiAgICAvLyBJZiBpbnRlcnJ1cHRlZCBoZXJlLCB0aGUgdXNlciBjYW4gbm90IGxvZ2luIHdpdGggdGhlaXIgb2xkIHBhc3N3b3JkIGFnYWluLiBUaGV5IG11c3RcclxuICAgIC8vIHN0YXJ0IHRoZSB3aG9sZSBMQk9QIHBhc3N3b3JkIHJlc2V0IHByb2Nlc3MgYWdhaW4uXHJcblxyXG4gICAgLy8gVGhpcyBjYWxsIHdpbGwgZ28gdGhyb3VnaCB0aGUgTFIgcHJveHkgd2hpY2ggaXMgT0sgc2luY2UgdGhlIExSIHNlcnZlciBrbm93c1xyXG4gICAgLy8gdGhlIHRlbXBvcmFyeSBwYXNzd29yZCBhbnl3YXkuXHJcbiAgICBsZXQgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5zaWduSW4ocmVzdWx0LnVzZXJuYW1lLCByZXN1bHQuaWRwUGFzc3dvcmQsIHtcclxuICAgICAgbm9Qcm94eTogJ3RydWUnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHVzZXIuY2hhbGxlbmdlTmFtZSAhPT0gJ05FV19QQVNTV09SRF9SRVFVSVJFRCcpIHtcclxuICAgICAgdGhyb3cgbmV3IExyRXhjZXB0aW9uKHtcclxuICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgJ0ludGVybmFsIGVycm9yLiBFeHBlY3RpbmcgQ29nbml0byB0byBoYXZlIGRvbmUgYSBwYXNzd29yZCByZXNldC4nLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLVBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDYgLS1cclxuICAgIC8vIE11c3QgcmVzdGFydCB0aGUgTEJPUCBwYXNzd29yZCByZXNldCBwcm9jZXNzIGFnYWluLlxyXG5cclxuICAgIC8vIFNldCBuZXcgcGFzc3dvcmQgb24gSWRwXHJcbiAgICB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmNvbXBsZXRlTmV3UGFzc3dvcmQoXHJcbiAgICAgIHVzZXIsXHJcbiAgICAgIHRoaXMucGFzc3dvcmRTZXJ2aWNlLmdldFBhc3NJZHBTdHJpbmcocGFzc0tleUJ1bmRsZS5wYXNzSWRwKSxcclxuICAgICAge31cclxuICAgICk7XHJcblxyXG4gICAgLy8gLS1Qb3RlbnRpYWwgRmFpbHVyZSBQb2ludCA3IC0tXHJcbiAgICAvLyBNdXN0IHJlc3RhcnQgdGhlIExCT1AgcGFzc3dvcmQgcmVzZXQgcHJvY2VzcyBhZ2Fpbi5cclxuXHJcbiAgICBhd2FpdCB0aGlzLmF1dGguc2lnbk91dCgpO1xyXG5cclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8YW55PihgJHt0aGlzLmNvbmZpZy5hdXRoVXJsfXVzZXJzL2xib3AtcmVzZXQvY29tcGxldGUvYCwge1xyXG4gICAgICAgIGxib3BJZDogcGFyYW1zLmxib3BJZCxcclxuICAgICAgICBzZXRQYXNzd29yZFRva2VuOiByZXN1bHQuc2V0UGFzc3dvcmRUb2tlbixcclxuICAgICAgfSlcclxuICAgICAgLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxufVxyXG4iXX0=
|