@lifeready/core 1.0.21 → 1.0.23
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/bundles/lifeready-core.umd.js +10612 -10527
- package/bundles/lifeready-core.umd.js.map +1 -1
- package/bundles/lifeready-core.umd.min.js +1 -15
- package/bundles/lifeready-core.umd.min.js.map +1 -1
- package/esm2015/lib/_common/ast.js +2 -1
- package/esm2015/lib/_common/deferred-promise.js +1 -1
- package/esm2015/lib/_common/exceptions.js +1 -1
- package/esm2015/lib/_common/queries.gql.js +1 -1
- package/esm2015/lib/_common/run-outside-angular.js +3 -2
- package/esm2015/lib/_common/types.js +2 -1
- package/esm2015/lib/_common/utils.js +2 -1
- package/esm2015/lib/api/lr-apollo.service.js +4 -3
- package/esm2015/lib/api/lr-graphql/index.js +1 -1
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +9 -8
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +5 -6
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +1 -1
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +3 -3
- package/esm2015/lib/api/lr-graphql/lr.service.js +1 -1
- package/esm2015/lib/api/query-processor/common-processors.service.js +4 -3
- package/esm2015/lib/api/query-processor/index.js +1 -1
- package/esm2015/lib/api/query-processor/query-processor.service.js +5 -4
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +8 -7
- package/esm2015/lib/api/types/graphql.types.js +2 -1
- package/esm2015/lib/api/types/index.js +1 -1
- package/esm2015/lib/api/types/lr-graphql.types.js +1 -1
- package/esm2015/lib/auth/auth.config.js +1 -1
- package/esm2015/lib/auth/auth.gql.js +1 -28
- package/esm2015/lib/auth/auth.types.js +1 -1
- package/esm2015/lib/auth/life-ready-auth.service.js +36 -32
- package/esm2015/lib/category/category-meta.service.js +1 -1
- package/esm2015/lib/category/category.gql.js +3 -2
- package/esm2015/lib/category/category.service.js +9 -8
- package/esm2015/lib/category/category.types.js +1 -1
- package/esm2015/lib/contact-card/contact-card.gql.js +79 -0
- package/esm2015/lib/contact-card/contact-card.service.js +156 -0
- package/esm2015/lib/contact-card/contact-card2.gql.js +29 -0
- package/esm2015/lib/contact-card/contact-card2.service.js +103 -0
- package/esm2015/lib/encryption/encryption.service.js +190 -0
- package/esm2015/lib/file-upload/file-upload.service.js +74 -0
- package/esm2015/lib/file-upload/file-upload.types.js +2 -0
- package/esm2015/lib/idle/idle.service.js +168 -0
- package/esm2015/lib/idle/idle.types.js +7 -0
- package/esm2015/lib/item2/item2.gql.js +127 -0
- package/esm2015/lib/item2/item2.gql.private.js +23 -0
- package/esm2015/lib/item2/item2.service.js +519 -0
- package/esm2015/lib/item2/item2.types.js +2 -0
- package/esm2015/lib/key/key-factory.service.js +237 -0
- package/esm2015/lib/key/key-graph.service.js +300 -0
- package/esm2015/lib/key/key-meta.service.js +201 -0
- package/esm2015/lib/{cryptography → key}/key.service.js +4 -4
- package/esm2015/lib/key/key.types.js +11 -0
- package/esm2015/lib/key-exchange/key-exchange.gql.js +188 -0
- package/esm2015/lib/key-exchange/key-exchange.service.js +441 -0
- package/esm2015/lib/key-exchange/key-exchange.types.js +7 -0
- package/esm2015/lib/key-exchange/key-exchange2.gql.js +171 -0
- package/esm2015/lib/key-exchange/key-exchange2.service.js +500 -0
- package/esm2015/lib/lbop/lbop.service.js +357 -0
- package/esm2015/lib/life-ready.config.js +2 -1
- package/esm2015/lib/life-ready.module.js +2 -27
- package/esm2015/lib/lock/lock.gql.js +40 -0
- package/esm2015/lib/lock/lock.service.js +64 -0
- package/esm2015/lib/message/message.gql.js +32 -0
- package/esm2015/lib/message/message.service.js +118 -0
- package/esm2015/lib/message/message.types.js +2 -0
- package/esm2015/lib/notification/notification.gql.js +1 -1
- package/esm2015/lib/notification/notification.service.js +2 -2
- package/esm2015/lib/password/password.gql.js +28 -0
- package/esm2015/lib/password/password.service.js +316 -0
- package/esm2015/lib/persist/persist.service.js +181 -0
- package/esm2015/lib/plan/plan.gql.js +1 -1
- package/esm2015/lib/plan/plan.service.js +3 -2
- package/esm2015/lib/plan/plan.types.js +1 -1
- package/esm2015/lib/profile/profile-details.service.js +215 -0
- package/esm2015/lib/profile/profile.gql.js +98 -0
- package/esm2015/lib/profile/profile.service.js +170 -0
- package/esm2015/lib/profile/profile.types.js +34 -0
- package/esm2015/lib/record/record-attachment.service.js +16 -15
- package/esm2015/lib/record/record.gql.js +1 -1
- package/esm2015/lib/record/record.service.js +8 -8
- package/esm2015/lib/record/record.types.js +1 -1
- package/esm2015/lib/record-type/record-type.service.js +1 -1
- package/esm2015/lib/record-type/record-type.types.js +1 -1
- package/esm2015/lib/register/register.service.js +173 -0
- package/esm2015/lib/scenario/scenario.constants.js +1 -1
- package/esm2015/lib/scenario/scenario.controller.js +2 -2
- package/esm2015/lib/scenario/scenario.gql.js +1 -1
- package/esm2015/lib/scenario/scenario.private.gql.js +198 -0
- package/esm2015/lib/scenario/scenario.service.js +19 -17
- package/esm2015/lib/scenario/scenario.types.js +2 -1
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +119 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +41 -0
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +117 -0
- package/esm2015/lib/slip39/slip39.service.js +167 -0
- package/esm2015/lib/time/time.service.js +146 -0
- package/esm2015/lib/tp-assembly/tp-assembly.js +365 -0
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +22 -0
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +2 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +100 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +118 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +4 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +34 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +74 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +165 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +54 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +92 -0
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +2 -0
- package/esm2015/lib/trusted-party/trusted-party.gql.js +148 -0
- package/esm2015/lib/trusted-party/trusted-party.service.js +327 -0
- package/esm2015/lib/trusted-party/trusted-party.types.js +41 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.js +64 -0
- package/esm2015/lib/trusted-party/trusted-party2.gql.private.js +25 -0
- package/esm2015/lib/trusted-party/trusted-party2.service.js +224 -0
- package/esm2015/lib/trusted-party/trusted-party2.types.js +2 -0
- package/esm2015/lib/two-factor/two-factor.service.js +74 -0
- package/esm2015/lib/user/user.gql.js +60 -0
- package/esm2015/lib/user/user.service.js +80 -0
- package/esm2015/lib/user/user.types.js +2 -0
- package/esm2015/lib/web-crypto/web-crypto.service.js +29 -0
- package/esm2015/lifeready-core.js +15 -13
- package/esm2015/public-api.js +49 -51
- package/fesm2015/lifeready-core.js +8764 -8737
- package/fesm2015/lifeready-core.js.map +1 -1
- package/lib/_common/types.d.ts +3 -1
- package/lib/_common/utils.d.ts +2 -2
- package/lib/api/lr-apollo.service.d.ts +2 -2
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +26 -8
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +22 -4
- package/lib/api/lr-graphql/lr-mutation.d.ts +1 -2
- package/lib/api/query-processor/common-processors.service.d.ts +1 -1
- package/lib/api/query-processor/query-processor.service.d.ts +1 -1
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +2 -2
- package/lib/api/types/lr-graphql.types.d.ts +14 -3
- package/lib/auth/auth.gql.d.ts +0 -3
- package/lib/auth/auth.types.d.ts +5 -5
- package/lib/auth/life-ready-auth.service.d.ts +13 -13
- package/lib/category/category.gql.d.ts +1 -1
- package/lib/category/category.service.d.ts +3 -3
- package/lib/{api → contact-card}/contact-card.service.d.ts +9 -9
- package/lib/contact-card/contact-card2.gql.d.ts +25 -0
- package/lib/contact-card/contact-card2.service.d.ts +64 -0
- package/lib/{cryptography → encryption}/encryption.service.d.ts +10 -9
- package/lib/{api/file.service.d.ts → file-upload/file-upload.service.d.ts} +5 -8
- package/lib/file-upload/file-upload.types.d.ts +5 -0
- package/lib/{auth → idle}/idle.service.d.ts +6 -6
- package/lib/{items2 → item2}/item2.gql.d.ts +16 -16
- package/lib/{items2 → item2}/item2.service.d.ts +34 -35
- package/lib/{cryptography → key}/key-factory.service.d.ts +4 -3
- package/lib/{cryptography → key}/key-graph.service.d.ts +6 -6
- package/lib/{cryptography → key}/key-meta.service.d.ts +1 -1
- package/lib/{cryptography → key}/key.service.d.ts +2 -2
- package/lib/{cryptography/cryptography.types.d.ts → key/key.types.d.ts} +13 -17
- package/lib/{api → key-exchange}/key-exchange.service.d.ts +5 -5
- package/lib/{api → key-exchange}/key-exchange.types.d.ts +4 -4
- package/lib/{api → key-exchange}/key-exchange2.gql.d.ts +1 -1
- package/lib/{api → key-exchange}/key-exchange2.service.d.ts +82 -29
- package/lib/{auth → lbop}/lbop.service.d.ts +7 -7
- package/lib/life-ready.config.d.ts +1 -1
- package/lib/{api → lock}/lock.gql.d.ts +1 -1
- package/lib/{api → lock}/lock.service.d.ts +1 -1
- package/lib/message/message.gql.d.ts +13 -0
- package/lib/message/message.service.d.ts +36 -0
- package/lib/message/message.types.d.ts +12 -0
- package/lib/notification/notification.service.d.ts +3 -2
- package/lib/password/password.gql.d.ts +3 -0
- package/lib/{auth → password}/password.service.d.ts +9 -9
- package/lib/{api → persist}/persist.service.d.ts +3 -3
- package/lib/plan/plan.service.d.ts +3 -2
- package/lib/plan/plan.types.d.ts +2 -1
- package/lib/{users → profile}/profile-details.service.d.ts +3 -3
- package/lib/{users → profile}/profile.gql.d.ts +2 -2
- package/lib/{users → profile}/profile.service.d.ts +6 -6
- package/lib/{users → profile}/profile.types.d.ts +3 -2
- package/lib/record/record-attachment.service.d.ts +6 -6
- package/lib/record/record.service.d.ts +3 -3
- package/lib/{auth → register}/register.service.d.ts +4 -4
- package/lib/scenario/scenario.controller.d.ts +1 -1
- package/lib/scenario/scenario.service.d.ts +105 -5
- package/lib/scenario/scenario.types.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card.service.d.ts +9 -9
- package/lib/{api → shared-contact-card}/shared-contact-card2.gql.d.ts +1 -1
- package/lib/{api → shared-contact-card}/shared-contact-card2.service.d.ts +6 -6
- package/lib/{cryptography → slip39}/slip39.service.d.ts +0 -1
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.d.ts +7 -7
- package/lib/{trusted-parties → tp-assembly}/tp-assembly.types.d.ts +3 -3
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-request.service.d.ts +5 -9
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset-user.service.d.ts +7 -13
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.controller.d.ts +1 -1
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +63 -0
- package/lib/{trusted-parties/tp-password-reset.gql.d.ts → tp-password-reset/tp-password-reset.private.gql.d.ts} +1 -63
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +59 -0
- package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.service.d.ts +6 -89
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +40 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party.service.d.ts +7 -7
- package/lib/{trusted-parties → trusted-party}/trusted-party.types.d.ts +2 -3
- package/lib/{trusted-parties → trusted-party}/trusted-party2.gql.d.ts +0 -22
- package/lib/trusted-party/trusted-party2.gql.private.d.ts +23 -0
- package/lib/{trusted-parties → trusted-party}/trusted-party2.service.d.ts +11 -35
- package/lib/trusted-party/trusted-party2.types.d.ts +12 -0
- package/lib/{users → user}/user.gql.d.ts +1 -1
- package/lib/{users → user}/user.service.d.ts +1 -1
- package/lib/{users → user}/user.types.d.ts +1 -1
- package/lifeready-core.d.ts +14 -12
- package/lifeready-core.metadata.json +1 -1
- package/package.json +2 -2
- package/public-api.d.ts +48 -50
- package/esm2015/lib/api/contact-card.gql.js +0 -79
- package/esm2015/lib/api/contact-card.service.js +0 -154
- package/esm2015/lib/api/contact-card2.gql.js +0 -60
- package/esm2015/lib/api/contact-card2.service.js +0 -103
- package/esm2015/lib/api/file.service.js +0 -74
- package/esm2015/lib/api/key-exchange.gql.js +0 -188
- package/esm2015/lib/api/key-exchange.service.js +0 -442
- package/esm2015/lib/api/key-exchange.types.js +0 -7
- package/esm2015/lib/api/key-exchange2.gql.js +0 -171
- package/esm2015/lib/api/key-exchange2.service.js +0 -480
- package/esm2015/lib/api/lock.gql.js +0 -40
- package/esm2015/lib/api/lock.service.js +0 -64
- package/esm2015/lib/api/message.service.js +0 -138
- package/esm2015/lib/api/persist.service.js +0 -181
- package/esm2015/lib/api/shared-contact-card.service.js +0 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/api/time.service.js +0 -146
- package/esm2015/lib/auth/idle.service.js +0 -168
- package/esm2015/lib/auth/idle.types.js +0 -7
- package/esm2015/lib/auth/lbop.service.js +0 -355
- package/esm2015/lib/auth/password.service.js +0 -315
- package/esm2015/lib/auth/register.service.js +0 -172
- package/esm2015/lib/auth/two-factor.service.js +0 -74
- package/esm2015/lib/cryptography/cryptography.types.js +0 -11
- package/esm2015/lib/cryptography/encryption.service.js +0 -189
- package/esm2015/lib/cryptography/key-factory.service.js +0 -237
- package/esm2015/lib/cryptography/key-graph.service.js +0 -299
- package/esm2015/lib/cryptography/key-meta.service.js +0 -200
- package/esm2015/lib/cryptography/slip39.service.js +0 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
- package/esm2015/lib/items2/item2.gql.js +0 -127
- package/esm2015/lib/items2/item2.gql.private.js +0 -23
- package/esm2015/lib/items2/item2.service.js +0 -516
- package/esm2015/lib/items2/item2.types.js +0 -1
- package/esm2015/lib/scenario/scenario.gql.private.js +0 -198
- package/esm2015/lib/trusted-parties/tp-assembly.gql.private.js +0 -22
- package/esm2015/lib/trusted-parties/tp-assembly.js +0 -365
- package/esm2015/lib/trusted-parties/tp-assembly.types.js +0 -1
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -113
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -129
- package/esm2015/lib/trusted-parties/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/trusted-parties/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -237
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -95
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -218
- package/esm2015/lib/users/profile-details.service.js +0 -214
- package/esm2015/lib/users/profile.gql.js +0 -97
- package/esm2015/lib/users/profile.service.js +0 -169
- package/esm2015/lib/users/profile.types.js +0 -34
- package/esm2015/lib/users/user.gql.js +0 -60
- package/esm2015/lib/users/user.service.js +0 -79
- package/esm2015/lib/users/user.types.js +0 -1
- package/lib/api/contact-card2.gql.d.ts +0 -34
- package/lib/api/contact-card2.service.d.ts +0 -50
- package/lib/api/message.service.d.ts +0 -59
- /package/lib/{api → contact-card}/contact-card.gql.d.ts +0 -0
- /package/lib/{auth → idle}/idle.types.d.ts +0 -0
- /package/lib/{items2 → item2}/item2.gql.private.d.ts +0 -0
- /package/lib/{items2 → item2}/item2.types.d.ts +0 -0
- /package/lib/{api → key-exchange}/key-exchange.gql.d.ts +0 -0
- /package/lib/scenario/{scenario.gql.private.d.ts → scenario.private.gql.d.ts} +0 -0
- /package/lib/{api → time}/time.service.d.ts +0 -0
- /package/lib/{trusted-parties/tp-assembly.gql.private.d.ts → tp-assembly/tp-assembly.private.gql.d.ts} +0 -0
- /package/lib/{trusted-parties → tp-password-reset}/tp-password-reset.constants.d.ts +0 -0
- /package/lib/{trusted-parties → trusted-party}/trusted-party.gql.d.ts +0 -0
- /package/lib/{auth → two-factor}/two-factor.service.d.ts +0 -0
- /package/lib/{cryptography → web-crypto}/web-crypto.service.d.ts +0 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import gql from 'graphql-tag';
|
|
4
|
+
import { EncryptionService } from '../encryption/encryption.service';
|
|
5
|
+
import { KeyGraphService } from '../key/key-graph.service';
|
|
6
|
+
import { KeyService } from '../key/key.service';
|
|
7
|
+
import { ContactCardName } from '../profile/profile.types';
|
|
8
|
+
import { LrApolloService } from '../api/lr-apollo.service';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../key/key.service";
|
|
11
|
+
import * as i2 from "../api/lr-apollo.service";
|
|
12
|
+
import * as i3 from "../key/key-graph.service";
|
|
13
|
+
import * as i4 from "../encryption/encryption.service";
|
|
14
|
+
export const SharedContactCardFields = `
|
|
15
|
+
id
|
|
16
|
+
owner {
|
|
17
|
+
id
|
|
18
|
+
username
|
|
19
|
+
}
|
|
20
|
+
ownerKey {
|
|
21
|
+
id
|
|
22
|
+
}
|
|
23
|
+
ownerCipherData
|
|
24
|
+
receiver {
|
|
25
|
+
id
|
|
26
|
+
username
|
|
27
|
+
}
|
|
28
|
+
receiverKey {
|
|
29
|
+
id
|
|
30
|
+
}
|
|
31
|
+
receiverCipherData
|
|
32
|
+
sharedKey {
|
|
33
|
+
id
|
|
34
|
+
}
|
|
35
|
+
sharedCipherData
|
|
36
|
+
sharedCipherDataSig
|
|
37
|
+
sharedCipherDataSigPxk {
|
|
38
|
+
id
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
const UpdateOwnedContactCard = gql `
|
|
42
|
+
mutation UpdateOwnedContactCard(
|
|
43
|
+
$input: UpdateOwnedContactCardInput!
|
|
44
|
+
) {
|
|
45
|
+
updateOwnedContactCard(
|
|
46
|
+
input: $input
|
|
47
|
+
) {
|
|
48
|
+
ownedContactCard {
|
|
49
|
+
${SharedContactCardFields}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}`;
|
|
53
|
+
export class SharedContactCardService {
|
|
54
|
+
constructor(keyService, lrApollo, keyGraph, encryptionService) {
|
|
55
|
+
this.keyService = keyService;
|
|
56
|
+
this.lrApollo = lrApollo;
|
|
57
|
+
this.keyGraph = keyGraph;
|
|
58
|
+
this.encryptionService = encryptionService;
|
|
59
|
+
}
|
|
60
|
+
decryptSharedTrustedPartyDetails(cc) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
const details = yield this.decryptTrustedPartyDetails(cc);
|
|
63
|
+
return Object.assign({ id: cc.id, ownedKeyId: cc.ownerKey.id, sharedKeyId: cc.sharedKey.id }, details);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
decryptTrustedPartyDetails(cc) {
|
|
67
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
68
|
+
if (cc && cc.sharedKey && cc.sharedCipherData) {
|
|
69
|
+
try {
|
|
70
|
+
return yield this.encryptionService.decrypt(yield this.keyGraph.getJwkKey(cc.sharedKey.id), cc.sharedCipherData);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
console.error('Cannot decrypt trusted party details', e);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return null;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
updateMySharedContactCard(id, ownedKeyId, sharedKeyId, contactCard) {
|
|
80
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
const ownerKey = yield this.keyGraph.getKey(ownedKeyId);
|
|
82
|
+
const sharedKey = yield this.keyGraph.getKey(sharedKeyId);
|
|
83
|
+
const sigPxk = yield this.keyService.getCurrentSigPxk();
|
|
84
|
+
const sharedCipherData = yield this.encryptionService.encrypt(sharedKey.jwk, contactCard);
|
|
85
|
+
const sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
|
|
86
|
+
const ownerPlainData = {
|
|
87
|
+
name: new ContactCardName(contactCard.name),
|
|
88
|
+
};
|
|
89
|
+
const ownerPlainDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, ownerPlainData));
|
|
90
|
+
yield this.lrApollo.mutate({
|
|
91
|
+
mutation: UpdateOwnedContactCard,
|
|
92
|
+
variables: {
|
|
93
|
+
input: {
|
|
94
|
+
id,
|
|
95
|
+
ownerCipherData: '',
|
|
96
|
+
ownerKeyId: ownerKey.id,
|
|
97
|
+
sharedCipherDataSig,
|
|
98
|
+
sharedKeyId: sharedKey.id,
|
|
99
|
+
sigPxkId: sigPxk.id,
|
|
100
|
+
ownerPlainDataSig,
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
SharedContactCardService.ɵprov = i0.ɵɵdefineInjectable({ factory: function SharedContactCardService_Factory() { return new SharedContactCardService(i0.ɵɵinject(i1.KeyService), i0.ɵɵinject(i2.LrApolloService), i0.ɵɵinject(i3.KeyGraphService), i0.ɵɵinject(i4.EncryptionService)); }, token: SharedContactCardService, providedIn: "root" });
|
|
108
|
+
SharedContactCardService.decorators = [
|
|
109
|
+
{ type: Injectable, args: [{
|
|
110
|
+
providedIn: 'root',
|
|
111
|
+
},] }
|
|
112
|
+
];
|
|
113
|
+
SharedContactCardService.ctorParameters = () => [
|
|
114
|
+
{ type: KeyService },
|
|
115
|
+
{ type: LrApolloService },
|
|
116
|
+
{ type: KeyGraphService },
|
|
117
|
+
{ type: EncryptionService }
|
|
118
|
+
];
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLWNvbnRhY3QtY2FyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3NoYXJlZC1jb250YWN0LWNhcmQvc2hhcmVkLWNvbnRhY3QtY2FyZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUM5QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQXVCLE1BQU0sMEJBQTBCLENBQUM7QUFHaEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7QUFHM0QsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEJ0QyxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUE7Ozs7Ozs7O1FBUTFCLHVCQUF1Qjs7O0VBRzdCLENBQUM7QUEyQkgsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxZQUNVLFVBQXNCLEVBQ3RCLFFBQXlCLEVBQ3pCLFFBQXlCLEVBQ3pCLGlCQUFvQztRQUhwQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7SUFDM0MsQ0FBQztJQUVFLGdDQUFnQyxDQUNwQyxFQUFxQjs7WUFFckIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFMUQsdUJBQ0UsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQ1QsVUFBVSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUMxQixXQUFXLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQ3pCLE9BQU8sRUFDVjtRQUNKLENBQUM7S0FBQTtJQUVLLDBCQUEwQixDQUM5QixFQUFxQjs7WUFFckIsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzdDLElBQUk7b0JBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQ3pDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFDOUMsRUFBRSxDQUFDLGdCQUFnQixDQUNwQixDQUFDO2lCQUNIO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQzFEO2FBQ0Y7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FBQTtJQUVLLHlCQUF5QixDQUM3QixFQUFVLEVBQ1YsVUFBa0IsRUFDbEIsV0FBbUIsRUFDbkIsV0FBZ0M7O1lBRWhDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEQsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUV4RCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDM0QsU0FBUyxDQUFDLEdBQUcsRUFDYixXQUFXLENBQ1osQ0FBQztZQUNGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDeEMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUMsQ0FDaEUsQ0FBQztZQUVGLE1BQU0sY0FBYyxHQUFHO2dCQUNyQixJQUFJLEVBQUUsSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQzthQUM1QyxDQUFDO1lBQ0YsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUN0QyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FDOUQsQ0FBQztZQUVGLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQXlCO2dCQUNqRCxRQUFRLEVBQUUsc0JBQXNCO2dCQUNoQyxTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLEVBQUU7d0JBQ0YsZUFBZSxFQUFFLEVBQUU7d0JBQ25CLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRTt3QkFDdkIsbUJBQW1CO3dCQUNuQixXQUFXLEVBQUUsU0FBUyxDQUFDLEVBQUU7d0JBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTt3QkFDbkIsaUJBQWlCO3FCQUNsQjtpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTs7OztZQS9FRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQXpFUSxVQUFVO1lBS1YsZUFBZTtZQU5mLGVBQWU7WUFEZixpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vZW5jcnlwdGlvbi9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5R3JhcGhTZXJ2aWNlIH0gZnJvbSAnLi4va2V5L2tleS1ncmFwaC5zZXJ2aWNlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LnNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5IH0gZnJvbSAnLi4va2V5L2tleS50eXBlcyc7XG5pbXBvcnQgeyBDb250YWN0Q2FyZE5hbWUsIFRydXN0ZWRQYXJ0eURldGFpbHMgfSBmcm9tICcuLi9wcm9maWxlL3Byb2ZpbGUudHlwZXMnO1xuaW1wb3J0IHsgU2hhcmVkVHJ1c3RlZFBhcnR5RGV0YWlscyB9IGZyb20gJy4uL3RydXN0ZWQtcGFydHkvdHJ1c3RlZC1wYXJ0eS50eXBlcyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci91c2VyLnR5cGVzJztcbmltcG9ydCB7IExyQXBvbGxvU2VydmljZSB9IGZyb20gJy4uL2FwaS9sci1hcG9sbG8uc2VydmljZSc7XG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IFNoYXJlZENvbnRhY3RDYXJkRmllbGRzID0gYFxuICBpZFxuICBvd25lciB7XG4gICAgaWRcbiAgICB1c2VybmFtZVxuICB9XG4gIG93bmVyS2V5IHtcbiAgICBpZFxuICB9XG4gIG93bmVyQ2lwaGVyRGF0YVxuICByZWNlaXZlciB7XG4gICAgaWRcbiAgICB1c2VybmFtZVxuICB9XG4gIHJlY2VpdmVyS2V5IHtcbiAgICBpZFxuICB9XG4gIHJlY2VpdmVyQ2lwaGVyRGF0YVxuICBzaGFyZWRLZXkge1xuICAgIGlkXG4gIH1cbiAgc2hhcmVkQ2lwaGVyRGF0YVxuICBzaGFyZWRDaXBoZXJEYXRhU2lnXG4gIHNoYXJlZENpcGhlckRhdGFTaWdQeGsge1xuICAgIGlkXG4gIH1cbmA7XG5cbmNvbnN0IFVwZGF0ZU93bmVkQ29udGFjdENhcmQgPSBncWxgXG5tdXRhdGlvbiBVcGRhdGVPd25lZENvbnRhY3RDYXJkKFxuICAkaW5wdXQ6IFVwZGF0ZU93bmVkQ29udGFjdENhcmRJbnB1dCFcbikge1xuICB1cGRhdGVPd25lZENvbnRhY3RDYXJkKFxuICAgIGlucHV0OiAkaW5wdXRcbiAgKSB7XG4gICAgb3duZWRDb250YWN0Q2FyZCB7XG4gICAgICAke1NoYXJlZENvbnRhY3RDYXJkRmllbGRzfVxuICAgIH1cbiAgfVxufWA7XG5cbmludGVyZmFjZSBVcGRhdGVPd25lZENvbnRhY3RDYXJkIHtcbiAgdXBkYXRlT3duZWRDb250YWN0Q2FyZDoge1xuICAgIG93bmVkQ29udGFjdENhcmQ6IFNoYXJlZENvbnRhY3RDYXJkO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZENvbnRhY3RDYXJkIHtcbiAgaWQ6IHN0cmluZztcbiAgb3duZXI6IFVzZXI7XG4gIG93bmVyS2V5OiBLZXk7XG4gIG93bmVyQ2lwaGVyRGF0YTogc3RyaW5nO1xuICByZWNlaXZlcjogVXNlcjtcbiAgcmVjZWl2ZXJLZXk6IEtleTtcbiAgcmVjZWl2ZXJDaXBoZXJEYXRhOiBzdHJpbmc7XG4gIHNoYXJlZEtleTogS2V5O1xuICBzaGFyZWRDaXBoZXJEYXRhOiBzdHJpbmc7XG4gIC8vIERlY3J5cHRlZFxuICBwbGFpbk93bmVyQ2lwaGVyRGF0YUpzb246IEpTT05PYmplY3Q7XG4gIHBsYWluUmVjZWl2ZXJDaXBoZXJEYXRhSnNvbjogSlNPTk9iamVjdDtcbiAgcGxhaW5TaGFyZWRDaXBoZXJEYXRhSnNvbjogSlNPTk9iamVjdDtcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFNoYXJlZENvbnRhY3RDYXJkU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlHcmFwaDogS2V5R3JhcGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBkZWNyeXB0U2hhcmVkVHJ1c3RlZFBhcnR5RGV0YWlscyhcbiAgICBjYzogU2hhcmVkQ29udGFjdENhcmRcbiAgKTogUHJvbWlzZTxTaGFyZWRUcnVzdGVkUGFydHlEZXRhaWxzPiB7XG4gICAgY29uc3QgZGV0YWlscyA9IGF3YWl0IHRoaXMuZGVjcnlwdFRydXN0ZWRQYXJ0eURldGFpbHMoY2MpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBjYy5pZCxcbiAgICAgIG93bmVkS2V5SWQ6IGNjLm93bmVyS2V5LmlkLFxuICAgICAgc2hhcmVkS2V5SWQ6IGNjLnNoYXJlZEtleS5pZCxcbiAgICAgIC4uLmRldGFpbHMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIGRlY3J5cHRUcnVzdGVkUGFydHlEZXRhaWxzKFxuICAgIGNjOiBTaGFyZWRDb250YWN0Q2FyZFxuICApOiBQcm9taXNlPFRydXN0ZWRQYXJ0eURldGFpbHM+IHtcbiAgICBpZiAoY2MgJiYgY2Muc2hhcmVkS2V5ICYmIGNjLnNoYXJlZENpcGhlckRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgICAgYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRKd2tLZXkoY2Muc2hhcmVkS2V5LmlkKSxcbiAgICAgICAgICBjYy5zaGFyZWRDaXBoZXJEYXRhXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBkZWNyeXB0IHRydXN0ZWQgcGFydHkgZGV0YWlscycsIGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU15U2hhcmVkQ29udGFjdENhcmQoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBvd25lZEtleUlkOiBzdHJpbmcsXG4gICAgc2hhcmVkS2V5SWQ6IHN0cmluZyxcbiAgICBjb250YWN0Q2FyZDogVHJ1c3RlZFBhcnR5RGV0YWlsc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvd25lcktleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KG93bmVkS2V5SWQpO1xuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KHNoYXJlZEtleUlkKTtcbiAgICBjb25zdCBzaWdQeGsgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFNpZ1B4aygpO1xuXG4gICAgY29uc3Qgc2hhcmVkQ2lwaGVyRGF0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIHNoYXJlZEtleS5qd2ssXG4gICAgICBjb250YWN0Q2FyZFxuICAgICk7XG4gICAgY29uc3Qgc2hhcmVkQ2lwaGVyRGF0YVNpZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHNpZ1B4ay5qd2ssIHNoYXJlZENpcGhlckRhdGEpXG4gICAgKTtcblxuICAgIGNvbnN0IG93bmVyUGxhaW5EYXRhID0ge1xuICAgICAgbmFtZTogbmV3IENvbnRhY3RDYXJkTmFtZShjb250YWN0Q2FyZC5uYW1lKSxcbiAgICB9O1xuICAgIGNvbnN0IG93bmVyUGxhaW5EYXRhU2lnID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLnNpZ24oc2lnUHhrLmp3aywgb3duZXJQbGFpbkRhdGEpXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPFVwZGF0ZU93bmVkQ29udGFjdENhcmQ+KHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVPd25lZENvbnRhY3RDYXJkLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgb3duZXJDaXBoZXJEYXRhOiAnJyxcbiAgICAgICAgICBvd25lcktleUlkOiBvd25lcktleS5pZCxcbiAgICAgICAgICBzaGFyZWRDaXBoZXJEYXRhU2lnLFxuICAgICAgICAgIHNoYXJlZEtleUlkOiBzaGFyZWRLZXkuaWQsXG4gICAgICAgICAgc2lnUHhrSWQ6IHNpZ1B4ay5pZCxcbiAgICAgICAgICBvd25lclBsYWluRGF0YVNpZyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { gqlTyped } from '../_common/ast';
|
|
2
|
+
export const UpdateOwnedContactCardMutation = gqlTyped `
|
|
3
|
+
mutation UpdateOwnedContactCardMutation(
|
|
4
|
+
$input: UpdateOwnedContactCardInput!
|
|
5
|
+
) {
|
|
6
|
+
updateOwnedContactCard(input: $input) {
|
|
7
|
+
ownedContactCard {
|
|
8
|
+
id
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}`;
|
|
12
|
+
export const UpdateReceivedContactCardMutation = gqlTyped `
|
|
13
|
+
mutation UpdateReceivedContactCardMutation(
|
|
14
|
+
$input: UpdateReceivedContactCardInput!
|
|
15
|
+
) {
|
|
16
|
+
updateReceivedContactCard(input: $input) {
|
|
17
|
+
receivedContactCard {
|
|
18
|
+
id
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}`;
|
|
22
|
+
export const GetOwnedContactCardKeyIdsQuery = gqlTyped `
|
|
23
|
+
query GetOwnedContactCardKeyIdsQuery($id: LrRelayIdInput!) {
|
|
24
|
+
ownedContactCard(id: $id) {
|
|
25
|
+
sharedKey {
|
|
26
|
+
id
|
|
27
|
+
}
|
|
28
|
+
ownerKey {
|
|
29
|
+
id
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}`;
|
|
33
|
+
export const GetReceivedContactCardKeyIdQuery = gqlTyped `
|
|
34
|
+
query GetReceivedContactCardKeyIdQuery($id: LrRelayIdInput!) {
|
|
35
|
+
receivedContactCard(id: $id) {
|
|
36
|
+
receiverKey {
|
|
37
|
+
id
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}`;
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLWNvbnRhY3QtY2FyZDIuZ3FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3NoYXJlZC1jb250YWN0LWNhcmQvc2hhcmVkLWNvbnRhY3QtY2FyZDIuZ3FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVMxQyxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxRQUFRLENBQWdDOzs7Ozs7Ozs7RUFTcEYsQ0FBQztBQVNILE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFFBQVEsQ0FBbUM7Ozs7Ozs7OztFQVMxRixDQUFDO0FBWUgsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsUUFBUSxDQUFnQzs7Ozs7Ozs7OztFQVVwRixDQUFDO0FBU0gsTUFBTSxDQUFDLE1BQU0sZ0NBQWdDLEdBQUcsUUFBUSxDQUFrQzs7Ozs7OztFQU94RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUQgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgZ3FsVHlwZWQgfSBmcm9tICcuLi9fY29tbW9uL2FzdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlT3duZWRDb250YWN0Q2FyZE11dGF0aW9uIHtcbiAgdXBkYXRlT3duZWRDb250YWN0Q2FyZDoge1xuICAgIG93bmVkQ29udGFjdENhcmQ6IHtcbiAgICAgIGlkOiBJRDtcbiAgICB9O1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IFVwZGF0ZU93bmVkQ29udGFjdENhcmRNdXRhdGlvbiA9IGdxbFR5cGVkPFVwZGF0ZU93bmVkQ29udGFjdENhcmRNdXRhdGlvbj5gXG5tdXRhdGlvbiBVcGRhdGVPd25lZENvbnRhY3RDYXJkTXV0YXRpb24oXG4gICRpbnB1dDogVXBkYXRlT3duZWRDb250YWN0Q2FyZElucHV0IVxuKSB7XG4gIHVwZGF0ZU93bmVkQ29udGFjdENhcmQoaW5wdXQ6ICRpbnB1dCkge1xuICAgIG93bmVkQ29udGFjdENhcmQge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVJlY2VpdmVkQ29udGFjdENhcmRNdXRhdGlvbiB7XG4gIHVwZGF0ZVJlY2VpdmVkQ29udGFjdENhcmQ6IHtcbiAgICByZWNlaXZlZENvbnRhY3RDYXJkOiB7XG4gICAgICBpZDogSUQ7XG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBVcGRhdGVSZWNlaXZlZENvbnRhY3RDYXJkTXV0YXRpb24gPSBncWxUeXBlZDxVcGRhdGVSZWNlaXZlZENvbnRhY3RDYXJkTXV0YXRpb24+YFxubXV0YXRpb24gVXBkYXRlUmVjZWl2ZWRDb250YWN0Q2FyZE11dGF0aW9uKFxuICAkaW5wdXQ6IFVwZGF0ZVJlY2VpdmVkQ29udGFjdENhcmRJbnB1dCFcbikge1xuICB1cGRhdGVSZWNlaXZlZENvbnRhY3RDYXJkKGlucHV0OiAkaW5wdXQpIHtcbiAgICByZWNlaXZlZENvbnRhY3RDYXJkIHtcbiAgICAgIGlkXG4gICAgfVxuICB9XG59YDtcblxuZXhwb3J0IGludGVyZmFjZSBHZXRPd25lZENvbnRhY3RDYXJkS2V5SWRzUXVlcnkge1xuICBvd25lZENvbnRhY3RDYXJkOiB7XG4gICAgc2hhcmVkS2V5OiB7XG4gICAgICBpZDogSUQ7XG4gICAgfTtcbiAgICBvd25lcktleToge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgR2V0T3duZWRDb250YWN0Q2FyZEtleUlkc1F1ZXJ5ID0gZ3FsVHlwZWQ8R2V0T3duZWRDb250YWN0Q2FyZEtleUlkc1F1ZXJ5PmBcbnF1ZXJ5IEdldE93bmVkQ29udGFjdENhcmRLZXlJZHNRdWVyeSgkaWQ6IExyUmVsYXlJZElucHV0ISkge1xuICBvd25lZENvbnRhY3RDYXJkKGlkOiAkaWQpIHtcbiAgICBzaGFyZWRLZXkge1xuICAgICAgaWRcbiAgICB9XG4gICAgb3duZXJLZXkge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1gO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJlY2VpdmVkQ29udGFjdENhcmRLZXlJZFF1ZXJ5IHtcbiAgcmVjZWl2ZWRDb250YWN0Q2FyZDoge1xuICAgIHJlY2VpdmVyS2V5OiB7XG4gICAgICBpZDogSUQ7XG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBHZXRSZWNlaXZlZENvbnRhY3RDYXJkS2V5SWRRdWVyeSA9IGdxbFR5cGVkPEdldFJlY2VpdmVkQ29udGFjdENhcmRLZXlJZFF1ZXJ5PmBcbnF1ZXJ5IEdldFJlY2VpdmVkQ29udGFjdENhcmRLZXlJZFF1ZXJ5KCRpZDogTHJSZWxheUlkSW5wdXQhKSB7XG4gIHJlY2VpdmVkQ29udGFjdENhcmQoaWQ6ICRpZCkge1xuICAgIHJlY2VpdmVyS2V5IHtcbiAgICAgIGlkXG4gICAgfVxuICB9XG59YDtcbiJdfQ==
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { __awaiter, __decorate } from "tslib";
|
|
2
|
+
import { Injectable, NgZone } from '@angular/core';
|
|
3
|
+
import { LrGraphQLService, LrMutation } from '../api/lr-graphql';
|
|
4
|
+
import { EncryptionService } from '../encryption/encryption.service';
|
|
5
|
+
import { KeyGraphService } from '../key/key-graph.service';
|
|
6
|
+
import { KeyService } from '../key/key.service';
|
|
7
|
+
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
8
|
+
import { GetOwnedContactCardKeyIdsQuery, GetReceivedContactCardKeyIdQuery, UpdateOwnedContactCardMutation, UpdateReceivedContactCardMutation, } from './shared-contact-card2.gql';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "../key/key.service";
|
|
11
|
+
import * as i2 from "../key/key-graph.service";
|
|
12
|
+
import * as i3 from "../encryption/encryption.service";
|
|
13
|
+
import * as i4 from "../api/lr-graphql/lr-graphql.service";
|
|
14
|
+
let SharedContactCard2Service = class SharedContactCard2Service {
|
|
15
|
+
constructor(ngZone, keyService, keyGraph, encryptionService, lrGraphQL) {
|
|
16
|
+
this.ngZone = ngZone;
|
|
17
|
+
this.keyService = keyService;
|
|
18
|
+
this.keyGraph = keyGraph;
|
|
19
|
+
this.encryptionService = encryptionService;
|
|
20
|
+
this.lrGraphQL = lrGraphQL;
|
|
21
|
+
}
|
|
22
|
+
getOwnedContactCardKeyIds(id) {
|
|
23
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
+
const { ownedContactCard: cc } = yield this.lrGraphQL.query({
|
|
25
|
+
query: GetOwnedContactCardKeyIdsQuery,
|
|
26
|
+
variables: {
|
|
27
|
+
id,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
sharedKeyId: cc.sharedKey.id,
|
|
32
|
+
ownerKeyId: cc.ownerKey.id,
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
getReceivedContactCardKeyId(id) {
|
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
38
|
+
return (yield this.lrGraphQL.query({
|
|
39
|
+
query: GetReceivedContactCardKeyIdQuery,
|
|
40
|
+
variables: {
|
|
41
|
+
id,
|
|
42
|
+
},
|
|
43
|
+
})).receivedContactCard.receiverKey.id;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
updateOwnedContactCard({ id, ownerKeyId, sharedKeyId, ownerPlainDataJson, ownerCipherDataClearJson, sharedCipherDataClearJson, }) {
|
|
47
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
48
|
+
let ownerKey;
|
|
49
|
+
let sharedKey;
|
|
50
|
+
try {
|
|
51
|
+
ownerKey = yield this.keyGraph.getKey(ownerKeyId);
|
|
52
|
+
sharedKey = yield this.keyGraph.getKey(sharedKeyId);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const keys = yield this.getOwnedContactCardKeyIds(id);
|
|
56
|
+
// try again
|
|
57
|
+
ownerKey = yield this.keyGraph.getKey(keys.ownerKeyId);
|
|
58
|
+
sharedKey = yield this.keyGraph.getKey(keys.sharedKeyId);
|
|
59
|
+
}
|
|
60
|
+
const sigPxk = yield this.keyService.getCurrentSigPxk();
|
|
61
|
+
const sharedCipherData = yield this.encryptionService.encrypt(sharedKey.jwk, sharedCipherDataClearJson);
|
|
62
|
+
const sharedCipherDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, sharedCipherData));
|
|
63
|
+
const ownerPlainDataSig = JSON.stringify(yield this.encryptionService.sign(sigPxk.jwk, ownerPlainDataJson));
|
|
64
|
+
const ownerCipherData = yield this.encryptionService.encryptToString(ownerKey.jwk, ownerCipherDataClearJson);
|
|
65
|
+
return new LrMutation({
|
|
66
|
+
mutation: UpdateOwnedContactCardMutation,
|
|
67
|
+
variables: {
|
|
68
|
+
input: {
|
|
69
|
+
id,
|
|
70
|
+
ownerCipherData,
|
|
71
|
+
ownerKeyId: ownerKey.id,
|
|
72
|
+
sharedCipherDataSig,
|
|
73
|
+
sharedKeyId: sharedKey.id,
|
|
74
|
+
sigPxkId: sigPxk.id,
|
|
75
|
+
ownerPlainDataSig,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
updateReceivedContactCard({ id, receiverKeyId, receiverCipherDataClearJson, }) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
const receiverKey = yield this.keyGraph.getKey(receiverKeyId, () => this.getReceivedContactCardKeyId(id));
|
|
84
|
+
const receiverCipherData = yield this.encryptionService.encryptToString(receiverKey.jwk, receiverCipherDataClearJson);
|
|
85
|
+
return new LrMutation({
|
|
86
|
+
mutation: UpdateReceivedContactCardMutation,
|
|
87
|
+
variables: {
|
|
88
|
+
input: {
|
|
89
|
+
id,
|
|
90
|
+
receiverCipherData,
|
|
91
|
+
receiverKeyId: receiverKey.id,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
SharedContactCard2Service.ɵprov = i0.ɵɵdefineInjectable({ factory: function SharedContactCard2Service_Factory() { return new SharedContactCard2Service(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i1.KeyService), i0.ɵɵinject(i2.KeyGraphService), i0.ɵɵinject(i3.EncryptionService), i0.ɵɵinject(i4.LrGraphQLService)); }, token: SharedContactCard2Service, providedIn: "root" });
|
|
99
|
+
SharedContactCard2Service.decorators = [
|
|
100
|
+
{ type: Injectable, args: [{
|
|
101
|
+
providedIn: 'root',
|
|
102
|
+
},] }
|
|
103
|
+
];
|
|
104
|
+
SharedContactCard2Service.ctorParameters = () => [
|
|
105
|
+
{ type: NgZone },
|
|
106
|
+
{ type: KeyService },
|
|
107
|
+
{ type: KeyGraphService },
|
|
108
|
+
{ type: EncryptionService },
|
|
109
|
+
{ type: LrGraphQLService }
|
|
110
|
+
];
|
|
111
|
+
SharedContactCard2Service = __decorate([
|
|
112
|
+
RunOutsideAngular({
|
|
113
|
+
ngZoneName: 'ngZone',
|
|
114
|
+
})
|
|
115
|
+
], SharedContactCard2Service);
|
|
116
|
+
export { SharedContactCard2Service };
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLWNvbnRhY3QtY2FyZDIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9zaGFyZWQtY29udGFjdC1jYXJkL3NoYXJlZC1jb250YWN0LWNhcmQyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUtyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsZ0NBQWdDLEVBQ2hDLDhCQUE4QixFQUM5QixpQ0FBaUMsR0FDbEMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7O0lBb0J2Qix5QkFBeUIsU0FBekIseUJBQXlCO0lBQ3BDLFlBQ1UsTUFBYyxFQUNkLFVBQXNCLEVBQ3RCLFFBQXlCLEVBQ3pCLGlCQUFvQyxFQUNwQyxTQUEyQjtRQUozQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGNBQVMsR0FBVCxTQUFTLENBQWtCO0lBQ2xDLENBQUM7SUFFVSx5QkFBeUIsQ0FBQyxFQUFrQjs7WUFDeEQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FB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QUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FDakUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxDQUNyQyxDQUFDO1lBRUYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQ3JFLFdBQVcsQ0FBQyxHQUFHLEVBQ2YsMkJBQTJCLENBQzVCLENBQUM7WUFFRixPQUFPLElBQUksVUFBVSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsaUNBQWlDO2dCQUMzQyxTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLEVBQUU7d0JBQ0Ysa0JBQWtCO3dCQUNsQixhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQUU7cUJBQzlCO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0NBQ0YsQ0FBQTs7O1lBdkhBLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBcENvQixNQUFNO1lBU2xCLFVBQVU7WUFEVixlQUFlO1lBTGYsaUJBQWlCO1lBRmpCLGdCQUFnQjs7QUFvQ1oseUJBQXlCO0lBTnJDLGlCQUFpQixDQUFDO1FBQ2pCLFVBQVUsRUFBRSxRQUFRO0tBQ3JCLENBQUM7R0FJVyx5QkFBeUIsQ0FvSHJDO1NBcEhZLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTHJHcmFwaFFMU2VydmljZSwgTHJNdXRhdGlvbiB9IGZyb20gJy4uL2FwaS9sci1ncmFwaHFsJztcbmltcG9ydCB7IExyUmVsYXlJZElucHV0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IEVuY3J5cHRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vZW5jcnlwdGlvbi9lbmNyeXB0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ29udGFjdENhcmRSZWNlaXZlckNpcGhlckRhdGEsXG4gIFNlbmRDb250YWN0Q2FyZElucHV0LFxufSBmcm9tICcuLi9rZXktZXhjaGFuZ2Uva2V5LWV4Y2hhbmdlMi5zZXJ2aWNlJztcbmltcG9ydCB7IEtleUdyYXBoU2VydmljZSB9IGZyb20gJy4uL2tleS9rZXktZ3JhcGguc2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4va2V5L2tleS5zZXJ2aWNlJztcbmltcG9ydCB7IEtleSB9IGZyb20gJy4uL2tleS9rZXkudHlwZXMnO1xuaW1wb3J0IHsgUnVuT3V0c2lkZUFuZ3VsYXIgfSBmcm9tICcuLi9fY29tbW9uL3J1bi1vdXRzaWRlLWFuZ3VsYXInO1xuaW1wb3J0IHtcbiAgR2V0T3duZWRDb250YWN0Q2FyZEtleUlkc1F1ZXJ5LFxuICBHZXRSZWNlaXZlZENvbnRhY3RDYXJkS2V5SWRRdWVyeSxcbiAgVXBkYXRlT3duZWRDb250YWN0Q2FyZE11dGF0aW9uLFxuICBVcGRhdGVSZWNlaXZlZENvbnRhY3RDYXJkTXV0YXRpb24sXG59IGZyb20gJy4vc2hhcmVkLWNvbnRhY3QtY2FyZDIuZ3FsJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVPd25lZENvbnRhY3RDYXJkSW5wdXQgZXh0ZW5kcyBTZW5kQ29udGFjdENhcmRJbnB1dCB7XG4gIGlkOiBMclJlbGF5SWRJbnB1dDtcbiAgb3duZXJLZXlJZD86IExyUmVsYXlJZElucHV0O1xuICBzaGFyZWRLZXlJZD86IExyUmVsYXlJZElucHV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVJlY2VpdmVkQ29udGFjdENhcmRJbnB1dFxuICBleHRlbmRzIENvbnRhY3RDYXJkUmVjZWl2ZXJDaXBoZXJEYXRhIHtcbiAgaWQ6IExyUmVsYXlJZElucHV0O1xuICByZWNlaXZlcktleUlkPzogTHJSZWxheUlkSW5wdXQ7XG59XG5cbkBSdW5PdXRzaWRlQW5ndWxhcih7XG4gIG5nWm9uZU5hbWU6ICduZ1pvbmUnLFxufSlcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTaGFyZWRDb250YWN0Q2FyZDJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBrZXlHcmFwaDogS2V5R3JhcGhTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbHJHcmFwaFFMOiBMckdyYXBoUUxTZXJ2aWNlXG4gICkge31cblxuICBwcml2YXRlIGFzeW5jIGdldE93bmVkQ29udGFjdENhcmRLZXlJZHMoaWQ6IExyUmVsYXlJZElucHV0KSB7XG4gICAgY29uc3QgeyBvd25lZENvbnRhY3RDYXJkOiBjYyB9ID0gYXdhaXQgdGhpcy5sckdyYXBoUUwucXVlcnkoe1xuICAgICAgcXVlcnk6IEdldE93bmVkQ29udGFjdENhcmRLZXlJZHNRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpZCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2hhcmVkS2V5SWQ6IGNjLnNoYXJlZEtleS5pZCxcbiAgICAgIG93bmVyS2V5SWQ6IGNjLm93bmVyS2V5LmlkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFJlY2VpdmVkQ29udGFjdENhcmRLZXlJZChpZDogTHJSZWxheUlkSW5wdXQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgdGhpcy5sckdyYXBoUUwucXVlcnkoe1xuICAgICAgICBxdWVyeTogR2V0UmVjZWl2ZWRDb250YWN0Q2FyZEtleUlkUXVlcnksXG4gICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApLnJlY2VpdmVkQ29udGFjdENhcmQucmVjZWl2ZXJLZXkuaWQ7XG4gIH1cblxuICBhc3luYyB1cGRhdGVPd25lZENvbnRhY3RDYXJkKHtcbiAgICBpZCxcbiAgICBvd25lcktleUlkLFxuICAgIHNoYXJlZEtleUlkLFxuICAgIG93bmVyUGxhaW5EYXRhSnNvbixcbiAgICBvd25lckNpcGhlckRhdGFDbGVhckpzb24sXG4gICAgc2hhcmVkQ2lwaGVyRGF0YUNsZWFySnNvbixcbiAgfTogVXBkYXRlT3duZWRDb250YWN0Q2FyZElucHV0KSB7XG4gICAgbGV0IG93bmVyS2V5OiBLZXk7XG4gICAgbGV0IHNoYXJlZEtleTogS2V5O1xuXG4gICAgdHJ5IHtcbiAgICAgIG93bmVyS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkob3duZXJLZXlJZCk7XG4gICAgICBzaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEtleShzaGFyZWRLZXlJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLmdldE93bmVkQ29udGFjdENhcmRLZXlJZHMoaWQpO1xuXG4gICAgICAvLyB0cnkgYWdhaW5cbiAgICAgIG93bmVyS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoa2V5cy5vd25lcktleUlkKTtcbiAgICAgIHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5R3JhcGguZ2V0S2V5KGtleXMuc2hhcmVkS2V5SWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHNpZ1B4ayA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5nZXRDdXJyZW50U2lnUHhrKCk7XG5cbiAgICBjb25zdCBzaGFyZWRDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgc2hhcmVkS2V5Lmp3ayxcbiAgICAgIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb25cbiAgICApO1xuICAgIGNvbnN0IHNoYXJlZENpcGhlckRhdGFTaWcgPSBKU09OLnN0cmluZ2lmeShcbiAgICAgIGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihzaWdQeGsuandrLCBzaGFyZWRDaXBoZXJEYXRhKVxuICAgICk7XG5cbiAgICBjb25zdCBvd25lclBsYWluRGF0YVNpZyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHNpZ1B4ay5qd2ssIG93bmVyUGxhaW5EYXRhSnNvbilcbiAgICApO1xuXG4gICAgY29uc3Qgb3duZXJDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXG4gICAgICBvd25lcktleS5qd2ssXG4gICAgICBvd25lckNpcGhlckRhdGFDbGVhckpzb25cbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVPd25lZENvbnRhY3RDYXJkTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBvd25lckNpcGhlckRhdGEsXG4gICAgICAgICAgb3duZXJLZXlJZDogb3duZXJLZXkuaWQsXG4gICAgICAgICAgc2hhcmVkQ2lwaGVyRGF0YVNpZyxcbiAgICAgICAgICBzaGFyZWRLZXlJZDogc2hhcmVkS2V5LmlkLFxuICAgICAgICAgIHNpZ1B4a0lkOiBzaWdQeGsuaWQsXG4gICAgICAgICAgb3duZXJQbGFpbkRhdGFTaWcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUmVjZWl2ZWRDb250YWN0Q2FyZCh7XG4gICAgaWQsXG4gICAgcmVjZWl2ZXJLZXlJZCxcbiAgICByZWNlaXZlckNpcGhlckRhdGFDbGVhckpzb24sXG4gIH06IFVwZGF0ZVJlY2VpdmVkQ29udGFjdENhcmRJbnB1dCkge1xuICAgIGNvbnN0IHJlY2VpdmVyS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkocmVjZWl2ZXJLZXlJZCwgKCkgPT5cbiAgICAgIHRoaXMuZ2V0UmVjZWl2ZWRDb250YWN0Q2FyZEtleUlkKGlkKVxuICAgICk7XG5cbiAgICBjb25zdCByZWNlaXZlckNpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcbiAgICAgIHJlY2VpdmVyS2V5Lmp3ayxcbiAgICAgIHJlY2VpdmVyQ2lwaGVyRGF0YUNsZWFySnNvblxuICAgICk7XG5cbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZVJlY2VpdmVkQ29udGFjdENhcmRNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHJlY2VpdmVyQ2lwaGVyRGF0YSxcbiAgICAgICAgICByZWNlaXZlcktleUlkOiByZWNlaXZlcktleS5pZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { Slip39, Slip39Helper } from 'slip39';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class SecretShare {
|
|
6
|
+
constructor(assembly = 0, subAssembly = 0, mnemonics = '') {
|
|
7
|
+
this.assembly = assembly;
|
|
8
|
+
this.subAssembly = subAssembly;
|
|
9
|
+
this.mnemonics = mnemonics;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class SubAssembly {
|
|
13
|
+
constructor(index, threshold = 0, size = 0) {
|
|
14
|
+
this.index = index;
|
|
15
|
+
this.threshold = threshold;
|
|
16
|
+
this.size = size;
|
|
17
|
+
this.clearShares();
|
|
18
|
+
}
|
|
19
|
+
clearShares() {
|
|
20
|
+
this.shares = [];
|
|
21
|
+
}
|
|
22
|
+
addShare(share) {
|
|
23
|
+
this.shares.push(share);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class Assembly {
|
|
27
|
+
constructor(threshold = 0) {
|
|
28
|
+
this.threshold = threshold;
|
|
29
|
+
this.clearSubAssemblies();
|
|
30
|
+
}
|
|
31
|
+
size() {
|
|
32
|
+
return this.subAssemblies.length;
|
|
33
|
+
}
|
|
34
|
+
clearSubAssemblies() {
|
|
35
|
+
this.subAssemblies = [];
|
|
36
|
+
}
|
|
37
|
+
addSubAssembly(subAssembly) {
|
|
38
|
+
this.subAssemblies.push(subAssembly);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class SubQuorum {
|
|
42
|
+
constructor(subAssemblyIndex) {
|
|
43
|
+
this.subAssemblyIndex = subAssemblyIndex;
|
|
44
|
+
this.clearShares();
|
|
45
|
+
}
|
|
46
|
+
clearShares() {
|
|
47
|
+
this.shares = [];
|
|
48
|
+
}
|
|
49
|
+
addShare(share) {
|
|
50
|
+
this.shares.push(share);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class Quorum {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.clearSubQuora();
|
|
56
|
+
}
|
|
57
|
+
clearSubQuora() {
|
|
58
|
+
this.subQuora = [];
|
|
59
|
+
}
|
|
60
|
+
addSubQuorum(subQuorum) {
|
|
61
|
+
this.subQuora.push(subQuorum);
|
|
62
|
+
}
|
|
63
|
+
serialiseShares() {
|
|
64
|
+
let shares = [];
|
|
65
|
+
this.subQuora.forEach((subQuorum) => {
|
|
66
|
+
shares = shares.concat(subQuorum.shares);
|
|
67
|
+
});
|
|
68
|
+
return shares;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export class Slip39Service {
|
|
72
|
+
generateShares(secret, passphrase, assembly) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
// Hex-encode secret.
|
|
75
|
+
let ems = btoa(secret);
|
|
76
|
+
ems = Slip39Helper.slip39EncodeHex(ems);
|
|
77
|
+
// Construct group specifications
|
|
78
|
+
const groups = [];
|
|
79
|
+
for (const sa of assembly.subAssemblies) {
|
|
80
|
+
groups.push([sa.threshold, sa.size]);
|
|
81
|
+
}
|
|
82
|
+
// Split!
|
|
83
|
+
const slip = yield Slip39.fromArray(ems, {
|
|
84
|
+
passphrase,
|
|
85
|
+
threshold: assembly.threshold,
|
|
86
|
+
groups,
|
|
87
|
+
title: '',
|
|
88
|
+
});
|
|
89
|
+
// Extract shares
|
|
90
|
+
assembly.subAssemblies.forEach((sa, isa) => {
|
|
91
|
+
// Remove any existing shares
|
|
92
|
+
sa.clearShares();
|
|
93
|
+
for (let im = 0; im < sa.size; im++) {
|
|
94
|
+
// Construct the path to the share, formatted as "r/<subassembly index>/<member index>"
|
|
95
|
+
// with <subassembly index> and <member index> being two-digit, zero-padded integers.
|
|
96
|
+
const path = 'r/' +
|
|
97
|
+
isa.toString().padStart(2, '0') +
|
|
98
|
+
'/' +
|
|
99
|
+
im.toString().padStart(2, '0');
|
|
100
|
+
const mnemonics = slip.fromPath(path).mnemonics[0];
|
|
101
|
+
const share = new SecretShare(isa, im, mnemonics);
|
|
102
|
+
sa.addShare(share);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Remove all redundant shares. i.e. keep only enough members and groups to satisfy the thresholds.
|
|
108
|
+
minimalSet(mnemonics) {
|
|
109
|
+
// Decode the mnemonics and sort then into groups.
|
|
110
|
+
let groupThresh = null;
|
|
111
|
+
const groups = new Map();
|
|
112
|
+
for (const mnemonic of mnemonics) {
|
|
113
|
+
const decoded = Slip39Helper.decodeMnemonic(mnemonic);
|
|
114
|
+
if (groupThresh && groupThresh !== decoded.groupThreshold) {
|
|
115
|
+
throw new Error('groupThreshold is different in mnemonics');
|
|
116
|
+
}
|
|
117
|
+
groupThresh = decoded.groupThreshold;
|
|
118
|
+
// Note that Slip39.recoverSecret() will do all the error checking again. So it's not critical
|
|
119
|
+
// that we error check here. So we just optimistically assume it's all good.
|
|
120
|
+
let g = groups.get(decoded.groupIndex);
|
|
121
|
+
if (g == null) {
|
|
122
|
+
g = {
|
|
123
|
+
memberThreshold: decoded.memberThreshold,
|
|
124
|
+
members: [],
|
|
125
|
+
};
|
|
126
|
+
groups.set(decoded.groupIndex, g);
|
|
127
|
+
}
|
|
128
|
+
g.members.push({
|
|
129
|
+
mnemonic,
|
|
130
|
+
decoded,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// Keep the minimum set of groups that meet threshold.
|
|
134
|
+
const mnemonicsMinSet = [];
|
|
135
|
+
let groupCount = 0;
|
|
136
|
+
for (const g of groups.values()) {
|
|
137
|
+
// Keep only groups that meet threshold
|
|
138
|
+
if (g.members.length < g.memberThreshold) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
// Keep minimum number of approvals needed for group
|
|
142
|
+
g.members.slice(0, g.memberThreshold).forEach((member) => {
|
|
143
|
+
mnemonicsMinSet.push(member.mnemonic);
|
|
144
|
+
});
|
|
145
|
+
++groupCount;
|
|
146
|
+
if (groupCount >= groupThresh) {
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return mnemonicsMinSet;
|
|
151
|
+
}
|
|
152
|
+
recoverSecret(shares, passphrase) {
|
|
153
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
154
|
+
shares = this.minimalSet(shares);
|
|
155
|
+
const recovered = yield Slip39.recoverSecret(shares, passphrase);
|
|
156
|
+
const secret = Slip39Helper.slip39DecodeHex(recovered);
|
|
157
|
+
return atob(secret);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
Slip39Service.ɵprov = i0.ɵɵdefineInjectable({ factory: function Slip39Service_Factory() { return new Slip39Service(); }, token: Slip39Service, providedIn: "root" });
|
|
162
|
+
Slip39Service.decorators = [
|
|
163
|
+
{ type: Injectable, args: [{
|
|
164
|
+
providedIn: 'root',
|
|
165
|
+
},] }
|
|
166
|
+
];
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpcDM5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvc2xpcDM5L3NsaXAzOS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFDOztBQUU5QyxNQUFNLE9BQU8sV0FBVztJQUN0QixZQUNTLFdBQW1CLENBQUMsRUFDcEIsY0FBc0IsQ0FBQyxFQUN2QixZQUFvQixFQUFFO1FBRnRCLGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFDdkIsY0FBUyxHQUFULFNBQVMsQ0FBYTtJQUM1QixDQUFDO0NBQ0w7QUFFRCxNQUFNLE9BQU8sV0FBVztJQUN0QixZQUNTLEtBQWEsRUFDYixZQUFvQixDQUFDLEVBQ3JCLE9BQWUsQ0FBQztRQUZoQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQUNyQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBRXZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBSU0sV0FBVztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQWtCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxRQUFRO0lBQ25CLFlBQW1CLFlBQW9CLENBQUM7UUFBckIsY0FBUyxHQUFULFNBQVMsQ0FBWTtRQUN0QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBSU0sSUFBSTtRQUNULE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU0sY0FBYyxDQUFDLFdBQXdCO1FBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxTQUFTO0lBR3BCLFlBQW1CLGdCQUF3QjtRQUF4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVE7UUFDekMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sTUFBTTtJQUdqQjtRQUNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRU0sYUFBYTtRQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU0sWUFBWSxDQUFDLFNBQW9CO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVoQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2xDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQUtELE1BQU0sT0FBTyxhQUFhO0lBQ1gsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFrQixFQUFFLFFBQWtCOztZQUN4RSxxQkFBcUI7WUFDckIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLEdBQUcsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXhDLGlDQUFpQztZQUNqQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFFbEIsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUN0QztZQUVELFNBQVM7WUFDVCxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUN2QyxVQUFVO2dCQUNWLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztnQkFDN0IsTUFBTTtnQkFDTixLQUFLLEVBQUUsRUFBRTthQUNWLENBQUMsQ0FBQztZQUVILGlCQUFpQjtZQUNqQixRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDekMsNkJBQTZCO2dCQUM3QixFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBRWpCLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUNuQyx1RkFBdUY7b0JBQ3ZGLHFGQUFxRjtvQkFDckYsTUFBTSxJQUFJLEdBQ1IsSUFBSTt3QkFDSixHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7d0JBQy9CLEdBQUc7d0JBQ0gsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUVsRCxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUNwQjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRUQsbUdBQW1HO0lBQzNGLFVBQVUsQ0FBQyxTQUFtQjtRQUNwQyxrREFBa0Q7UUFDbEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekIsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUU7WUFDaEMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV0RCxJQUFJLFdBQVcsSUFBSSxXQUFXLEtBQUssT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO2FBQzdEO1lBRUQsV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFFckMsOEZBQThGO1lBQzlGLDRFQUE0RTtZQUM1RSxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQ2IsQ0FBQyxHQUFHO29CQUNGLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtvQkFDeEMsT0FBTyxFQUFFLEVBQUU7aUJBQ1osQ0FBQztnQkFDRixNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkM7WUFFRCxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDYixRQUFRO2dCQUNSLE9BQU87YUFDUixDQUFDLENBQUM7U0FDSjtRQUVELHNEQUFzRDtRQUN0RCxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9CLHVDQUF1QztZQUN2QyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hDLFNBQVM7YUFDVjtZQUVELG9EQUFvRDtZQUNwRCxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUN2RCxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4QyxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsVUFBVSxDQUFDO1lBQ2IsSUFBSSxVQUFVLElBQUksV0FBVyxFQUFFO2dCQUM3QixNQUFNO2FBQ1A7U0FDRjtRQUVELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFWSxhQUFhLENBQUMsTUFBZ0IsRUFBRSxVQUFrQjs7WUFDN0QsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFakMsTUFBTSxTQUFTLEdBQUcsTUFBTSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUVqRSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXZELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7S0FBQTs7OztZQTNHRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTbGlwMzksIFNsaXAzOUhlbHBlciB9IGZyb20gJ3NsaXAzOSc7XG5cbmV4cG9ydCBjbGFzcyBTZWNyZXRTaGFyZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBhc3NlbWJseTogbnVtYmVyID0gMCxcbiAgICBwdWJsaWMgc3ViQXNzZW1ibHk6IG51bWJlciA9IDAsXG4gICAgcHVibGljIG1uZW1vbmljczogc3RyaW5nID0gJydcbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgU3ViQXNzZW1ibHkge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaW5kZXg6IG51bWJlcixcbiAgICBwdWJsaWMgdGhyZXNob2xkOiBudW1iZXIgPSAwLFxuICAgIHB1YmxpYyBzaXplOiBudW1iZXIgPSAwXG4gICkge1xuICAgIHRoaXMuY2xlYXJTaGFyZXMoKTtcbiAgfVxuXG4gIHNoYXJlczogU2VjcmV0U2hhcmVbXTtcblxuICBwdWJsaWMgY2xlYXJTaGFyZXMoKSB7XG4gICAgdGhpcy5zaGFyZXMgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRTaGFyZShzaGFyZTogU2VjcmV0U2hhcmUpIHtcbiAgICB0aGlzLnNoYXJlcy5wdXNoKHNoYXJlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXNzZW1ibHkge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdGhyZXNob2xkOiBudW1iZXIgPSAwKSB7XG4gICAgdGhpcy5jbGVhclN1YkFzc2VtYmxpZXMoKTtcbiAgfVxuXG4gIHN1YkFzc2VtYmxpZXM6IFN1YkFzc2VtYmx5W107XG5cbiAgcHVibGljIHNpemUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3ViQXNzZW1ibGllcy5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTdWJBc3NlbWJsaWVzKCkge1xuICAgIHRoaXMuc3ViQXNzZW1ibGllcyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGFkZFN1YkFzc2VtYmx5KHN1YkFzc2VtYmx5OiBTdWJBc3NlbWJseSkge1xuICAgIHRoaXMuc3ViQXNzZW1ibGllcy5wdXNoKHN1YkFzc2VtYmx5KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3ViUXVvcnVtIHtcbiAgc2hhcmVzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3ViQXNzZW1ibHlJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jbGVhclNoYXJlcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyU2hhcmVzKCkge1xuICAgIHRoaXMuc2hhcmVzID0gW107XG4gIH1cblxuICBwdWJsaWMgYWRkU2hhcmUoc2hhcmU6IHN0cmluZykge1xuICAgIHRoaXMuc2hhcmVzLnB1c2goc2hhcmUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBRdW9ydW0ge1xuICBzdWJRdW9yYTogU3ViUXVvcnVtW107XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jbGVhclN1YlF1b3JhKCk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTdWJRdW9yYSgpIHtcbiAgICB0aGlzLnN1YlF1b3JhID0gW107XG4gIH1cblxuICBwdWJsaWMgYWRkU3ViUXVvcnVtKHN1YlF1b3J1bTogU3ViUXVvcnVtKSB7XG4gICAgdGhpcy5zdWJRdW9yYS5wdXNoKHN1YlF1b3J1bSk7XG4gIH1cblxuICBwdWJsaWMgc2VyaWFsaXNlU2hhcmVzKCkge1xuICAgIGxldCBzaGFyZXMgPSBbXTtcblxuICAgIHRoaXMuc3ViUXVvcmEuZm9yRWFjaCgoc3ViUXVvcnVtKSA9PiB7XG4gICAgICBzaGFyZXMgPSBzaGFyZXMuY29uY2F0KHN1YlF1b3J1bS5zaGFyZXMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNoYXJlcztcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2xpcDM5U2VydmljZSB7XG4gIHB1YmxpYyBhc3luYyBnZW5lcmF0ZVNoYXJlcyhzZWNyZXQsIHBhc3NwaHJhc2U6IHN0cmluZywgYXNzZW1ibHk6IEFzc2VtYmx5KSB7XG4gICAgLy8gSGV4LWVuY29kZSBzZWNyZXQuXG4gICAgbGV0IGVtcyA9IGJ0b2Eoc2VjcmV0KTtcbiAgICBlbXMgPSBTbGlwMzlIZWxwZXIuc2xpcDM5RW5jb2RlSGV4KGVtcyk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgZ3JvdXAgc3BlY2lmaWNhdGlvbnNcbiAgICBjb25zdCBncm91cHMgPSBbXTtcblxuICAgIGZvciAoY29uc3Qgc2Egb2YgYXNzZW1ibHkuc3ViQXNzZW1ibGllcykge1xuICAgICAgZ3JvdXBzLnB1c2goW3NhLnRocmVzaG9sZCwgc2Euc2l6ZV0pO1xuICAgIH1cblxuICAgIC8vIFNwbGl0IVxuICAgIGNvbnN0IHNsaXAgPSBhd2FpdCBTbGlwMzkuZnJvbUFycmF5KGVtcywge1xuICAgICAgcGFzc3BocmFzZSxcbiAgICAgIHRocmVzaG9sZDogYXNzZW1ibHkudGhyZXNob2xkLFxuICAgICAgZ3JvdXBzLFxuICAgICAgdGl0bGU6ICcnLFxuICAgIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBzaGFyZXNcbiAgICBhc3NlbWJseS5zdWJBc3NlbWJsaWVzLmZvckVhY2goKHNhLCBpc2EpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3Rpbmcgc2hhcmVzXG4gICAgICBzYS5jbGVhclNoYXJlcygpO1xuXG4gICAgICBmb3IgKGxldCBpbSA9IDA7IGltIDwgc2Euc2l6ZTsgaW0rKykge1xuICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIHBhdGggdG8gdGhlIHNoYXJlLCBmb3JtYXR0ZWQgYXMgXCJyLzxzdWJhc3NlbWJseSBpbmRleD4vPG1lbWJlciBpbmRleD5cIlxuICAgICAgICAvLyB3aXRoIDxzdWJhc3NlbWJseSBpbmRleD4gYW5kIDxtZW1iZXIgaW5kZXg+IGJlaW5nIHR3by1kaWdpdCwgemVyby1wYWRkZWQgaW50ZWdlcnMuXG4gICAgICAgIGNvbnN0IHBhdGggPVxuICAgICAgICAgICdyLycgK1xuICAgICAgICAgIGlzYS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgK1xuICAgICAgICAgICcvJyArXG4gICAgICAgICAgaW0udG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgICAgICBjb25zdCBtbmVtb25pY3MgPSBzbGlwLmZyb21QYXRoKHBhdGgpLm1uZW1vbmljc1swXTtcbiAgICAgICAgY29uc3Qgc2hhcmUgPSBuZXcgU2VjcmV0U2hhcmUoaXNhLCBpbSwgbW5lbW9uaWNzKTtcblxuICAgICAgICBzYS5hZGRTaGFyZShzaGFyZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIHJlZHVuZGFudCBzaGFyZXMuIGkuZS4ga2VlcCBvbmx5IGVub3VnaCBtZW1iZXJzIGFuZCBncm91cHMgdG8gc2F0aXNmeSB0aGUgdGhyZXNob2xkcy5cbiAgcHJpdmF0ZSBtaW5pbWFsU2V0KG1uZW1vbmljczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgLy8gRGVjb2RlIHRoZSBtbmVtb25pY3MgYW5kIHNvcnQgdGhlbiBpbnRvIGdyb3Vwcy5cbiAgICBsZXQgZ3JvdXBUaHJlc2ggPSBudWxsO1xuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXAoKTtcbiAgICBmb3IgKGNvbnN0IG1uZW1vbmljIG9mIG1uZW1vbmljcykge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IFNsaXAzOUhlbHBlci5kZWNvZGVNbmVtb25pYyhtbmVtb25pYyk7XG5cbiAgICAgIGlmIChncm91cFRocmVzaCAmJiBncm91cFRocmVzaCAhPT0gZGVjb2RlZC5ncm91cFRocmVzaG9sZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2dyb3VwVGhyZXNob2xkIGlzIGRpZmZlcmVudCBpbiBtbmVtb25pY3MnKTtcbiAgICAgIH1cblxuICAgICAgZ3JvdXBUaHJlc2ggPSBkZWNvZGVkLmdyb3VwVGhyZXNob2xkO1xuXG4gICAgICAvLyBOb3RlIHRoYXQgU2xpcDM5LnJlY292ZXJTZWNyZXQoKSB3aWxsIGRvIGFsbCB0aGUgZXJyb3IgY2hlY2tpbmcgYWdhaW4uIFNvIGl0J3Mgbm90IGNyaXRpY2FsXG4gICAgICAvLyB0aGF0IHdlIGVycm9yIGNoZWNrIGhlcmUuIFNvIHdlIGp1c3Qgb3B0aW1pc3RpY2FsbHkgYXNzdW1lIGl0J3MgYWxsIGdvb2QuXG4gICAgICBsZXQgZyA9IGdyb3Vwcy5nZXQoZGVjb2RlZC5ncm91cEluZGV4KTtcbiAgICAgIGlmIChnID09IG51bGwpIHtcbiAgICAgICAgZyA9IHtcbiAgICAgICAgICBtZW1iZXJUaHJlc2hvbGQ6IGRlY29kZWQubWVtYmVyVGhyZXNob2xkLFxuICAgICAgICAgIG1lbWJlcnM6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBncm91cHMuc2V0KGRlY29kZWQuZ3JvdXBJbmRleCwgZyk7XG4gICAgICB9XG5cbiAgICAgIGcubWVtYmVycy5wdXNoKHtcbiAgICAgICAgbW5lbW9uaWMsXG4gICAgICAgIGRlY29kZWQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBLZWVwIHRoZSBtaW5pbXVtIHNldCBvZiBncm91cHMgdGhhdCBtZWV0IHRocmVzaG9sZC5cbiAgICBjb25zdCBtbmVtb25pY3NNaW5TZXQgPSBbXTtcbiAgICBsZXQgZ3JvdXBDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBnIG9mIGdyb3Vwcy52YWx1ZXMoKSkge1xuICAgICAgLy8gS2VlcCBvbmx5IGdyb3VwcyB0aGF0IG1lZXQgdGhyZXNob2xkXG4gICAgICBpZiAoZy5tZW1iZXJzLmxlbmd0aCA8IGcubWVtYmVyVGhyZXNob2xkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIG1pbmltdW0gbnVtYmVyIG9mIGFwcHJvdmFscyBuZWVkZWQgZm9yIGdyb3VwXG4gICAgICBnLm1lbWJlcnMuc2xpY2UoMCwgZy5tZW1iZXJUaHJlc2hvbGQpLmZvckVhY2goKG1lbWJlcikgPT4ge1xuICAgICAgICBtbmVtb25pY3NNaW5TZXQucHVzaChtZW1iZXIubW5lbW9uaWMpO1xuICAgICAgfSk7XG5cbiAgICAgICsrZ3JvdXBDb3VudDtcbiAgICAgIGlmIChncm91cENvdW50ID49IGdyb3VwVGhyZXNoKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtbmVtb25pY3NNaW5TZXQ7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVjb3ZlclNlY3JldChzaGFyZXM6IHN0cmluZ1tdLCBwYXNzcGhyYXNlOiBzdHJpbmcpIHtcbiAgICBzaGFyZXMgPSB0aGlzLm1pbmltYWxTZXQoc2hhcmVzKTtcblxuICAgIGNvbnN0IHJlY292ZXJlZCA9IGF3YWl0IFNsaXAzOS5yZWNvdmVyU2VjcmV0KHNoYXJlcywgcGFzc3BocmFzZSk7XG5cbiAgICBjb25zdCBzZWNyZXQgPSBTbGlwMzlIZWxwZXIuc2xpcDM5RGVjb2RlSGV4KHJlY292ZXJlZCk7XG5cbiAgICByZXR1cm4gYXRvYihzZWNyZXQpO1xuICB9XG59XG4iXX0=
|