@lifeready/core 9.0.8 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/lifeready-core.mjs +10522 -0
- package/fesm2022/lifeready-core.mjs.map +1 -0
- package/package.json +21 -16
- package/types/lifeready-core.d.ts +5329 -0
- package/bundles/lifeready-core.umd.js +0 -13231
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -2
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -41
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -186
- package/esm2015/lib/_common/index.js +0 -3
- package/esm2015/lib/_common/kc-lodash.js +0 -11
- package/esm2015/lib/_common/key.js +0 -28
- package/esm2015/lib/_common/queries.gql.js +0 -43
- package/esm2015/lib/_common/run-outside-angular.js +0 -80
- package/esm2015/lib/_common/storage.js +0 -28
- package/esm2015/lib/_common/types.js +0 -2
- package/esm2015/lib/_common/utils.js +0 -73
- package/esm2015/lib/api/lr-apollo.service.js +0 -47
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
- package/esm2015/lib/api/types/graphql.types.js +0 -8
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.private.js +0 -85
- package/esm2015/lib/auth/auth.service.js +0 -616
- package/esm2015/lib/auth/auth.types.js +0 -19
- package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
- package/esm2015/lib/contact-card/contact-card.service.js +0 -156
- package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
- package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
- package/esm2015/lib/encryption/encryption.service.js +0 -188
- package/esm2015/lib/file-upload/file-upload.service.js +0 -70
- package/esm2015/lib/file-upload/file-upload.types.js +0 -2
- package/esm2015/lib/idle/idle.service.js +0 -159
- package/esm2015/lib/idle/idle.types.js +0 -7
- package/esm2015/lib/item/item.gql.js +0 -166
- package/esm2015/lib/item/item.gql.private.js +0 -41
- package/esm2015/lib/item/item.service.js +0 -662
- package/esm2015/lib/item/item.types.js +0 -2
- package/esm2015/lib/key/key-factory.service.js +0 -226
- package/esm2015/lib/key/key-graph.service.js +0 -314
- package/esm2015/lib/key/key-meta.service.js +0 -153
- package/esm2015/lib/key/key.service.js +0 -124
- package/esm2015/lib/key/key.types.js +0 -16
- package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
- package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
- package/esm2015/lib/lbop/lbop.service.js +0 -351
- package/esm2015/lib/life-ready.config.js +0 -96
- package/esm2015/lib/life-ready.module.js +0 -42
- package/esm2015/lib/lock/lock.gql.js +0 -40
- package/esm2015/lib/lock/lock.service.js +0 -64
- package/esm2015/lib/notification/notification.gql.js +0 -43
- package/esm2015/lib/notification/notification.service.js +0 -118
- package/esm2015/lib/password/password.gql.js +0 -28
- package/esm2015/lib/password/password.service.js +0 -309
- package/esm2015/lib/persist/persist.service.js +0 -181
- package/esm2015/lib/plan/plan.gql.js +0 -91
- package/esm2015/lib/plan/plan.service.js +0 -191
- package/esm2015/lib/plan/plan.types.js +0 -2
- package/esm2015/lib/profile/profile-details.service.js +0 -261
- package/esm2015/lib/profile/profile.gql.js +0 -170
- package/esm2015/lib/profile/profile.service.js +0 -166
- package/esm2015/lib/profile/profile.types.js +0 -45
- package/esm2015/lib/register/register.service.js +0 -173
- package/esm2015/lib/register/register.types.js +0 -3
- package/esm2015/lib/reminder/reminder.gql.js +0 -27
- package/esm2015/lib/reminder/reminder.service.js +0 -85
- package/esm2015/lib/reminder/reminder.types.js +0 -2
- package/esm2015/lib/scenario/scenario.constants.js +0 -2
- package/esm2015/lib/scenario/scenario.controller.js +0 -34
- package/esm2015/lib/scenario/scenario.gql.js +0 -90
- package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
- package/esm2015/lib/scenario/scenario.service.js +0 -679
- package/esm2015/lib/scenario/scenario.types.js +0 -2
- package/esm2015/lib/server-config/server-config.gql.js +0 -9
- package/esm2015/lib/server-config/server-config.service.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/slip39/slip39.service.js +0 -167
- package/esm2015/lib/time/time.service.js +0 -152
- package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
- package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
- package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
- package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
- package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
- package/esm2015/lib/two-factor/two-factor.service.js +0 -74
- package/esm2015/lib/user/user.gql.js +0 -32
- package/esm2015/lib/user/user.service.js +0 -58
- package/esm2015/lib/user/user.types.js +0 -2
- package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
- package/esm2015/lifeready-core.js +0 -17
- package/esm2015/public-api.js +0 -60
- package/fesm2015/lifeready-core.js +0 -10970
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -126
- package/lib/_common/index.d.ts +0 -2
- package/lib/_common/kc-lodash.d.ts +0 -5
- package/lib/_common/key.d.ts +0 -14
- package/lib/_common/queries.gql.d.ts +0 -4
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/storage.d.ts +0 -13
- package/lib/_common/types.d.ts +0 -15
- package/lib/_common/utils.d.ts +0 -12
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/index.d.ts +0 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/index.d.ts +0 -2
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/types/graphql.types.d.ts +0 -30
- package/lib/api/types/index.d.ts +0 -2
- package/lib/api/types/lr-graphql.types.d.ts +0 -807
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.private.d.ts +0 -25
- package/lib/auth/auth.service.d.ts +0 -72
- package/lib/auth/auth.types.d.ts +0 -70
- package/lib/contact-card/contact-card.gql.d.ts +0 -7
- package/lib/contact-card/contact-card.service.d.ts +0 -53
- package/lib/contact-card/contact-card2.gql.d.ts +0 -25
- package/lib/contact-card/contact-card2.service.d.ts +0 -64
- package/lib/encryption/encryption.service.d.ts +0 -42
- package/lib/file-upload/file-upload.service.d.ts +0 -15
- package/lib/file-upload/file-upload.types.d.ts +0 -5
- package/lib/idle/idle.service.d.ts +0 -47
- package/lib/idle/idle.types.d.ts +0 -10
- package/lib/item/item.gql.d.ts +0 -134
- package/lib/item/item.gql.private.d.ts +0 -35
- package/lib/item/item.service.d.ts +0 -201
- package/lib/item/item.types.d.ts +0 -95
- package/lib/key/key-factory.service.d.ts +0 -40
- package/lib/key/key-graph.service.d.ts +0 -41
- package/lib/key/key-meta.service.d.ts +0 -51
- package/lib/key/key.service.d.ts +0 -36
- package/lib/key/key.types.d.ts +0 -86
- package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
- package/lib/key-exchange/key-exchange.service.d.ts +0 -179
- package/lib/lbop/lbop.service.d.ts +0 -99
- package/lib/life-ready.config.d.ts +0 -26
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/lock/lock.gql.d.ts +0 -27
- package/lib/lock/lock.service.d.ts +0 -34
- package/lib/notification/notification.gql.d.ts +0 -37
- package/lib/notification/notification.service.d.ts +0 -64
- package/lib/password/password.gql.d.ts +0 -3
- package/lib/password/password.service.d.ts +0 -79
- package/lib/persist/persist.service.d.ts +0 -31
- package/lib/plan/plan.gql.d.ts +0 -69
- package/lib/plan/plan.service.d.ts +0 -111
- package/lib/plan/plan.types.d.ts +0 -16
- package/lib/profile/profile-details.service.d.ts +0 -20
- package/lib/profile/profile.gql.d.ts +0 -21
- package/lib/profile/profile.service.d.ts +0 -32
- package/lib/profile/profile.types.d.ts +0 -121
- package/lib/register/register.service.d.ts +0 -25
- package/lib/register/register.types.d.ts +0 -6
- package/lib/reminder/reminder.gql.d.ts +0 -23
- package/lib/reminder/reminder.service.d.ts +0 -33
- package/lib/reminder/reminder.types.d.ts +0 -17
- package/lib/scenario/scenario.constants.d.ts +0 -1
- package/lib/scenario/scenario.controller.d.ts +0 -10
- package/lib/scenario/scenario.gql.d.ts +0 -78
- package/lib/scenario/scenario.private.gql.d.ts +0 -16
- package/lib/scenario/scenario.service.d.ts +0 -655
- package/lib/scenario/scenario.types.d.ts +0 -64
- package/lib/server-config/server-config.gql.d.ts +0 -5
- package/lib/server-config/server-config.service.d.ts +0 -9
- package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
- package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
- package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
- package/lib/slip39/slip39.service.d.ts +0 -42
- package/lib/time/time.service.d.ts +0 -26
- package/lib/tp-assembly/tp-assembly.d.ts +0 -177
- package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
- package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
- package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
- package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
- package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
- package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
- package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
- package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
- package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
- package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
- package/lib/trusted-party/trusted-party.service.d.ts +0 -192
- package/lib/trusted-party/trusted-party.types.d.ts +0 -31
- package/lib/two-factor/two-factor.service.d.ts +0 -15
- package/lib/user/user.gql.d.ts +0 -8
- package/lib/user/user.service.d.ts +0 -9
- package/lib/user/user.types.d.ts +0 -16
- package/lib/web-crypto/web-crypto.service.d.ts +0 -5
- package/lifeready-core.d.ts +0 -16
- package/lifeready-core.metadata.json +0 -1
- package/public-api.d.ts +0 -56
|
@@ -1,461 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __decorate } from "tslib";
|
|
2
|
-
import { Injectable, Injector, NgZone } from '@angular/core';
|
|
3
|
-
import { JWK } from 'node-jose';
|
|
4
|
-
import { LrMutation, LrService } from '../api/lr-graphql';
|
|
5
|
-
import { AccessRoleChoice, ShareTypeChoice, } from '../api/types';
|
|
6
|
-
import { EncryptionService } from '../encryption/encryption.service';
|
|
7
|
-
import { ItemService } from '../item/item.service';
|
|
8
|
-
import { KeyFactoryService } from '../key/key-factory.service';
|
|
9
|
-
import { KeyGraphService } from '../key/key-graph.service';
|
|
10
|
-
import { KeyService } from '../key/key.service';
|
|
11
|
-
import { KcBadArgumentException, KcBadStateException, } from '../_common/exceptions';
|
|
12
|
-
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
13
|
-
import { CompleteDetachedDirectoryShareMutation, CompleteDetachedFileShareMutation, CompleteTpMkReshareMutation, CreateDirectoryShareMutation, CreateFileShareMutation, DeleteDirectoryShareMutation, DeleteFileShareMutation, DeleteTpMutation, RequestTpMkReshareMutation, RespondTpMkReshareMutation, UpdateDirectoryShareMutation, UpdateFileShareMutation, } from './trusted-party.gql';
|
|
14
|
-
import { DirectoryShareQuery, FileShareQuery, TpCurrentUserSharedKeyQuery, } from './trusted-party.gql.private';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "../key/key-graph.service";
|
|
17
|
-
import * as i2 from "../item/item.service";
|
|
18
|
-
import * as i3 from "../key/key.service";
|
|
19
|
-
import * as i4 from "../key/key-factory.service";
|
|
20
|
-
import * as i5 from "../encryption/encryption.service";
|
|
21
|
-
let TrustedPartyService = class TrustedPartyService extends LrService {
|
|
22
|
-
constructor(ngZone, injector, keyGraph, itemService, keyService, keyFactory, encryptionService) {
|
|
23
|
-
super(injector);
|
|
24
|
-
this.ngZone = ngZone;
|
|
25
|
-
this.injector = injector;
|
|
26
|
-
this.keyGraph = keyGraph;
|
|
27
|
-
this.itemService = itemService;
|
|
28
|
-
this.keyService = keyService;
|
|
29
|
-
this.keyFactory = keyFactory;
|
|
30
|
-
this.encryptionService = encryptionService;
|
|
31
|
-
}
|
|
32
|
-
deleteTp(tpId) {
|
|
33
|
-
return this.mutate(this.deleteTpMutation(tpId));
|
|
34
|
-
}
|
|
35
|
-
deleteTpMutation(tpId) {
|
|
36
|
-
return new LrMutation({
|
|
37
|
-
mutation: DeleteTpMutation,
|
|
38
|
-
variables: {
|
|
39
|
-
input: {
|
|
40
|
-
id: tpId,
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
createDirectoryShare(options) {
|
|
46
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
-
return this.mutate(this.createDirectoryShareMutation(options));
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
createDirectoryShareMutation(options) {
|
|
51
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
-
return new LrMutation({
|
|
53
|
-
mutation: CreateDirectoryShareMutation,
|
|
54
|
-
variables: yield this.prepareCreateItemShareMutation(Object.assign(Object.assign({}, options), { isDirectory: true })),
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
createFileShare(options) {
|
|
59
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
return this.mutate(this.createFileShareMutation(options));
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
createFileShareMutation(options) {
|
|
64
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
return new LrMutation({
|
|
66
|
-
mutation: CreateFileShareMutation,
|
|
67
|
-
variables: yield this.prepareCreateItemShareMutation(Object.assign(Object.assign({}, options), { isDirectory: false })),
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
prepareCreateItemShareMutation(options) {
|
|
72
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
-
const { itemId: _itemId, itemKeyId: _itemKeyId, tpId, tpSharedKeyId, accessRole, isDirectory, shareType, plainMetaJson, } = options;
|
|
74
|
-
const item = options.item || {
|
|
75
|
-
id: _itemId,
|
|
76
|
-
keyId: _itemKeyId,
|
|
77
|
-
};
|
|
78
|
-
const plainMeta = plainMetaJson && JSON.stringify(plainMetaJson);
|
|
79
|
-
if (accessRole == AccessRoleChoice.DENY) {
|
|
80
|
-
if (item.keyId || tpSharedKeyId) {
|
|
81
|
-
throw new KcBadArgumentException('If accessRole is AccessRoleChoice.DENY, must not specify any of itemId, itemKeyId, or tpSharedKeyId parameters');
|
|
82
|
-
}
|
|
83
|
-
return {
|
|
84
|
-
input: {
|
|
85
|
-
itemId: item.id,
|
|
86
|
-
tpId,
|
|
87
|
-
accessRole,
|
|
88
|
-
itemKeyId: null,
|
|
89
|
-
wrappingKeyId: null,
|
|
90
|
-
wrappedItemKey: null,
|
|
91
|
-
shareType,
|
|
92
|
-
plainMeta,
|
|
93
|
-
},
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
const itemKey = yield this.keyGraph.getKey(item.keyId, () => isDirectory
|
|
97
|
-
? this.itemService.getDirectoryKeyId(item.id)
|
|
98
|
-
: this.itemService.getFileKeyId(item.id));
|
|
99
|
-
const wrappingKey = yield this.keyGraph.getKey(tpSharedKeyId, () => this.getTpCurrentUserSharedKey(tpId).then((res) => res.sharedKey.id));
|
|
100
|
-
const wrappedItemKey = yield this.keyGraph.wrapKey(wrappingKey, itemKey.jwk);
|
|
101
|
-
return {
|
|
102
|
-
input: {
|
|
103
|
-
itemId: item.id,
|
|
104
|
-
tpId,
|
|
105
|
-
accessRole,
|
|
106
|
-
itemKeyId: itemKey.id,
|
|
107
|
-
wrappingKeyId: wrappingKey.id,
|
|
108
|
-
wrappedItemKey,
|
|
109
|
-
shareType,
|
|
110
|
-
plainMeta,
|
|
111
|
-
},
|
|
112
|
-
};
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
updateDirectoryShare(options) {
|
|
116
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
117
|
-
return this.mutate(this.updateDirectoryShareMutation(options));
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
updateDirectoryShareMutation(options) {
|
|
121
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
-
return new LrMutation({
|
|
123
|
-
mutation: UpdateDirectoryShareMutation,
|
|
124
|
-
variables: yield this.prepareUpdateItemShareMutation(Object.assign(Object.assign({}, options), { isDirectory: true })),
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
updateDetachedDirectoryShare(options) {
|
|
129
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
130
|
-
return this.mutate(this.updateDetachedDirectoryShareMutation(options));
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
updateDetachedDirectoryShareMutation(options) {
|
|
134
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
135
|
-
return new LrMutation({
|
|
136
|
-
mutation: UpdateDirectoryShareMutation,
|
|
137
|
-
variables: yield this.prepareUpdateDetachedItemShareMutation(options),
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
updateFileShare(options) {
|
|
142
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
143
|
-
return this.mutate(this.updateFileShareMutation(options));
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
updateFileShareMutation(options) {
|
|
147
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
148
|
-
return new LrMutation({
|
|
149
|
-
mutation: UpdateFileShareMutation,
|
|
150
|
-
variables: yield this.prepareUpdateItemShareMutation(Object.assign(Object.assign({}, options), { isDirectory: false })),
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
updateDetachedFileShare(options) {
|
|
155
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
-
return this.mutate(this.updateDetachedFileShareMutation(options));
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
updateDetachedFileShareMutation(options) {
|
|
160
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
-
return new LrMutation({
|
|
162
|
-
mutation: UpdateFileShareMutation,
|
|
163
|
-
variables: yield this.prepareUpdateDetachedItemShareMutation(options),
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
getDirectoryShare(itemShareId) {
|
|
168
|
-
return this.lrGraphQL.query({
|
|
169
|
-
query: DirectoryShareQuery,
|
|
170
|
-
variables: {
|
|
171
|
-
id: itemShareId,
|
|
172
|
-
},
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
getFileShare(itemShareId) {
|
|
176
|
-
return this.lrGraphQL.query({
|
|
177
|
-
query: FileShareQuery,
|
|
178
|
-
variables: {
|
|
179
|
-
id: itemShareId,
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
prepareUpdateItemShareMutation(options) {
|
|
184
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
185
|
-
const { itemShareId, accessRole, isDirectory, itemId: _itemId, itemKeyId: _itemKeyId, tpId, tpSharedKeyId, plainMetaJson, } = options;
|
|
186
|
-
const item = options.item || {
|
|
187
|
-
id: _itemId,
|
|
188
|
-
keyId: _itemKeyId,
|
|
189
|
-
};
|
|
190
|
-
// If plainMetaJson is undefined, then plainMeta is undefined
|
|
191
|
-
// If plainMetaJson is null, then plainMeta is null
|
|
192
|
-
// If plainMetaJson has value, then plainMeta is JSON.stringify(plainMetaJson)
|
|
193
|
-
const plainMeta = plainMetaJson && JSON.stringify(plainMetaJson);
|
|
194
|
-
// If not updating access role or updating to DENY role, then we don't need any key material.
|
|
195
|
-
if (accessRole == null || accessRole == AccessRoleChoice.DENY) {
|
|
196
|
-
if (item.id || item.keyId || tpId || tpSharedKeyId) {
|
|
197
|
-
throw new KcBadArgumentException('If accessRole is AccessRoleChoice.DENY, must not specify any of itemId, itemKeyId, tpId, or tpSharedKeyId parameters');
|
|
198
|
-
}
|
|
199
|
-
return {
|
|
200
|
-
input: {
|
|
201
|
-
id: itemShareId,
|
|
202
|
-
accessRole,
|
|
203
|
-
plainMeta,
|
|
204
|
-
},
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
// Caching the result so we only need one call.
|
|
208
|
-
let itemShare;
|
|
209
|
-
const getItemShare = () => __awaiter(this, void 0, void 0, function* () {
|
|
210
|
-
if (!itemShare) {
|
|
211
|
-
if (isDirectory) {
|
|
212
|
-
itemShare = (yield this.getDirectoryShare(itemShareId))
|
|
213
|
-
.directoryShare;
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
itemShare = (yield this.getFileShare(itemShareId)).fileShare;
|
|
217
|
-
}
|
|
218
|
-
if (itemShare.shareType == ShareTypeChoice.DETACHED) {
|
|
219
|
-
throw new KcBadArgumentException('Use updateDetachedDirectoryShare() or updateDetachedFileShare() to updated DETACHED shares.');
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
return itemShare;
|
|
223
|
-
});
|
|
224
|
-
const itemKey = yield this.keyGraph.getKey(item.keyId, () => __awaiter(this, void 0, void 0, function* () {
|
|
225
|
-
const itemId_ = item.id || (yield getItemShare()).item.id;
|
|
226
|
-
if (isDirectory) {
|
|
227
|
-
return this.itemService.getDirectoryKeyId(itemId_);
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
return this.itemService.getFileKeyId(itemId_);
|
|
231
|
-
}
|
|
232
|
-
}));
|
|
233
|
-
const wrappingKey = yield this.keyGraph.getKey(tpSharedKeyId, () => __awaiter(this, void 0, void 0, function* () {
|
|
234
|
-
const tpId_ = tpId || (yield getItemShare()).tp.id;
|
|
235
|
-
return (yield this.getTpCurrentUserSharedKey(tpId_)).sharedKey.id;
|
|
236
|
-
}));
|
|
237
|
-
const wrappedItemKey = yield this.keyGraph.wrapKey(wrappingKey, itemKey.jwk);
|
|
238
|
-
return {
|
|
239
|
-
input: {
|
|
240
|
-
id: itemShareId,
|
|
241
|
-
accessRole,
|
|
242
|
-
itemKeyId: itemKey.id,
|
|
243
|
-
wrappingKeyId: wrappingKey.id,
|
|
244
|
-
wrappedItemKey,
|
|
245
|
-
plainMeta,
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
prepareUpdateDetachedItemShareMutation(options) {
|
|
251
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
252
|
-
const { itemShareId, accessRole, plainMetaJson } = options;
|
|
253
|
-
return {
|
|
254
|
-
input: {
|
|
255
|
-
id: itemShareId,
|
|
256
|
-
accessRole,
|
|
257
|
-
plainMeta: plainMetaJson && JSON.stringify(plainMetaJson),
|
|
258
|
-
},
|
|
259
|
-
};
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
deleteDirectoryShare(id) {
|
|
263
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
264
|
-
return this.mutate(this.deleteDirectoryShareMutation(id));
|
|
265
|
-
});
|
|
266
|
-
}
|
|
267
|
-
deleteDirectoryShareMutation(id) {
|
|
268
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
269
|
-
return new LrMutation({
|
|
270
|
-
mutation: DeleteDirectoryShareMutation,
|
|
271
|
-
variables: {
|
|
272
|
-
input: {
|
|
273
|
-
id,
|
|
274
|
-
},
|
|
275
|
-
},
|
|
276
|
-
});
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
deleteFileShare(id) {
|
|
280
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
281
|
-
return this.mutate(this.deleteFileShareMutation(id));
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
deleteFileShareMutation(id) {
|
|
285
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
286
|
-
return new LrMutation({
|
|
287
|
-
mutation: DeleteFileShareMutation,
|
|
288
|
-
variables: {
|
|
289
|
-
input: {
|
|
290
|
-
id,
|
|
291
|
-
},
|
|
292
|
-
},
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
completeDetachedDirectoryShare(options) {
|
|
297
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
298
|
-
return this.mutate(this.completeDetachedDirectoryShareMutation(options));
|
|
299
|
-
});
|
|
300
|
-
}
|
|
301
|
-
completeDetachedDirectoryShareMutation(options) {
|
|
302
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
303
|
-
return new LrMutation({
|
|
304
|
-
mutation: CompleteDetachedDirectoryShareMutation,
|
|
305
|
-
variables: yield this.prepareCompleteDetachedItemShareMutation(Object.assign(Object.assign({}, options), { isDirectory: true })),
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
completeDetachedFileShare(options) {
|
|
310
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
311
|
-
return this.mutate(this.completeDetachedFileShareMutation(options));
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
completeDetachedFileShareMutation(options) {
|
|
315
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
316
|
-
return new LrMutation({
|
|
317
|
-
mutation: CompleteDetachedFileShareMutation,
|
|
318
|
-
variables: yield this.prepareCompleteDetachedItemShareMutation(Object.assign(Object.assign({}, options), { isDirectory: false })),
|
|
319
|
-
});
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
prepareCompleteDetachedItemShareMutation(options) {
|
|
323
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
324
|
-
const { itemShareId, itemKeyId, isDirectory } = options;
|
|
325
|
-
const itemKey = yield this.keyGraph.getKey(itemKeyId, () => isDirectory
|
|
326
|
-
? this.itemService.getDirectoryKeyIdFromDirectoryShare(itemShareId)
|
|
327
|
-
: this.itemService.getFileKeyIdFromFileShare(itemShareId));
|
|
328
|
-
const rootKey = this.keyService.currentRootKey;
|
|
329
|
-
const wrappedKey = yield this.keyGraph.wrapKey(rootKey, itemKey.jwk);
|
|
330
|
-
return {
|
|
331
|
-
input: {
|
|
332
|
-
id: itemShareId,
|
|
333
|
-
keyId: itemKey.id,
|
|
334
|
-
wrappingKeyId: rootKey.id,
|
|
335
|
-
wrappedKey,
|
|
336
|
-
},
|
|
337
|
-
};
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
requestMkReshareMutation(tpId) {
|
|
341
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
342
|
-
const userSharedKey = yield this.getTpCurrentUserSharedKey(tpId);
|
|
343
|
-
if (userSharedKey.mkSharedKey) {
|
|
344
|
-
throw new KcBadStateException('TP already has mkSharedKey');
|
|
345
|
-
}
|
|
346
|
-
const masterKey = this.keyService.currentMasterKey;
|
|
347
|
-
const prk = yield this.keyFactory.createPkcKey();
|
|
348
|
-
const mkWrappedMkPrk = yield this.encryptionService.encryptToString(masterKey.jwk, prk.toJSON(true));
|
|
349
|
-
const sharedKey = yield this.keyGraph.getKey(userSharedKey.sharedKey.id);
|
|
350
|
-
const mkReshareRequestCipher = yield this.encryptionService.encryptToString(sharedKey.jwk, {
|
|
351
|
-
pbk: prk.toJSON(),
|
|
352
|
-
});
|
|
353
|
-
return yield new LrMutation({
|
|
354
|
-
mutation: RequestTpMkReshareMutation,
|
|
355
|
-
variables: {
|
|
356
|
-
input: {
|
|
357
|
-
tpId,
|
|
358
|
-
masterKeyId: masterKey.id,
|
|
359
|
-
mkPbk: JSON.stringify(prk.toJSON()),
|
|
360
|
-
mkWrappedMkPrk,
|
|
361
|
-
sharedKeyId: sharedKey.id,
|
|
362
|
-
mkReshareRequestCipher,
|
|
363
|
-
},
|
|
364
|
-
},
|
|
365
|
-
});
|
|
366
|
-
});
|
|
367
|
-
}
|
|
368
|
-
respondMkReshare(tpId) {
|
|
369
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
370
|
-
const userSharedKey = yield this.getTpCurrentUserSharedKey(tpId);
|
|
371
|
-
if (!userSharedKey.mkSharedKey) {
|
|
372
|
-
throw new KcBadStateException('No access to the mkSharedKey so cannot reshare it with TP');
|
|
373
|
-
}
|
|
374
|
-
const sharedKey = yield this.keyGraph.getKey(userSharedKey.sharedKey.id);
|
|
375
|
-
const plainMkReshareRequestCipher = yield this.encryptionService.decrypt(sharedKey, userSharedKey.mkReshareRequestCipher);
|
|
376
|
-
const pbk = yield JWK.asKey(plainMkReshareRequestCipher.pbk);
|
|
377
|
-
const mkSharedKey = yield this.keyGraph.getKey(userSharedKey.mkSharedKey.id);
|
|
378
|
-
const plainMkReshareResponseCipher = {
|
|
379
|
-
mkSharedKey: {
|
|
380
|
-
id: mkSharedKey.id,
|
|
381
|
-
jwk: mkSharedKey.jwk.toJSON(true),
|
|
382
|
-
},
|
|
383
|
-
};
|
|
384
|
-
// Wrap with sharedKey then again with Pbk
|
|
385
|
-
const mkReshareResponseCipher = yield this.encryptionService.encryptToString(pbk, yield this.encryptionService.encryptToString(sharedKey.jwk, plainMkReshareResponseCipher));
|
|
386
|
-
return new LrMutation({
|
|
387
|
-
mutation: RespondTpMkReshareMutation,
|
|
388
|
-
variables: {
|
|
389
|
-
input: {
|
|
390
|
-
tpId,
|
|
391
|
-
mkSharedKeyId: mkSharedKey.id,
|
|
392
|
-
mkReshareResponseCipher,
|
|
393
|
-
},
|
|
394
|
-
},
|
|
395
|
-
});
|
|
396
|
-
});
|
|
397
|
-
}
|
|
398
|
-
completeMkReshare(tpId) {
|
|
399
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
400
|
-
const userSharedKey = yield this.getTpCurrentUserSharedKey(tpId);
|
|
401
|
-
const sharedKey = yield this.keyGraph.getKey(userSharedKey.sharedKey.id);
|
|
402
|
-
const prk = yield this.keyGraph.getKey(userSharedKey.mkPxk.id);
|
|
403
|
-
const plainMkReshareResponseCipher = yield this.encryptionService.decrypt(sharedKey, yield this.encryptionService.decrypt(prk, userSharedKey.mkReshareResponseCipher));
|
|
404
|
-
// Double check it's a valid key.
|
|
405
|
-
const mkSharedKey = {
|
|
406
|
-
id: plainMkReshareResponseCipher.mkSharedKey.id,
|
|
407
|
-
jwk: yield JWK.asKey(plainMkReshareResponseCipher.mkSharedKey.jwk),
|
|
408
|
-
};
|
|
409
|
-
const masterKey = this.keyService.currentMasterKey;
|
|
410
|
-
const mkWrappedMkSharedKey = yield this.encryptionService.encryptToString(masterKey.jwk, mkSharedKey.jwk.toJSON(true));
|
|
411
|
-
return new LrMutation({
|
|
412
|
-
mutation: CompleteTpMkReshareMutation,
|
|
413
|
-
variables: {
|
|
414
|
-
input: {
|
|
415
|
-
tpId,
|
|
416
|
-
masterKeyId: masterKey.id,
|
|
417
|
-
mkSharedKeyId: mkSharedKey.id,
|
|
418
|
-
mkWrappedMkSharedKey,
|
|
419
|
-
},
|
|
420
|
-
},
|
|
421
|
-
});
|
|
422
|
-
});
|
|
423
|
-
}
|
|
424
|
-
// ------------------------------------------------------------------------------------
|
|
425
|
-
// ------------------------------------------------------------------------------------
|
|
426
|
-
// Helpers
|
|
427
|
-
// ------------------------------------------------------------------------------------
|
|
428
|
-
// ------------------------------------------------------------------------------------
|
|
429
|
-
getTpCurrentUserSharedKey(tpId) {
|
|
430
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
431
|
-
return (yield this.lrGraphQL.query({
|
|
432
|
-
query: TpCurrentUserSharedKeyQuery,
|
|
433
|
-
variables: {
|
|
434
|
-
id: tpId,
|
|
435
|
-
},
|
|
436
|
-
})).tp.currentUserSharedKey.userSharedKey;
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
};
|
|
440
|
-
TrustedPartyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TrustedPartyService_Factory() { return new TrustedPartyService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.KeyGraphService), i0.ɵɵinject(i2.ItemService), i0.ɵɵinject(i3.KeyService), i0.ɵɵinject(i4.KeyFactoryService), i0.ɵɵinject(i5.EncryptionService)); }, token: TrustedPartyService, providedIn: "root" });
|
|
441
|
-
TrustedPartyService.decorators = [
|
|
442
|
-
{ type: Injectable, args: [{
|
|
443
|
-
providedIn: 'root',
|
|
444
|
-
},] }
|
|
445
|
-
];
|
|
446
|
-
TrustedPartyService.ctorParameters = () => [
|
|
447
|
-
{ type: NgZone },
|
|
448
|
-
{ type: Injector },
|
|
449
|
-
{ type: KeyGraphService },
|
|
450
|
-
{ type: ItemService },
|
|
451
|
-
{ type: KeyService },
|
|
452
|
-
{ type: KeyFactoryService },
|
|
453
|
-
{ type: EncryptionService }
|
|
454
|
-
];
|
|
455
|
-
TrustedPartyService = __decorate([
|
|
456
|
-
RunOutsideAngular({
|
|
457
|
-
ngZoneName: 'ngZone',
|
|
458
|
-
})
|
|
459
|
-
], TrustedPartyService);
|
|
460
|
-
export { TrustedPartyService };
|
|
461
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3RydXN0ZWQtcGFydHkvdHJ1c3RlZC1wYXJ0eS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsZUFBZSxHQUNoQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG1CQUFtQixHQUNwQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsaUNBQWlDLEVBQ2pDLDJCQUEyQixFQUMzQiw0QkFBNEIsRUFDNUIsdUJBQXVCLEVBQ3ZCLDRCQUE0QixFQUM1Qix1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2hCLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLHVCQUF1QixHQUN4QixNQUFNLHFCQUFxQixDQUFD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Z0JBQ3JDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLEVBQUU7d0JBQ0wsSUFBSTt3QkFDSixXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7d0JBQ3pCLGFBQWEsRUFBRSxXQUFXLENBQUMsRUFBRTt3QkFDN0Isb0JBQW9CO3FCQUNyQjtpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUVELHVGQUF1RjtJQUN2Rix1RkFBdUY7SUFDdkYsVUFBVTtJQUNWLHVGQUF1RjtJQUN2Rix1RkFBdUY7SUFDekUseUJBQXlCLENBQUMsSUFBb0I7O1lBQzFELE9BQU8sQ0FDTCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUN6QixLQUFLLEVBQUUsMkJBQTJCO2dCQUNsQyxTQUFTLEVBQUU7b0JBQ1QsRUFBRSxFQUFFLElBQUk7aUJBQ1Q7YUFDRixDQUFDLENBQ0gsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsYUFBYSxDQUFDO1FBQzFDLENBQUM7S0FBQTtDQUNGLENBQUE7OztZQWhpQkEsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUF0RDhCLE1BQU07WUFBaEIsUUFBUTtZQVlwQixlQUFlO1lBSGYsV0FBVztZQUlYLFVBQVU7WUFGVixpQkFBaUI7WUFIakIsaUJBQWlCOztBQStDYixtQkFBbUI7SUFOL0IsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLG1CQUFtQixDQTZoQi9CO1NBN2hCWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKV0sgfSBmcm9tICdub2RlLWpvc2UnO1xuaW1wb3J0IHsgTHJNdXRhdGlvbiwgTHJTZXJ2aWNlIH0gZnJvbSAnLi4vYXBpL2xyLWdyYXBocWwnO1xuaW1wb3J0IHtcbiAgQWNjZXNzUm9sZUNob2ljZSxcbiAgTHJSZWxheUlkSW5wdXQsXG4gIFNoYXJlVHlwZUNob2ljZSxcbn0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vZW5jcnlwdGlvbi9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgSXRlbVNlcnZpY2UgfSBmcm9tICcuLi9pdGVtL2l0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBJZEtleVBhaXIgfSBmcm9tICcuLi9pdGVtL2l0ZW0udHlwZXMnO1xuaW1wb3J0IHsgS2V5RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2tleS9rZXkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuLi9rZXkva2V5LnR5cGVzJztcbmltcG9ydCB7XG4gIEtjQmFkQXJndW1lbnRFeGNlcHRpb24sXG4gIEtjQmFkU3RhdGVFeGNlcHRpb24sXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5pbXBvcnQgeyBSdW5PdXRzaWRlQW5ndWxhciB9IGZyb20gJy4uL19jb21tb24vcnVuLW91dHNpZGUtYW5ndWxhcic7XG5pbXBvcnQge1xuICBDb21wbGV0ZURldGFjaGVkRGlyZWN0b3J5U2hhcmVNdXRhdGlvbixcbiAgQ29tcGxldGVEZXRhY2hlZEZpbGVTaGFyZU11dGF0aW9uLFxuICBDb21wbGV0ZVRwTWtSZXNoYXJlTXV0YXRpb24sXG4gIENyZWF0ZURpcmVjdG9yeVNoYXJlTXV0YXRpb24sXG4gIENyZWF0ZUZpbGVTaGFyZU11dGF0aW9uLFxuICBEZWxldGVEaXJlY3RvcnlTaGFyZU11dGF0aW9uLFxuICBEZWxldGVGaWxlU2hhcmVNdXRhdGlvbixcbiAgRGVsZXRlVHBNdXRhdGlvbixcbiAgUmVxdWVzdFRwTWtSZXNoYXJlTXV0YXRpb24sXG4gIFJlc3BvbmRUcE1rUmVzaGFyZU11dGF0aW9uLFxuICBVcGRhdGVEaXJlY3RvcnlTaGFyZU11dGF0aW9uLFxuICBVcGRhdGVGaWxlU2hhcmVNdXRhdGlvbixcbn0gZnJvbSAnLi90cnVzdGVkLXBhcnR5LmdxbCc7XG5pbXBvcnQge1xuICBEaXJlY3RvcnlTaGFyZVF1ZXJ5LFxuICBEaXJlY3RvcnlTaGFyZVF1ZXJ5UmVzdWx0LFxuICBGaWxlU2hhcmVRdWVyeSxcbiAgRmlsZVNoYXJlUXVlcnlSZXN1bHQsXG4gIEl0ZW1TaGFyZVF1ZXJ5UmVzdWx0LFxuICBUcEN1cnJlbnRVc2VyU2hhcmVkS2V5UXVlcnksXG59IGZyb20gJy4vdHJ1c3RlZC1wYXJ0eS5ncWwucHJpdmF0ZSc7XG5pbXBvcnQge1xuICBDb21wbGV0ZURldGFjaGVkSXRlbVNoYXJlT3B0aW9ucyxcbiAgQ3JlYXRlSXRlbVNoYXJlT3B0aW9ucyxcbiAgVXBkYXRlRGV0YWNoZWRJdGVtU2hhcmVPcHRpb25zLFxuICBVcGRhdGVJdGVtU2hhcmVPcHRpb25zLFxufSBmcm9tICcuL3RydXN0ZWQtcGFydHkudHlwZXMnO1xuXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcbn0pXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZFBhcnR5U2VydmljZSBleHRlbmRzIExyU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBrZXlHcmFwaDogS2V5R3JhcGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtleUZhY3RvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuXG4gIGRlbGV0ZVRwKHRwSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuZGVsZXRlVHBNdXRhdGlvbih0cElkKSk7XG4gIH1cblxuICBkZWxldGVUcE11dGF0aW9uKHRwSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBEZWxldGVUcE11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgaWQ6IHRwSWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRGlyZWN0b3J5U2hhcmUob3B0aW9uczogQ3JlYXRlSXRlbVNoYXJlT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNyZWF0ZURpcmVjdG9yeVNoYXJlTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlRGlyZWN0b3J5U2hhcmVNdXRhdGlvbihvcHRpb25zOiBDcmVhdGVJdGVtU2hhcmVPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDcmVhdGVEaXJlY3RvcnlTaGFyZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiBhd2FpdCB0aGlzLnByZXBhcmVDcmVhdGVJdGVtU2hhcmVNdXRhdGlvbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGlzRGlyZWN0b3J5OiB0cnVlLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVGaWxlU2hhcmUob3B0aW9uczogQ3JlYXRlSXRlbVNoYXJlT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNyZWF0ZUZpbGVTaGFyZU11dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUZpbGVTaGFyZU11dGF0aW9uKG9wdGlvbnM6IENyZWF0ZUl0ZW1TaGFyZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IENyZWF0ZUZpbGVTaGFyZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiBhd2FpdCB0aGlzLnByZXBhcmVDcmVhdGVJdGVtU2hhcmVNdXRhdGlvbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGlzRGlyZWN0b3J5OiBmYWxzZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ3JlYXRlSXRlbVNoYXJlTXV0YXRpb24oXG4gICAgb3B0aW9uczogQ3JlYXRlSXRlbVNoYXJlT3B0aW9ucyAmIHsgaXNEaXJlY3Rvcnk6IGJvb2xlYW4gfVxuICApIHtcbiAgICBjb25zdCB7XG4gICAgICBpdGVtSWQ6IF9pdGVtSWQsXG4gICAgICBpdGVtS2V5SWQ6IF9pdGVtS2V5SWQsXG4gICAgICB0cElkLFxuICAgICAgdHBTaGFyZWRLZXlJZCxcbiAgICAgIGFjY2Vzc1JvbGUsXG4gICAgICBpc0RpcmVjdG9yeSxcbiAgICAgIHNoYXJlVHlwZSxcbiAgICAgIHBsYWluTWV0YUpzb24sXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBpdGVtOiBJZEtleVBhaXIgPSBvcHRpb25zLml0ZW0gfHwge1xuICAgICAgaWQ6IF9pdGVtSWQsXG4gICAgICBrZXlJZDogX2l0ZW1LZXlJZCxcbiAgICB9O1xuXG4gICAgY29uc3QgcGxhaW5NZXRhID0gcGxhaW5NZXRhSnNvbiAmJiBKU09OLnN0cmluZ2lmeShwbGFpbk1ldGFKc29uKTtcblxuICAgIGlmIChhY2Nlc3NSb2xlID09IEFjY2Vzc1JvbGVDaG9pY2UuREVOWSkge1xuICAgICAgaWYgKGl0ZW0ua2V5SWQgfHwgdHBTaGFyZWRLZXlJZCkge1xuICAgICAgICB0aHJvdyBuZXcgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgICAnSWYgYWNjZXNzUm9sZSBpcyBBY2Nlc3NSb2xlQ2hvaWNlLkRFTlksIG11c3Qgbm90IHNwZWNpZnkgYW55IG9mIGl0ZW1JZCwgaXRlbUtleUlkLCBvciB0cFNoYXJlZEtleUlkIHBhcmFtZXRlcnMnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgaXRlbUlkOiBpdGVtLmlkLFxuICAgICAgICAgIHRwSWQsXG4gICAgICAgICAgYWNjZXNzUm9sZSxcbiAgICAgICAgICBpdGVtS2V5SWQ6IG51bGwsXG4gICAgICAgICAgd3JhcHBpbmdLZXlJZDogbnVsbCxcbiAgICAgICAgICB3cmFwcGVkSXRlbUtleTogbnVsbCxcbiAgICAgICAgICBzaGFyZVR5cGUsXG4gICAgICAgICAgcGxhaW5NZXRhLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoaXRlbS5rZXlJZCwgKCkgPT5cbiAgICAgIGlzRGlyZWN0b3J5XG4gICAgICAgID8gdGhpcy5pdGVtU2VydmljZS5nZXREaXJlY3RvcnlLZXlJZChpdGVtLmlkKVxuICAgICAgICA6IHRoaXMuaXRlbVNlcnZpY2UuZ2V0RmlsZUtleUlkKGl0ZW0uaWQpXG4gICAgKTtcblxuICAgIGNvbnN0IHdyYXBwaW5nS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkodHBTaGFyZWRLZXlJZCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0VHBDdXJyZW50VXNlclNoYXJlZEtleSh0cElkKS50aGVuKChyZXMpID0+IHJlcy5zaGFyZWRLZXkuaWQpXG4gICAgKTtcbiAgICBjb25zdCB3cmFwcGVkSXRlbUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGgud3JhcEtleShcbiAgICAgIHdyYXBwaW5nS2V5LFxuICAgICAgaXRlbUtleS5qd2tcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIGl0ZW1JZDogaXRlbS5pZCxcbiAgICAgICAgdHBJZCxcbiAgICAgICAgYWNjZXNzUm9sZSxcbiAgICAgICAgaXRlbUtleUlkOiBpdGVtS2V5LmlkLFxuICAgICAgICB3cmFwcGluZ0tleUlkOiB3cmFwcGluZ0tleS5pZCxcbiAgICAgICAgd3JhcHBlZEl0ZW1LZXksXG4gICAgICAgIHNoYXJlVHlwZSxcbiAgICAgICAgcGxhaW5NZXRhLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGlyZWN0b3J5U2hhcmUob3B0aW9uczogVXBkYXRlSXRlbVNoYXJlT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZURpcmVjdG9yeVNoYXJlTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGlyZWN0b3J5U2hhcmVNdXRhdGlvbihvcHRpb25zOiBVcGRhdGVJdGVtU2hhcmVPcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVEaXJlY3RvcnlTaGFyZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiBhd2FpdCB0aGlzLnByZXBhcmVVcGRhdGVJdGVtU2hhcmVNdXRhdGlvbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGlzRGlyZWN0b3J5OiB0cnVlLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXRhY2hlZERpcmVjdG9yeVNoYXJlKG9wdGlvbnM6IFVwZGF0ZURldGFjaGVkSXRlbVNoYXJlT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZURldGFjaGVkRGlyZWN0b3J5U2hhcmVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXRhY2hlZERpcmVjdG9yeVNoYXJlTXV0YXRpb24oXG4gICAgb3B0aW9uczogVXBkYXRlRGV0YWNoZWRJdGVtU2hhcmVPcHRpb25zXG4gICkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlRGlyZWN0b3J5U2hhcmVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczogYXdhaXQgdGhpcy5wcmVwYXJlVXBkYXRlRGV0YWNoZWRJdGVtU2hhcmVNdXRhdGlvbihvcHRpb25zKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpbGVTaGFyZShvcHRpb25zOiBVcGRhdGVJdGVtU2hhcmVPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMudXBkYXRlRmlsZVNoYXJlTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmlsZVNoYXJlTXV0YXRpb24ob3B0aW9uczogVXBkYXRlSXRlbVNoYXJlT3B0aW9ucykge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlRmlsZVNoYXJlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZUl0ZW1TaGFyZU11dGF0aW9uKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaXNEaXJlY3Rvcnk6IGZhbHNlLFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXRhY2hlZEZpbGVTaGFyZShvcHRpb25zOiBVcGRhdGVEZXRhY2hlZEl0ZW1TaGFyZU9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy51cGRhdGVEZXRhY2hlZEZpbGVTaGFyZU11dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURldGFjaGVkRmlsZVNoYXJlTXV0YXRpb24oXG4gICAgb3B0aW9uczogVXBkYXRlRGV0YWNoZWRJdGVtU2hhcmVPcHRpb25zXG4gICkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlRmlsZVNoYXJlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IGF3YWl0IHRoaXMucHJlcGFyZVVwZGF0ZURldGFjaGVkSXRlbVNoYXJlTXV0YXRpb24ob3B0aW9ucyksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldERpcmVjdG9yeVNoYXJlKFxuICAgIGl0ZW1TaGFyZUlkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEaXJlY3RvcnlTaGFyZVF1ZXJ5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMubHJHcmFwaFFMLnF1ZXJ5KHtcbiAgICAgIHF1ZXJ5OiBEaXJlY3RvcnlTaGFyZVF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkOiBpdGVtU2hhcmVJZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldEZpbGVTaGFyZShpdGVtU2hhcmVJZDogc3RyaW5nKTogUHJvbWlzZTxGaWxlU2hhcmVRdWVyeVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmxyR3JhcGhRTC5xdWVyeSh7XG4gICAgICBxdWVyeTogRmlsZVNoYXJlUXVlcnksXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaWQ6IGl0ZW1TaGFyZUlkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVVwZGF0ZUl0ZW1TaGFyZU11dGF0aW9uKFxuICAgIG9wdGlvbnM6IFVwZGF0ZUl0ZW1TaGFyZU9wdGlvbnMgJiB7IGlzRGlyZWN0b3J5OiBib29sZWFuIH1cbiAgKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXRlbVNoYXJlSWQsXG4gICAgICBhY2Nlc3NSb2xlLFxuICAgICAgaXNEaXJlY3RvcnksXG4gICAgICBpdGVtSWQ6IF9pdGVtSWQsXG4gICAgICBpdGVtS2V5SWQ6IF9pdGVtS2V5SWQsXG4gICAgICB0cElkLFxuICAgICAgdHBTaGFyZWRLZXlJZCxcbiAgICAgIHBsYWluTWV0YUpzb24sXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBpdGVtOiBJZEtleVBhaXIgPSBvcHRpb25zLml0ZW0gfHwge1xuICAgICAgaWQ6IF9pdGVtSWQsXG4gICAgICBrZXlJZDogX2l0ZW1LZXlJZCxcbiAgICB9O1xuXG4gICAgLy8gSWYgcGxhaW5NZXRhSnNvbiBpcyB1bmRlZmluZWQsIHRoZW4gcGxhaW5NZXRhIGlzIHVuZGVmaW5lZFxuICAgIC8vIElmIHBsYWluTWV0YUpzb24gaXMgbnVsbCwgdGhlbiBwbGFpbk1ldGEgaXMgbnVsbFxuICAgIC8vIElmIHBsYWluTWV0YUpzb24gaGFzIHZhbHVlLCB0aGVuIHBsYWluTWV0YSBpcyBKU09OLnN0cmluZ2lmeShwbGFpbk1ldGFKc29uKVxuICAgIGNvbnN0IHBsYWluTWV0YSA9IHBsYWluTWV0YUpzb24gJiYgSlNPTi5zdHJpbmdpZnkocGxhaW5NZXRhSnNvbik7XG5cbiAgICAvLyBJZiBub3QgdXBkYXRpbmcgYWNjZXNzIHJvbGUgb3IgdXBkYXRpbmcgdG8gREVOWSByb2xlLCB0aGVuIHdlIGRvbid0IG5lZWQgYW55IGtleSBtYXRlcmlhbC5cbiAgICBpZiAoYWNjZXNzUm9sZSA9PSBudWxsIHx8IGFjY2Vzc1JvbGUgPT0gQWNjZXNzUm9sZUNob2ljZS5ERU5ZKSB7XG4gICAgICBpZiAoaXRlbS5pZCB8fCBpdGVtLmtleUlkIHx8IHRwSWQgfHwgdHBTaGFyZWRLZXlJZCkge1xuICAgICAgICB0aHJvdyBuZXcgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgICAnSWYgYWNjZXNzUm9sZSBpcyBBY2Nlc3NSb2xlQ2hvaWNlLkRFTlksIG11c3Qgbm90IHNwZWNpZnkgYW55IG9mIGl0ZW1JZCwgaXRlbUtleUlkLCB0cElkLCBvciB0cFNoYXJlZEtleUlkIHBhcmFtZXRlcnMnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgaWQ6IGl0ZW1TaGFyZUlkLFxuICAgICAgICAgIGFjY2Vzc1JvbGUsXG4gICAgICAgICAgcGxhaW5NZXRhLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDYWNoaW5nIHRoZSByZXN1bHQgc28gd2Ugb25seSBuZWVkIG9uZSBjYWxsLlxuICAgIGxldCBpdGVtU2hhcmU6IEl0ZW1TaGFyZVF1ZXJ5UmVzdWx0O1xuXG4gICAgY29uc3QgZ2V0SXRlbVNoYXJlID0gYXN5bmMgKCk6IFByb21pc2U8SXRlbVNoYXJlUXVlcnlSZXN1bHQ+ID0+IHtcbiAgICAgIGlmICghaXRlbVNoYXJlKSB7XG4gICAgICAgIGlmIChpc0RpcmVjdG9yeSkge1xuICAgICAgICAgIGl0ZW1TaGFyZSA9IChhd2FpdCB0aGlzLmdldERpcmVjdG9yeVNoYXJlKGl0ZW1TaGFyZUlkKSlcbiAgICAgICAgICAgIC5kaXJlY3RvcnlTaGFyZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtU2hhcmUgPSAoYXdhaXQgdGhpcy5nZXRGaWxlU2hhcmUoaXRlbVNoYXJlSWQpKS5maWxlU2hhcmU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXRlbVNoYXJlLnNoYXJlVHlwZSA9PSBTaGFyZVR5cGVDaG9pY2UuREVUQUNIRUQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgS2NCYWRBcmd1bWVudEV4Y2VwdGlvbihcbiAgICAgICAgICAgICdVc2UgdXBkYXRlRGV0YWNoZWREaXJlY3RvcnlTaGFyZSgpIG9yIHVwZGF0ZURldGFjaGVkRmlsZVNoYXJlKCkgdG8gdXBkYXRlZCBERVRBQ0hFRCBzaGFyZXMuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGl0ZW1TaGFyZTtcbiAgICB9O1xuXG4gICAgY29uc3QgaXRlbUtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxuICAgICAgaXRlbS5rZXlJZCxcbiAgICAgIGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBjb25zdCBpdGVtSWRfID0gaXRlbS5pZCB8fCAoYXdhaXQgZ2V0SXRlbVNoYXJlKCkpLml0ZW0uaWQ7XG4gICAgICAgIGlmIChpc0RpcmVjdG9yeSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1TZXJ2aWNlLmdldERpcmVjdG9yeUtleUlkKGl0ZW1JZF8pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLml0ZW1TZXJ2aWNlLmdldEZpbGVLZXlJZChpdGVtSWRfKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cbiAgICBjb25zdCB3cmFwcGluZ0tleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxuICAgICAgdHBTaGFyZWRLZXlJZCxcbiAgICAgIGFzeW5jICgpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBjb25zdCB0cElkXyA9IHRwSWQgfHwgKGF3YWl0IGdldEl0ZW1TaGFyZSgpKS50cC5pZDtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLmdldFRwQ3VycmVudFVzZXJTaGFyZWRLZXkodHBJZF8pKS5zaGFyZWRLZXkuaWQ7XG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IHdyYXBwZWRJdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC53cmFwS2V5KFxuICAgICAgd3JhcHBpbmdLZXksXG4gICAgICBpdGVtS2V5Lmp3a1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXQ6IHtcbiAgICAgICAgaWQ6IGl0ZW1TaGFyZUlkLFxuICAgICAgICBhY2Nlc3NSb2xlLFxuICAgICAgICBpdGVtS2V5SWQ6IGl0ZW1LZXkuaWQsXG4gICAgICAgIHdyYXBwaW5nS2V5SWQ6IHdyYXBwaW5nS2V5LmlkLFxuICAgICAgICB3cmFwcGVkSXRlbUtleSxcbiAgICAgICAgcGxhaW5NZXRhLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlVXBkYXRlRGV0YWNoZWRJdGVtU2hhcmVNdXRhdGlvbihcbiAgICBvcHRpb25zOiBVcGRhdGVEZXRhY2hlZEl0ZW1TaGFyZU9wdGlvbnNcbiAgKSB7XG4gICAgY29uc3QgeyBpdGVtU2hhcmVJZCwgYWNjZXNzUm9sZSwgcGxhaW5NZXRhSnNvbiB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dDoge1xuICAgICAgICBpZDogaXRlbVNoYXJlSWQsXG4gICAgICAgIGFjY2Vzc1JvbGUsXG4gICAgICAgIHBsYWluTWV0YTogcGxhaW5NZXRhSnNvbiAmJiBKU09OLnN0cmluZ2lmeShwbGFpbk1ldGFKc29uKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZURpcmVjdG9yeVNoYXJlKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5kZWxldGVEaXJlY3RvcnlTaGFyZU11dGF0aW9uKGlkKSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVEaXJlY3RvcnlTaGFyZU11dGF0aW9uKGlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IERlbGV0ZURpcmVjdG9yeVNoYXJlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlU2hhcmUoaWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmRlbGV0ZUZpbGVTaGFyZU11dGF0aW9uKGlkKSk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGaWxlU2hhcmVNdXRhdGlvbihpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBEZWxldGVGaWxlU2hhcmVNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbXBsZXRlRGV0YWNoZWREaXJlY3RvcnlTaGFyZShcbiAgICBvcHRpb25zOiBDb21wbGV0ZURldGFjaGVkSXRlbVNoYXJlT3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy5jb21wbGV0ZURldGFjaGVkRGlyZWN0b3J5U2hhcmVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZURldGFjaGVkRGlyZWN0b3J5U2hhcmVNdXRhdGlvbihcbiAgICBvcHRpb25zOiBDb21wbGV0ZURldGFjaGVkSXRlbVNoYXJlT3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IENvbXBsZXRlRGV0YWNoZWREaXJlY3RvcnlTaGFyZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiBhd2FpdCB0aGlzLnByZXBhcmVDb21wbGV0ZURldGFjaGVkSXRlbVNoYXJlTXV0YXRpb24oe1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBpc0RpcmVjdG9yeTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgY29tcGxldGVEZXRhY2hlZEZpbGVTaGFyZShvcHRpb25zOiBDb21wbGV0ZURldGFjaGVkSXRlbVNoYXJlT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNvbXBsZXRlRGV0YWNoZWRGaWxlU2hhcmVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyBjb21wbGV0ZURldGFjaGVkRmlsZVNoYXJlTXV0YXRpb24oXG4gICAgb3B0aW9uczogQ29tcGxldGVEZXRhY2hlZEl0ZW1TaGFyZU9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDb21wbGV0ZURldGFjaGVkRmlsZVNoYXJlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IGF3YWl0IHRoaXMucHJlcGFyZUNvbXBsZXRlRGV0YWNoZWRJdGVtU2hhcmVNdXRhdGlvbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGlzRGlyZWN0b3J5OiBmYWxzZSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQ29tcGxldGVEZXRhY2hlZEl0ZW1TaGFyZU11dGF0aW9uKFxuICAgIG9wdGlvbnM6IENvbXBsZXRlRGV0YWNoZWRJdGVtU2hhcmVPcHRpb25zICYgeyBpc0RpcmVjdG9yeTogYm9vbGVhbiB9XG4gICkge1xuICAgIGNvbnN0IHsgaXRlbVNoYXJlSWQsIGl0ZW1LZXlJZCwgaXNEaXJlY3RvcnkgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBpdGVtS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoaXRlbUtleUlkLCAoKSA9PlxuICAgICAgaXNEaXJlY3RvcnlcbiAgICAgICAgPyB0aGlzLml0ZW1TZXJ2aWNlLmdldERpcmVjdG9yeUtleUlkRnJvbURpcmVjdG9yeVNoYXJlKGl0ZW1TaGFyZUlkKVxuICAgICAgICA6IHRoaXMuaXRlbVNlcnZpY2UuZ2V0RmlsZUtleUlkRnJvbUZpbGVTaGFyZShpdGVtU2hhcmVJZClcbiAgICApO1xuXG4gICAgY29uc3Qgcm9vdEtleSA9IHRoaXMua2V5U2VydmljZS5jdXJyZW50Um9vdEtleTtcblxuICAgIGNvbnN0IHdyYXBwZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLndyYXBLZXkocm9vdEtleSwgaXRlbUtleS5qd2spO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0OiB7XG4gICAgICAgIGlkOiBpdGVtU2hhcmVJZCxcbiAgICAgICAga2V5SWQ6IGl0ZW1LZXkuaWQsXG4gICAgICAgIHdyYXBwaW5nS2V5SWQ6IHJvb3RLZXkuaWQsXG4gICAgICAgIHdyYXBwZWRLZXksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBhc3luYyByZXF1ZXN0TWtSZXNoYXJlTXV0YXRpb24odHBJZDogTHJSZWxheUlkSW5wdXQpIHtcbiAgICBjb25zdCB1c2VyU2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5nZXRUcEN1cnJlbnRVc2VyU2hhcmVkS2V5KHRwSWQpO1xuXG4gICAgaWYgKHVzZXJTaGFyZWRLZXkubWtTaGFyZWRLZXkpIHtcbiAgICAgIHRocm93IG5ldyBLY0JhZFN0YXRlRXhjZXB0aW9uKCdUUCBhbHJlYWR5IGhhcyBta1NoYXJlZEtleScpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hc3RlcktleSA9IHRoaXMua2V5U2VydmljZS5jdXJyZW50TWFzdGVyS2V5O1xuICAgIGNvbnN0IHByayA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVQa2NLZXkoKTtcbiAgICBjb25zdCBta1dyYXBwZWRNa1ByayA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgIHByay50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgY29uc3Qgc2hhcmVkS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkodXNlclNoYXJlZEtleS5zaGFyZWRLZXkuaWQpO1xuICAgIGNvbnN0IG1rUmVzaGFyZVJlcXVlc3RDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgIHNoYXJlZEtleS5qd2ssXG4gICAgICB7XG4gICAgICAgIHBiazogcHJrLnRvSlNPTigpLFxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFJlcXVlc3RUcE1rUmVzaGFyZU11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgdHBJZCxcbiAgICAgICAgICBtYXN0ZXJLZXlJZDogbWFzdGVyS2V5LmlkLFxuICAgICAgICAgIG1rUGJrOiBKU09OLnN0cmluZ2lmeShwcmsudG9KU09OKCkpLFxuICAgICAgICAgIG1rV3JhcHBlZE1rUHJrLFxuICAgICAgICAgIHNoYXJlZEtleUlkOiBzaGFyZWRLZXkuaWQsXG4gICAgICAgICAgbWtSZXNoYXJlUmVxdWVzdENpcGhlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyByZXNwb25kTWtSZXNoYXJlKHRwSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgY29uc3QgdXNlclNoYXJlZEtleSA9IGF3YWl0IHRoaXMuZ2V0VHBDdXJyZW50VXNlclNoYXJlZEtleSh0cElkKTtcblxuICAgIGlmICghdXNlclNoYXJlZEtleS5ta1NoYXJlZEtleSkge1xuICAgICAgdGhyb3cgbmV3IEtjQmFkU3RhdGVFeGNlcHRpb24oXG4gICAgICAgICdObyBhY2Nlc3MgdG8gdGhlIG1rU2hhcmVkS2V5IHNvIGNhbm5vdCByZXNoYXJlIGl0IHdpdGggVFAnXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KHVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkKTtcbiAgICBjb25zdCBwbGFpbk1rUmVzaGFyZVJlcXVlc3RDaXBoZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICBzaGFyZWRLZXksXG4gICAgICB1c2VyU2hhcmVkS2V5Lm1rUmVzaGFyZVJlcXVlc3RDaXBoZXJcbiAgICApO1xuICAgIGNvbnN0IHBiayA9IGF3YWl0IEpXSy5hc0tleShwbGFpbk1rUmVzaGFyZVJlcXVlc3RDaXBoZXIucGJrKTtcbiAgICBjb25zdCBta1NoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KFxuICAgICAgdXNlclNoYXJlZEtleS5ta1NoYXJlZEtleS5pZFxuICAgICk7XG5cbiAgICBjb25zdCBwbGFpbk1rUmVzaGFyZVJlc3BvbnNlQ2lwaGVyID0ge1xuICAgICAgbWtTaGFyZWRLZXk6IHtcbiAgICAgICAgaWQ6IG1rU2hhcmVkS2V5LmlkLFxuICAgICAgICBqd2s6IG1rU2hhcmVkS2V5Lmp3ay50b0pTT04odHJ1ZSksXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBXcmFwIHdpdGggc2hhcmVkS2V5IHRoZW4gYWdhaW4gd2l0aCBQYmtcbiAgICBjb25zdCBta1Jlc2hhcmVSZXNwb25zZUNpcGhlciA9XG4gICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgcGJrLFxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgICAgICBzaGFyZWRLZXkuandrLFxuICAgICAgICAgIHBsYWluTWtSZXNoYXJlUmVzcG9uc2VDaXBoZXJcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogUmVzcG9uZFRwTWtSZXNoYXJlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICB0cElkLFxuICAgICAgICAgIG1rU2hhcmVkS2V5SWQ6IG1rU2hhcmVkS2V5LmlkLFxuICAgICAgICAgIG1rUmVzaGFyZVJlc3BvbnNlQ2lwaGVyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGNvbXBsZXRlTWtSZXNoYXJlKHRwSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgY29uc3QgdXNlclNoYXJlZEtleSA9IGF3YWl0IHRoaXMuZ2V0VHBDdXJyZW50VXNlclNoYXJlZEtleSh0cElkKTtcblxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KHVzZXJTaGFyZWRLZXkuc2hhcmVkS2V5LmlkKTtcbiAgICBjb25zdCBwcmsgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEtleSh1c2VyU2hhcmVkS2V5Lm1rUHhrLmlkKTtcbiAgICBjb25zdCBwbGFpbk1rUmVzaGFyZVJlc3BvbnNlQ2lwaGVyID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgc2hhcmVkS2V5LFxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgICBwcmssXG4gICAgICAgIHVzZXJTaGFyZWRLZXkubWtSZXNoYXJlUmVzcG9uc2VDaXBoZXJcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gRG91YmxlIGNoZWNrIGl0J3MgYSB2YWxpZCBrZXkuXG4gICAgY29uc3QgbWtTaGFyZWRLZXk6IEtleSA9IHtcbiAgICAgIGlkOiBwbGFpbk1rUmVzaGFyZVJlc3BvbnNlQ2lwaGVyLm1rU2hhcmVkS2V5LmlkLFxuICAgICAgandrOiBhd2FpdCBKV0suYXNLZXkocGxhaW5Na1Jlc2hhcmVSZXNwb25zZUNpcGhlci5ta1NoYXJlZEtleS5qd2spLFxuICAgIH07XG5cbiAgICBjb25zdCBtYXN0ZXJLZXkgPSB0aGlzLmtleVNlcnZpY2UuY3VycmVudE1hc3RlcktleTtcbiAgICBjb25zdCBta1dyYXBwZWRNa1NoYXJlZEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxuICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgIG1rU2hhcmVkS2V5Lmp3ay50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBDb21wbGV0ZVRwTWtSZXNoYXJlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICB0cElkLFxuICAgICAgICAgIG1hc3RlcktleUlkOiBtYXN0ZXJLZXkuaWQsXG4gICAgICAgICAgbWtTaGFyZWRLZXlJZDogbWtTaGFyZWRLZXkuaWQsXG4gICAgICAgICAgbWtXcmFwcGVkTWtTaGFyZWRLZXksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBIZWxwZXJzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSBhc3luYyBnZXRUcEN1cnJlbnRVc2VyU2hhcmVkS2V5KHRwSWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMubHJHcmFwaFFMLnF1ZXJ5KHtcbiAgICAgICAgcXVlcnk6IFRwQ3VycmVudFVzZXJTaGFyZWRLZXlRdWVyeSxcbiAgICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgICAgaWQ6IHRwSWQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICkudHAuY3VycmVudFVzZXJTaGFyZWRLZXkudXNlclNoYXJlZEtleTtcbiAgfVxufVxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS50eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi90cnVzdGVkLXBhcnR5L3RydXN0ZWQtcGFydHkudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFjY2Vzc1JvbGVDaG9pY2UsXG4gIEpTT05PYmplY3QsXG4gIExyUmVsYXlJZElucHV0LFxuICBTaGFyZVR5cGVDaG9pY2UsXG59IGZyb20gJy4uL2FwaS90eXBlcyc7XG5pbXBvcnQgeyBJZEtleVBhaXIgfSBmcm9tICcuLi9pdGVtL2l0ZW0udHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUl0ZW1TaGFyZU9wdGlvbnMge1xuICB0cElkOiBMclJlbGF5SWRJbnB1dDtcbiAgYWNjZXNzUm9sZTogQWNjZXNzUm9sZUNob2ljZTtcbiAgc2hhcmVUeXBlOiBTaGFyZVR5cGVDaG9pY2U7XG4gIHBsYWluTWV0YUpzb24/OiBKU09OT2JqZWN0O1xuICBpdGVtPzogSWRLZXlQYWlyO1xuICBpdGVtSWQ/OiBMclJlbGF5SWRJbnB1dDtcbiAgaXRlbUtleUlkPzogTHJSZWxheUlkSW5wdXQ7XG4gIC8vIE9wdGlvbmFsIHRvIGltcHJvdmUgZWZmaWNpZW5jeVxuICB0cFNoYXJlZEtleUlkPzogTHJSZWxheUlkSW5wdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlSXRlbVNoYXJlT3B0aW9ucyB7XG4gIGl0ZW1TaGFyZUlkOiBMclJlbGF5SWRJbnB1dDtcbiAgYWNjZXNzUm9sZT86IEFjY2Vzc1JvbGVDaG9pY2U7XG4gIHBsYWluTWV0YUpzb24/OiBKU09OT2JqZWN0O1xuICAvLyBPcHRpb25hbCB0byBpbXByb3ZlIGVmZmljaWVuY3lcbiAgaXRlbT86IElkS2V5UGFpcjtcbiAgaXRlbUlkPzogTHJSZWxheUlkSW5wdXQ7XG4gIGl0ZW1LZXlJZD86IExyUmVsYXlJZElucHV0O1xuICB0cElkPzogTHJSZWxheUlkSW5wdXQ7XG4gIHRwU2hhcmVkS2V5SWQ/OiBMclJlbGF5SWRJbnB1dDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVEZXRhY2hlZEl0ZW1TaGFyZU9wdGlvbnMge1xuICBpdGVtU2hhcmVJZDogTHJSZWxheUlkSW5wdXQ7XG4gIGFjY2Vzc1JvbGU/OiBBY2Nlc3NSb2xlQ2hvaWNlO1xuICBwbGFpbk1ldGFKc29uPzogSlNPTk9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wbGV0ZURldGFjaGVkSXRlbVNoYXJlT3B0aW9ucyB7XG4gIGl0ZW1TaGFyZUlkOiBMclJlbGF5SWRJbnB1dDtcbiAgLy8gT3B0aW9uYWwgdG8gaW1wcm92ZSBlZmZpY2llbmN5XG4gIGl0ZW1LZXlJZD86IExyUmVsYXlJZElucHV0O1xufVxuIl19
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
4
|
-
import { KcBadArgumentException } from '../_common/exceptions';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@aws-amplify/auth/lib-esm/Auth";
|
|
7
|
-
export class TwoFactorService {
|
|
8
|
-
constructor(auth) {
|
|
9
|
-
this.auth = auth;
|
|
10
|
-
}
|
|
11
|
-
getPreferredMFA() {
|
|
12
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
13
|
-
const cognitoUser = yield this.auth.currentAuthenticatedUser();
|
|
14
|
-
return yield this.auth.getPreferredMFA(cognitoUser);
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
setPreferredMFA(method) {
|
|
18
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
19
|
-
const cognitoUser = yield this.auth.currentAuthenticatedUser();
|
|
20
|
-
yield this.auth.setPreferredMFA(cognitoUser, method);
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
setPhoneNumber(phone) {
|
|
24
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
25
|
-
const cognitoUser = yield this.auth.currentAuthenticatedUser();
|
|
26
|
-
yield this.auth.updateUserAttributes(cognitoUser, {
|
|
27
|
-
phone_number: phone,
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
getSMSCode() {
|
|
32
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
yield this.auth.verifyCurrentUserAttribute('phone_number');
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
verifySMSCode(verificationCode) {
|
|
37
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
-
yield this.auth.verifyCurrentUserAttributeSubmit('phone_number', verificationCode);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
getSoftwareToken() {
|
|
42
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
43
|
-
const [cognitoUser, userInfo] = yield Promise.all([
|
|
44
|
-
this.auth.currentAuthenticatedUser(),
|
|
45
|
-
this.auth.currentUserInfo(),
|
|
46
|
-
]);
|
|
47
|
-
const code = yield this.auth.setupTOTP(cognitoUser);
|
|
48
|
-
const email = userInfo.attributes.email;
|
|
49
|
-
if (!email) {
|
|
50
|
-
throw new KcBadArgumentException('No email associated with user.');
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
code,
|
|
54
|
-
codeUri: `otpauth://totp/${email}?secret=${code}&issuer=LifeReady`,
|
|
55
|
-
};
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
verifySoftwareToken(totpCode) {
|
|
59
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
60
|
-
const cognitoUser = yield this.auth.currentAuthenticatedUser();
|
|
61
|
-
yield this.auth.verifyTotpToken(cognitoUser, totpCode);
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
TwoFactorService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TwoFactorService_Factory() { return new TwoFactorService(i0.ɵɵinject(i1.AuthClass)); }, token: TwoFactorService, providedIn: "root" });
|
|
66
|
-
TwoFactorService.decorators = [
|
|
67
|
-
{ type: Injectable, args: [{
|
|
68
|
-
providedIn: 'root',
|
|
69
|
-
},] }
|
|
70
|
-
];
|
|
71
|
-
TwoFactorService.ctorParameters = () => [
|
|
72
|
-
{ type: AuthClass }
|
|
73
|
-
];
|
|
74
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWZhY3Rvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3R3by1mYWN0b3IvdHdvLWZhY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBSy9ELE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFBb0IsSUFBZTtRQUFmLFNBQUksR0FBSixJQUFJLENBQVc7SUFBRyxDQUFDO0lBRTFCLGVBQWU7O1lBQzFCLE1BQU0sV0FBVyxHQUFnQixNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUU1RSxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsQ0FBQztLQUFBO0lBRVksZUFBZSxDQUMxQixNQUFnQzs7WUFFaEMsTUFBTSxXQUFXLEdBQWdCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBRTVFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELENBQUM7S0FBQTtJQUVZLGNBQWMsQ0FBQyxLQUFLOztZQUMvQixNQUFNLFdBQVcsR0FBZ0IsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFFNUUsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRTtnQkFDaEQsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRVksVUFBVTs7WUFDckIsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdELENBQUM7S0FBQTtJQUVZLGFBQWEsQ0FBQyxnQkFBd0I7O1lBQ2pELE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FDOUMsY0FBYyxFQUNkLGdCQUFnQixDQUNqQixDQUFDO1FBQ0osQ0FBQztLQUFBO0lBRVksZ0JBQWdCOztZQUMzQixNQUFNLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7YUFDNUIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUVwRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNWLE1BQU0sSUFBSSxzQkFBc0IsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2FBQ3BFO1lBRUQsT0FBTztnQkFDTCxJQUFJO2dCQUNKLE9BQU8sRUFBRSxrQkFBa0IsS0FBSyxXQUFXLElBQUksbUJBQW1CO2FBQ25FLENBQUM7UUFDSixDQUFDO0tBQUE7SUFFWSxtQkFBbUIsQ0FBQyxRQUFnQjs7WUFDL0MsTUFBTSxXQUFXLEdBQWdCLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1lBRTVFLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELENBQUM7S0FBQTs7OztZQTlERixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQUxRLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2duaXRvVXNlciB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoJztcbmltcG9ydCB7IEF1dGhDbGFzcyB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoL2xpYi1lc20vQXV0aCc7XG5pbXBvcnQgeyBLY0JhZEFyZ3VtZW50RXhjZXB0aW9uIH0gZnJvbSAnLi4vX2NvbW1vbi9leGNlcHRpb25zJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFR3b0ZhY3RvclNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGg6IEF1dGhDbGFzcykge31cblxuICBwdWJsaWMgYXN5bmMgZ2V0UHJlZmVycmVkTUZBKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY29nbml0b1VzZXI6IENvZ25pdG9Vc2VyID0gYXdhaXQgdGhpcy5hdXRoLmN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcigpO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYXV0aC5nZXRQcmVmZXJyZWRNRkEoY29nbml0b1VzZXIpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldFByZWZlcnJlZE1GQShcbiAgICBtZXRob2Q6ICdUT1RQJyB8ICdTTVMnIHwgJ05PTUZBJ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb2duaXRvVXNlcjogQ29nbml0b1VzZXIgPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyKCk7XG5cbiAgICBhd2FpdCB0aGlzLmF1dGguc2V0UHJlZmVycmVkTUZBKGNvZ25pdG9Vc2VyLCBtZXRob2QpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldFBob25lTnVtYmVyKHBob25lKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29nbml0b1VzZXI6IENvZ25pdG9Vc2VyID0gYXdhaXQgdGhpcy5hdXRoLmN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcigpO1xuXG4gICAgYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVVzZXJBdHRyaWJ1dGVzKGNvZ25pdG9Vc2VyLCB7XG4gICAgICBwaG9uZV9udW1iZXI6IHBob25lLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNNU0NvZGUoKSB7XG4gICAgYXdhaXQgdGhpcy5hdXRoLnZlcmlmeUN1cnJlbnRVc2VyQXR0cmlidXRlKCdwaG9uZV9udW1iZXInKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlTTVNDb2RlKHZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlDdXJyZW50VXNlckF0dHJpYnV0ZVN1Ym1pdChcbiAgICAgICdwaG9uZV9udW1iZXInLFxuICAgICAgdmVyaWZpY2F0aW9uQ29kZVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U29mdHdhcmVUb2tlbigpOiBQcm9taXNlPHsgY29kZTogc3RyaW5nOyBjb2RlVXJpOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IFtjb2duaXRvVXNlciwgdXNlckluZm9dID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5hdXRoLmN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcigpLFxuICAgICAgdGhpcy5hdXRoLmN1cnJlbnRVc2VySW5mbygpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgY29kZSA9IGF3YWl0IHRoaXMuYXV0aC5zZXR1cFRPVFAoY29nbml0b1VzZXIpO1xuXG4gICAgY29uc3QgZW1haWwgPSB1c2VySW5mby5hdHRyaWJ1dGVzLmVtYWlsO1xuICAgIGlmICghZW1haWwpIHtcbiAgICAgIHRocm93IG5ldyBLY0JhZEFyZ3VtZW50RXhjZXB0aW9uKCdObyBlbWFpbCBhc3NvY2lhdGVkIHdpdGggdXNlci4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29kZSxcbiAgICAgIGNvZGVVcmk6IGBvdHBhdXRoOi8vdG90cC8ke2VtYWlsfT9zZWNyZXQ9JHtjb2RlfSZpc3N1ZXI9TGlmZVJlYWR5YCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHZlcmlmeVNvZnR3YXJlVG9rZW4odG90cENvZGU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvZ25pdG9Vc2VyOiBDb2duaXRvVXNlciA9IGF3YWl0IHRoaXMuYXV0aC5jdXJyZW50QXV0aGVudGljYXRlZFVzZXIoKTtcblxuICAgIGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlUb3RwVG9rZW4oY29nbml0b1VzZXIsIHRvdHBDb2RlKTtcbiAgfVxufVxuIl19
|