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