@lifeready/core 0.6.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/README.md +62 -0
  2. package/bundles/lifeready-core.umd.js +15939 -0
  3. package/bundles/lifeready-core.umd.js.map +1 -0
  4. package/bundles/lifeready-core.umd.min.js +2 -0
  5. package/bundles/lifeready-core.umd.min.js.map +1 -0
  6. package/esm2015/lib/_common/ast.js +40 -0
  7. package/esm2015/lib/_common/deferred-promise.js +24 -0
  8. package/esm2015/lib/_common/exceptions.js +157 -0
  9. package/esm2015/lib/_common/queries.gql.js +190 -0
  10. package/esm2015/lib/_common/run-outside-angular.js +79 -0
  11. package/esm2015/lib/_common/types.js +1 -0
  12. package/esm2015/lib/_common/utils.js +44 -0
  13. package/esm2015/lib/api/contact-card.gql.js +79 -0
  14. package/esm2015/lib/api/contact-card.service.js +154 -0
  15. package/esm2015/lib/api/contact-card2.gql.js +60 -0
  16. package/esm2015/lib/api/contact-card2.service.js +103 -0
  17. package/esm2015/lib/api/file.service.js +74 -0
  18. package/esm2015/lib/api/item2.gql.js +110 -0
  19. package/esm2015/lib/api/item2.service.js +311 -0
  20. package/esm2015/lib/api/key-exchange.gql.js +188 -0
  21. package/esm2015/lib/api/key-exchange.service.js +442 -0
  22. package/esm2015/lib/api/key-exchange.types.js +18 -0
  23. package/esm2015/lib/api/key-exchange2.gql.js +171 -0
  24. package/esm2015/lib/api/key-exchange2.service.js +479 -0
  25. package/esm2015/lib/api/lock.gql.js +40 -0
  26. package/esm2015/lib/api/lock.service.js +64 -0
  27. package/esm2015/lib/api/lr-apollo.service.js +46 -0
  28. package/esm2015/lib/api/lr-graphql/index.js +6 -0
  29. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +155 -0
  30. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +213 -0
  31. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +51 -0
  32. package/esm2015/lib/api/lr-graphql/lr-mutation.js +48 -0
  33. package/esm2015/lib/api/lr-graphql/lr.service.js +18 -0
  34. package/esm2015/lib/api/message.service.js +138 -0
  35. package/esm2015/lib/api/persist.service.js +181 -0
  36. package/esm2015/lib/api/query-processor/common-processors.service.js +93 -0
  37. package/esm2015/lib/api/query-processor/index.js +3 -0
  38. package/esm2015/lib/api/query-processor/query-processor.service.js +192 -0
  39. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +109 -0
  40. package/esm2015/lib/api/shared-contact-card.service.js +119 -0
  41. package/esm2015/lib/api/shared-contact-card2.gql.js +41 -0
  42. package/esm2015/lib/api/shared-contact-card2.service.js +117 -0
  43. package/esm2015/lib/api/time.service.js +146 -0
  44. package/esm2015/lib/api/types/graphql.types.js +7 -0
  45. package/esm2015/lib/api/types/index.js +3 -0
  46. package/esm2015/lib/api/types/lr-graphql.types.js +71 -0
  47. package/esm2015/lib/auth/auth.config.js +57 -0
  48. package/esm2015/lib/auth/auth.gql.js +48 -0
  49. package/esm2015/lib/auth/auth.types.js +27 -0
  50. package/esm2015/lib/auth/idle.service.js +168 -0
  51. package/esm2015/lib/auth/idle.types.js +7 -0
  52. package/esm2015/lib/auth/lbop.service.js +355 -0
  53. package/esm2015/lib/auth/life-ready-auth.service.js +333 -0
  54. package/esm2015/lib/auth/password.service.js +320 -0
  55. package/esm2015/lib/auth/register.service.js +172 -0
  56. package/esm2015/lib/auth/two-factor.service.js +74 -0
  57. package/esm2015/lib/category/category-meta.service.js +99 -0
  58. package/esm2015/lib/category/category.gql.js +406 -0
  59. package/esm2015/lib/category/category.service.js +390 -0
  60. package/esm2015/lib/category/category.types.js +29 -0
  61. package/esm2015/lib/cryptography/cryptography.types.js +11 -0
  62. package/esm2015/lib/cryptography/encryption.service.js +189 -0
  63. package/esm2015/lib/cryptography/key-factory.service.js +237 -0
  64. package/esm2015/lib/cryptography/key-graph.service.js +280 -0
  65. package/esm2015/lib/cryptography/key-meta.service.js +200 -0
  66. package/esm2015/lib/cryptography/key.service.js +124 -0
  67. package/esm2015/lib/cryptography/slip39.service.js +169 -0
  68. package/esm2015/lib/cryptography/web-crypto.service.js +29 -0
  69. package/esm2015/lib/life-ready.config.js +84 -0
  70. package/esm2015/lib/life-ready.module.js +74 -0
  71. package/esm2015/lib/plan/plan.gql.js +123 -0
  72. package/esm2015/lib/plan/plan.service.js +149 -0
  73. package/esm2015/lib/plan/plan.types.js +11 -0
  74. package/esm2015/lib/record/record-attachment.service.js +101 -0
  75. package/esm2015/lib/record/record.gql.js +179 -0
  76. package/esm2015/lib/record/record.service.js +206 -0
  77. package/esm2015/lib/record/record.types.js +15 -0
  78. package/esm2015/lib/record-type/record-type.service.js +75 -0
  79. package/esm2015/lib/record-type/record-type.types.js +28 -0
  80. package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +105 -0
  81. package/esm2015/lib/scenario/approvals/scenario-approval.types.js +1 -0
  82. package/esm2015/lib/scenario/approvals/scenario-approver.service.js +300 -0
  83. package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +52 -0
  84. package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +97 -0
  85. package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +1 -0
  86. package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +150 -0
  87. package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +229 -0
  88. package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +1 -0
  89. package/esm2015/lib/scenario/scenario-setup.service.js +269 -0
  90. package/esm2015/lib/scenario/scenario.gql.js +368 -0
  91. package/esm2015/lib/scenario/scenario.service.js +611 -0
  92. package/esm2015/lib/scenario/scenario.types.js +64 -0
  93. package/esm2015/lib/search/search.gql.js +62 -0
  94. package/esm2015/lib/search/search.service.js +156 -0
  95. package/esm2015/lib/search/search.types.js +6 -0
  96. package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +112 -0
  97. package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +266 -0
  98. package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +232 -0
  99. package/esm2015/lib/trusted-parties/tp-password-reset.service.js +300 -0
  100. package/esm2015/lib/trusted-parties/trusted-party.gql.js +148 -0
  101. package/esm2015/lib/trusted-parties/trusted-party.service.js +326 -0
  102. package/esm2015/lib/trusted-parties/trusted-party.types.js +41 -0
  103. package/esm2015/lib/trusted-parties/trusted-party2.gql.js +87 -0
  104. package/esm2015/lib/trusted-parties/trusted-party2.service.js +215 -0
  105. package/esm2015/lib/users/profile-details.service.js +214 -0
  106. package/esm2015/lib/users/profile.gql.js +97 -0
  107. package/esm2015/lib/users/profile.service.js +169 -0
  108. package/esm2015/lib/users/profile.types.js +34 -0
  109. package/esm2015/lib/users/user.gql.js +60 -0
  110. package/esm2015/lib/users/user.service.js +79 -0
  111. package/esm2015/lib/users/user.types.js +5 -0
  112. package/esm2015/lifeready-core.js +10 -0
  113. package/esm2015/public-api.js +81 -0
  114. package/fesm2015/lifeready-core.js +13290 -0
  115. package/fesm2015/lifeready-core.js.map +1 -0
  116. package/lib/_common/ast.d.ts +11 -0
  117. package/lib/_common/deferred-promise.d.ts +12 -0
  118. package/lib/_common/exceptions.d.ts +109 -0
  119. package/lib/_common/queries.gql.d.ts +10 -0
  120. package/lib/_common/run-outside-angular.d.ts +14 -0
  121. package/lib/_common/types.d.ts +10 -0
  122. package/lib/_common/utils.d.ts +3 -0
  123. package/lib/api/contact-card.gql.d.ts +7 -0
  124. package/lib/api/contact-card.service.d.ts +52 -0
  125. package/lib/api/contact-card2.gql.d.ts +34 -0
  126. package/lib/api/contact-card2.service.d.ts +49 -0
  127. package/lib/api/file.service.d.ts +18 -0
  128. package/lib/api/item2.gql.d.ts +96 -0
  129. package/lib/api/item2.service.d.ts +177 -0
  130. package/lib/api/key-exchange.gql.d.ts +9 -0
  131. package/lib/api/key-exchange.service.d.ts +39 -0
  132. package/lib/api/key-exchange.types.d.ts +196 -0
  133. package/lib/api/key-exchange2.gql.d.ts +125 -0
  134. package/lib/api/key-exchange2.service.d.ts +187 -0
  135. package/lib/api/lock.gql.d.ts +27 -0
  136. package/lib/api/lock.service.d.ts +25 -0
  137. package/lib/api/lr-apollo.service.d.ts +15 -0
  138. package/lib/api/lr-graphql/index.d.ts +5 -0
  139. package/lib/api/lr-graphql/lr-graphql.service.d.ts +60 -0
  140. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +27 -0
  141. package/lib/api/lr-graphql/lr-mutation-base.d.ts +28 -0
  142. package/lib/api/lr-graphql/lr-mutation.d.ts +8 -0
  143. package/lib/api/lr-graphql/lr.service.d.ts +9 -0
  144. package/lib/api/message.service.d.ts +58 -0
  145. package/lib/api/persist.service.d.ts +31 -0
  146. package/lib/api/query-processor/common-processors.service.d.ts +36 -0
  147. package/lib/api/query-processor/index.d.ts +2 -0
  148. package/lib/api/query-processor/query-processor.service.d.ts +18 -0
  149. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +15 -0
  150. package/lib/api/shared-contact-card.service.d.ts +33 -0
  151. package/lib/api/shared-contact-card2.gql.d.ts +36 -0
  152. package/lib/api/shared-contact-card2.service.d.ts +45 -0
  153. package/lib/api/time.service.d.ts +16 -0
  154. package/lib/api/types/graphql.types.d.ts +29 -0
  155. package/lib/api/types/index.d.ts +2 -0
  156. package/lib/api/types/lr-graphql.types.d.ts +385 -0
  157. package/lib/auth/auth.config.d.ts +5 -0
  158. package/lib/auth/auth.gql.d.ts +15 -0
  159. package/lib/auth/auth.types.d.ts +66 -0
  160. package/lib/auth/idle.service.d.ts +40 -0
  161. package/lib/auth/idle.types.d.ts +10 -0
  162. package/lib/auth/lbop.service.d.ts +91 -0
  163. package/lib/auth/life-ready-auth.service.d.ts +46 -0
  164. package/lib/auth/password.service.d.ts +78 -0
  165. package/lib/auth/register.service.d.ts +25 -0
  166. package/lib/auth/two-factor.service.d.ts +15 -0
  167. package/lib/category/category-meta.service.d.ts +23 -0
  168. package/lib/category/category.gql.d.ts +45 -0
  169. package/lib/category/category.service.d.ts +67 -0
  170. package/lib/category/category.types.d.ts +79 -0
  171. package/lib/cryptography/cryptography.types.d.ts +83 -0
  172. package/lib/cryptography/encryption.service.d.ts +41 -0
  173. package/lib/cryptography/key-factory.service.d.ts +38 -0
  174. package/lib/cryptography/key-graph.service.d.ts +33 -0
  175. package/lib/cryptography/key-meta.service.d.ts +44 -0
  176. package/lib/cryptography/key.service.d.ts +36 -0
  177. package/lib/cryptography/slip39.service.d.ts +43 -0
  178. package/lib/cryptography/web-crypto.service.d.ts +5 -0
  179. package/lib/life-ready.config.d.ts +14 -0
  180. package/lib/life-ready.module.d.ts +5 -0
  181. package/lib/plan/plan.gql.d.ts +11 -0
  182. package/lib/plan/plan.service.d.ts +33 -0
  183. package/lib/plan/plan.types.d.ts +31 -0
  184. package/lib/record/record-attachment.service.d.ts +16 -0
  185. package/lib/record/record.gql.d.ts +14 -0
  186. package/lib/record/record.service.d.ts +25 -0
  187. package/lib/record/record.types.d.ts +57 -0
  188. package/lib/record-type/record-type.service.d.ts +11 -0
  189. package/lib/record-type/record-type.types.d.ts +50 -0
  190. package/lib/scenario/approvals/scenario-approval.gql.d.ts +7 -0
  191. package/lib/scenario/approvals/scenario-approval.types.d.ts +63 -0
  192. package/lib/scenario/approvals/scenario-approver.service.d.ts +32 -0
  193. package/lib/scenario/claimants/scenario-claimant.gql.d.ts +5 -0
  194. package/lib/scenario/claimants/scenario-claimant.service.d.ts +17 -0
  195. package/lib/scenario/claimants/scenario-claimant.types.d.ts +18 -0
  196. package/lib/scenario/receivers/scenario-receiver.gql.d.ts +8 -0
  197. package/lib/scenario/receivers/scenario-receiver.service.d.ts +30 -0
  198. package/lib/scenario/receivers/scenario-receiver.types.d.ts +54 -0
  199. package/lib/scenario/scenario-setup.service.d.ts +22 -0
  200. package/lib/scenario/scenario.gql.d.ts +34 -0
  201. package/lib/scenario/scenario.service.d.ts +58 -0
  202. package/lib/scenario/scenario.types.d.ts +217 -0
  203. package/lib/search/search.gql.d.ts +1 -0
  204. package/lib/search/search.service.d.ts +25 -0
  205. package/lib/search/search.types.d.ts +20 -0
  206. package/lib/trusted-parties/tp-password-reset-request.service.d.ts +20 -0
  207. package/lib/trusted-parties/tp-password-reset-user.service.d.ts +41 -0
  208. package/lib/trusted-parties/tp-password-reset.gql.d.ts +218 -0
  209. package/lib/trusted-parties/tp-password-reset.service.d.ts +131 -0
  210. package/lib/trusted-parties/trusted-party.gql.d.ts +9 -0
  211. package/lib/trusted-parties/trusted-party.service.d.ts +44 -0
  212. package/lib/trusted-parties/trusted-party.types.d.ts +102 -0
  213. package/lib/trusted-parties/trusted-party2.gql.d.ts +79 -0
  214. package/lib/trusted-parties/trusted-party2.service.d.ts +114 -0
  215. package/lib/users/profile-details.service.d.ts +21 -0
  216. package/lib/users/profile.gql.d.ts +11 -0
  217. package/lib/users/profile.service.d.ts +35 -0
  218. package/lib/users/profile.types.d.ts +96 -0
  219. package/lib/users/user.gql.d.ts +9 -0
  220. package/lib/users/user.service.d.ts +12 -0
  221. package/lib/users/user.types.d.ts +23 -0
  222. package/lifeready-core.d.ts +9 -0
  223. package/lifeready-core.metadata.json +1 -0
  224. package/package.json +29 -0
  225. package/public-api.d.ts +77 -0
@@ -0,0 +1,300 @@
1
+ var TpPasswordResetService_1;
2
+ import { __awaiter, __decorate, __rest } from "tslib";
3
+ import { Injectable, Injector, NgZone } from '@angular/core';
4
+ import { KeyService } from '../cryptography/key.service';
5
+ import { EncryptionService } from '../cryptography/encryption.service';
6
+ import { CreateTpPasswordResetMutation, DeleteTpPasswordResetMutation, TpPasswordResetQuery, UpdateTpPasswordResetMutation, CancelTpPasswordResetRequestMutation, } from './tp-password-reset.gql';
7
+ import { KeyGraphService } from '../cryptography/key-graph.service';
8
+ import * as slip from '../cryptography/slip39.service';
9
+ import { LrBadArgumentException, LrBadLogicException, } from '../_common/exceptions';
10
+ import { KeyFactoryService } from '../cryptography/key-factory.service';
11
+ import { LrMutation, LrService } from '../api/lr-graphql';
12
+ import { RunOutsideAngular } from '../_common/run-outside-angular';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../cryptography/key.service";
15
+ import * as i2 from "../cryptography/key-factory.service";
16
+ import * as i3 from "../cryptography/encryption.service";
17
+ import * as i4 from "../cryptography/key-graph.service";
18
+ import * as i5 from "../cryptography/slip39.service";
19
+ export class CreateSubAssembliesInput {
20
+ }
21
+ export class UpdateSubAssembliesInput extends CreateSubAssembliesInput {
22
+ }
23
+ export class CreateTpPasswordResetInput {
24
+ }
25
+ export class UpdateTpPasswordResetInput extends CreateTpPasswordResetInput {
26
+ }
27
+ let TpPasswordResetService = TpPasswordResetService_1 = class TpPasswordResetService extends LrService {
28
+ constructor(ngZone, injector, keyService, keyFactory, encryptionService, keyGraph, slip39Service) {
29
+ super(injector);
30
+ this.ngZone = ngZone;
31
+ this.injector = injector;
32
+ this.keyService = keyService;
33
+ this.keyFactory = keyFactory;
34
+ this.encryptionService = encryptionService;
35
+ this.keyGraph = keyGraph;
36
+ this.slip39Service = slip39Service;
37
+ }
38
+ getReset() {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ return (yield this.query({
41
+ query: TpPasswordResetQuery,
42
+ })).tpPasswordReset;
43
+ });
44
+ }
45
+ createReset(input) {
46
+ return this.mutate(this.createResetMutation(input));
47
+ }
48
+ createResetMutation(input) {
49
+ return __awaiter(this, void 0, void 0, function* () {
50
+ const { mutationInput } = yield this._createReset(input, (rawAssemblyKey) => __awaiter(this, void 0, void 0, function* () {
51
+ return this.prepareSlip39(input.createSubAssemblies, input.quorum, rawAssemblyKey);
52
+ }));
53
+ return new LrMutation({
54
+ mutation: CreateTpPasswordResetMutation,
55
+ variables: {
56
+ input: mutationInput,
57
+ },
58
+ });
59
+ });
60
+ }
61
+ deleteReset() {
62
+ return this.mutate(this.deleteResetMutation());
63
+ }
64
+ deleteResetMutation() {
65
+ return new LrMutation({
66
+ mutation: DeleteTpPasswordResetMutation,
67
+ });
68
+ }
69
+ updateReset(input) {
70
+ return this.mutate(this.updateResetMutation(input));
71
+ }
72
+ updateResetMutation(input) {
73
+ return __awaiter(this, void 0, void 0, function* () {
74
+ const passwordReset = yield this.getReset();
75
+ const { mutationInput, subjectKey, slipAssembly, assemblyKeyParams, } = yield this._createReset(input, (rawAssemblyKey) => __awaiter(this, void 0, void 0, function* () {
76
+ return this.prepareSlip39(input.createSubAssemblies.concat(input.updateSubAssemblies), input.quorum, rawAssemblyKey);
77
+ }));
78
+ const updateSubAssemblies = yield Promise.all(input.updateSubAssemblies.map((sa, saIndex) => __awaiter(this, void 0, void 0, function* () {
79
+ const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, {
80
+ name: sa.name,
81
+ });
82
+ // Get the existing sub-assembly
83
+ const existingSa = passwordReset.assembly.subAssemblies.edges.find((edge) => edge.node.id === sa.id).node;
84
+ // Get approvers that do not exist yet
85
+ const createApprovers = [];
86
+ const updateApprovers = [];
87
+ sa.approverTps.forEach((tp) => {
88
+ var _a;
89
+ const approver = (_a = existingSa.approvers.edges.find((edge) => edge.node.tp.id === tp.id)) === null || _a === void 0 ? void 0 : _a.node;
90
+ if (approver) {
91
+ updateApprovers.push({
92
+ tp,
93
+ approverId: approver.id,
94
+ });
95
+ }
96
+ else {
97
+ createApprovers.push({
98
+ tp,
99
+ });
100
+ }
101
+ });
102
+ return {
103
+ subAssemblyId: sa.id,
104
+ singleReject: sa.singleReject,
105
+ quorum: sa.quorum,
106
+ subjectCipherData,
107
+ createApprovers: yield Promise.all(createApprovers.map(({ tp }, approverIndex) => __awaiter(this, void 0, void 0, function* () {
108
+ return this.prepareApprover({
109
+ tp,
110
+ approverIndex,
111
+ saIndex: saIndex + input.createSubAssemblies.length,
112
+ slipAssembly,
113
+ assemblyKeyParams,
114
+ subjectKey,
115
+ });
116
+ }))),
117
+ updateApprovers: yield Promise.all(updateApprovers.map(({ tp, approverId }, approverIndex) => __awaiter(this, void 0, void 0, function* () {
118
+ return this.prepareApprover({
119
+ approverId,
120
+ tp,
121
+ approverIndex: approverIndex + createApprovers.length,
122
+ saIndex: saIndex + input.createSubAssemblies.length,
123
+ slipAssembly,
124
+ assemblyKeyParams,
125
+ subjectKey,
126
+ });
127
+ }))),
128
+ };
129
+ })));
130
+ return new LrMutation({
131
+ mutation: UpdateTpPasswordResetMutation,
132
+ variables: {
133
+ input: Object.assign(Object.assign({}, mutationInput), { assembly: Object.assign(Object.assign({}, mutationInput.assembly), { updateSubAssemblies }) }),
134
+ },
135
+ });
136
+ });
137
+ }
138
+ cancelResetRequest() {
139
+ return this.mutate(this.cancelResetRequestMutation());
140
+ }
141
+ cancelResetRequestMutation() {
142
+ return new LrMutation({
143
+ mutation: CancelTpPasswordResetRequestMutation,
144
+ });
145
+ }
146
+ validateApprovers(approvers) {
147
+ // Ensure all approvers have mkSharedKey.
148
+ for (const tp of approvers) {
149
+ if (!tp.currentUserSharedKey.userSharedKey.mkSharedKey) {
150
+ const msg = `tp ${tp.other.username} does not have mkSharedKey`;
151
+ console.log(msg);
152
+ throw new LrBadArgumentException(msg);
153
+ }
154
+ }
155
+ }
156
+ prepareApprover({ approverId, tp, approverIndex, saIndex, slipAssembly, assemblyKeyParams, subjectKey, }) {
157
+ return __awaiter(this, void 0, void 0, function* () {
158
+ if (!tp.currentUserSharedKey.userSharedKey.mkSharedKey) {
159
+ throw new LrBadArgumentException(`Tp ${tp.other.username} does not have mkSharedKey. Need to reshared it first.`);
160
+ }
161
+ const sharedKey = yield this.keyFactory.createKey();
162
+ const tpMkSharedKey = yield this.keyGraph.getKey(tp.currentUserSharedKey.userSharedKey.mkSharedKey.id);
163
+ // For TP to access shared_key
164
+ const tpMkSharedKeyWrappedSharedKey = yield this.encryptionService.encryptToString(tpMkSharedKey.jwk, sharedKey.toJSON(true));
165
+ // For subject to access shared_key
166
+ const subjectKeyWrappedSharedKey = yield this.encryptionService.encryptToString(subjectKey, sharedKey.toJSON(true));
167
+ const saSlip = slipAssembly.subAssemblies[saIndex];
168
+ if (saSlip.index !== saIndex) {
169
+ // Paranoia
170
+ throw new LrBadLogicException('slip sub assembly index should match with array index');
171
+ }
172
+ // If quorum is 1, then using the same share for every member.
173
+ const share = saSlip.threshold === 1 ? saSlip.shares[0] : saSlip.shares[approverIndex];
174
+ const partialAssemblyKey = {
175
+ slip39: {
176
+ share,
177
+ subAssembly: {
178
+ quorum: saSlip.threshold,
179
+ size: saSlip.size,
180
+ },
181
+ },
182
+ assemblyKeyParams,
183
+ };
184
+ console.log('partialAssemblyKey', partialAssemblyKey);
185
+ return {
186
+ tpMkSharedKeyId: tpMkSharedKey.id,
187
+ tpMkSharedKeyWrappedSharedKey,
188
+ subjectKeyWrappedSharedKey,
189
+ sharedCipherData: yield this.encryptionService.encryptToString(sharedKey, { a: '123' }),
190
+ sharedCipherApprovalData: '',
191
+ sharedCipherPartialAssemblyKey: yield this.encryptionService.encryptToString(sharedKey, partialAssemblyKey),
192
+ approverId: approverId || void 0,
193
+ tpId: approverId ? void 0 : tp.id,
194
+ };
195
+ });
196
+ }
197
+ // Prepare slip39
198
+ prepareSlip39(subAssemblies, assemblyQuorum, rawAssemblyKey) {
199
+ return __awaiter(this, void 0, void 0, function* () {
200
+ // Is there enough sub assemblies to meet quorum
201
+ if (subAssemblies.length < assemblyQuorum) {
202
+ throw new LrBadArgumentException('Not enough sub assemblies to meet quorum');
203
+ }
204
+ const slipAssembly = new slip.Assembly(assemblyQuorum);
205
+ subAssemblies.forEach((sa, index) => {
206
+ let approverCount = sa.approverTps.length;
207
+ // slip39 restricts quorum == 1 to have only 1 member. So we just share the same
208
+ // partial key for all sub assembly members.
209
+ if (sa.quorum === 1) {
210
+ approverCount = 1;
211
+ }
212
+ slipAssembly.addSubAssembly(new slip.SubAssembly(index, sa.quorum, approverCount));
213
+ });
214
+ yield this.slip39Service.generateShares(rawAssemblyKey, TpPasswordResetService_1.SLIP39_PASSPHRASE, slipAssembly);
215
+ return slipAssembly;
216
+ });
217
+ }
218
+ _createReset(input, createSlipAssembly) {
219
+ return __awaiter(this, void 0, void 0, function* () {
220
+ // Create subject key
221
+ const masterKey = yield this.keyService.getCurrentMasterKey();
222
+ const subjectKey = yield this.keyFactory.createKey();
223
+ const assemblyKey = yield this.keyFactory.createKey();
224
+ const _a = assemblyKey.toJSON(true), { k: rawAssemblyKey } = _a, assemblyKeyParams = __rest(_a, ["k"]);
225
+ const assemblyKeyVerifierPrk = yield this.keyFactory.createPkcSignKey();
226
+ const wrappedAssemblyKeyVerifierPrk = yield this.encryptionService.encryptToString(assemblyKey, assemblyKeyVerifierPrk.toJSON(true));
227
+ const masterKeyWrappedSubjectKey = yield this.encryptionService.encryptToString(masterKey.jwk, subjectKey.toJSON(true));
228
+ const subjectKeyWrappedAssemblyKey = yield this.encryptionService.encryptToString(subjectKey, assemblyKey.toJSON(true));
229
+ // Encrypt the rootKey with the assemblyKey
230
+ const rootKey = yield this.keyService.getCurrentRootKey();
231
+ const assemblyCipherData = yield this.encryptionService.encryptToString(assemblyKey, {
232
+ rootKey: rootKey.jwk.toJSON(true),
233
+ });
234
+ const slipAssembly = yield createSlipAssembly(rawAssemblyKey);
235
+ // const slipAssembly = await this.prepareSlip39(input.createSubAssemblies, input.quorum, rawAssemblyKey);
236
+ const createSubAssemblies = yield Promise.all(input.createSubAssemblies.map((sa, saIndex) => __awaiter(this, void 0, void 0, function* () {
237
+ const subjectCipherData = yield this.encryptionService.encryptToString(subjectKey, {
238
+ name: sa.name,
239
+ });
240
+ return {
241
+ singleReject: sa.singleReject,
242
+ quorum: sa.quorum,
243
+ subjectCipherData,
244
+ createApprovers: yield Promise.all(sa.approverTps.map((approverTp, approverIndex) => __awaiter(this, void 0, void 0, function* () {
245
+ return this.prepareApprover({
246
+ tp: approverTp,
247
+ approverIndex,
248
+ saIndex,
249
+ slipAssembly,
250
+ assemblyKeyParams,
251
+ subjectKey,
252
+ });
253
+ }))),
254
+ };
255
+ })));
256
+ return {
257
+ subjectKey,
258
+ slipAssembly,
259
+ assemblyKeyParams,
260
+ mutationInput: {
261
+ assembly: {
262
+ singleReject: input.singleReject,
263
+ quorum: input.quorum,
264
+ masterKeyId: masterKey.id,
265
+ masterKeyWrappedSubjectKey,
266
+ subjectKeyWrappedAssemblyKey,
267
+ subjectCipherData: '',
268
+ assemblyCipherData,
269
+ createSubAssemblies,
270
+ assemblyKeyVerifierPbk: JSON.stringify(assemblyKeyVerifierPrk.toJSON()),
271
+ wrappedAssemblyKeyVerifierPrk,
272
+ },
273
+ },
274
+ };
275
+ });
276
+ }
277
+ };
278
+ TpPasswordResetService.SLIP39_PASSPHRASE = 'lifeready';
279
+ TpPasswordResetService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TpPasswordResetService_Factory() { return new TpPasswordResetService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.KeyService), i0.ɵɵinject(i2.KeyFactoryService), i0.ɵɵinject(i3.EncryptionService), i0.ɵɵinject(i4.KeyGraphService), i0.ɵɵinject(i5.Slip39Service)); }, token: TpPasswordResetService, providedIn: "root" });
280
+ TpPasswordResetService.decorators = [
281
+ { type: Injectable, args: [{
282
+ providedIn: 'root',
283
+ },] }
284
+ ];
285
+ TpPasswordResetService.ctorParameters = () => [
286
+ { type: NgZone },
287
+ { type: Injector },
288
+ { type: KeyService },
289
+ { type: KeyFactoryService },
290
+ { type: EncryptionService },
291
+ { type: KeyGraphService },
292
+ { type: slip.Slip39Service }
293
+ ];
294
+ TpPasswordResetService = TpPasswordResetService_1 = __decorate([
295
+ RunOutsideAngular({
296
+ ngZoneName: 'ngZone',
297
+ })
298
+ ], TpPasswordResetService);
299
+ export { TpPasswordResetService };
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHAtcGFzc3dvcmQtcmVzZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJDOi9Qcm9qZWN0cy90ZXN0L3Byb2plY3RzL2NvcmUvc3JjLyIsInNvdXJjZXMiOlsibGliL3RydXN0ZWQtcGFydGllcy90cC1wYXNzd29yZC1yZXNldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN2RSxPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLDZCQUE2QixFQUM3QixvQkFBb0IsRUFDcEIsNkJBQTZCLEVBQzdCLG9DQUFvQyxHQUNyQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEtBQUssSUFBSSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFJL0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDeEUsT0FBTyxFQUFvQixVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7Ozs7QUFFbkUsTUFBTSxPQUFPLHdCQUF3QjtDQUtwQztBQUVELE1BQU0sT0FBTyx3QkFBeUIsU0FBUSx3QkFBd0I7Q0FFckU7QUFFRCxNQUFNLE9BQU8sMEJBQTBCO0NBSXRDO0FBRUQsTUFBTSxPQUFPLDBCQUEyQixTQUFRLDBCQUEwQjtDQUV6RTtJQW1EWSxzQkFBc0Isb0NBQXRCLHNCQUF1QixTQUFRLFNBQVM7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QU0sRUFBRSxDQUNoQzt3QkFDRCw2QkFBNkI7cUJBQzlCO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FBQTtDQUNGLENBQUE7QUFsWWUsd0NBQWlCLEdBQUcsV0FBVyxDQUFDOzs7WUFKL0MsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUE3RjhCLE1BQU07WUFBaEIsUUFBUTtZQUNwQixVQUFVO1lBa0JWLGlCQUFpQjtZQWpCakIsaUJBQWlCO1lBUWpCLGVBQWU7WUFDWixJQUFJLENBNkZnQixhQUFhOztBQVZoQyxzQkFBc0I7SUFObEMsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLHNCQUFzQixDQW1ZbEM7U0FuWVksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkvZW5jcnlwdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBDcmVhdGVUcFBhc3N3b3JkUmVzZXRNdXRhdGlvbixcclxuICBEZWxldGVUcFBhc3N3b3JkUmVzZXRNdXRhdGlvbixcclxuICBUcFBhc3N3b3JkUmVzZXRRdWVyeSxcclxuICBVcGRhdGVUcFBhc3N3b3JkUmVzZXRNdXRhdGlvbixcclxuICBDYW5jZWxUcFBhc3N3b3JkUmVzZXRSZXF1ZXN0TXV0YXRpb24sXHJcbn0gZnJvbSAnLi90cC1wYXNzd29yZC1yZXNldC5ncWwnO1xyXG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9jcnlwdG9ncmFwaHkva2V5LWdyYXBoLnNlcnZpY2UnO1xyXG5pbXBvcnQgKiBhcyBzbGlwIGZyb20gJy4uL2NyeXB0b2dyYXBoeS9zbGlwMzkuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbixcclxuICBMckJhZExvZ2ljRXhjZXB0aW9uLFxyXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XHJcbmltcG9ydCB7IFBhcnRpYWxBc3NlbWJseUtleSB9IGZyb20gJy4uL3NjZW5hcmlvL3NjZW5hcmlvLnR5cGVzJztcclxuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcclxuaW1wb3J0IHsgS2V5IH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2NyeXB0b2dyYXBoeS50eXBlcyc7XHJcbmltcG9ydCB7IEtleUZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi4vY3J5cHRvZ3JhcGh5L2tleS1mYWN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBMckdyYXBoUUxTZXJ2aWNlLCBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XHJcbmltcG9ydCB7IFRwTm9kZSB9IGZyb20gJy4uL2FwaS90eXBlcyc7XHJcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcclxuXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVTdWJBc3NlbWJsaWVzSW5wdXQge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBxdW9ydW06IG51bWJlcjtcclxuICBzaW5nbGVSZWplY3Q6IGJvb2xlYW47XHJcbiAgYXBwcm92ZXJUcHM6IFRwTm9kZVtdO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgVXBkYXRlU3ViQXNzZW1ibGllc0lucHV0IGV4dGVuZHMgQ3JlYXRlU3ViQXNzZW1ibGllc0lucHV0IHtcclxuICBpZDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlVHBQYXNzd29yZFJlc2V0SW5wdXQge1xyXG4gIHF1b3J1bTogbnVtYmVyO1xyXG4gIHNpbmdsZVJlamVjdDogYm9vbGVhbjtcclxuICBjcmVhdGVTdWJBc3NlbWJsaWVzOiBDcmVhdGVTdWJBc3NlbWJsaWVzSW5wdXRbXTtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVwZGF0ZVRwUGFzc3dvcmRSZXNldElucHV0IGV4dGVuZHMgQ3JlYXRlVHBQYXNzd29yZFJlc2V0SW5wdXQge1xyXG4gIHVwZGF0ZVN1YkFzc2VtYmxpZXM6IFVwZGF0ZVN1YkFzc2VtYmxpZXNJbnB1dFtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRwQXNzZW1ibHlBcHByb3ZlcnMge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdHA6IHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgfTtcclxuICBzaGFyZWRLZXk6IEtleTtcclxuICBzaGFyZWRDaXBoZXJEYXRhPzogc3RyaW5nO1xyXG4gIHNoYXJlZENpcGhlckRhdGFDbGVhckpzb24/OiBhbnk7XHJcbiAgc2hhcmVkQ2lwaGVyQXBwcm92YWxEYXRhPzogc3RyaW5nO1xyXG4gIHNoYXJlZENpcGhlckFwcHJvdmFsRGF0YUNsZWFySnNvbj86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcFN1YkFzc2VtYmx5IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIHNpbmdsZVJlamVjdDogYm9vbGVhbjtcclxuICBxdW9ydW06IG51bWJlcjtcclxuICBzdWJqZWN0Q2lwaGVyRGF0YTogc3RyaW5nO1xyXG4gIHBsYWluU3ViamVjdENpcGhlckRhdGE6IGFueTtcclxuICBhcHByb3ZlcnM6IFRwQXNzZW1ibHlBcHByb3ZlcnNbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUcEFzc2VtYmx5IHtcclxuICBzaW5nbGVSZWplY3Q6IGJvb2xlYW47XHJcbiAgcXVvcnVtOiBudW1iZXI7XHJcbiAgc3ViamVjdEtleTogS2V5O1xyXG4gIGFzc2VtYmx5S2V5OiBLZXk7XHJcbiAgYXNzZW1ibHlDaXBoZXJEYXRhOiBzdHJpbmc7XHJcbiAgcGxhaW5Bc3NlbWJseUNpcGhlckRhdGE6IGFueTtcclxuICBzdWJBc3NlbWJsaWVzOiBUcFN1YkFzc2VtYmx5W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVHBQYXNzd29yZFJlc2V0IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGFzc2VtYmx5OiBUcEFzc2VtYmx5O1xyXG4gIGFwcGxpZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFJlc2V0UmVzdWx0IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGFzc29jaWF0ZV9yZXNldF91c2VyX3Rva2VuOiBzdHJpbmc7XHJcbiAgcmVzZXRfdXNlcm5hbWU6IHN0cmluZztcclxufVxyXG5cclxuQFJ1bk91dHNpZGVBbmd1bGFyKHtcclxuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcclxufSlcclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFRwUGFzc3dvcmRSZXNldFNlcnZpY2UgZXh0ZW5kcyBMclNlcnZpY2Uge1xyXG4gIHB1YmxpYyBzdGF0aWMgU0xJUDM5X1BBU1NQSFJBU0UgPSAnbGlmZXJlYWR5JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtleUZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBlbmNyeXB0aW9uU2VydmljZTogRW5jcnlwdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNsaXAzOVNlcnZpY2U6IHNsaXAuU2xpcDM5U2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0UmVzZXQoKSB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICBhd2FpdCB0aGlzLnF1ZXJ5KHtcclxuICAgICAgICBxdWVyeTogVHBQYXNzd29yZFJlc2V0UXVlcnksXHJcbiAgICAgIH0pXHJcbiAgICApLnRwUGFzc3dvcmRSZXNldDtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVJlc2V0KGlucHV0OiBDcmVhdGVUcFBhc3N3b3JkUmVzZXRJbnB1dCkge1xyXG4gICAgcmV0dXJuIHRoaXMubXV0YXRlKHRoaXMuY3JlYXRlUmVzZXRNdXRhdGlvbihpbnB1dCkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY3JlYXRlUmVzZXRNdXRhdGlvbihpbnB1dDogQ3JlYXRlVHBQYXNzd29yZFJlc2V0SW5wdXQpIHtcclxuICAgIGNvbnN0IHsgbXV0YXRpb25JbnB1dCB9ID0gYXdhaXQgdGhpcy5fY3JlYXRlUmVzZXQoXHJcbiAgICAgIGlucHV0LFxyXG4gICAgICBhc3luYyAocmF3QXNzZW1ibHlLZXkpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlU2xpcDM5KFxyXG4gICAgICAgICAgaW5wdXQuY3JlYXRlU3ViQXNzZW1ibGllcyxcclxuICAgICAgICAgIGlucHV0LnF1b3J1bSxcclxuICAgICAgICAgIHJhd0Fzc2VtYmx5S2V5XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogQ3JlYXRlVHBQYXNzd29yZFJlc2V0TXV0YXRpb24sXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIGlucHV0OiBtdXRhdGlvbklucHV0LFxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVSZXNldCgpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmRlbGV0ZVJlc2V0TXV0YXRpb24oKSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVSZXNldE11dGF0aW9uKCkge1xyXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgbXV0YXRpb246IERlbGV0ZVRwUGFzc3dvcmRSZXNldE11dGF0aW9uLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVSZXNldChpbnB1dDogVXBkYXRlVHBQYXNzd29yZFJlc2V0SW5wdXQpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZVJlc2V0TXV0YXRpb24oaW5wdXQpKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHVwZGF0ZVJlc2V0TXV0YXRpb24oaW5wdXQ6IFVwZGF0ZVRwUGFzc3dvcmRSZXNldElucHV0KSB7XHJcbiAgICBjb25zdCBwYXNzd29yZFJlc2V0ID0gYXdhaXQgdGhpcy5nZXRSZXNldCgpO1xyXG5cclxuICAgIGNvbnN0IHtcclxuICAgICAgbXV0YXRpb25JbnB1dCxcclxuICAgICAgc3ViamVjdEtleSxcclxuICAgICAgc2xpcEFzc2VtYmx5LFxyXG4gICAgICBhc3NlbWJseUtleVBhcmFtcyxcclxuICAgIH0gPSBhd2FpdCB0aGlzLl9jcmVhdGVSZXNldChpbnB1dCwgYXN5bmMgKHJhd0Fzc2VtYmx5S2V5KSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnByZXBhcmVTbGlwMzkoXHJcbiAgICAgICAgaW5wdXQuY3JlYXRlU3ViQXNzZW1ibGllcy5jb25jYXQoaW5wdXQudXBkYXRlU3ViQXNzZW1ibGllcyksXHJcbiAgICAgICAgaW5wdXQucXVvcnVtLFxyXG4gICAgICAgIHJhd0Fzc2VtYmx5S2V5XHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB1cGRhdGVTdWJBc3NlbWJsaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIGlucHV0LnVwZGF0ZVN1YkFzc2VtYmxpZXMubWFwKGFzeW5jIChzYSwgc2FJbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN1YmplY3RDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgICAgICBzdWJqZWN0S2V5LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBzYS5uYW1lLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIEdldCB0aGUgZXhpc3Rpbmcgc3ViLWFzc2VtYmx5XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdTYSA9IHBhc3N3b3JkUmVzZXQuYXNzZW1ibHkuc3ViQXNzZW1ibGllcy5lZGdlcy5maW5kKFxyXG4gICAgICAgICAgKGVkZ2UpID0+IGVkZ2Uubm9kZS5pZCA9PT0gc2EuaWRcclxuICAgICAgICApLm5vZGU7XHJcblxyXG4gICAgICAgIC8vIEdldCBhcHByb3ZlcnMgdGhhdCBkbyBub3QgZXhpc3QgeWV0XHJcbiAgICAgICAgY29uc3QgY3JlYXRlQXBwcm92ZXJzID0gW107XHJcbiAgICAgICAgY29uc3QgdXBkYXRlQXBwcm92ZXJzID0gW107XHJcblxyXG4gICAgICAgIHNhLmFwcHJvdmVyVHBzLmZvckVhY2goKHRwKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBhcHByb3ZlciA9IGV4aXN0aW5nU2EuYXBwcm92ZXJzLmVkZ2VzLmZpbmQoXHJcbiAgICAgICAgICAgIChlZGdlKSA9PiBlZGdlLm5vZGUudHAuaWQgPT09IHRwLmlkXHJcbiAgICAgICAgICApPy5ub2RlO1xyXG4gICAgICAgICAgaWYgKGFwcHJvdmVyKSB7XHJcbiAgICAgICAgICAgIHVwZGF0ZUFwcHJvdmVycy5wdXNoKHtcclxuICAgICAgICAgICAgICB0cCxcclxuICAgICAgICAgICAgICBhcHByb3ZlcklkOiBhcHByb3Zlci5pZCxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjcmVhdGVBcHByb3ZlcnMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdHAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgc3ViQXNzZW1ibHlJZDogc2EuaWQsXHJcbiAgICAgICAgICBzaW5nbGVSZWplY3Q6IHNhLnNpbmdsZVJlamVjdCxcclxuICAgICAgICAgIHF1b3J1bTogc2EucXVvcnVtLFxyXG4gICAgICAgICAgc3ViamVjdENpcGhlckRhdGEsXHJcbiAgICAgICAgICBjcmVhdGVBcHByb3ZlcnM6IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICBjcmVhdGVBcHByb3ZlcnMubWFwKGFzeW5jICh7IHRwIH0sIGFwcHJvdmVySW5kZXgpID0+XHJcbiAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlQXBwcm92ZXIoe1xyXG4gICAgICAgICAgICAgICAgdHAsXHJcbiAgICAgICAgICAgICAgICBhcHByb3ZlckluZGV4LFxyXG4gICAgICAgICAgICAgICAgc2FJbmRleDogc2FJbmRleCArIGlucHV0LmNyZWF0ZVN1YkFzc2VtYmxpZXMubGVuZ3RoLCAvLyBzbGlwQXNzZW1ibHkgaXMgYWxsIHN1Yi1hc3NlbWJsaWVzIGNvbWJpbmVkXHJcbiAgICAgICAgICAgICAgICBzbGlwQXNzZW1ibHksXHJcbiAgICAgICAgICAgICAgICBhc3NlbWJseUtleVBhcmFtcyxcclxuICAgICAgICAgICAgICAgIHN1YmplY3RLZXksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHVwZGF0ZUFwcHJvdmVyczogYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIHVwZGF0ZUFwcHJvdmVycy5tYXAoYXN5bmMgKHsgdHAsIGFwcHJvdmVySWQgfSwgYXBwcm92ZXJJbmRleCkgPT5cclxuICAgICAgICAgICAgICB0aGlzLnByZXBhcmVBcHByb3Zlcih7XHJcbiAgICAgICAgICAgICAgICBhcHByb3ZlcklkLFxyXG4gICAgICAgICAgICAgICAgdHAsXHJcbiAgICAgICAgICAgICAgICBhcHByb3ZlckluZGV4OiBhcHByb3ZlckluZGV4ICsgY3JlYXRlQXBwcm92ZXJzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgIHNhSW5kZXg6IHNhSW5kZXggKyBpbnB1dC5jcmVhdGVTdWJBc3NlbWJsaWVzLmxlbmd0aCwgLy8gc2xpcEFzc2VtYmx5IGlzIGFsbCBzdWItYXNzZW1ibGllcyBjb21iaW5lZFxyXG4gICAgICAgICAgICAgICAgc2xpcEFzc2VtYmx5LFxyXG4gICAgICAgICAgICAgICAgYXNzZW1ibHlLZXlQYXJhbXMsXHJcbiAgICAgICAgICAgICAgICBzdWJqZWN0S2V5LFxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICksXHJcbiAgICAgICAgfTtcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcclxuICAgICAgbXV0YXRpb246IFVwZGF0ZVRwUGFzc3dvcmRSZXNldE11dGF0aW9uLFxyXG4gICAgICB2YXJpYWJsZXM6IHtcclxuICAgICAgICBpbnB1dDoge1xyXG4gICAgICAgICAgLi4ubXV0YXRpb25JbnB1dCxcclxuICAgICAgICAgIGFzc2VtYmx5OiB7XHJcbiAgICAgICAgICAgIC4uLm11dGF0aW9uSW5wdXQuYXNzZW1ibHksXHJcbiAgICAgICAgICAgIHVwZGF0ZVN1YkFzc2VtYmxpZXMsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbFJlc2V0UmVxdWVzdCgpIHtcclxuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmNhbmNlbFJlc2V0UmVxdWVzdE11dGF0aW9uKCkpO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsUmVzZXRSZXF1ZXN0TXV0YXRpb24oKSB7XHJcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xyXG4gICAgICBtdXRhdGlvbjogQ2FuY2VsVHBQYXNzd29yZFJlc2V0UmVxdWVzdE11dGF0aW9uLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZUFwcHJvdmVycyhhcHByb3ZlcnM6IFRwTm9kZVtdKTogdm9pZCB7XHJcbiAgICAvLyBFbnN1cmUgYWxsIGFwcHJvdmVycyBoYXZlIG1rU2hhcmVkS2V5LlxyXG4gICAgZm9yIChjb25zdCB0cCBvZiBhcHByb3ZlcnMpIHtcclxuICAgICAgaWYgKCF0cC5jdXJyZW50VXNlclNoYXJlZEtleS51c2VyU2hhcmVkS2V5Lm1rU2hhcmVkS2V5KSB7XHJcbiAgICAgICAgY29uc3QgbXNnID0gYHRwICR7dHAub3RoZXIudXNlcm5hbWV9IGRvZXMgbm90IGhhdmUgbWtTaGFyZWRLZXlgO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24obXNnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlQXBwcm92ZXIoe1xyXG4gICAgYXBwcm92ZXJJZCxcclxuICAgIHRwLFxyXG4gICAgYXBwcm92ZXJJbmRleCxcclxuICAgIHNhSW5kZXgsXHJcbiAgICBzbGlwQXNzZW1ibHksXHJcbiAgICBhc3NlbWJseUtleVBhcmFtcyxcclxuICAgIHN1YmplY3RLZXksXHJcbiAgfToge1xyXG4gICAgYXBwcm92ZXJJZD86IHN0cmluZztcclxuICAgIHRwOiBUcE5vZGU7XHJcbiAgICBhcHByb3ZlckluZGV4OiBudW1iZXI7XHJcbiAgICBzYUluZGV4OiBudW1iZXI7XHJcbiAgICBzbGlwQXNzZW1ibHk6IHNsaXAuQXNzZW1ibHk7XHJcbiAgICBhc3NlbWJseUtleVBhcmFtczogb2JqZWN0O1xyXG4gICAgc3ViamVjdEtleTogSldLLktleTtcclxuICB9KSB7XHJcbiAgICBpZiAoIXRwLmN1cnJlbnRVc2VyU2hhcmVkS2V5LnVzZXJTaGFyZWRLZXkubWtTaGFyZWRLZXkpIHtcclxuICAgICAgdGhyb3cgbmV3IExyQmFkQXJndW1lbnRFeGNlcHRpb24oXHJcbiAgICAgICAgYFRwICR7dHAub3RoZXIudXNlcm5hbWV9IGRvZXMgbm90IGhhdmUgbWtTaGFyZWRLZXkuIE5lZWQgdG8gcmVzaGFyZWQgaXQgZmlyc3QuYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNoYXJlZEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcclxuICAgIGNvbnN0IHRwTWtTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmtleUdyYXBoLmdldEtleShcclxuICAgICAgdHAuY3VycmVudFVzZXJTaGFyZWRLZXkudXNlclNoYXJlZEtleS5ta1NoYXJlZEtleS5pZFxyXG4gICAgKTtcclxuICAgIC8vIEZvciBUUCB0byBhY2Nlc3Mgc2hhcmVkX2tleVxyXG4gICAgY29uc3QgdHBNa1NoYXJlZEtleVdyYXBwZWRTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcclxuICAgICAgdHBNa1NoYXJlZEtleS5qd2ssXHJcbiAgICAgIHNoYXJlZEtleS50b0pTT04odHJ1ZSlcclxuICAgICk7XHJcbiAgICAvLyBGb3Igc3ViamVjdCB0byBhY2Nlc3Mgc2hhcmVkX2tleVxyXG4gICAgY29uc3Qgc3ViamVjdEtleVdyYXBwZWRTaGFyZWRLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcclxuICAgICAgc3ViamVjdEtleSxcclxuICAgICAgc2hhcmVkS2V5LnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBzYVNsaXAgPSBzbGlwQXNzZW1ibHkuc3ViQXNzZW1ibGllc1tzYUluZGV4XTtcclxuICAgIGlmIChzYVNsaXAuaW5kZXggIT09IHNhSW5kZXgpIHtcclxuICAgICAgLy8gUGFyYW5vaWFcclxuICAgICAgdGhyb3cgbmV3IExyQmFkTG9naWNFeGNlcHRpb24oXHJcbiAgICAgICAgJ3NsaXAgc3ViIGFzc2VtYmx5IGluZGV4IHNob3VsZCBtYXRjaCB3aXRoIGFycmF5IGluZGV4J1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHF1b3J1bSBpcyAxLCB0aGVuIHVzaW5nIHRoZSBzYW1lIHNoYXJlIGZvciBldmVyeSBtZW1iZXIuXHJcbiAgICBjb25zdCBzaGFyZSA9XHJcbiAgICAgIHNhU2xpcC50aHJlc2hvbGQgPT09IDEgPyBzYVNsaXAuc2hhcmVzWzBdIDogc2FTbGlwLnNoYXJlc1thcHByb3ZlckluZGV4XTtcclxuXHJcbiAgICBjb25zdCBwYXJ0aWFsQXNzZW1ibHlLZXk6IFBhcnRpYWxBc3NlbWJseUtleSA9IHtcclxuICAgICAgc2xpcDM5OiB7XHJcbiAgICAgICAgc2hhcmUsXHJcbiAgICAgICAgc3ViQXNzZW1ibHk6IHtcclxuICAgICAgICAgIHF1b3J1bTogc2FTbGlwLnRocmVzaG9sZCxcclxuICAgICAgICAgIHNpemU6IHNhU2xpcC5zaXplLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygncGFydGlhbEFzc2VtYmx5S2V5JywgcGFydGlhbEFzc2VtYmx5S2V5KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0cE1rU2hhcmVkS2V5SWQ6IHRwTWtTaGFyZWRLZXkuaWQsXHJcbiAgICAgIHRwTWtTaGFyZWRLZXlXcmFwcGVkU2hhcmVkS2V5LFxyXG4gICAgICBzdWJqZWN0S2V5V3JhcHBlZFNoYXJlZEtleSxcclxuICAgICAgc2hhcmVkQ2lwaGVyRGF0YTogYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgICAgc2hhcmVkS2V5LFxyXG4gICAgICAgIHsgYTogJzEyMycgfVxyXG4gICAgICApLFxyXG4gICAgICBzaGFyZWRDaXBoZXJBcHByb3ZhbERhdGE6ICcnLFxyXG4gICAgICBzaGFyZWRDaXBoZXJQYXJ0aWFsQXNzZW1ibHlLZXk6IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxyXG4gICAgICAgIHNoYXJlZEtleSxcclxuICAgICAgICBwYXJ0aWFsQXNzZW1ibHlLZXlcclxuICAgICAgKSxcclxuICAgICAgYXBwcm92ZXJJZDogYXBwcm92ZXJJZCB8fCB2b2lkIDAsXHJcbiAgICAgIHRwSWQ6IGFwcHJvdmVySWQgPyB2b2lkIDAgOiB0cC5pZCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyBQcmVwYXJlIHNsaXAzOVxyXG4gIHByaXZhdGUgYXN5bmMgcHJlcGFyZVNsaXAzOShcclxuICAgIHN1YkFzc2VtYmxpZXMsXHJcbiAgICBhc3NlbWJseVF1b3J1bTogbnVtYmVyLFxyXG4gICAgcmF3QXNzZW1ibHlLZXk6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8c2xpcC5Bc3NlbWJseT4ge1xyXG4gICAgLy8gSXMgdGhlcmUgZW5vdWdoIHN1YiBhc3NlbWJsaWVzIHRvIG1lZXQgcXVvcnVtXHJcbiAgICBpZiAoc3ViQXNzZW1ibGllcy5sZW5ndGggPCBhc3NlbWJseVF1b3J1bSkge1xyXG4gICAgICB0aHJvdyBuZXcgTHJCYWRBcmd1bWVudEV4Y2VwdGlvbihcclxuICAgICAgICAnTm90IGVub3VnaCBzdWIgYXNzZW1ibGllcyB0byBtZWV0IHF1b3J1bSdcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzbGlwQXNzZW1ibHkgPSBuZXcgc2xpcC5Bc3NlbWJseShhc3NlbWJseVF1b3J1bSk7XHJcblxyXG4gICAgc3ViQXNzZW1ibGllcy5mb3JFYWNoKChzYSwgaW5kZXgpID0+IHtcclxuICAgICAgbGV0IGFwcHJvdmVyQ291bnQgPSBzYS5hcHByb3ZlclRwcy5sZW5ndGg7XHJcblxyXG4gICAgICAvLyBzbGlwMzkgcmVzdHJpY3RzIHF1b3J1bSA9PSAxIHRvIGhhdmUgb25seSAxIG1lbWJlci4gU28gd2UganVzdCBzaGFyZSB0aGUgc2FtZVxyXG4gICAgICAvLyBwYXJ0aWFsIGtleSBmb3IgYWxsIHN1YiBhc3NlbWJseSBtZW1iZXJzLlxyXG4gICAgICBpZiAoc2EucXVvcnVtID09PSAxKSB7XHJcbiAgICAgICAgYXBwcm92ZXJDb3VudCA9IDE7XHJcbiAgICAgIH1cclxuICAgICAgc2xpcEFzc2VtYmx5LmFkZFN1YkFzc2VtYmx5KFxyXG4gICAgICAgIG5ldyBzbGlwLlN1YkFzc2VtYmx5KGluZGV4LCBzYS5xdW9ydW0sIGFwcHJvdmVyQ291bnQpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnNsaXAzOVNlcnZpY2UuZ2VuZXJhdGVTaGFyZXMoXHJcbiAgICAgIHJhd0Fzc2VtYmx5S2V5LFxyXG4gICAgICBUcFBhc3N3b3JkUmVzZXRTZXJ2aWNlLlNMSVAzOV9QQVNTUEhSQVNFLFxyXG4gICAgICBzbGlwQXNzZW1ibHlcclxuICAgICk7XHJcbiAgICByZXR1cm4gc2xpcEFzc2VtYmx5O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlUmVzZXQoXHJcbiAgICBpbnB1dDogQ3JlYXRlVHBQYXNzd29yZFJlc2V0SW5wdXQsXHJcbiAgICBjcmVhdGVTbGlwQXNzZW1ibHlcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgLy8gQ3JlYXRlIHN1YmplY3Qga2V5XHJcbiAgICBjb25zdCBtYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudE1hc3RlcktleSgpO1xyXG4gICAgY29uc3Qgc3ViamVjdEtleSA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVLZXkoKTtcclxuICAgIGNvbnN0IGFzc2VtYmx5S2V5ID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZUtleSgpO1xyXG4gICAgY29uc3QgeyBrOiByYXdBc3NlbWJseUtleSwgLi4uYXNzZW1ibHlLZXlQYXJhbXMgfSA9IGFzc2VtYmx5S2V5LnRvSlNPTihcclxuICAgICAgdHJ1ZVxyXG4gICAgKSBhcyBhbnk7XHJcbiAgICBjb25zdCBhc3NlbWJseUtleVZlcmlmaWVyUHJrID0gYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmNyZWF0ZVBrY1NpZ25LZXkoKTtcclxuICAgIGNvbnN0IHdyYXBwZWRBc3NlbWJseUtleVZlcmlmaWVyUHJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgIGFzc2VtYmx5S2V5LFxyXG4gICAgICBhc3NlbWJseUtleVZlcmlmaWVyUHJrLnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBtYXN0ZXJLZXlXcmFwcGVkU3ViamVjdEtleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdFRvU3RyaW5nKFxyXG4gICAgICBtYXN0ZXJLZXkuandrLFxyXG4gICAgICBzdWJqZWN0S2V5LnRvSlNPTih0cnVlKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHN1YmplY3RLZXlXcmFwcGVkQXNzZW1ibHlLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcclxuICAgICAgc3ViamVjdEtleSxcclxuICAgICAgYXNzZW1ibHlLZXkudG9KU09OKHRydWUpXHJcbiAgICApO1xyXG5cclxuICAgIC8vIEVuY3J5cHQgdGhlIHJvb3RLZXkgd2l0aCB0aGUgYXNzZW1ibHlLZXlcclxuICAgIGNvbnN0IHJvb3RLZXkgPSBhd2FpdCB0aGlzLmtleVNlcnZpY2UuZ2V0Q3VycmVudFJvb3RLZXkoKTtcclxuXHJcbiAgICBjb25zdCBhc3NlbWJseUNpcGhlckRhdGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHRUb1N0cmluZyhcclxuICAgICAgYXNzZW1ibHlLZXksXHJcbiAgICAgIHtcclxuICAgICAgICByb290S2V5OiByb290S2V5Lmp3ay50b0pTT04odHJ1ZSksXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgY29uc3Qgc2xpcEFzc2VtYmx5ID0gYXdhaXQgY3JlYXRlU2xpcEFzc2VtYmx5KHJhd0Fzc2VtYmx5S2V5KTtcclxuICAgIC8vIGNvbnN0IHNsaXBBc3NlbWJseSA9IGF3YWl0IHRoaXMucHJlcGFyZVNsaXAzOShpbnB1dC5jcmVhdGVTdWJBc3NlbWJsaWVzLCBpbnB1dC5xdW9ydW0sIHJhd0Fzc2VtYmx5S2V5KTtcclxuXHJcbiAgICBjb25zdCBjcmVhdGVTdWJBc3NlbWJsaWVzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIGlucHV0LmNyZWF0ZVN1YkFzc2VtYmxpZXMubWFwKGFzeW5jIChzYSwgc2FJbmRleCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN1YmplY3RDaXBoZXJEYXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0VG9TdHJpbmcoXHJcbiAgICAgICAgICBzdWJqZWN0S2V5LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiBzYS5uYW1lLFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzaW5nbGVSZWplY3Q6IHNhLnNpbmdsZVJlamVjdCxcclxuICAgICAgICAgIHF1b3J1bTogc2EucXVvcnVtLFxyXG4gICAgICAgICAgc3ViamVjdENpcGhlckRhdGEsXHJcbiAgICAgICAgICBjcmVhdGVBcHByb3ZlcnM6IGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICBzYS5hcHByb3ZlclRwcy5tYXAoYXN5bmMgKGFwcHJvdmVyVHAsIGFwcHJvdmVySW5kZXgpID0+XHJcbiAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlQXBwcm92ZXIoe1xyXG4gICAgICAgICAgICAgICAgdHA6IGFwcHJvdmVyVHAsXHJcbiAgICAgICAgICAgICAgICBhcHByb3ZlckluZGV4LFxyXG4gICAgICAgICAgICAgICAgc2FJbmRleCxcclxuICAgICAgICAgICAgICAgIHNsaXBBc3NlbWJseSxcclxuICAgICAgICAgICAgICAgIGFzc2VtYmx5S2V5UGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgc3ViamVjdEtleSxcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN1YmplY3RLZXksXHJcbiAgICAgIHNsaXBBc3NlbWJseSxcclxuICAgICAgYXNzZW1ibHlLZXlQYXJhbXMsXHJcbiAgICAgIG11dGF0aW9uSW5wdXQ6IHtcclxuICAgICAgICBhc3NlbWJseToge1xyXG4gICAgICAgICAgc2luZ2xlUmVqZWN0OiBpbnB1dC5zaW5nbGVSZWplY3QsXHJcbiAgICAgICAgICBxdW9ydW06IGlucHV0LnF1b3J1bSxcclxuICAgICAgICAgIG1hc3RlcktleUlkOiBtYXN0ZXJLZXkuaWQsXHJcbiAgICAgICAgICBtYXN0ZXJLZXlXcmFwcGVkU3ViamVjdEtleSxcclxuICAgICAgICAgIHN1YmplY3RLZXlXcmFwcGVkQXNzZW1ibHlLZXksXHJcbiAgICAgICAgICBzdWJqZWN0Q2lwaGVyRGF0YTogJycsXHJcbiAgICAgICAgICBhc3NlbWJseUNpcGhlckRhdGEsXHJcbiAgICAgICAgICBjcmVhdGVTdWJBc3NlbWJsaWVzLFxyXG4gICAgICAgICAgYXNzZW1ibHlLZXlWZXJpZmllclBiazogSlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICAgIGFzc2VtYmx5S2V5VmVyaWZpZXJQcmsudG9KU09OKClcclxuICAgICAgICAgICksXHJcbiAgICAgICAgICB3cmFwcGVkQXNzZW1ibHlLZXlWZXJpZmllclByayxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,148 @@
1
+ import gql from 'graphql-tag';
2
+ import { KeyGraphField } from '../_common/queries.gql';
3
+ import { KeyExchangeFields, UserSharedKeyFields, } from '../api/key-exchange.gql';
4
+ import { SharedContactCardFields } from '../api/shared-contact-card.service';
5
+ export const TrustedPartyProperties = `
6
+ id
7
+ user {
8
+ id
9
+ username
10
+ }
11
+ other{
12
+ id
13
+ username,
14
+ features {
15
+ shareVault
16
+ }
17
+ }
18
+ sharedContactCard {
19
+ ${SharedContactCardFields}
20
+ }
21
+ myContactCard {
22
+ ${SharedContactCardFields}
23
+ }
24
+ sharedScenarios {
25
+ edges {
26
+ node {
27
+ id
28
+ }
29
+ }
30
+ }
31
+ sharedItems {
32
+ directories {
33
+ edges {
34
+ node {
35
+ id
36
+ }
37
+ }
38
+ }
39
+ }
40
+ currentUserSharedKey {
41
+ userSharedKey {
42
+ keyExchange {
43
+ ${KeyExchangeFields}
44
+ }
45
+ ${UserSharedKeyFields}
46
+ }
47
+ }`;
48
+ export const GetTrustedPartiesQuery = gql `
49
+ query GetTrustedPartiesQuery {
50
+ tps {
51
+ edges {
52
+ node {
53
+ ${TrustedPartyProperties}
54
+ }
55
+ }
56
+ }
57
+ ${KeyGraphField}
58
+ }`;
59
+ export const GetAllTrustedPartiesQuery = gql `
60
+ query GetAllTrustedPartiesQuery($userId: ID, $isExpired: Boolean, $inviteState: String, $sentInviteState: String) {
61
+ tps {
62
+ edges {
63
+ node {
64
+ ${TrustedPartyProperties}
65
+ }
66
+ }
67
+ }
68
+ invites: keyExchanges(
69
+ responder: $userId
70
+ isExpired: $isExpired
71
+ state: $inviteState
72
+ orderBy: "state,-created"
73
+ ) {
74
+ edges {
75
+ node {
76
+ ${KeyExchangeFields}
77
+ }
78
+ }
79
+ }
80
+ sentInvites: keyExchanges(
81
+ initiator: $userId
82
+ isExpired: $isExpired
83
+ state: $sentInviteState
84
+ orderBy: "state,-created"
85
+ ) {
86
+ edges {
87
+ node {
88
+ ${KeyExchangeFields}
89
+ }
90
+ }
91
+ }
92
+ ${KeyGraphField}
93
+ }`;
94
+ export const GetTrustedPartyQuery = gql `
95
+ query GetTrustedPartyQuery($partyId: LrRelayIdInput!) {
96
+ tp(id: $partyId) {
97
+ ${TrustedPartyProperties}
98
+ }
99
+ ${KeyGraphField}
100
+ }`;
101
+ export const DeclineTrustedPartyInvitationMutation = gql `
102
+ mutation DeclineKeyExchange($input: DeclineKeyExchangeInput!) {
103
+ declineKeyExchange(input: $input) {
104
+ keyExchange {
105
+ id
106
+ }
107
+ }
108
+ }
109
+ `;
110
+ export const CancelTrustedPartyInvitationMutation = gql `
111
+ mutation CancelKeyExchange($input: CancelKeyExchangeInput!) {
112
+ cancelKeyExchange(input: $input) {
113
+ keyExchange {
114
+ id
115
+ }
116
+ }
117
+ }
118
+ `;
119
+ export const DeleteTrustedPartyMutation = gql `
120
+ mutation DeleteTpMutation($input: DeleteTpInput!) {
121
+ deleteTp(input: $input) {
122
+ id
123
+ }
124
+ }
125
+ `;
126
+ export const ShareCategoryMutation = gql `
127
+ mutation ShareDirectory($input: ShareDirectoryInput!) {
128
+ shareDirectory(input: $input) {
129
+ tpDirectory {
130
+ item {
131
+ plainMeta
132
+ }
133
+ }
134
+ }
135
+ }
136
+ `;
137
+ export const UnshareCategoryMutation = gql `
138
+ mutation UnshareDirectory($input: UnshareDirectoryInput!) {
139
+ unshareDirectory(input: $input) {
140
+ tpDirectory {
141
+ item {
142
+ plainMeta
143
+ }
144
+ }
145
+ }
146
+ }
147
+ `;
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1wYXJ0eS5ncWwuanMiLCJzb3VyY2VSb290IjoiQzovUHJvamVjdHMvdGVzdC9wcm9qZWN0cy9jb3JlL3NyYy8iLCJzb3VyY2VzIjpbImxpYi90cnVzdGVkLXBhcnRpZXMvdHJ1c3RlZC1wYXJ0eS5ncWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLG1CQUFtQixHQUNwQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTdFLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHOzs7Ozs7Ozs7Ozs7OztNQWNoQyx1QkFBdUI7OztNQUd2Qix1QkFBdUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztVQXFCbkIsaUJBQWlCOztRQUVuQixtQkFBbUI7O0lBRXZCLENBQUM7QUFFTCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLENBQUE7Ozs7O1VBSy9CLHNCQUFzQjs7OztJQUk1QixhQUFhO0VBQ2YsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQTs7Ozs7VUFLbEMsc0JBQXNCOzs7Ozs7Ozs7Ozs7VUFZdEIsaUJBQWlCOzs7Ozs7Ozs7Ozs7VUFZakIsaUJBQWlCOzs7O0lBSXZCLGFBQWE7RUFDZixDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFBOzs7TUFHakMsc0JBQXNCOztJQUV4QixhQUFhO0VBQ2YsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHFDQUFxQyxHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7Q0FRdkQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7Q0FRdEQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQTs7Ozs7O0NBTTVDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUE7Ozs7Ozs7Ozs7Q0FVdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7OztDQVV6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGdxbCBmcm9tICdncmFwaHFsLXRhZyc7XHJcbmltcG9ydCB7IEtleUdyYXBoRmllbGQgfSBmcm9tICcuLi9fY29tbW9uL3F1ZXJpZXMuZ3FsJztcclxuaW1wb3J0IHtcclxuICBLZXlFeGNoYW5nZUZpZWxkcyxcclxuICBVc2VyU2hhcmVkS2V5RmllbGRzLFxyXG59IGZyb20gJy4uL2FwaS9rZXktZXhjaGFuZ2UuZ3FsJztcclxuaW1wb3J0IHsgU2hhcmVkQ29udGFjdENhcmRGaWVsZHMgfSBmcm9tICcuLi9hcGkvc2hhcmVkLWNvbnRhY3QtY2FyZC5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjb25zdCBUcnVzdGVkUGFydHlQcm9wZXJ0aWVzID0gYFxyXG4gIGlkXHJcbiAgdXNlciB7XHJcbiAgICBpZFxyXG4gICAgdXNlcm5hbWVcclxuICB9XHJcbiAgb3RoZXJ7XHJcbiAgICBpZFxyXG4gICAgdXNlcm5hbWUsXHJcbiAgICBmZWF0dXJlcyB7XHJcbiAgICAgIHNoYXJlVmF1bHRcclxuICAgIH1cclxuICB9XHJcbiAgc2hhcmVkQ29udGFjdENhcmQge1xyXG4gICAgJHtTaGFyZWRDb250YWN0Q2FyZEZpZWxkc31cclxuICB9XHJcbiAgbXlDb250YWN0Q2FyZCB7XHJcbiAgICAke1NoYXJlZENvbnRhY3RDYXJkRmllbGRzfVxyXG4gIH1cclxuICBzaGFyZWRTY2VuYXJpb3Mge1xyXG4gICAgZWRnZXMge1xyXG4gICAgICBub2RlIHtcclxuICAgICAgICBpZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNoYXJlZEl0ZW1zIHtcclxuICAgIGRpcmVjdG9yaWVzIHtcclxuICAgICAgZWRnZXMge1xyXG4gICAgICAgIG5vZGUge1xyXG4gICAgICAgICAgaWRcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgY3VycmVudFVzZXJTaGFyZWRLZXkge1xyXG4gICAgdXNlclNoYXJlZEtleSB7XHJcbiAgICAgIGtleUV4Y2hhbmdlIHtcclxuICAgICAgICAke0tleUV4Y2hhbmdlRmllbGRzfVxyXG4gICAgICB9XHJcbiAgICAgICR7VXNlclNoYXJlZEtleUZpZWxkc31cclxuICAgIH1cclxuICB9YDtcclxuXHJcbmV4cG9ydCBjb25zdCBHZXRUcnVzdGVkUGFydGllc1F1ZXJ5ID0gZ3FsYFxyXG5xdWVyeSBHZXRUcnVzdGVkUGFydGllc1F1ZXJ5IHtcclxuICB0cHMge1xyXG4gICAgZWRnZXMge1xyXG4gICAgICBub2RlIHtcclxuICAgICAgICAke1RydXN0ZWRQYXJ0eVByb3BlcnRpZXN9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgJHtLZXlHcmFwaEZpZWxkfVxyXG59YDtcclxuXHJcbmV4cG9ydCBjb25zdCBHZXRBbGxUcnVzdGVkUGFydGllc1F1ZXJ5ID0gZ3FsYFxyXG5xdWVyeSBHZXRBbGxUcnVzdGVkUGFydGllc1F1ZXJ5KCR1c2VySWQ6IElELCAkaXNFeHBpcmVkOiBCb29sZWFuLCAkaW52aXRlU3RhdGU6IFN0cmluZywgJHNlbnRJbnZpdGVTdGF0ZTogU3RyaW5nKSB7XHJcbiAgdHBzIHtcclxuICAgIGVkZ2VzIHtcclxuICAgICAgbm9kZSB7XHJcbiAgICAgICAgJHtUcnVzdGVkUGFydHlQcm9wZXJ0aWVzfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGludml0ZXM6IGtleUV4Y2hhbmdlcyhcclxuICAgIHJlc3BvbmRlcjogJHVzZXJJZFxyXG4gICAgaXNFeHBpcmVkOiAkaXNFeHBpcmVkXHJcbiAgICBzdGF0ZTogJGludml0ZVN0YXRlXHJcbiAgICBvcmRlckJ5OiBcInN0YXRlLC1jcmVhdGVkXCJcclxuICApIHtcclxuICAgIGVkZ2VzIHtcclxuICAgICAgbm9kZSB7XHJcbiAgICAgICAgJHtLZXlFeGNoYW5nZUZpZWxkc31cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBzZW50SW52aXRlczoga2V5RXhjaGFuZ2VzKFxyXG4gICAgaW5pdGlhdG9yOiAkdXNlcklkXHJcbiAgICBpc0V4cGlyZWQ6ICRpc0V4cGlyZWRcclxuICAgIHN0YXRlOiAkc2VudEludml0ZVN0YXRlXHJcbiAgICBvcmRlckJ5OiBcInN0YXRlLC1jcmVhdGVkXCJcclxuICApIHtcclxuICAgIGVkZ2VzIHtcclxuICAgICAgbm9kZSB7XHJcbiAgICAgICAgJHtLZXlFeGNoYW5nZUZpZWxkc31cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAke0tleUdyYXBoRmllbGR9XHJcbn1gO1xyXG5cclxuZXhwb3J0IGNvbnN0IEdldFRydXN0ZWRQYXJ0eVF1ZXJ5ID0gZ3FsYFxyXG5xdWVyeSBHZXRUcnVzdGVkUGFydHlRdWVyeSgkcGFydHlJZDogTHJSZWxheUlkSW5wdXQhKSB7XHJcbiAgdHAoaWQ6ICRwYXJ0eUlkKSB7XHJcbiAgICAke1RydXN0ZWRQYXJ0eVByb3BlcnRpZXN9XHJcbiAgfVxyXG4gICR7S2V5R3JhcGhGaWVsZH1cclxufWA7XHJcblxyXG5leHBvcnQgY29uc3QgRGVjbGluZVRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbiA9IGdxbGBcclxuICBtdXRhdGlvbiBEZWNsaW5lS2V5RXhjaGFuZ2UoJGlucHV0OiBEZWNsaW5lS2V5RXhjaGFuZ2VJbnB1dCEpIHtcclxuICAgIGRlY2xpbmVLZXlFeGNoYW5nZShpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgIGtleUV4Y2hhbmdlIHtcclxuICAgICAgICBpZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IENhbmNlbFRydXN0ZWRQYXJ0eUludml0YXRpb25NdXRhdGlvbiA9IGdxbGBcclxuICBtdXRhdGlvbiBDYW5jZWxLZXlFeGNoYW5nZSgkaW5wdXQ6IENhbmNlbEtleUV4Y2hhbmdlSW5wdXQhKSB7XHJcbiAgICBjYW5jZWxLZXlFeGNoYW5nZShpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgIGtleUV4Y2hhbmdlIHtcclxuICAgICAgICBpZFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGNvbnN0IERlbGV0ZVRydXN0ZWRQYXJ0eU11dGF0aW9uID0gZ3FsYFxyXG4gIG11dGF0aW9uIERlbGV0ZVRwTXV0YXRpb24oJGlucHV0OiBEZWxldGVUcElucHV0ISkge1xyXG4gICAgZGVsZXRlVHAoaW5wdXQ6ICRpbnB1dCkge1xyXG4gICAgICBpZFxyXG4gICAgfVxyXG4gIH1cclxuYDtcclxuXHJcbmV4cG9ydCBjb25zdCBTaGFyZUNhdGVnb3J5TXV0YXRpb24gPSBncWxgXHJcbiAgbXV0YXRpb24gU2hhcmVEaXJlY3RvcnkoJGlucHV0OiBTaGFyZURpcmVjdG9yeUlucHV0ISkge1xyXG4gICAgc2hhcmVEaXJlY3RvcnkoaW5wdXQ6ICRpbnB1dCkge1xyXG4gICAgICB0cERpcmVjdG9yeSB7XHJcbiAgICAgICAgaXRlbSB7XHJcbiAgICAgICAgICBwbGFpbk1ldGFcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmA7XHJcblxyXG5leHBvcnQgY29uc3QgVW5zaGFyZUNhdGVnb3J5TXV0YXRpb24gPSBncWxgXHJcbiAgbXV0YXRpb24gVW5zaGFyZURpcmVjdG9yeSgkaW5wdXQ6IFVuc2hhcmVEaXJlY3RvcnlJbnB1dCEpIHtcclxuICAgIHVuc2hhcmVEaXJlY3RvcnkoaW5wdXQ6ICRpbnB1dCkge1xyXG4gICAgICB0cERpcmVjdG9yeSB7XHJcbiAgICAgICAgaXRlbSB7XHJcbiAgICAgICAgICBwbGFpbk1ldGFcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbmA7XHJcbiJdfQ==