@lifeready/core 9.0.8 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/fesm2022/lifeready-core.mjs +10522 -0
  2. package/fesm2022/lifeready-core.mjs.map +1 -0
  3. package/package.json +21 -16
  4. package/types/lifeready-core.d.ts +5329 -0
  5. package/bundles/lifeready-core.umd.js +0 -13231
  6. package/bundles/lifeready-core.umd.js.map +0 -1
  7. package/bundles/lifeready-core.umd.min.js +0 -2
  8. package/bundles/lifeready-core.umd.min.js.map +0 -1
  9. package/esm2015/lib/_common/ast.js +0 -41
  10. package/esm2015/lib/_common/deferred-promise.js +0 -24
  11. package/esm2015/lib/_common/exceptions.js +0 -186
  12. package/esm2015/lib/_common/index.js +0 -3
  13. package/esm2015/lib/_common/kc-lodash.js +0 -11
  14. package/esm2015/lib/_common/key.js +0 -28
  15. package/esm2015/lib/_common/queries.gql.js +0 -43
  16. package/esm2015/lib/_common/run-outside-angular.js +0 -80
  17. package/esm2015/lib/_common/storage.js +0 -28
  18. package/esm2015/lib/_common/types.js +0 -2
  19. package/esm2015/lib/_common/utils.js +0 -73
  20. package/esm2015/lib/api/lr-apollo.service.js +0 -47
  21. package/esm2015/lib/api/lr-graphql/index.js +0 -6
  22. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
  23. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
  24. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
  25. package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
  26. package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
  27. package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
  28. package/esm2015/lib/api/query-processor/index.js +0 -3
  29. package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
  30. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
  31. package/esm2015/lib/api/types/graphql.types.js +0 -8
  32. package/esm2015/lib/api/types/index.js +0 -3
  33. package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
  34. package/esm2015/lib/auth/auth.config.js +0 -57
  35. package/esm2015/lib/auth/auth.gql.private.js +0 -85
  36. package/esm2015/lib/auth/auth.service.js +0 -616
  37. package/esm2015/lib/auth/auth.types.js +0 -19
  38. package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
  39. package/esm2015/lib/contact-card/contact-card.service.js +0 -156
  40. package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
  41. package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
  42. package/esm2015/lib/encryption/encryption.service.js +0 -188
  43. package/esm2015/lib/file-upload/file-upload.service.js +0 -70
  44. package/esm2015/lib/file-upload/file-upload.types.js +0 -2
  45. package/esm2015/lib/idle/idle.service.js +0 -159
  46. package/esm2015/lib/idle/idle.types.js +0 -7
  47. package/esm2015/lib/item/item.gql.js +0 -166
  48. package/esm2015/lib/item/item.gql.private.js +0 -41
  49. package/esm2015/lib/item/item.service.js +0 -662
  50. package/esm2015/lib/item/item.types.js +0 -2
  51. package/esm2015/lib/key/key-factory.service.js +0 -226
  52. package/esm2015/lib/key/key-graph.service.js +0 -314
  53. package/esm2015/lib/key/key-meta.service.js +0 -153
  54. package/esm2015/lib/key/key.service.js +0 -124
  55. package/esm2015/lib/key/key.types.js +0 -16
  56. package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
  57. package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
  58. package/esm2015/lib/lbop/lbop.service.js +0 -351
  59. package/esm2015/lib/life-ready.config.js +0 -96
  60. package/esm2015/lib/life-ready.module.js +0 -42
  61. package/esm2015/lib/lock/lock.gql.js +0 -40
  62. package/esm2015/lib/lock/lock.service.js +0 -64
  63. package/esm2015/lib/notification/notification.gql.js +0 -43
  64. package/esm2015/lib/notification/notification.service.js +0 -118
  65. package/esm2015/lib/password/password.gql.js +0 -28
  66. package/esm2015/lib/password/password.service.js +0 -309
  67. package/esm2015/lib/persist/persist.service.js +0 -181
  68. package/esm2015/lib/plan/plan.gql.js +0 -91
  69. package/esm2015/lib/plan/plan.service.js +0 -191
  70. package/esm2015/lib/plan/plan.types.js +0 -2
  71. package/esm2015/lib/profile/profile-details.service.js +0 -261
  72. package/esm2015/lib/profile/profile.gql.js +0 -170
  73. package/esm2015/lib/profile/profile.service.js +0 -166
  74. package/esm2015/lib/profile/profile.types.js +0 -45
  75. package/esm2015/lib/register/register.service.js +0 -173
  76. package/esm2015/lib/register/register.types.js +0 -3
  77. package/esm2015/lib/reminder/reminder.gql.js +0 -27
  78. package/esm2015/lib/reminder/reminder.service.js +0 -85
  79. package/esm2015/lib/reminder/reminder.types.js +0 -2
  80. package/esm2015/lib/scenario/scenario.constants.js +0 -2
  81. package/esm2015/lib/scenario/scenario.controller.js +0 -34
  82. package/esm2015/lib/scenario/scenario.gql.js +0 -90
  83. package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
  84. package/esm2015/lib/scenario/scenario.service.js +0 -679
  85. package/esm2015/lib/scenario/scenario.types.js +0 -2
  86. package/esm2015/lib/server-config/server-config.gql.js +0 -9
  87. package/esm2015/lib/server-config/server-config.service.js +0 -41
  88. package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
  89. package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
  90. package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
  91. package/esm2015/lib/slip39/slip39.service.js +0 -167
  92. package/esm2015/lib/time/time.service.js +0 -152
  93. package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
  94. package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
  95. package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
  96. package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
  97. package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
  98. package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
  99. package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
  100. package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
  101. package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
  102. package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
  103. package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
  104. package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
  105. package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
  106. package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
  107. package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
  108. package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
  109. package/esm2015/lib/two-factor/two-factor.service.js +0 -74
  110. package/esm2015/lib/user/user.gql.js +0 -32
  111. package/esm2015/lib/user/user.service.js +0 -58
  112. package/esm2015/lib/user/user.types.js +0 -2
  113. package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
  114. package/esm2015/lifeready-core.js +0 -17
  115. package/esm2015/public-api.js +0 -60
  116. package/fesm2015/lifeready-core.js +0 -10970
  117. package/fesm2015/lifeready-core.js.map +0 -1
  118. package/lib/_common/ast.d.ts +0 -11
  119. package/lib/_common/deferred-promise.d.ts +0 -12
  120. package/lib/_common/exceptions.d.ts +0 -126
  121. package/lib/_common/index.d.ts +0 -2
  122. package/lib/_common/kc-lodash.d.ts +0 -5
  123. package/lib/_common/key.d.ts +0 -14
  124. package/lib/_common/queries.gql.d.ts +0 -4
  125. package/lib/_common/run-outside-angular.d.ts +0 -14
  126. package/lib/_common/storage.d.ts +0 -13
  127. package/lib/_common/types.d.ts +0 -15
  128. package/lib/_common/utils.d.ts +0 -12
  129. package/lib/api/lr-apollo.service.d.ts +0 -15
  130. package/lib/api/lr-graphql/index.d.ts +0 -5
  131. package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
  132. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
  133. package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
  134. package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
  135. package/lib/api/lr-graphql/lr.service.d.ts +0 -9
  136. package/lib/api/query-processor/common-processors.service.d.ts +0 -36
  137. package/lib/api/query-processor/index.d.ts +0 -2
  138. package/lib/api/query-processor/query-processor.service.d.ts +0 -18
  139. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
  140. package/lib/api/types/graphql.types.d.ts +0 -30
  141. package/lib/api/types/index.d.ts +0 -2
  142. package/lib/api/types/lr-graphql.types.d.ts +0 -807
  143. package/lib/auth/auth.config.d.ts +0 -5
  144. package/lib/auth/auth.gql.private.d.ts +0 -25
  145. package/lib/auth/auth.service.d.ts +0 -72
  146. package/lib/auth/auth.types.d.ts +0 -70
  147. package/lib/contact-card/contact-card.gql.d.ts +0 -7
  148. package/lib/contact-card/contact-card.service.d.ts +0 -53
  149. package/lib/contact-card/contact-card2.gql.d.ts +0 -25
  150. package/lib/contact-card/contact-card2.service.d.ts +0 -64
  151. package/lib/encryption/encryption.service.d.ts +0 -42
  152. package/lib/file-upload/file-upload.service.d.ts +0 -15
  153. package/lib/file-upload/file-upload.types.d.ts +0 -5
  154. package/lib/idle/idle.service.d.ts +0 -47
  155. package/lib/idle/idle.types.d.ts +0 -10
  156. package/lib/item/item.gql.d.ts +0 -134
  157. package/lib/item/item.gql.private.d.ts +0 -35
  158. package/lib/item/item.service.d.ts +0 -201
  159. package/lib/item/item.types.d.ts +0 -95
  160. package/lib/key/key-factory.service.d.ts +0 -40
  161. package/lib/key/key-graph.service.d.ts +0 -41
  162. package/lib/key/key-meta.service.d.ts +0 -51
  163. package/lib/key/key.service.d.ts +0 -36
  164. package/lib/key/key.types.d.ts +0 -86
  165. package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
  166. package/lib/key-exchange/key-exchange.service.d.ts +0 -179
  167. package/lib/lbop/lbop.service.d.ts +0 -99
  168. package/lib/life-ready.config.d.ts +0 -26
  169. package/lib/life-ready.module.d.ts +0 -5
  170. package/lib/lock/lock.gql.d.ts +0 -27
  171. package/lib/lock/lock.service.d.ts +0 -34
  172. package/lib/notification/notification.gql.d.ts +0 -37
  173. package/lib/notification/notification.service.d.ts +0 -64
  174. package/lib/password/password.gql.d.ts +0 -3
  175. package/lib/password/password.service.d.ts +0 -79
  176. package/lib/persist/persist.service.d.ts +0 -31
  177. package/lib/plan/plan.gql.d.ts +0 -69
  178. package/lib/plan/plan.service.d.ts +0 -111
  179. package/lib/plan/plan.types.d.ts +0 -16
  180. package/lib/profile/profile-details.service.d.ts +0 -20
  181. package/lib/profile/profile.gql.d.ts +0 -21
  182. package/lib/profile/profile.service.d.ts +0 -32
  183. package/lib/profile/profile.types.d.ts +0 -121
  184. package/lib/register/register.service.d.ts +0 -25
  185. package/lib/register/register.types.d.ts +0 -6
  186. package/lib/reminder/reminder.gql.d.ts +0 -23
  187. package/lib/reminder/reminder.service.d.ts +0 -33
  188. package/lib/reminder/reminder.types.d.ts +0 -17
  189. package/lib/scenario/scenario.constants.d.ts +0 -1
  190. package/lib/scenario/scenario.controller.d.ts +0 -10
  191. package/lib/scenario/scenario.gql.d.ts +0 -78
  192. package/lib/scenario/scenario.private.gql.d.ts +0 -16
  193. package/lib/scenario/scenario.service.d.ts +0 -655
  194. package/lib/scenario/scenario.types.d.ts +0 -64
  195. package/lib/server-config/server-config.gql.d.ts +0 -5
  196. package/lib/server-config/server-config.service.d.ts +0 -9
  197. package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
  198. package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
  199. package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
  200. package/lib/slip39/slip39.service.d.ts +0 -42
  201. package/lib/time/time.service.d.ts +0 -26
  202. package/lib/tp-assembly/tp-assembly.d.ts +0 -177
  203. package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
  204. package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
  205. package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
  206. package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
  207. package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
  208. package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
  209. package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
  210. package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
  211. package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
  212. package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
  213. package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
  214. package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
  215. package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
  216. package/lib/trusted-party/trusted-party.service.d.ts +0 -192
  217. package/lib/trusted-party/trusted-party.types.d.ts +0 -31
  218. package/lib/two-factor/two-factor.service.d.ts +0 -15
  219. package/lib/user/user.gql.d.ts +0 -8
  220. package/lib/user/user.service.d.ts +0 -9
  221. package/lib/user/user.types.d.ts +0 -16
  222. package/lib/web-crypto/web-crypto.service.d.ts +0 -5
  223. package/lifeready-core.d.ts +0 -16
  224. package/lifeready-core.metadata.json +0 -1
  225. package/public-api.d.ts +0 -56
@@ -1,351 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import { HttpClient } from '@angular/common/http';
4
- import { Inject, Injectable } from '@angular/core';
5
- import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
6
- import gql from 'graphql-tag';
7
- import { Slip39Helper } from 'slip39';
8
- import { LrApolloService } from '../api/lr-apollo.service';
9
- import { EncryptionService } from '../encryption/encryption.service';
10
- import { KeyFactoryService as KFS } from '../key/key-factory.service';
11
- import { KeyService } from '../key/key.service';
12
- import { KC_CONFIG } from '../life-ready.config';
13
- import { PasswordService } from '../password/password.service';
14
- import { KcBadLogicException, KcError, KcException, KcInternalErrorException, } from '../_common/exceptions';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "../life-ready.config";
17
- import * as i2 from "@angular/common/http";
18
- import * as i3 from "../api/lr-apollo.service";
19
- import * as i4 from "@aws-amplify/auth/lib-esm/Auth";
20
- import * as i5 from "../key/key-factory.service";
21
- import * as i6 from "../key/key.service";
22
- import * as i7 from "../encryption/encryption.service";
23
- import * as i8 from "../password/password.service";
24
- export const ERROR_SOURCE = 'LBOP';
25
- export var KcLbopErrorCode;
26
- (function (KcLbopErrorCode) {
27
- KcLbopErrorCode["INVALID_PASSPHRASE"] = "INVALID_PASSPHRASE";
28
- })(KcLbopErrorCode || (KcLbopErrorCode = {}));
29
- export const CreateLbopQuery = gql `
30
- mutation CreateLbop($input: CreateLbopInput!) {
31
- createLbop(input: $input) {
32
- lbop {
33
- id
34
- }
35
- }
36
- }
37
- `;
38
- export const DeleteLbopQuery = gql `
39
- mutation DeleteLbop($input: DeleteLbopInput!) {
40
- deleteLbop(input: $input) {
41
- id
42
- }
43
- }
44
- `;
45
- export const UpdateLbopQuery = gql `
46
- mutation UpdateLbop($input: UpdateLbopInput!) {
47
- updateLbop(input: $input) {
48
- lbop {
49
- id
50
- }
51
- }
52
- }
53
- `;
54
- export const LbopQuery = gql `
55
- query Lbop($id: LrRelayIdInput!) {
56
- lbop(id: $id) {
57
- id
58
- cipherMeta
59
- }
60
- }
61
- `;
62
- export const LbopsQuery = gql `
63
- query Lbops {
64
- lbops {
65
- edges {
66
- node {
67
- id
68
- cipherMeta
69
- }
70
- }
71
- }
72
- }
73
- `;
74
- export class LbopService {
75
- constructor(config, http, lrApollo, auth, keyFactory, keyService, encryptionService, passwordService) {
76
- this.config = config;
77
- this.http = http;
78
- this.lrApollo = lrApollo;
79
- this.auth = auth;
80
- this.keyFactory = keyFactory;
81
- this.keyService = keyService;
82
- this.encryptionService = encryptionService;
83
- this.passwordService = passwordService;
84
- this.CLIENT_NONCE_LENGTH = 32;
85
- // There are 1024 words (10 bits), so 25 words should give ~256 bits of entropy.
86
- this.LBOP_WORDS = 25;
87
- }
88
- getPartial(lbopString) {
89
- return lbopString.split(' ')[0];
90
- }
91
- remove(id) {
92
- return __awaiter(this, void 0, void 0, function* () {
93
- const res = yield this.lrApollo.mutate({
94
- mutation: DeleteLbopQuery,
95
- variables: {
96
- input: {
97
- id,
98
- },
99
- },
100
- });
101
- return res.deleteLbop.id;
102
- });
103
- }
104
- update({ id, name }) {
105
- return __awaiter(this, void 0, void 0, function* () {
106
- const lbop = yield this.get(id);
107
- lbop.name = name;
108
- const masterKey = this.keyService.currentMasterKey;
109
- const cipherMeta = yield this.encryptionService.encrypt(masterKey.jwk, lbop);
110
- const res = yield this.lrApollo.mutate({
111
- mutation: UpdateLbopQuery,
112
- variables: {
113
- input: {
114
- id,
115
- cipherMeta: JSON.stringify(cipherMeta),
116
- },
117
- },
118
- });
119
- return res.updateLbop;
120
- });
121
- }
122
- get(id) {
123
- return __awaiter(this, void 0, void 0, function* () {
124
- const res = yield this.lrApollo.query({
125
- query: LbopQuery,
126
- variables: {
127
- id,
128
- },
129
- });
130
- const masterKey = this.keyService.currentMasterKey;
131
- const plainCipherMeta = yield this.encryptionService.decrypt(masterKey.jwk, JSON.parse(res.lbop.cipherMeta));
132
- return Object.assign({ id: res.id }, plainCipherMeta);
133
- });
134
- }
135
- list() {
136
- return __awaiter(this, void 0, void 0, function* () {
137
- const res = yield this.lrApollo.query({
138
- query: LbopsQuery,
139
- });
140
- const masterKey = yield this.keyService.currentMasterKey;
141
- return Promise.all(res.lbops.edges.map((edge) => __awaiter(this, void 0, void 0, function* () {
142
- const plainCipherMeta = yield this.encryptionService.decrypt(masterKey.jwk, JSON.parse(edge.node.cipherMeta));
143
- return Object.assign({ id: edge.node.id }, plainCipherMeta);
144
- })));
145
- });
146
- }
147
- create({ name }) {
148
- return __awaiter(this, void 0, void 0, function* () {
149
- if (Slip39Helper.WORD_LIST.length !== 1024) {
150
- throw new KcBadLogicException('Slip39Helper.WORD_LIST.length != 1024');
151
- }
152
- // Get existing to make sure there are not duplicate first words
153
- const lbops = yield this.list();
154
- // Generate new one
155
- let lbopString;
156
- // eslint-disable-next-line no-constant-condition
157
- while (true) {
158
- lbopString = this.keyFactory
159
- .randomChoices(Slip39Helper.WORD_LIST, this.LBOP_WORDS)
160
- .join(' ');
161
- const partial = this.getPartial(lbopString);
162
- if (!lbops.some((lbop) => lbop.partial === partial)) {
163
- break;
164
- }
165
- }
166
- const lbopKeyParams = yield this.keyFactory.createLbopKeyParams();
167
- const lbopKey = (yield this.keyFactory.deriveLbopKey(Object.assign({ password: yield this.keyFactory.importPassword(lbopString) }, lbopKeyParams))).jwk;
168
- const lbopKeyVerifier = yield this.keyFactory.createSignKey();
169
- const wrappedLbopKeyVerifier = yield this.encryptionService.encrypt(lbopKey, lbopKeyVerifier.toJSON(true));
170
- // Re-encrypt master key with new key
171
- const masterKey = this.keyService.currentMasterKey;
172
- const wrappedMasterKey = yield this.encryptionService.encrypt(lbopKey, masterKey.jwk.toJSON(true));
173
- const meta = Object.assign(Object.assign({}, (name && { name })), { partial: this.getPartial(lbopString) });
174
- const cipherMeta = yield this.encryptionService.encrypt(masterKey.jwk, meta);
175
- const res = yield this.lrApollo.mutate({
176
- mutation: CreateLbopQuery,
177
- variables: {
178
- input: {
179
- cipherMeta: JSON.stringify(cipherMeta),
180
- lbopKeyParams: JSON.stringify(lbopKeyParams),
181
- lbopKeyVerifier: JSON.stringify(lbopKeyVerifier.toJSON(true)),
182
- wrappedLbopKeyVerifier: JSON.stringify(wrappedLbopKeyVerifier),
183
- masterKeyId: masterKey.id,
184
- wrappedMasterKey: JSON.stringify(wrappedMasterKey),
185
- },
186
- },
187
- });
188
- return Object.assign(Object.assign({}, res.createLbop.lbop), { lbopString });
189
- });
190
- }
191
- // --------------------------------------------------------------------------------------------------------------------
192
- // --------------------------------------------------------------------------------------------------------------------
193
- // Flow below are for password reset via LBOP
194
- //
195
- // --Potential Failure Point xxx--
196
- //
197
- // Look for the above and you can test by interrupting at these points.
198
- //
199
- // The LBOP reset process can be restarted at any point before the call to "set-password/". Once "set-password/" has been
200
- // called, we assume the client has a short period of time to change the Idp password to the one they've chosen. The "set-password/"
201
- // will set the Idp password to a temporary random password. The user can no longer login using their current password. If the Idp
202
- // password change process does not complete or takes longer than the lockout period, the account will not be accessible and a new
203
- // LBOP password reset must be carried out.
204
- // --------------------------------------------------------------------------------------------------------------------
205
- // --------------------------------------------------------------------------------------------------------------------
206
- verifyLbops(challengeResult, lbopString) {
207
- return __awaiter(this, void 0, void 0, function* () {
208
- const clientNonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
209
- for (const lbop of challengeResult.lbops) {
210
- const lbopKey = (yield this.keyFactory.deriveLbopKey(Object.assign({ password: yield this.keyFactory.importPassword(lbopString) }, lbop.lbopKeyParams))).jwk;
211
- // If decoding successful then it's the correct lbop
212
- try {
213
- const lbopKeyVerifier = (yield this.encryptionService.decrypt(lbopKey, lbop.wrappedLbopKeyVerifier));
214
- // Force a bad signature.
215
- // const serverNonce = challengeResult.challenge.serverNonce + "1",
216
- const serverNonce = challengeResult.challenge.serverNonce;
217
- const signedChallenge = yield this.encryptionService.sign(lbopKeyVerifier, {
218
- serverNonce,
219
- clientNonce,
220
- });
221
- return {
222
- lbop,
223
- signedChallenge,
224
- lbopKey,
225
- };
226
- }
227
- catch (error) {
228
- continue;
229
- }
230
- }
231
- throw new KcException(new KcError({
232
- source: ERROR_SOURCE,
233
- code: KcLbopErrorCode.INVALID_PASSPHRASE,
234
- message: 'Invalid passphrase.',
235
- }));
236
- });
237
- }
238
- verifyContact(params) {
239
- return __awaiter(this, void 0, void 0, function* () {
240
- const ret = this.http
241
- .post(`${this.config.authUrl}users/lbop-reset/verify-contact/`, params)
242
- .toPromise();
243
- // --Potential Failure Point 1 --
244
- // The contact verifications are throttled. But otherwise harmless.
245
- return ret;
246
- });
247
- }
248
- confirmContact(params) {
249
- return __awaiter(this, void 0, void 0, function* () {
250
- return this.http
251
- .post(`${this.config.authUrl}cove/respond/`, {
252
- claim_id: params.claimId,
253
- v_code: params.vCode,
254
- })
255
- .toPromise();
256
- // --Potential Failure Point 2 --
257
- // A verified claim for a contact does not prevent new ones from being generated. So it should be fine to just start again.
258
- });
259
- }
260
- verify(params) {
261
- return __awaiter(this, void 0, void 0, function* () {
262
- const challengeResult = yield this.http
263
- .post(`${this.config.authUrl}users/lbop-reset/get-challenge/`, {
264
- claimId: params.claimId,
265
- claimToken: params.claimToken,
266
- })
267
- .toPromise();
268
- // --Potential Failure Point 3 --
269
- // This does not lock anything. A second call to "get-challenge/" will create a new challenge amd invalidate the first one.
270
- const { signedChallenge, lbop, lbopKey } = yield this.verifyLbops(challengeResult, params.lbop);
271
- const res = yield this.http
272
- .post(`${this.config.authUrl}users/lbop-reset/verify-challenge/`, {
273
- lbopId: lbop.lbopId,
274
- signedChallenge,
275
- })
276
- .toPromise();
277
- // --Potential Failure Point 4 --
278
- // This does not lock anything. So ok to restart.
279
- return {
280
- lbopId: lbop.lbopId,
281
- verifiedToken: res.verifiedToken,
282
- masterKeyId: res.masterKeyId,
283
- masterKey: yield KFS.asKey(yield this.encryptionService.decrypt(lbopKey, res.wrappedMasterKey)),
284
- };
285
- });
286
- }
287
- setPassword(params) {
288
- return __awaiter(this, void 0, void 0, function* () {
289
- // Generate the new password derived keys
290
- const passKeyBundle = yield this.passwordService.createPassKeyBundle(params.newPassword);
291
- // Re-encrypt master key with new key
292
- const newWrappedMasterKey = yield this.encryptionService.encrypt(passKeyBundle.passKey, params.masterKey.toJSON(true));
293
- const result = yield this.http
294
- .post(`${this.config.authUrl}users/lbop-reset/set-password/`, {
295
- lbopId: params.lbopId,
296
- verifiedToken: params.verifiedToken,
297
- masterKeyId: params.masterKeyId,
298
- newWrappedMasterKey,
299
- newPassKey: {
300
- passKeyParams: passKeyBundle.passKeyParams,
301
- passIdpParams: passKeyBundle.passIdpParams,
302
- passIdpVerifierPbk: passKeyBundle.passIdpVerifier.toJSON(),
303
- wrappedPassIdpVerifierPrk: passKeyBundle.wrappedPassIdpVerifierPrk,
304
- },
305
- })
306
- .toPromise();
307
- // --Potential Failure Point 5 --
308
- // A timed mutex is locked. The Idp password change must occur within a period of time.
309
- // If interrupted here, the user can not login with their old password again. They must
310
- // start the whole LBOP password reset process again.
311
- // This call will go through the LR proxy which is OK since the LR server knows
312
- // the temporary password anyway.
313
- let user = yield this.auth.signIn(result.username, result.idpPassword, {
314
- noProxy: 'true',
315
- });
316
- if (user.challengeName !== 'NEW_PASSWORD_REQUIRED') {
317
- throw new KcInternalErrorException('Expecting Cognito to have done a password reset.');
318
- }
319
- // --Potential Failure Point 6 --
320
- // Must restart the LBOP password reset process again.
321
- // Set new password on Idp
322
- user = yield this.auth.completeNewPassword(user, this.passwordService.getPassIdpString(passKeyBundle.passIdp), {});
323
- // --Potential Failure Point 7 --
324
- // Must restart the LBOP password reset process again.
325
- yield this.auth.signOut();
326
- return yield this.http
327
- .post(`${this.config.authUrl}users/lbop-reset/complete/`, {
328
- lbopId: params.lbopId,
329
- setPasswordToken: result.setPasswordToken,
330
- })
331
- .toPromise();
332
- });
333
- }
334
- }
335
- LbopService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LbopService_Factory() { return new LbopService(i0.ɵɵinject(i1.KC_CONFIG), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.AuthClass), i0.ɵɵinject(i5.KeyFactoryService), i0.ɵɵinject(i6.KeyService), i0.ɵɵinject(i7.EncryptionService), i0.ɵɵinject(i8.PasswordService)); }, token: LbopService, providedIn: "root" });
336
- LbopService.decorators = [
337
- { type: Injectable, args: [{
338
- providedIn: 'root',
339
- },] }
340
- ];
341
- LbopService.ctorParameters = () => [
342
- { type: undefined, decorators: [{ type: Inject, args: [KC_CONFIG,] }] },
343
- { type: HttpClient },
344
- { type: LrApolloService },
345
- { type: AuthClass },
346
- { type: KFS },
347
- { type: KeyService },
348
- { type: EncryptionService },
349
- { type: PasswordService }
350
- ];
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGJvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2xib3AvbGJvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFFOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVoRCxPQUFPLEVBQVksU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsT0FBTyxFQUNQLFdBQVcsRUFDWCx3QkFBd0IsR0FDekIsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQUUvQixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDO0FBQ25DLE1BQU0sQ0FBTixJQUFZLGVBRVg7QUFGRCxXQUFZLGVBQWU7SUFDekIsNERBQXlDLENBQUE7QUFDM0MsQ0FBQyxFQUZXLGVBQWUsS0FBZixlQUFlLFFBRTFCO0FBZ0ZELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FB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TTthQUNuQjs7OzRDQU9JLE1BQU0sU0FBQyxTQUFTO1lBbkxaLFVBQVU7WUFNVixlQUFlO1lBSmYsU0FBUztZQU1ZLEdBQUc7WUFDeEIsVUFBVTtZQUZWLGlCQUFpQjtZQUtqQixlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXV0aENsYXNzIH0gZnJvbSAnQGF3cy1hbXBsaWZ5L2F1dGgvbGliLWVzbS9BdXRoJztcbmltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnO1xuaW1wb3J0IHsgSldLIH0gZnJvbSAnbm9kZS1qb3NlJztcbmltcG9ydCB7IFNsaXAzOUhlbHBlciB9IGZyb20gJ3NsaXAzOSc7XG5pbXBvcnQgeyBMckFwb2xsb1NlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItYXBvbGxvLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9lbmNyeXB0aW9uL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSBhcyBLRlMgfSBmcm9tICcuLi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4va2V5L2tleS5zZXJ2aWNlJztcbmltcG9ydCB7IFBhc3NLZXlQYXJhbXMgfSBmcm9tICcuLi9rZXkva2V5LnR5cGVzJztcbmltcG9ydCB7IEtjQ29uZmlnLCBLQ19DT05GSUcgfSBmcm9tICcuLi9saWZlLXJlYWR5LmNvbmZpZyc7XG5pbXBvcnQgeyBQYXNzd29yZFNlcnZpY2UgfSBmcm9tICcuLi9wYXNzd29yZC9wYXNzd29yZC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEtjQmFkTG9naWNFeGNlcHRpb24sXG4gIEtjRXJyb3IsXG4gIEtjRXhjZXB0aW9uLFxuICBLY0ludGVybmFsRXJyb3JFeGNlcHRpb24sXG59IGZyb20gJy4uL19jb21tb24vZXhjZXB0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBFUlJPUl9TT1VSQ0UgPSAnTEJPUCc7XG5leHBvcnQgZW51bSBLY0xib3BFcnJvckNvZGUge1xuICBJTlZBTElEX1BBU1NQSFJBU0UgPSAnSU5WQUxJRF9QQVNTUEhSQVNFJyxcbn1cblxuaW50ZXJmYWNlIFNldFBhc3N3b3JkQXBpUmVzdWx0IHtcbiAgdXNlcm5hbWU6IHN0cmluZztcbiAgaWRwUGFzc3dvcmQ6IHN0cmluZztcbiAgc2V0UGFzc3dvcmRUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldFBhc3N3b3JkUGFyYW1zIHtcbiAgbGJvcElkOiBzdHJpbmc7XG4gIG5ld1Bhc3N3b3JkOiBDcnlwdG9LZXk7XG4gIHZlcmlmaWVkVG9rZW46IHN0cmluZztcbiAgbWFzdGVyS2V5SWQ6IHN0cmluZztcbiAgbWFzdGVyS2V5OiBKV0suS2V5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeUNvbnRhY3RQYXJhbXMge1xuICBlbWFpbD86IHN0cmluZztcbiAgcGhvbmU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5Q29udGFjdFJlc3VsdCB7XG4gIC8vIFRoZSBjbGFpbV9pZCBpZGVudGlmaWVzIHRoZSBFbWFpbC9TTVMgY29uZmlybWF0aW9uXG4gIGNsYWltSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maXJtQ29udGFjdFBhcmFtcyB7XG4gIGNsYWltSWQ6IHN0cmluZztcbiAgdkNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb25maXJtQ29udGFjdFJlc3VsdCB7XG4gIC8vIFRoZSB0b2tlbiB0byBwcm92ZSB0aGUgY2xpZW50IGhhZCB0aGUgY29ycmVjdCBjb25maXJtYXRpb24gY29kZS5cbiAgdG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlQYXJhbXMge1xuICBjbGFpbUlkOiBzdHJpbmc7XG4gIGNsYWltVG9rZW46IHN0cmluZztcbiAgbGJvcDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVJlc3VsdCB7XG4gIC8vIHVzZXJJZDogc3RyaW5nO1xuICBsYm9wSWQ6IHN0cmluZztcbiAgdmVyaWZpZWRUb2tlbjogc3RyaW5nO1xuICBtYXN0ZXJLZXlJZDogc3RyaW5nO1xuICBtYXN0ZXJLZXk6IEpXSy5LZXk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbGxlbmdlUmVzdWx0TGJvcCB7XG4gIGxib3BJZDogc3RyaW5nO1xuICBsYm9wS2V5UGFyYW1zOiBQYXNzS2V5UGFyYW1zO1xuICB3cmFwcGVkTGJvcEtleVZlcmlmaWVyOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbGxlbmdlUmVzdWx0IHtcbiAgY2hhbGxlbmdlOiB7XG4gICAgc2VydmVyTm9uY2U6IHN0cmluZztcbiAgfTtcbiAgbGJvcHM6IENoYWxsZW5nZVJlc3VsdExib3BbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYm9wIHtcbiAgaWQ6IHN0cmluZztcbiAgcGFydGlhbD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbGJvcFN0cmluZz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVMYm9wUGFyYW1zIHtcbiAgbmFtZT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENyZWF0ZUxib3BRdWVyeSB7XG4gIGNyZWF0ZUxib3A6IHtcbiAgICBsYm9wOiBMYm9wO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgQ3JlYXRlTGJvcFF1ZXJ5ID0gZ3FsYFxuICBtdXRhdGlvbiBDcmVhdGVMYm9wKCRpbnB1dDogQ3JlYXRlTGJvcElucHV0ISkge1xuICAgIGNyZWF0ZUxib3AoaW5wdXQ6ICRpbnB1dCkge1xuICAgICAgbGJvcCB7XG4gICAgICAgIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG5gO1xuXG5pbnRlcmZhY2UgRGVsZXRlTGJvcFF1ZXJ5IHtcbiAgZGVsZXRlTGJvcDogTGJvcDtcbn1cblxuZXhwb3J0IGNvbnN0IERlbGV0ZUxib3BRdWVyeSA9IGdxbGBcbiAgbXV0YXRpb24gRGVsZXRlTGJvcCgkaW5wdXQ6IERlbGV0ZUxib3BJbnB1dCEpIHtcbiAgICBkZWxldGVMYm9wKGlucHV0OiAkaW5wdXQpIHtcbiAgICAgIGlkXG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxib3BQYXJhbXMge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBVcGRhdGVMYm9wUXVlcnkge1xuICB1cGRhdGVMYm9wOiBMYm9wO1xufVxuXG5leHBvcnQgY29uc3QgVXBkYXRlTGJvcFF1ZXJ5ID0gZ3FsYFxuICBtdXRhdGlvbiBVcGRhdGVMYm9wKCRpbnB1dDogVXBkYXRlTGJvcElucHV0ISkge1xuICAgIHVwZGF0ZUxib3AoaW5wdXQ6ICRpbnB1dCkge1xuICAgICAgbGJvcCB7XG4gICAgICAgIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgTGJvcFF1ZXJ5ID0gZ3FsYFxuICBxdWVyeSBMYm9wKCRpZDogTHJSZWxheUlkSW5wdXQhKSB7XG4gICAgbGJvcChpZDogJGlkKSB7XG4gICAgICBpZFxuICAgICAgY2lwaGVyTWV0YVxuICAgIH1cbiAgfVxuYDtcblxuaW50ZXJmYWNlIExib3BzUXVlcnkge1xuICBsYm9wczogYW55O1xufVxuXG5leHBvcnQgY29uc3QgTGJvcHNRdWVyeSA9IGdxbGBcbiAgcXVlcnkgTGJvcHMge1xuICAgIGxib3BzIHtcbiAgICAgIGVkZ2VzIHtcbiAgICAgICAgbm9kZSB7XG4gICAgICAgICAgaWRcbiAgICAgICAgICBjaXBoZXJNZXRhXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMYm9wU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgQ0xJRU5UX05PTkNFX0xFTkdUSCA9IDMyO1xuICAvLyBUaGVyZSBhcmUgMTAyNCB3b3JkcyAoMTAgYml0cyksIHNvIDI1IHdvcmRzIHNob3VsZCBnaXZlIH4yNTYgYml0cyBvZiBlbnRyb3B5LlxuICBwcml2YXRlIHJlYWRvbmx5IExCT1BfV09SRFMgPSAyNTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEtDX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IEtjQ29uZmlnLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGxyQXBvbGxvOiBMckFwb2xsb1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdXRoOiBBdXRoQ2xhc3MsXG4gICAgcHJpdmF0ZSBrZXlGYWN0b3J5OiBLRlMsXG4gICAgcHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZW5jcnlwdGlvblNlcnZpY2U6IEVuY3J5cHRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcGFzc3dvcmRTZXJ2aWNlOiBQYXNzd29yZFNlcnZpY2VcbiAgKSB7fVxuXG4gIHByaXZhdGUgZ2V0UGFydGlhbChsYm9wU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBsYm9wU3RyaW5nLnNwbGl0KCcgJylbMF07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPGFueT4oe1xuICAgICAgbXV0YXRpb246IERlbGV0ZUxib3BRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXMuZGVsZXRlTGJvcC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGUoeyBpZCwgbmFtZSB9OiBVcGRhdGVMYm9wUGFyYW1zKTogUHJvbWlzZTxMYm9wPiB7XG4gICAgY29uc3QgbGJvcCA9IGF3YWl0IHRoaXMuZ2V0KGlkKTtcbiAgICBsYm9wLm5hbWUgPSBuYW1lO1xuXG4gICAgY29uc3QgbWFzdGVyS2V5ID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRNYXN0ZXJLZXk7XG4gICAgY29uc3QgY2lwaGVyTWV0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIG1hc3RlcktleS5qd2ssXG4gICAgICBsYm9wXG4gICAgKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPFVwZGF0ZUxib3BRdWVyeT4oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZUxib3BRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIGNpcGhlck1ldGE6IEpTT04uc3RyaW5naWZ5KGNpcGhlck1ldGEpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXMudXBkYXRlTGJvcDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXQoaWQ6IHN0cmluZyk6IFByb21pc2U8TGJvcD4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ucXVlcnk8YW55Pih7XG4gICAgICBxdWVyeTogTGJvcFF1ZXJ5LFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlkLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1hc3RlcktleSA9IHRoaXMua2V5U2VydmljZS5jdXJyZW50TWFzdGVyS2V5O1xuXG4gICAgY29uc3QgcGxhaW5DaXBoZXJNZXRhID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5kZWNyeXB0KFxuICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgIEpTT04ucGFyc2UocmVzLmxib3AuY2lwaGVyTWV0YSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiByZXMuaWQsXG4gICAgICAuLi5wbGFpbkNpcGhlck1ldGEsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8TGJvcFtdPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5sckFwb2xsby5xdWVyeTxMYm9wc1F1ZXJ5Pih7XG4gICAgICBxdWVyeTogTGJvcHNRdWVyeSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1hc3RlcktleSA9IGF3YWl0IHRoaXMua2V5U2VydmljZS5jdXJyZW50TWFzdGVyS2V5O1xuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgcmVzLmxib3BzLmVkZ2VzLm1hcChhc3luYyAoZWRnZSkgPT4ge1xuICAgICAgICBjb25zdCBwbGFpbkNpcGhlck1ldGEgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgICAgbWFzdGVyS2V5Lmp3ayxcbiAgICAgICAgICBKU09OLnBhcnNlKGVkZ2Uubm9kZS5jaXBoZXJNZXRhKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBlZGdlLm5vZGUuaWQsXG4gICAgICAgICAgLi4ucGxhaW5DaXBoZXJNZXRhLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZSh7IG5hbWUgfTogQ3JlYXRlTGJvcFBhcmFtcyk6IFByb21pc2U8TGJvcD4ge1xuICAgIGlmIChTbGlwMzlIZWxwZXIuV09SRF9MSVNULmxlbmd0aCAhPT0gMTAyNCkge1xuICAgICAgdGhyb3cgbmV3IEtjQmFkTG9naWNFeGNlcHRpb24oJ1NsaXAzOUhlbHBlci5XT1JEX0xJU1QubGVuZ3RoICE9IDEwMjQnKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgZXhpc3RpbmcgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBub3QgZHVwbGljYXRlIGZpcnN0IHdvcmRzXG4gICAgY29uc3QgbGJvcHMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcblxuICAgIC8vIEdlbmVyYXRlIG5ldyBvbmVcbiAgICBsZXQgbGJvcFN0cmluZzogc3RyaW5nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgbGJvcFN0cmluZyA9IHRoaXMua2V5RmFjdG9yeVxuICAgICAgICAucmFuZG9tQ2hvaWNlcyhTbGlwMzlIZWxwZXIuV09SRF9MSVNULCB0aGlzLkxCT1BfV09SRFMpXG4gICAgICAgIC5qb2luKCcgJyk7XG4gICAgICBjb25zdCBwYXJ0aWFsID0gdGhpcy5nZXRQYXJ0aWFsKGxib3BTdHJpbmcpO1xuXG4gICAgICBpZiAoIWxib3BzLnNvbWUoKGxib3ApID0+IGxib3AucGFydGlhbCA9PT0gcGFydGlhbCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGJvcEtleVBhcmFtcyA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVMYm9wS2V5UGFyYW1zKCk7XG4gICAgY29uc3QgbGJvcEtleSA9IChcbiAgICAgIGF3YWl0IHRoaXMua2V5RmFjdG9yeS5kZXJpdmVMYm9wS2V5KHtcbiAgICAgICAgcGFzc3dvcmQ6IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5pbXBvcnRQYXNzd29yZChsYm9wU3RyaW5nKSxcbiAgICAgICAgLi4ubGJvcEtleVBhcmFtcyxcbiAgICAgIH0pXG4gICAgKS5qd2s7XG5cbiAgICBjb25zdCBsYm9wS2V5VmVyaWZpZXIgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlU2lnbktleSgpO1xuICAgIGNvbnN0IHdyYXBwZWRMYm9wS2V5VmVyaWZpZXIgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICBsYm9wS2V5LFxuICAgICAgbGJvcEtleVZlcmlmaWVyLnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICAvLyBSZS1lbmNyeXB0IG1hc3RlciBrZXkgd2l0aCBuZXcga2V5XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gdGhpcy5rZXlTZXJ2aWNlLmN1cnJlbnRNYXN0ZXJLZXk7XG4gICAgY29uc3Qgd3JhcHBlZE1hc3RlcktleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIGxib3BLZXksXG4gICAgICBtYXN0ZXJLZXkuandrLnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICBjb25zdCBtZXRhID0ge1xuICAgICAgLi4uKG5hbWUgJiYgeyBuYW1lIH0pLFxuICAgICAgcGFydGlhbDogdGhpcy5nZXRQYXJ0aWFsKGxib3BTdHJpbmcpLFxuICAgIH07XG4gICAgY29uc3QgY2lwaGVyTWV0YSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIG1hc3RlcktleS5qd2ssXG4gICAgICBtZXRhXG4gICAgKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubHJBcG9sbG8ubXV0YXRlPENyZWF0ZUxib3BRdWVyeT4oe1xuICAgICAgbXV0YXRpb246IENyZWF0ZUxib3BRdWVyeSxcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIGNpcGhlck1ldGE6IEpTT04uc3RyaW5naWZ5KGNpcGhlck1ldGEpLFxuICAgICAgICAgIGxib3BLZXlQYXJhbXM6IEpTT04uc3RyaW5naWZ5KGxib3BLZXlQYXJhbXMpLFxuICAgICAgICAgIGxib3BLZXlWZXJpZmllcjogSlNPTi5zdHJpbmdpZnkobGJvcEtleVZlcmlmaWVyLnRvSlNPTih0cnVlKSksXG4gICAgICAgICAgd3JhcHBlZExib3BLZXlWZXJpZmllcjogSlNPTi5zdHJpbmdpZnkod3JhcHBlZExib3BLZXlWZXJpZmllciksXG4gICAgICAgICAgbWFzdGVyS2V5SWQ6IG1hc3RlcktleS5pZCxcbiAgICAgICAgICB3cmFwcGVkTWFzdGVyS2V5OiBKU09OLnN0cmluZ2lmeSh3cmFwcGVkTWFzdGVyS2V5KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzLmNyZWF0ZUxib3AubGJvcCxcbiAgICAgIGxib3BTdHJpbmcsXG4gICAgfTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEZsb3cgYmVsb3cgYXJlIGZvciBwYXNzd29yZCByZXNldCB2aWEgTEJPUFxuICAvL1xuICAvLyAtLVBvdGVudGlhbCBGYWlsdXJlIFBvaW50IHh4eC0tXG4gIC8vXG4gIC8vIExvb2sgZm9yIHRoZSBhYm92ZSBhbmQgeW91IGNhbiB0ZXN0IGJ5IGludGVycnVwdGluZyBhdCB0aGVzZSBwb2ludHMuXG4gIC8vXG4gIC8vIFRoZSBMQk9QIHJlc2V0IHByb2Nlc3MgY2FuIGJlIHJlc3RhcnRlZCBhdCBhbnkgcG9pbnQgYmVmb3JlIHRoZSBjYWxsIHRvIFwic2V0LXBhc3N3b3JkL1wiLiBPbmNlIFwic2V0LXBhc3N3b3JkL1wiIGhhcyBiZWVuXG4gIC8vIGNhbGxlZCwgd2UgYXNzdW1lIHRoZSBjbGllbnQgaGFzIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUgdG8gY2hhbmdlIHRoZSBJZHAgcGFzc3dvcmQgdG8gdGhlIG9uZSB0aGV5J3ZlIGNob3Nlbi4gVGhlIFwic2V0LXBhc3N3b3JkL1wiXG4gIC8vIHdpbGwgc2V0IHRoZSBJZHAgcGFzc3dvcmQgdG8gYSB0ZW1wb3JhcnkgcmFuZG9tIHBhc3N3b3JkLiBUaGUgdXNlciBjYW4gbm8gbG9uZ2VyIGxvZ2luIHVzaW5nIHRoZWlyIGN1cnJlbnQgcGFzc3dvcmQuIElmIHRoZSBJZHBcbiAgLy8gcGFzc3dvcmQgY2hhbmdlIHByb2Nlc3MgZG9lcyBub3QgY29tcGxldGUgb3IgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIGxvY2tvdXQgcGVyaW9kLCB0aGUgYWNjb3VudCB3aWxsIG5vdCBiZSBhY2Nlc3NpYmxlIGFuZCBhIG5ld1xuICAvLyBMQk9QIHBhc3N3b3JkIHJlc2V0IG11c3QgYmUgY2FycmllZCBvdXQuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgYXN5bmMgdmVyaWZ5TGJvcHMoXG4gICAgY2hhbGxlbmdlUmVzdWx0OiBDaGFsbGVuZ2VSZXN1bHQsXG4gICAgbGJvcFN0cmluZzogc3RyaW5nXG4gICk6IFByb21pc2U8e1xuICAgIGxib3A6IENoYWxsZW5nZVJlc3VsdExib3A7XG4gICAgc2lnbmVkQ2hhbGxlbmdlOiBhbnk7XG4gICAgbGJvcEtleTogSldLLktleTtcbiAgfT4ge1xuICAgIGNvbnN0IGNsaWVudE5vbmNlID0gdGhpcy5rZXlGYWN0b3J5LnJhbmRvbVN0cmluZyh0aGlzLkNMSUVOVF9OT05DRV9MRU5HVEgpO1xuXG4gICAgZm9yIChjb25zdCBsYm9wIG9mIGNoYWxsZW5nZVJlc3VsdC5sYm9wcykge1xuICAgICAgY29uc3QgbGJvcEtleSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5rZXlGYWN0b3J5LmRlcml2ZUxib3BLZXkoe1xuICAgICAgICAgIHBhc3N3b3JkOiBhd2FpdCB0aGlzLmtleUZhY3RvcnkuaW1wb3J0UGFzc3dvcmQobGJvcFN0cmluZyksXG4gICAgICAgICAgLi4ubGJvcC5sYm9wS2V5UGFyYW1zLFxuICAgICAgICB9KVxuICAgICAgKS5qd2s7XG5cbiAgICAgIC8vIElmIGRlY29kaW5nIHN1Y2Nlc3NmdWwgdGhlbiBpdCdzIHRoZSBjb3JyZWN0IGxib3BcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGxib3BLZXlWZXJpZmllciA9IChhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQoXG4gICAgICAgICAgbGJvcEtleSxcbiAgICAgICAgICBsYm9wLndyYXBwZWRMYm9wS2V5VmVyaWZpZXJcbiAgICAgICAgKSkgYXMgYW55O1xuXG4gICAgICAgIC8vIEZvcmNlIGEgYmFkIHNpZ25hdHVyZS5cbiAgICAgICAgLy8gY29uc3Qgc2VydmVyTm9uY2UgPSBjaGFsbGVuZ2VSZXN1bHQuY2hhbGxlbmdlLnNlcnZlck5vbmNlICsgXCIxXCIsXG5cbiAgICAgICAgY29uc3Qgc2VydmVyTm9uY2UgPSBjaGFsbGVuZ2VSZXN1bHQuY2hhbGxlbmdlLnNlcnZlck5vbmNlO1xuXG4gICAgICAgIGNvbnN0IHNpZ25lZENoYWxsZW5nZSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2Uuc2lnbihcbiAgICAgICAgICBsYm9wS2V5VmVyaWZpZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2VydmVyTm9uY2UsXG4gICAgICAgICAgICBjbGllbnROb25jZSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsYm9wLFxuICAgICAgICAgIHNpZ25lZENoYWxsZW5nZSxcbiAgICAgICAgICBsYm9wS2V5LFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBLY0V4Y2VwdGlvbihcbiAgICAgIG5ldyBLY0Vycm9yKHtcbiAgICAgICAgc291cmNlOiBFUlJPUl9TT1VSQ0UsXG4gICAgICAgIGNvZGU6IEtjTGJvcEVycm9yQ29kZS5JTlZBTElEX1BBU1NQSFJBU0UsXG4gICAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIHBhc3NwaHJhc2UuJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlDb250YWN0KFxuICAgIHBhcmFtczogVmVyaWZ5Q29udGFjdFBhcmFtc1xuICApOiBQcm9taXNlPFZlcmlmeUNvbnRhY3RSZXN1bHQ+IHtcbiAgICBjb25zdCByZXQgPSB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PFZlcmlmeUNvbnRhY3RSZXN1bHQ+KFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5hdXRoVXJsfXVzZXJzL2xib3AtcmVzZXQvdmVyaWZ5LWNvbnRhY3QvYCxcbiAgICAgICAgcGFyYW1zXG4gICAgICApXG4gICAgICAudG9Qcm9taXNlKCk7XG5cbiAgICAvLyAtLVBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDEgLS1cbiAgICAvLyBUaGUgY29udGFjdCB2ZXJpZmljYXRpb25zIGFyZSB0aHJvdHRsZWQuIEJ1dCBvdGhlcndpc2UgaGFybWxlc3MuXG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbmZpcm1Db250YWN0KFxuICAgIHBhcmFtczogQ29uZmlybUNvbnRhY3RQYXJhbXNcbiAgKTogUHJvbWlzZTxDb25maXJtQ29udGFjdFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENvbmZpcm1Db250YWN0UmVzdWx0PihgJHt0aGlzLmNvbmZpZy5hdXRoVXJsfWNvdmUvcmVzcG9uZC9gLCB7XG4gICAgICAgIGNsYWltX2lkOiBwYXJhbXMuY2xhaW1JZCxcbiAgICAgICAgdl9jb2RlOiBwYXJhbXMudkNvZGUsXG4gICAgICB9KVxuICAgICAgLnRvUHJvbWlzZSgpO1xuXG4gICAgLy8gLS1Qb3RlbnRpYWwgRmFpbHVyZSBQb2ludCAyIC0tXG4gICAgLy8gQSB2ZXJpZmllZCBjbGFpbSBmb3IgYSBjb250YWN0IGRvZXMgbm90IHByZXZlbnQgbmV3IG9uZXMgZnJvbSBiZWluZyBnZW5lcmF0ZWQuIFNvIGl0IHNob3VsZCBiZSBmaW5lIHRvIGp1c3Qgc3RhcnQgYWdhaW4uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdmVyaWZ5KHBhcmFtczogVmVyaWZ5UGFyYW1zKTogUHJvbWlzZTxWZXJpZnlSZXN1bHQ+IHtcbiAgICBjb25zdCBjaGFsbGVuZ2VSZXN1bHQgPSBhd2FpdCB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PENoYWxsZW5nZVJlc3VsdD4oXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmF1dGhVcmx9dXNlcnMvbGJvcC1yZXNldC9nZXQtY2hhbGxlbmdlL2AsXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFpbUlkOiBwYXJhbXMuY2xhaW1JZCxcbiAgICAgICAgICBjbGFpbVRva2VuOiBwYXJhbXMuY2xhaW1Ub2tlbixcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuXG4gICAgLy8gLS1Qb3RlbnRpYWwgRmFpbHVyZSBQb2ludCAzIC0tXG4gICAgLy8gVGhpcyBkb2VzIG5vdCBsb2NrIGFueXRoaW5nLiBBIHNlY29uZCBjYWxsIHRvIFwiZ2V0LWNoYWxsZW5nZS9cIiB3aWxsIGNyZWF0ZSBhIG5ldyBjaGFsbGVuZ2UgYW1kIGludmFsaWRhdGUgdGhlIGZpcnN0IG9uZS5cbiAgICBjb25zdCB7IHNpZ25lZENoYWxsZW5nZSwgbGJvcCwgbGJvcEtleSB9ID0gYXdhaXQgdGhpcy52ZXJpZnlMYm9wcyhcbiAgICAgIGNoYWxsZW5nZVJlc3VsdCxcbiAgICAgIHBhcmFtcy5sYm9wXG4gICAgKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8YW55PihgJHt0aGlzLmNvbmZpZy5hdXRoVXJsfXVzZXJzL2xib3AtcmVzZXQvdmVyaWZ5LWNoYWxsZW5nZS9gLCB7XG4gICAgICAgIGxib3BJZDogbGJvcC5sYm9wSWQsXG4gICAgICAgIHNpZ25lZENoYWxsZW5nZSxcbiAgICAgIH0pXG4gICAgICAudG9Qcm9taXNlKCk7XG5cbiAgICAvLyAtLVBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDQgLS1cbiAgICAvLyBUaGlzIGRvZXMgbm90IGxvY2sgYW55dGhpbmcuIFNvIG9rIHRvIHJlc3RhcnQuXG5cbiAgICByZXR1cm4ge1xuICAgICAgbGJvcElkOiBsYm9wLmxib3BJZCxcbiAgICAgIHZlcmlmaWVkVG9rZW46IHJlcy52ZXJpZmllZFRva2VuLFxuICAgICAgbWFzdGVyS2V5SWQ6IHJlcy5tYXN0ZXJLZXlJZCxcbiAgICAgIG1hc3RlcktleTogYXdhaXQgS0ZTLmFzS2V5KFxuICAgICAgICBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmRlY3J5cHQobGJvcEtleSwgcmVzLndyYXBwZWRNYXN0ZXJLZXkpXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0UGFzc3dvcmQocGFyYW1zOiBTZXRQYXNzd29yZFBhcmFtcyk6IFByb21pc2U8YW55PiB7XG4gICAgLy8gR2VuZXJhdGUgdGhlIG5ldyBwYXNzd29yZCBkZXJpdmVkIGtleXNcbiAgICBjb25zdCBwYXNzS2V5QnVuZGxlID0gYXdhaXQgdGhpcy5wYXNzd29yZFNlcnZpY2UuY3JlYXRlUGFzc0tleUJ1bmRsZShcbiAgICAgIHBhcmFtcy5uZXdQYXNzd29yZFxuICAgICk7XG5cbiAgICAvLyBSZS1lbmNyeXB0IG1hc3RlciBrZXkgd2l0aCBuZXcga2V5XG4gICAgY29uc3QgbmV3V3JhcHBlZE1hc3RlcktleSA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZW5jcnlwdChcbiAgICAgIHBhc3NLZXlCdW5kbGUucGFzc0tleSxcbiAgICAgIHBhcmFtcy5tYXN0ZXJLZXkudG9KU09OKHRydWUpXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuaHR0cFxuICAgICAgLnBvc3Q8U2V0UGFzc3dvcmRBcGlSZXN1bHQ+KFxuICAgICAgICBgJHt0aGlzLmNvbmZpZy5hdXRoVXJsfXVzZXJzL2xib3AtcmVzZXQvc2V0LXBhc3N3b3JkL2AsXG4gICAgICAgIHtcbiAgICAgICAgICBsYm9wSWQ6IHBhcmFtcy5sYm9wSWQsXG4gICAgICAgICAgdmVyaWZpZWRUb2tlbjogcGFyYW1zLnZlcmlmaWVkVG9rZW4sXG4gICAgICAgICAgbWFzdGVyS2V5SWQ6IHBhcmFtcy5tYXN0ZXJLZXlJZCxcbiAgICAgICAgICBuZXdXcmFwcGVkTWFzdGVyS2V5LFxuICAgICAgICAgIG5ld1Bhc3NLZXk6IHtcbiAgICAgICAgICAgIHBhc3NLZXlQYXJhbXM6IHBhc3NLZXlCdW5kbGUucGFzc0tleVBhcmFtcyxcbiAgICAgICAgICAgIHBhc3NJZHBQYXJhbXM6IHBhc3NLZXlCdW5kbGUucGFzc0lkcFBhcmFtcyxcbiAgICAgICAgICAgIHBhc3NJZHBWZXJpZmllclBiazogcGFzc0tleUJ1bmRsZS5wYXNzSWRwVmVyaWZpZXIudG9KU09OKCksXG4gICAgICAgICAgICB3cmFwcGVkUGFzc0lkcFZlcmlmaWVyUHJrOiBwYXNzS2V5QnVuZGxlLndyYXBwZWRQYXNzSWRwVmVyaWZpZXJQcmssXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuXG4gICAgLy8gLS1Qb3RlbnRpYWwgRmFpbHVyZSBQb2ludCA1IC0tXG4gICAgLy8gQSB0aW1lZCBtdXRleCBpcyBsb2NrZWQuIFRoZSBJZHAgcGFzc3dvcmQgY2hhbmdlIG11c3Qgb2NjdXIgd2l0aGluIGEgcGVyaW9kIG9mIHRpbWUuXG4gICAgLy8gSWYgaW50ZXJydXB0ZWQgaGVyZSwgdGhlIHVzZXIgY2FuIG5vdCBsb2dpbiB3aXRoIHRoZWlyIG9sZCBwYXNzd29yZCBhZ2Fpbi4gVGhleSBtdXN0XG4gICAgLy8gc3RhcnQgdGhlIHdob2xlIExCT1AgcGFzc3dvcmQgcmVzZXQgcHJvY2VzcyBhZ2Fpbi5cblxuICAgIC8vIFRoaXMgY2FsbCB3aWxsIGdvIHRocm91Z2ggdGhlIExSIHByb3h5IHdoaWNoIGlzIE9LIHNpbmNlIHRoZSBMUiBzZXJ2ZXIga25vd3NcbiAgICAvLyB0aGUgdGVtcG9yYXJ5IHBhc3N3b3JkIGFueXdheS5cbiAgICBsZXQgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5zaWduSW4ocmVzdWx0LnVzZXJuYW1lLCByZXN1bHQuaWRwUGFzc3dvcmQsIHtcbiAgICAgIG5vUHJveHk6ICd0cnVlJyxcbiAgICB9KTtcblxuICAgIGlmICh1c2VyLmNoYWxsZW5nZU5hbWUgIT09ICdORVdfUEFTU1dPUkRfUkVRVUlSRUQnKSB7XG4gICAgICB0aHJvdyBuZXcgS2NJbnRlcm5hbEVycm9yRXhjZXB0aW9uKFxuICAgICAgICAnRXhwZWN0aW5nIENvZ25pdG8gdG8gaGF2ZSBkb25lIGEgcGFzc3dvcmQgcmVzZXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAtLVBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDYgLS1cbiAgICAvLyBNdXN0IHJlc3RhcnQgdGhlIExCT1AgcGFzc3dvcmQgcmVzZXQgcHJvY2VzcyBhZ2Fpbi5cblxuICAgIC8vIFNldCBuZXcgcGFzc3dvcmQgb24gSWRwXG4gICAgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5jb21wbGV0ZU5ld1Bhc3N3b3JkKFxuICAgICAgdXNlcixcbiAgICAgIHRoaXMucGFzc3dvcmRTZXJ2aWNlLmdldFBhc3NJZHBTdHJpbmcocGFzc0tleUJ1bmRsZS5wYXNzSWRwKSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgNyAtLVxuICAgIC8vIE11c3QgcmVzdGFydCB0aGUgTEJPUCBwYXNzd29yZCByZXNldCBwcm9jZXNzIGFnYWluLlxuXG4gICAgYXdhaXQgdGhpcy5hdXRoLnNpZ25PdXQoKTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmh0dHBcbiAgICAgIC5wb3N0PGFueT4oYCR7dGhpcy5jb25maWcuYXV0aFVybH11c2Vycy9sYm9wLXJlc2V0L2NvbXBsZXRlL2AsIHtcbiAgICAgICAgbGJvcElkOiBwYXJhbXMubGJvcElkLFxuICAgICAgICBzZXRQYXNzd29yZFRva2VuOiByZXN1bHQuc2V0UGFzc3dvcmRUb2tlbixcbiAgICAgIH0pXG4gICAgICAudG9Qcm9taXNlKCk7XG4gIH1cbn1cbiJdfQ==
@@ -1,96 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- /* eslint-disable @typescript-eslint/no-explicit-any */
3
- import { InjectionToken } from '@angular/core';
4
- import { ApolloLink, createHttpLink, from, InMemoryCache, } from '@apollo/client/core';
5
- import { setContext } from '@apollo/client/link/context';
6
- import { RetryLink } from '@apollo/client/link/retry';
7
- import { KcErrorCode } from './_common/exceptions';
8
- import { getAccessJwtToken } from './_common/utils';
9
- // The injection token string is set to be the same as the const stand name since you
10
- // can possibly have different tokens with the same type (i.e. KcConfig). So it would not
11
- // be appropriate to use "KcConfig" as the token string.
12
- export const KC_CONFIG = new InjectionToken('KC_CONFIG');
13
- const RETRY_ERROR_CODES = [KcErrorCode.CONCURRENT_ACCESS];
14
- export function httpOptions(auth, config) {
15
- var _a, _b;
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const token = yield getAccessJwtToken(auth);
18
- const debugUsername = (_a = config.debug) === null || _a === void 0 ? void 0 : _a.username;
19
- const debugRbacCacheMode = (_b = config.debug) === null || _b === void 0 ? void 0 : _b.rbacCacheMode;
20
- return {
21
- withCredentials: true,
22
- headers: Object.assign(Object.assign(Object.assign({}, (token && { authorization: `Bearer ${token}` })), (debugUsername && { 'x-kc-dev-user': debugUsername })), (debugRbacCacheMode && {
23
- 'x-kc-dev-rbac-cache-mode': debugRbacCacheMode,
24
- })),
25
- };
26
- });
27
- }
28
- export const configureApollo = (config, auth) => {
29
- const defaultOptions = {
30
- watchQuery: {
31
- fetchPolicy: 'no-cache',
32
- errorPolicy: 'all',
33
- },
34
- query: {
35
- fetchPolicy: 'no-cache',
36
- errorPolicy: 'all',
37
- },
38
- mutate: {
39
- fetchPolicy: 'no-cache',
40
- errorPolicy: 'all',
41
- },
42
- };
43
- const authLink = setContext((_, { headers }) => __awaiter(void 0, void 0, void 0, function* () {
44
- const options = yield httpOptions(auth, config);
45
- return Object.assign(Object.assign({}, options), { headers: Object.assign(Object.assign({}, headers), options.headers) });
46
- }));
47
- // We are only retrying on certain errors, like the CONCURRENT_ACCESS gql
48
- // error which indicates DB race condition. So can be safely retried.
49
- const retryIf = (error, _) => {
50
- // The RetryLink is called on network error as well, so we need to filter for GraphQL errors.
51
- if (error instanceof GraphQLErrorException) {
52
- if (error.errors.some((e) => { var _a; return RETRY_ERROR_CODES.includes((_a = e.extensions) === null || _a === void 0 ? void 0 : _a.code); })) {
53
- return true;
54
- }
55
- }
56
- return false;
57
- };
58
- const retryLink = new RetryLink({
59
- delay: {
60
- initial: 300,
61
- max: Infinity,
62
- jitter: true,
63
- },
64
- attempts: {
65
- max: 3,
66
- retryIf,
67
- },
68
- });
69
- class GraphQLErrorException extends Error {
70
- constructor(errors) {
71
- super(errors.map((e) => e.message).join(', '));
72
- this.errors = errors;
73
- }
74
- }
75
- // Throw exception on gql errors which effectively promotes it to a network
76
- // error, which can then be handled by the RetryLink.
77
- const promoteGqlErrors = new ApolloLink((operation, forward) => {
78
- return forward(operation).map((data) => {
79
- if (data && data.errors) {
80
- const errors = data.errors.filter((e) => { var _a; return RETRY_ERROR_CODES.includes((_a = e.extensions) === null || _a === void 0 ? void 0 : _a.code); });
81
- if (errors.length > 0) {
82
- throw new GraphQLErrorException(data.errors);
83
- }
84
- }
85
- return data;
86
- });
87
- });
88
- const httpLink = createHttpLink({
89
- uri: config.apolloUrl,
90
- // Sending the sessionid cookie so that the server can use session data when needed.
91
- // eg. setting the session encryption key.
92
- credentials: 'include',
93
- });
94
- return Object.assign({ link: from([retryLink, promoteGqlErrors, authLink, httpLink]), cache: new InMemoryCache(), defaultOptions }, config.apolloConfig);
95
- };
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZS1yZWFkeS5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvbGlmZS1yZWFkeS5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFFTCxVQUFVLEVBQ1YsY0FBYyxFQUVkLElBQUksRUFDSixhQUFhLEdBQ2QsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRCxxRkFBcUY7QUFDckYseUZBQXlGO0FBQ3pGLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxjQUFjLENBQVcsV0FBVyxDQUFDLENBQUM7QUFDbkUsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRTFELE1BQU0sVUFBZ0IsV0FBVyxDQUFDLElBQWUsRUFBRSxNQUFnQjs7O1FBQ2pFLE1BQU0sS0FBSyxHQUFHLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUMsTUFBTSxhQUFhLFNBQUcsTUFBTSxDQUFDLEtBQUssMENBQUUsUUFBUSxDQUFDO1FBQzdDLE1BQU0sa0JBQWtCLFNBQUcsTUFBTSxDQUFDLEtBQUssMENBQUUsYUFBYSxDQUFDO1FBRXZELE9BQU87WUFDTCxlQUFlLEVBQUUsSUFBSTtZQUNyQixPQUFPLGdEQUNGLENBQUMsS0FBSyxJQUFJLEVBQUUsYUFBYSxFQUFFLFVBQVUsS0FB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SSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUM5QzthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDO1FBQzlCLEdBQUcsRUFBRSxNQUFNLENBQUMsU0FBUztRQUNyQixvRkFBb0Y7UUFDcEYsMENBQTBDO1FBQzFDLFdBQVcsRUFBRSxTQUFTO0tBQ3ZCLENBQUMsQ0FBQztJQUVILHVCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQzdELEtBQUssRUFBRSxJQUFJLGFBQWEsRUFBRSxFQUMxQixjQUFjLElBQ1gsTUFBTSxDQUFDLFlBQVksRUFDdEI7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXBvbGxvQ2xpZW50T3B0aW9ucyxcbiAgQXBvbGxvTGluayxcbiAgY3JlYXRlSHR0cExpbmssXG4gIERlZmF1bHRPcHRpb25zLFxuICBmcm9tLFxuICBJbk1lbW9yeUNhY2hlLFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7IHNldENvbnRleHQgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9saW5rL2NvbnRleHQnO1xuaW1wb3J0IHsgUmV0cnlMaW5rIH0gZnJvbSAnQGFwb2xsby9jbGllbnQvbGluay9yZXRyeSc7XG5pbXBvcnQgeyBBdXRoQ2xhc3MgfSBmcm9tICdAYXdzLWFtcGxpZnkvYXV0aC9saWItZXNtL0F1dGgnO1xuaW1wb3J0IHsgR3JhcGhRTEVycm9yIH0gZnJvbSAnZ3JhcGhxbCc7XG5pbXBvcnQgeyBLY0Vycm9yQ29kZSB9IGZyb20gJy4vX2NvbW1vbi9leGNlcHRpb25zJztcbmltcG9ydCB7IGdldEFjY2Vzc0p3dFRva2VuIH0gZnJvbSAnLi9fY29tbW9uL3V0aWxzJztcblxuLy8gVGhlIGluamVjdGlvbiB0b2tlbiBzdHJpbmcgaXMgc2V0IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBjb25zdCBzdGFuZCBuYW1lIHNpbmNlIHlvdVxuLy8gY2FuIHBvc3NpYmx5IGhhdmUgZGlmZmVyZW50IHRva2VucyB3aXRoIHRoZSBzYW1lIHR5cGUgKGkuZS4gS2NDb25maWcpLiBTbyBpdCB3b3VsZCBub3Rcbi8vIGJlIGFwcHJvcHJpYXRlIHRvIHVzZSBcIktjQ29uZmlnXCIgYXMgdGhlIHRva2VuIHN0cmluZy5cbmV4cG9ydCBjb25zdCBLQ19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48S2NDb25maWc+KCdLQ19DT05GSUcnKTtcbmNvbnN0IFJFVFJZX0VSUk9SX0NPREVTID0gW0tjRXJyb3JDb2RlLkNPTkNVUlJFTlRfQUNDRVNTXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh0dHBPcHRpb25zKGF1dGg6IEF1dGhDbGFzcywgY29uZmlnOiBLY0NvbmZpZykge1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEFjY2Vzc0p3dFRva2VuKGF1dGgpO1xuXG4gIGNvbnN0IGRlYnVnVXNlcm5hbWUgPSBjb25maWcuZGVidWc/LnVzZXJuYW1lO1xuICBjb25zdCBkZWJ1Z1JiYWNDYWNoZU1vZGUgPSBjb25maWcuZGVidWc/LnJiYWNDYWNoZU1vZGU7XG5cbiAgcmV0dXJuIHtcbiAgICB3aXRoQ3JlZGVudGlhbHM6IHRydWUsXG4gICAgaGVhZGVyczoge1xuICAgICAgLi4uKHRva2VuICYmIHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAgfSksXG4gICAgICAuLi4oZGVidWdVc2VybmFtZSAmJiB7ICd4LWtjLWRldi11c2VyJzogZGVidWdVc2VybmFtZSB9KSxcbiAgICAgIC4uLihkZWJ1Z1JiYWNDYWNoZU1vZGUgJiYge1xuICAgICAgICAneC1rYy1kZXYtcmJhYy1jYWNoZS1tb2RlJzogZGVidWdSYmFjQ2FjaGVNb2RlLFxuICAgICAgfSksXG4gICAgfSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLY0NvbmZpZyB7XG4gIGF1dGhVcmw6IHN0cmluZztcbiAgYXBpVXJsOiBzdHJpbmc7XG4gIGFwb2xsb1VybDogc3RyaW5nO1xuICB1c2VyUG9vbElkOiBzdHJpbmc7XG4gIHVzZXJQb29sV2ViQ2xpZW50SWQ6IHN0cmluZztcbiAgYXBvbGxvQ29uZmlnPzogQXBvbGxvQ2xpZW50T3B0aW9uczxhbnk+O1xuICAvLyBNYWlubHkgdG8gYWxsb3cgbG9jYWxob3N0IHRvIG5vdCBuZWVkaW5nIHRoaXMuIERlZmF1bHQgdG8gZmFsc3lcbiAgZGlzYWJsZVNlc3Npb25FbmNyeXB0aW9uS2V5PzogYm9vbGVhbjtcbiAgLy8gVGhlcmUncyBubyBjb21waWxlciBsZXZlbCBzd2l0Y2ggZXhjbHVkZSB2YXJpYWJsZXMgZnJvbSB0aGUgaW50ZXJmYWNlLlxuICAvLyBUaGUgb25seSBtZWNoYW5pc20gaXMgdG8gdXNlIHJlcGxhY2VtZW50IG9mIGZpbGVzLiBCdXQgaXQncyB0b28gY3VtYmVyc29tZS5cbiAgLy8gU28gd2UgdXNlIHJ1bnRpbWUgY2hlY2sgaW5zdGVhZCB0byBlbnN1cmUgZGVidWcgY29uZmlnIGlzIG51bGwgaW4gcHJvZHVjdGlvbi5cbiAgZGVidWc/OiB7XG4gICAgdXNlcm5hbWU/OiBzdHJpbmc7XG4gICAgcmJhY0NhY2hlTW9kZT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmZpZ3VyZUFwb2xsbyA9IChcbiAgY29uZmlnOiBLY0NvbmZpZyxcbiAgYXV0aDogQXV0aENsYXNzXG4pOiBBcG9sbG9DbGllbnRPcHRpb25zPGFueT4gPT4ge1xuICBjb25zdCBkZWZhdWx0T3B0aW9uczogRGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgd2F0Y2hRdWVyeToge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduby1jYWNoZScsXG4gICAgICBlcnJvclBvbGljeTogJ2FsbCcsXG4gICAgfSxcbiAgICBxdWVyeToge1xuICAgICAgZmV0Y2hQb2xpY3k6ICduby1jYWNoZScsXG4gICAgICBlcnJvclBvbGljeTogJ2FsbCcsXG4gICAgfSxcbiAgICBtdXRhdGU6IHtcbiAgICAgIGZldGNoUG9saWN5OiAnbm8tY2FjaGUnLFxuICAgICAgZXJyb3JQb2xpY3k6ICdhbGwnLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgYXV0aExpbmsgPSBzZXRDb250ZXh0KGFzeW5jIChfLCB7IGhlYWRlcnMgfSkgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCBodHRwT3B0aW9ucyhhdXRoLCBjb25maWcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gV2UgYXJlIG9ubHkgcmV0cnlpbmcgb24gY2VydGFpbiBlcnJvcnMsIGxpa2UgdGhlIENPTkNVUlJFTlRfQUNDRVNTIGdxbFxuICAvLyBlcnJvciB3aGljaCBpbmRpY2F0ZXMgREIgcmFjZSBjb25kaXRpb24uIFNvIGNhbiBiZSBzYWZlbHkgcmV0cmllZC5cbiAgY29uc3QgcmV0cnlJZiA9IChlcnJvciwgXykgPT4ge1xuICAgIC8vIFRoZSBSZXRyeUxpbmsgaXMgY2FsbGVkIG9uIG5ldHdvcmsgZXJyb3IgYXMgd2VsbCwgc28gd2UgbmVlZCB0byBmaWx0ZXIgZm9yIEdyYXBoUUwgZXJyb3JzLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEdyYXBoUUxFcnJvckV4Y2VwdGlvbikge1xuICAgICAgaWYgKFxuICAgICAgICBlcnJvci5lcnJvcnMuc29tZSgoZSkgPT4gUkVUUllfRVJST1JfQ09ERVMuaW5jbHVkZXMoZS5leHRlbnNpb25zPy5jb2RlKSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgY29uc3QgcmV0cnlMaW5rID0gbmV3IFJldHJ5TGluayh7XG4gICAgZGVsYXk6IHtcbiAgICAgIGluaXRpYWw6IDMwMCxcbiAgICAgIG1heDogSW5maW5pdHksXG4gICAgICBqaXR0ZXI6IHRydWUsXG4gICAgfSxcbiAgICBhdHRlbXB0czoge1xuICAgICAgbWF4OiAzLFxuICAgICAgcmV0cnlJZixcbiAgICB9LFxuICB9KTtcblxuICBjbGFzcyBHcmFwaFFMRXJyb3JFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGVycm9yczogcmVhZG9ubHkgR3JhcGhRTEVycm9yW10pIHtcbiAgICAgIHN1cGVyKGVycm9ycy5tYXAoKGUpID0+IGUubWVzc2FnZSkuam9pbignLCAnKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhyb3cgZXhjZXB0aW9uIG9uIGdxbCBlcnJvcnMgd2hpY2ggZWZmZWN0aXZlbHkgcHJvbW90ZXMgaXQgdG8gYSBuZXR3b3JrXG4gIC8vIGVycm9yLCB3aGljaCBjYW4gdGhlbiBiZSBoYW5kbGVkIGJ5IHRoZSBSZXRyeUxpbmsuXG4gIGNvbnN0IHByb21vdGVHcWxFcnJvcnMgPSBuZXcgQXBvbGxvTGluaygob3BlcmF0aW9uLCBmb3J3YXJkKSA9PiB7XG4gICAgcmV0dXJuIGZvcndhcmQob3BlcmF0aW9uKS5tYXAoKGRhdGEpID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEuZXJyb3JzKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGRhdGEuZXJyb3JzLmZpbHRlcigoZSkgPT5cbiAgICAgICAgICBSRVRSWV9FUlJPUl9DT0RFUy5pbmNsdWRlcyhlLmV4dGVuc2lvbnM/LmNvZGUpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEdyYXBoUUxFcnJvckV4Y2VwdGlvbihkYXRhLmVycm9ycyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBodHRwTGluayA9IGNyZWF0ZUh0dHBMaW5rKHtcbiAgICB1cmk6IGNvbmZpZy5hcG9sbG9VcmwsXG4gICAgLy8gU2VuZGluZyB0aGUgc2Vzc2lvbmlkIGNvb2tpZSBzbyB0aGF0IHRoZSBzZXJ2ZXIgY2FuIHVzZSBzZXNzaW9uIGRhdGEgd2hlbiBuZWVkZWQuXG4gICAgLy8gZWcuIHNldHRpbmcgdGhlIHNlc3Npb24gZW5jcnlwdGlvbiBrZXkuXG4gICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBsaW5rOiBmcm9tKFtyZXRyeUxpbmssIHByb21vdGVHcWxFcnJvcnMsIGF1dGhMaW5rLCBodHRwTGlua10pLFxuICAgIGNhY2hlOiBuZXcgSW5NZW1vcnlDYWNoZSgpLFxuICAgIGRlZmF1bHRPcHRpb25zLFxuICAgIC4uLmNvbmZpZy5hcG9sbG9Db25maWcsXG4gIH07XG59O1xuIl19
@@ -1,42 +0,0 @@
1
- import { HttpClientModule } from '@angular/common/http';
2
- import { APP_INITIALIZER, NgModule } from '@angular/core';
3
- import Auth from '@aws-amplify/auth';
4
- import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
5
- import { NgIdleKeepaliveModule } from '@ng-idle/keepalive';
6
- import { APOLLO_OPTIONS } from 'apollo-angular';
7
- import { configureAmplifyAuth } from './auth/auth.config';
8
- import { configureApollo, KC_CONFIG } from './life-ready.config';
9
- export class LifeReadyModule {
10
- static forRoot(config) {
11
- return {
12
- ngModule: LifeReadyModule,
13
- providers: [
14
- {
15
- provide: KC_CONFIG,
16
- useValue: config,
17
- },
18
- {
19
- provide: AuthClass,
20
- useValue: Auth,
21
- },
22
- {
23
- provide: APP_INITIALIZER,
24
- useFactory: configureAmplifyAuth,
25
- deps: [KC_CONFIG, AuthClass],
26
- multi: true,
27
- },
28
- {
29
- provide: APOLLO_OPTIONS,
30
- useFactory: configureApollo,
31
- deps: [KC_CONFIG, AuthClass],
32
- },
33
- ],
34
- };
35
- }
36
- }
37
- LifeReadyModule.decorators = [
38
- { type: NgModule, args: [{
39
- imports: [HttpClientModule, NgIdleKeepaliveModule.forRoot()],
40
- },] }
41
- ];
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmZS1yZWFkeS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvbGlmZS1yZWFkeS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBdUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMzRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBWSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUszRSxNQUFNLE9BQU8sZUFBZTtJQUNuQixNQUFNLENBQUMsT0FBTyxDQUNuQixNQUFnQjtRQUVoQixPQUFPO1lBQ0wsUUFBUSxFQUFFLGVBQWU7WUFDekIsU0FBUyxFQUFFO2dCQUNUO29CQUNFLE9BQU8sRUFBRSxTQUFTO29CQUNsQixRQUFRLEVBQUUsTUFBTTtpQkFDakI7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLFFBQVEsRUFBRSxJQUFJO2lCQUNmO2dCQUNEO29CQUNFLE9BQU8sRUFBRSxlQUFlO29CQUN4QixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO29CQUM1QixLQUFLLEVBQUUsSUFBSTtpQkFDWjtnQkFDRDtvQkFDRSxPQUFPLEVBQUUsY0FBYztvQkFDdkIsVUFBVSxFQUFFLGVBQWU7b0JBQzNCLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7aUJBQzdCO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQzs7O1lBL0JGLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUM3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBUFBfSU5JVElBTElaRVIsIE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgQXV0aCBmcm9tICdAYXdzLWFtcGxpZnkvYXV0aCc7XG5pbXBvcnQgeyBBdXRoQ2xhc3MgfSBmcm9tICdAYXdzLWFtcGxpZnkvYXV0aC9saWItZXNtL0F1dGgnO1xuaW1wb3J0IHsgTmdJZGxlS2VlcGFsaXZlTW9kdWxlIH0gZnJvbSAnQG5nLWlkbGUva2VlcGFsaXZlJztcbmltcG9ydCB7IEFQT0xMT19PUFRJT05TIH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IHsgY29uZmlndXJlQW1wbGlmeUF1dGggfSBmcm9tICcuL2F1dGgvYXV0aC5jb25maWcnO1xuaW1wb3J0IHsgY29uZmlndXJlQXBvbGxvLCBLY0NvbmZpZywgS0NfQ09ORklHIH0gZnJvbSAnLi9saWZlLXJlYWR5LmNvbmZpZyc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlLCBOZ0lkbGVLZWVwYWxpdmVNb2R1bGUuZm9yUm9vdCgpXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlmZVJlYWR5TW9kdWxlIHtcbiAgcHVibGljIHN0YXRpYyBmb3JSb290KFxuICAgIGNvbmZpZzogS2NDb25maWdcbiAgKTogTW9kdWxlV2l0aFByb3ZpZGVyczxMaWZlUmVhZHlNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IExpZmVSZWFkeU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogS0NfQ09ORklHLFxuICAgICAgICAgIHVzZVZhbHVlOiBjb25maWcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBdXRoQ2xhc3MsXG4gICAgICAgICAgdXNlVmFsdWU6IEF1dGgsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsXG4gICAgICAgICAgdXNlRmFjdG9yeTogY29uZmlndXJlQW1wbGlmeUF1dGgsXG4gICAgICAgICAgZGVwczogW0tDX0NPTkZJRywgQXV0aENsYXNzXSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQT0xMT19PUFRJT05TLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6IGNvbmZpZ3VyZUFwb2xsbyxcbiAgICAgICAgICBkZXBzOiBbS0NfQ09ORklHLCBBdXRoQ2xhc3NdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,40 +0,0 @@
1
- import { gqlTyped } from '../_common/ast';
2
- export const LockFragment = gqlTyped `
3
- fragment LockFragment on LockField {
4
- created
5
- modified
6
- version
7
- expiryTime
8
- state
9
- }`;
10
- export const UpdateLockMutation = gqlTyped `
11
- mutation UpdateLockMutation($input: UpdateLockInput!) {
12
- updateLock(input: $input) {
13
- lock {
14
- ...LockFragment
15
- }
16
- }
17
- }
18
- ${LockFragment}
19
- `;
20
- export const AcquireLockMutation = gqlTyped `
21
- mutation AcquireLockMutation($input: AcquireLockInput!) {
22
- acquireLock(input: $input) {
23
- lock {
24
- ...LockFragment
25
- }
26
- }
27
- }
28
- ${LockFragment}
29
- `;
30
- export const ReleaseLockMutation = gqlTyped `
31
- mutation ReleaseLockMutation($input: ReleaseLockInput!) {
32
- releaseLock(input: $input) {
33
- lock {
34
- ...LockFragment
35
- }
36
- }
37
- }
38
- ${LockFragment}
39
- `;
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jay5ncWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvbG9jay9sb2NrLmdxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTMUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBb0I7Ozs7Ozs7RUFPdEQsQ0FBQztBQU9ILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBMEI7Ozs7Ozs7O0VBUWxFLFlBQVk7Q0FDYixDQUFDO0FBT0YsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUEyQjs7Ozs7Ozs7RUFRcEUsWUFBWTtDQUNiLENBQUM7QUFPRixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQTJCOzs7Ozs7OztFQVFwRSxZQUFZO0NBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVUaW1lLCBMb2NrU3RhdGUsIFVVSUQgfSBmcm9tICcuLi9hcGkvdHlwZXMnO1xuaW1wb3J0IHsgZ3FsVHlwZWQgfSBmcm9tICcuLi9fY29tbW9uL2FzdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9ja0ZyYWdtZW50UmVzdWx0IHtcbiAgY3JlYXRlZDogRGF0ZVRpbWU7XG4gIG1vZGlmaWVkOiBEYXRlVGltZTtcbiAgdmVyc2lvbj86IFVVSUQ7XG4gIGV4cGlyeVRpbWU6IERhdGVUaW1lO1xuICBzdGF0ZTogTG9ja1N0YXRlO1xufVxuZXhwb3J0IGNvbnN0IExvY2tGcmFnbWVudCA9IGdxbFR5cGVkPExvY2tGcmFnbWVudFJlc3VsdD5gXG5mcmFnbWVudCBMb2NrRnJhZ21lbnQgb24gTG9ja0ZpZWxkIHtcbiAgY3JlYXRlZFxuICBtb2RpZmllZFxuICB2ZXJzaW9uXG4gIGV4cGlyeVRpbWVcbiAgc3RhdGVcbn1gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxvY2tNdXRhdGlvblJlc3VsdCB7XG4gIHVwZGF0ZUxvY2s6IHtcbiAgICBsb2NrOiBMb2NrRnJhZ21lbnRSZXN1bHQ7XG4gIH07XG59XG5leHBvcnQgY29uc3QgVXBkYXRlTG9ja011dGF0aW9uID0gZ3FsVHlwZWQ8VXBkYXRlTG9ja011dGF0aW9uUmVzdWx0PmBcbm11dGF0aW9uIFVwZGF0ZUxvY2tNdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZUxvY2tJbnB1dCEpIHtcbiAgdXBkYXRlTG9jayhpbnB1dDogJGlucHV0KSB7XG4gICAgbG9jayB7XG4gICAgICAuLi5Mb2NrRnJhZ21lbnRcbiAgICB9XG4gIH1cbn1cbiR7TG9ja0ZyYWdtZW50fVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBBY3F1aXJlTG9ja011dGF0aW9uUmVzdWx0IHtcbiAgYWNxdWlyZUxvY2s6IHtcbiAgICBsb2NrOiBMb2NrRnJhZ21lbnRSZXN1bHQ7XG4gIH07XG59XG5leHBvcnQgY29uc3QgQWNxdWlyZUxvY2tNdXRhdGlvbiA9IGdxbFR5cGVkPEFjcXVpcmVMb2NrTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gQWNxdWlyZUxvY2tNdXRhdGlvbigkaW5wdXQ6IEFjcXVpcmVMb2NrSW5wdXQhKSB7XG4gIGFjcXVpcmVMb2NrKGlucHV0OiAkaW5wdXQpIHtcbiAgICBsb2NrIHtcbiAgICAgIC4uLkxvY2tGcmFnbWVudFxuICAgIH1cbiAgfVxufVxuJHtMb2NrRnJhZ21lbnR9XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGVhc2VMb2NrTXV0YXRpb25SZXN1bHQge1xuICByZWxlYXNlTG9jazoge1xuICAgIGxvY2s6IExvY2tGcmFnbWVudFJlc3VsdDtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBSZWxlYXNlTG9ja011dGF0aW9uID0gZ3FsVHlwZWQ8UmVsZWFzZUxvY2tNdXRhdGlvblJlc3VsdD5gXG5tdXRhdGlvbiBSZWxlYXNlTG9ja011dGF0aW9uKCRpbnB1dDogUmVsZWFzZUxvY2tJbnB1dCEpIHtcbiAgcmVsZWFzZUxvY2soaW5wdXQ6ICRpbnB1dCkge1xuICAgIGxvY2sge1xuICAgICAgLi4uTG9ja0ZyYWdtZW50XG4gICAgfVxuICB9XG59XG4ke0xvY2tGcmFnbWVudH1cbmA7XG4iXX0=