@lifeready/core 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -62
- package/karma.conf.js +32 -0
- package/ng-package.json +26 -0
- package/package.json +21 -29
- package/src/lib/_common/ast.ts +75 -0
- package/src/lib/_common/deferred-promise.ts +35 -0
- package/src/lib/_common/exceptions.ts +189 -0
- package/src/lib/_common/queries.gql.ts +200 -0
- package/src/lib/_common/run-outside-angular.ts +125 -0
- package/src/lib/_common/tests.ts +82 -0
- package/{lib/_common/types.d.ts → src/lib/_common/types.ts} +13 -10
- package/src/lib/_common/utils.ts +57 -0
- package/src/lib/api/api-mutation.spec.ts +547 -0
- package/src/lib/api/api-query.spec.ts +40 -0
- package/src/lib/api/contact-card.gql.ts +85 -0
- package/src/lib/api/contact-card.service.spec.ts +249 -0
- package/src/lib/api/contact-card.service.ts +228 -0
- package/src/lib/api/contact-card2.gql.ts +93 -0
- package/src/lib/api/contact-card2.service.spec.ts +297 -0
- package/src/lib/api/contact-card2.service.ts +139 -0
- package/src/lib/api/file.service.spec.ts +14 -0
- package/src/lib/api/file.service.ts +81 -0
- package/src/lib/api/item2.gql.ts +211 -0
- package/src/lib/api/item2.service.spec.ts +1043 -0
- package/src/lib/api/item2.service.ts +481 -0
- package/src/lib/api/key-exchange.gql.ts +196 -0
- package/src/lib/api/key-exchange.service.spec.ts +470 -0
- package/src/lib/api/key-exchange.service.ts +731 -0
- package/src/lib/api/key-exchange.types.ts +235 -0
- package/src/lib/api/key-exchange2.gql.ts +310 -0
- package/src/lib/api/key-exchange2.service.spec.ts +892 -0
- package/src/lib/api/key-exchange2.service.ts +875 -0
- package/src/lib/api/lock.gql.ts +67 -0
- package/src/lib/api/lock.service.spec.ts +549 -0
- package/src/lib/api/lock.service.ts +57 -0
- package/src/lib/api/lr-apollo.service.spec.ts +27 -0
- package/src/lib/api/lr-apollo.service.ts +43 -0
- package/{lib/api/lr-graphql/index.d.ts → src/lib/api/lr-graphql/index.ts} +5 -5
- package/src/lib/api/lr-graphql/lr-graphql.service.ts +313 -0
- package/src/lib/api/lr-graphql/lr-merged-mutation.ts +377 -0
- package/src/lib/api/lr-graphql/lr-mutation-base.ts +67 -0
- package/src/lib/api/lr-graphql/lr-mutation.ts +74 -0
- package/src/lib/api/lr-graphql/lr.service.ts +28 -0
- package/src/lib/api/message.service.spec.ts +20 -0
- package/src/lib/api/message.service.ts +210 -0
- package/src/lib/api/persist.service.spec.ts +209 -0
- package/src/lib/api/persist.service.ts +220 -0
- package/src/lib/api/query-processor/common-processors.service.ts +148 -0
- package/{lib/api/query-processor/index.d.ts → src/lib/api/query-processor/index.ts} +2 -2
- package/src/lib/api/query-processor/query-processor.service.ts +240 -0
- package/src/lib/api/query-processor/tp-password-reset-processor.service.ts +177 -0
- package/src/lib/api/shared-contact-card.service.ts +156 -0
- package/src/lib/api/shared-contact-card2.gql.ts +76 -0
- package/src/lib/api/shared-contact-card2.service.ts +154 -0
- package/src/lib/api/time.service.spec.ts +48 -0
- package/src/lib/api/time.service.ts +155 -0
- package/src/lib/api/types/graphql.types.ts +48 -0
- package/{lib/api/types/index.d.ts → src/lib/api/types/index.ts} +2 -2
- package/src/lib/api/types/lr-graphql.types.ts +467 -0
- package/src/lib/auth/auth.config.ts +83 -0
- package/src/lib/auth/auth.gql.ts +62 -0
- package/src/lib/auth/auth.types.ts +79 -0
- package/src/lib/auth/idle.service.spec.ts +119 -0
- package/src/lib/auth/idle.service.ts +208 -0
- package/src/lib/auth/idle.types.ts +11 -0
- package/src/lib/auth/lbop.service.spec.ts +56 -0
- package/src/lib/auth/lbop.service.ts +539 -0
- package/src/lib/auth/life-ready-auth.service.spec.ts +70 -0
- package/src/lib/auth/life-ready-auth.service.ts +454 -0
- package/src/lib/auth/password.service.spec.ts +51 -0
- package/src/lib/auth/password.service.ts +438 -0
- package/src/lib/auth/register.service.spec.ts +31 -0
- package/src/lib/auth/register.service.ts +181 -0
- package/src/lib/auth/two-factor.service.spec.ts +21 -0
- package/src/lib/auth/two-factor.service.ts +69 -0
- package/src/lib/category/category-meta.service.spec.ts +28 -0
- package/src/lib/category/category-meta.service.ts +125 -0
- package/src/lib/category/category.gql.ts +449 -0
- package/src/lib/category/category.service.spec.ts +26 -0
- package/src/lib/category/category.service.ts +498 -0
- package/src/lib/category/category.types.ts +89 -0
- package/src/lib/cryptography/cryptography.types.ts +108 -0
- package/src/lib/cryptography/encryption.service.spec.ts +125 -0
- package/src/lib/cryptography/encryption.service.ts +243 -0
- package/src/lib/cryptography/key-factory.service.spec.ts +15 -0
- package/src/lib/cryptography/key-factory.service.ts +303 -0
- package/src/lib/cryptography/key-graph.service.spec.ts +16 -0
- package/src/lib/cryptography/key-graph.service.ts +354 -0
- package/src/lib/cryptography/key-meta.service.spec.ts +40 -0
- package/src/lib/cryptography/key-meta.service.ts +254 -0
- package/src/lib/cryptography/key.service.spec.ts +16 -0
- package/src/lib/cryptography/key.service.ts +154 -0
- package/src/lib/cryptography/slip39.service.spec.ts +44 -0
- package/src/lib/cryptography/slip39.service.ts +204 -0
- package/src/lib/cryptography/web-crypto.service.ts +22 -0
- package/src/lib/life-ready.config.ts +127 -0
- package/src/lib/life-ready.module.ts +81 -0
- package/src/lib/plan/plan.gql.ts +133 -0
- package/src/lib/plan/plan.service.spec.ts +294 -0
- package/src/lib/plan/plan.service.ts +198 -0
- package/src/lib/plan/plan.types.ts +37 -0
- package/src/lib/record/record-attachment.service.spec.ts +31 -0
- package/src/lib/record/record-attachment.service.ts +101 -0
- package/src/lib/record/record.gql.ts +192 -0
- package/src/lib/record/record.service.spec.ts +598 -0
- package/src/lib/record/record.service.ts +236 -0
- package/src/lib/record/record.types.ts +86 -0
- package/src/lib/record-type/record-type.service.spec.ts +16 -0
- package/src/lib/record-type/record-type.service.ts +71 -0
- package/src/lib/record-type/record-type.types.ts +58 -0
- package/src/lib/scenario/approvals/scenario-approval.gql.ts +112 -0
- package/src/lib/scenario/approvals/scenario-approval.types.ts +85 -0
- package/src/lib/scenario/approvals/scenario-approver.service.spec.ts +16 -0
- package/src/lib/scenario/approvals/scenario-approver.service.ts +422 -0
- package/src/lib/scenario/claimants/scenario-claimant.gql.ts +56 -0
- package/src/lib/scenario/claimants/scenario-claimant.service.spec.ts +16 -0
- package/src/lib/scenario/claimants/scenario-claimant.service.ts +100 -0
- package/src/lib/scenario/claimants/scenario-claimant.types.ts +21 -0
- package/src/lib/scenario/receivers/scenario-receiver.gql.ts +157 -0
- package/src/lib/scenario/receivers/scenario-receiver.service.spec.ts +16 -0
- package/src/lib/scenario/receivers/scenario-receiver.service.ts +278 -0
- package/src/lib/scenario/receivers/scenario-receiver.types.ts +66 -0
- package/src/lib/scenario/scenario-setup.service.spec.ts +22 -0
- package/src/lib/scenario/scenario-setup.service.ts +369 -0
- package/src/lib/scenario/scenario.gql.ts +404 -0
- package/src/lib/scenario/scenario.service.spec.ts +1586 -0
- package/src/lib/scenario/scenario.service.ts +811 -0
- package/src/lib/scenario/scenario.types.ts +258 -0
- package/src/lib/search/search.gql.ts +62 -0
- package/src/lib/search/search.service.spec.ts +57 -0
- package/src/lib/search/search.service.ts +174 -0
- package/src/lib/search/search.types.ts +24 -0
- package/src/lib/trusted-parties/tp-password-reset-request.service.ts +140 -0
- package/src/lib/trusted-parties/tp-password-reset-user.service.ts +359 -0
- package/src/lib/trusted-parties/tp-password-reset.gql.ts +453 -0
- package/src/lib/trusted-parties/tp-password-reset.service.spec.ts +602 -0
- package/src/lib/trusted-parties/tp-password-reset.service.ts +482 -0
- package/src/lib/trusted-parties/trusted-party.gql.ts +159 -0
- package/src/lib/trusted-parties/trusted-party.service.spec.ts +1008 -0
- package/src/lib/trusted-parties/trusted-party.service.ts +394 -0
- package/src/lib/trusted-parties/trusted-party.types.ts +119 -0
- package/src/lib/trusted-parties/trusted-party2.gql.ts +165 -0
- package/src/lib/trusted-parties/trusted-party2.service.spec.ts +1782 -0
- package/src/lib/trusted-parties/trusted-party2.service.ts +272 -0
- package/src/lib/users/profile-details.service.spec.ts +45 -0
- package/src/lib/users/profile-details.service.ts +278 -0
- package/src/lib/users/profile.gql.ts +108 -0
- package/src/lib/users/profile.service.spec.ts +97 -0
- package/src/lib/users/profile.service.ts +224 -0
- package/src/lib/users/profile.types.ts +101 -0
- package/src/lib/users/user.gql.ts +69 -0
- package/src/lib/users/user.service.spec.ts +161 -0
- package/src/lib/users/user.service.ts +72 -0
- package/src/lib/users/user.types.ts +27 -0
- package/{public-api.d.ts → src/public-api.ts} +96 -77
- package/src/test.ts +21 -0
- package/tsconfig.lib.json +21 -0
- package/tsconfig.lib.prod.json +6 -0
- package/tsconfig.spec.json +10 -0
- package/tslint.json +17 -0
- package/bundles/lifeready-core.umd.js +0 -15876
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -16
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -40
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -157
- package/esm2015/lib/_common/queries.gql.js +0 -190
- package/esm2015/lib/_common/run-outside-angular.js +0 -79
- package/esm2015/lib/_common/types.js +0 -1
- package/esm2015/lib/_common/utils.js +0 -44
- package/esm2015/lib/api/contact-card.gql.js +0 -79
- package/esm2015/lib/api/contact-card.service.js +0 -154
- package/esm2015/lib/api/contact-card2.gql.js +0 -60
- package/esm2015/lib/api/contact-card2.service.js +0 -103
- package/esm2015/lib/api/file.service.js +0 -74
- package/esm2015/lib/api/item2.gql.js +0 -110
- package/esm2015/lib/api/item2.service.js +0 -311
- package/esm2015/lib/api/key-exchange.gql.js +0 -188
- package/esm2015/lib/api/key-exchange.service.js +0 -442
- package/esm2015/lib/api/key-exchange.types.js +0 -18
- package/esm2015/lib/api/key-exchange2.gql.js +0 -171
- package/esm2015/lib/api/key-exchange2.service.js +0 -479
- package/esm2015/lib/api/lock.gql.js +0 -40
- package/esm2015/lib/api/lock.service.js +0 -64
- package/esm2015/lib/api/lr-apollo.service.js +0 -46
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -155
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -213
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -48
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/message.service.js +0 -138
- package/esm2015/lib/api/persist.service.js +0 -181
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -93
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -192
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -109
- package/esm2015/lib/api/shared-contact-card.service.js +0 -119
- package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/api/time.service.js +0 -146
- package/esm2015/lib/api/types/graphql.types.js +0 -7
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -71
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.js +0 -48
- package/esm2015/lib/auth/auth.types.js +0 -27
- package/esm2015/lib/auth/idle.service.js +0 -168
- package/esm2015/lib/auth/idle.types.js +0 -7
- package/esm2015/lib/auth/lbop.service.js +0 -355
- package/esm2015/lib/auth/life-ready-auth.service.js +0 -333
- package/esm2015/lib/auth/password.service.js +0 -320
- package/esm2015/lib/auth/register.service.js +0 -172
- package/esm2015/lib/auth/two-factor.service.js +0 -74
- package/esm2015/lib/category/category-meta.service.js +0 -99
- package/esm2015/lib/category/category.gql.js +0 -406
- package/esm2015/lib/category/category.service.js +0 -390
- package/esm2015/lib/category/category.types.js +0 -29
- package/esm2015/lib/cryptography/cryptography.types.js +0 -11
- package/esm2015/lib/cryptography/encryption.service.js +0 -189
- package/esm2015/lib/cryptography/key-factory.service.js +0 -237
- package/esm2015/lib/cryptography/key-graph.service.js +0 -280
- package/esm2015/lib/cryptography/key-meta.service.js +0 -200
- package/esm2015/lib/cryptography/key.service.js +0 -124
- package/esm2015/lib/cryptography/slip39.service.js +0 -169
- package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
- package/esm2015/lib/life-ready.config.js +0 -84
- package/esm2015/lib/life-ready.module.js +0 -74
- package/esm2015/lib/plan/plan.gql.js +0 -123
- package/esm2015/lib/plan/plan.service.js +0 -149
- package/esm2015/lib/plan/plan.types.js +0 -11
- package/esm2015/lib/record/record-attachment.service.js +0 -101
- package/esm2015/lib/record/record.gql.js +0 -179
- package/esm2015/lib/record/record.service.js +0 -206
- package/esm2015/lib/record/record.types.js +0 -15
- package/esm2015/lib/record-type/record-type.service.js +0 -75
- package/esm2015/lib/record-type/record-type.types.js +0 -28
- package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +0 -105
- package/esm2015/lib/scenario/approvals/scenario-approval.types.js +0 -1
- package/esm2015/lib/scenario/approvals/scenario-approver.service.js +0 -300
- package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +0 -52
- package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +0 -97
- package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +0 -1
- package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +0 -150
- package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +0 -229
- package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +0 -1
- package/esm2015/lib/scenario/scenario-setup.service.js +0 -269
- package/esm2015/lib/scenario/scenario.gql.js +0 -368
- package/esm2015/lib/scenario/scenario.service.js +0 -611
- package/esm2015/lib/scenario/scenario.types.js +0 -64
- package/esm2015/lib/search/search.gql.js +0 -62
- package/esm2015/lib/search/search.service.js +0 -156
- package/esm2015/lib/search/search.types.js +0 -6
- package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -112
- package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -266
- package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -232
- package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -300
- package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
- package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
- package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
- package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
- package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -215
- package/esm2015/lib/users/profile-details.service.js +0 -214
- package/esm2015/lib/users/profile.gql.js +0 -97
- package/esm2015/lib/users/profile.service.js +0 -169
- package/esm2015/lib/users/profile.types.js +0 -34
- package/esm2015/lib/users/user.gql.js +0 -60
- package/esm2015/lib/users/user.service.js +0 -79
- package/esm2015/lib/users/user.types.js +0 -5
- package/esm2015/lifeready-core.js +0 -10
- package/esm2015/public-api.js +0 -81
- package/fesm2015/lifeready-core.js +0 -13282
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -109
- package/lib/_common/queries.gql.d.ts +0 -10
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/utils.d.ts +0 -3
- package/lib/api/contact-card.gql.d.ts +0 -7
- package/lib/api/contact-card.service.d.ts +0 -52
- package/lib/api/contact-card2.gql.d.ts +0 -34
- package/lib/api/contact-card2.service.d.ts +0 -49
- package/lib/api/file.service.d.ts +0 -18
- package/lib/api/item2.gql.d.ts +0 -96
- package/lib/api/item2.service.d.ts +0 -177
- package/lib/api/key-exchange.gql.d.ts +0 -9
- package/lib/api/key-exchange.service.d.ts +0 -39
- package/lib/api/key-exchange.types.d.ts +0 -196
- package/lib/api/key-exchange2.gql.d.ts +0 -125
- package/lib/api/key-exchange2.service.d.ts +0 -187
- package/lib/api/lock.gql.d.ts +0 -27
- package/lib/api/lock.service.d.ts +0 -25
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -60
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -27
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -8
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/message.service.d.ts +0 -58
- package/lib/api/persist.service.d.ts +0 -31
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/shared-contact-card.service.d.ts +0 -33
- package/lib/api/shared-contact-card2.gql.d.ts +0 -36
- package/lib/api/shared-contact-card2.service.d.ts +0 -45
- package/lib/api/time.service.d.ts +0 -16
- package/lib/api/types/graphql.types.d.ts +0 -29
- package/lib/api/types/lr-graphql.types.d.ts +0 -385
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.d.ts +0 -15
- package/lib/auth/auth.types.d.ts +0 -66
- package/lib/auth/idle.service.d.ts +0 -40
- package/lib/auth/idle.types.d.ts +0 -10
- package/lib/auth/lbop.service.d.ts +0 -91
- package/lib/auth/life-ready-auth.service.d.ts +0 -46
- package/lib/auth/password.service.d.ts +0 -78
- package/lib/auth/register.service.d.ts +0 -25
- package/lib/auth/two-factor.service.d.ts +0 -15
- package/lib/category/category-meta.service.d.ts +0 -23
- package/lib/category/category.gql.d.ts +0 -45
- package/lib/category/category.service.d.ts +0 -67
- package/lib/category/category.types.d.ts +0 -79
- package/lib/cryptography/cryptography.types.d.ts +0 -83
- package/lib/cryptography/encryption.service.d.ts +0 -41
- package/lib/cryptography/key-factory.service.d.ts +0 -38
- package/lib/cryptography/key-graph.service.d.ts +0 -33
- package/lib/cryptography/key-meta.service.d.ts +0 -44
- package/lib/cryptography/key.service.d.ts +0 -36
- package/lib/cryptography/slip39.service.d.ts +0 -43
- package/lib/cryptography/web-crypto.service.d.ts +0 -5
- package/lib/life-ready.config.d.ts +0 -14
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/plan/plan.gql.d.ts +0 -11
- package/lib/plan/plan.service.d.ts +0 -33
- package/lib/plan/plan.types.d.ts +0 -31
- package/lib/record/record-attachment.service.d.ts +0 -16
- package/lib/record/record.gql.d.ts +0 -14
- package/lib/record/record.service.d.ts +0 -25
- package/lib/record/record.types.d.ts +0 -57
- package/lib/record-type/record-type.service.d.ts +0 -11
- package/lib/record-type/record-type.types.d.ts +0 -50
- package/lib/scenario/approvals/scenario-approval.gql.d.ts +0 -7
- package/lib/scenario/approvals/scenario-approval.types.d.ts +0 -63
- package/lib/scenario/approvals/scenario-approver.service.d.ts +0 -32
- package/lib/scenario/claimants/scenario-claimant.gql.d.ts +0 -5
- package/lib/scenario/claimants/scenario-claimant.service.d.ts +0 -17
- package/lib/scenario/claimants/scenario-claimant.types.d.ts +0 -18
- package/lib/scenario/receivers/scenario-receiver.gql.d.ts +0 -8
- package/lib/scenario/receivers/scenario-receiver.service.d.ts +0 -30
- package/lib/scenario/receivers/scenario-receiver.types.d.ts +0 -54
- package/lib/scenario/scenario-setup.service.d.ts +0 -22
- package/lib/scenario/scenario.gql.d.ts +0 -34
- package/lib/scenario/scenario.service.d.ts +0 -58
- package/lib/scenario/scenario.types.d.ts +0 -217
- package/lib/search/search.gql.d.ts +0 -1
- package/lib/search/search.service.d.ts +0 -25
- package/lib/search/search.types.d.ts +0 -20
- package/lib/trusted-parties/tp-password-reset-request.service.d.ts +0 -20
- package/lib/trusted-parties/tp-password-reset-user.service.d.ts +0 -41
- package/lib/trusted-parties/tp-password-reset.gql.d.ts +0 -218
- package/lib/trusted-parties/tp-password-reset.service.d.ts +0 -131
- package/lib/trusted-parties/trusted-party.gql.d.ts +0 -9
- package/lib/trusted-parties/trusted-party.service.d.ts +0 -44
- package/lib/trusted-parties/trusted-party.types.d.ts +0 -102
- package/lib/trusted-parties/trusted-party2.gql.d.ts +0 -79
- package/lib/trusted-parties/trusted-party2.service.d.ts +0 -114
- package/lib/users/profile-details.service.d.ts +0 -21
- package/lib/users/profile.gql.d.ts +0 -11
- package/lib/users/profile.service.d.ts +0 -35
- package/lib/users/profile.types.d.ts +0 -96
- package/lib/users/user.gql.d.ts +0 -9
- package/lib/users/user.service.d.ts +0 -12
- package/lib/users/user.types.d.ts +0 -23
- package/lifeready-core.d.ts +0 -9
- package/lifeready-core.metadata.json +0 -1
|
@@ -0,0 +1,539 @@
|
|
|
1
|
+
import { LrApolloService } from '../api/lr-apollo.service';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Inject, Injectable } from '@angular/core';
|
|
4
|
+
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
5
|
+
import gql from 'graphql-tag';
|
|
6
|
+
import { JWK } from 'node-jose';
|
|
7
|
+
import { EncryptionService } from '../cryptography/encryption.service';
|
|
8
|
+
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
9
|
+
import { KeyService } from '../cryptography/key.service';
|
|
10
|
+
import { LifeReadyConfig, LR_CONFIG } from '../life-ready.config';
|
|
11
|
+
import {
|
|
12
|
+
LrException,
|
|
13
|
+
LrErrorCode,
|
|
14
|
+
LrBadLogicException,
|
|
15
|
+
} from '../_common/exceptions';
|
|
16
|
+
import { LifeReadyAuthService } from './life-ready-auth.service';
|
|
17
|
+
import { PasswordService } from './password.service';
|
|
18
|
+
import { Slip39Helper } from 'slip39';
|
|
19
|
+
import { KeyFactoryService as KFS } from '../cryptography/key-factory.service';
|
|
20
|
+
|
|
21
|
+
interface SetPasswordApiResult {
|
|
22
|
+
username: string;
|
|
23
|
+
idpPassword: string;
|
|
24
|
+
setPasswordToken: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface SetPasswordParams {
|
|
28
|
+
lbopId: string;
|
|
29
|
+
newPassword: string;
|
|
30
|
+
verifiedToken: string;
|
|
31
|
+
masterKeyId: string;
|
|
32
|
+
masterKey: JWK.Key;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface VerifyContactParams {
|
|
36
|
+
email?: string;
|
|
37
|
+
phone?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface VerifyContactResult {
|
|
41
|
+
// The claim_id identifies the Email/SMS confirmation
|
|
42
|
+
claimId: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ConfirmContactParams {
|
|
46
|
+
claimId: string;
|
|
47
|
+
vCode: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface ConfirmContactResult {
|
|
51
|
+
// The token to prove the client had the correct confirmation code.
|
|
52
|
+
token: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface VerifyParams {
|
|
56
|
+
claimId: string;
|
|
57
|
+
claimToken: string;
|
|
58
|
+
lbop: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface VerifyResult {
|
|
62
|
+
// userId: string;
|
|
63
|
+
lbopId: string;
|
|
64
|
+
verifiedToken: string;
|
|
65
|
+
masterKeyId: string;
|
|
66
|
+
masterKey: JWK.Key;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ChallengeResult {
|
|
70
|
+
challenge: any;
|
|
71
|
+
lbops: any;
|
|
72
|
+
// userId: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface Lbop {
|
|
76
|
+
id: string;
|
|
77
|
+
partial?: string;
|
|
78
|
+
name?: string;
|
|
79
|
+
lbopString?: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface CreateLbopParams {
|
|
83
|
+
name?: string;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
interface CreateLbopQuery {
|
|
87
|
+
createLbop: {
|
|
88
|
+
lbop: Lbop;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const CreateLbopQuery = gql`
|
|
93
|
+
mutation CreateLbop($input: CreateLbopInput!) {
|
|
94
|
+
createLbop(input: $input) {
|
|
95
|
+
lbop {
|
|
96
|
+
id
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
|
|
102
|
+
interface DeleteLbopQuery {
|
|
103
|
+
deleteLbop: Lbop;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export const DeleteLbopQuery = gql`
|
|
107
|
+
mutation DeleteLbop($input: DeleteLbopInput!) {
|
|
108
|
+
deleteLbop(input: $input) {
|
|
109
|
+
id
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
`;
|
|
113
|
+
|
|
114
|
+
export interface UpdateLbopParams {
|
|
115
|
+
id: string;
|
|
116
|
+
name: string;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
interface UpdateLbopQuery {
|
|
120
|
+
updateLbop: Lbop;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export const UpdateLbopQuery = gql`
|
|
124
|
+
mutation UpdateLbop($input: UpdateLbopInput!) {
|
|
125
|
+
updateLbop(input: $input) {
|
|
126
|
+
lbop {
|
|
127
|
+
id
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
132
|
+
|
|
133
|
+
export const LbopQuery = gql`
|
|
134
|
+
query Lbop($id: LrRelayIdInput!) {
|
|
135
|
+
lbop(id: $id) {
|
|
136
|
+
id
|
|
137
|
+
cipherMeta
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
`;
|
|
141
|
+
|
|
142
|
+
interface LbopsQuery {
|
|
143
|
+
lbops: any;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export const LbopsQuery = gql`
|
|
147
|
+
query Lbops {
|
|
148
|
+
lbops {
|
|
149
|
+
edges {
|
|
150
|
+
node {
|
|
151
|
+
id
|
|
152
|
+
cipherMeta
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
`;
|
|
158
|
+
|
|
159
|
+
@Injectable({
|
|
160
|
+
providedIn: 'root',
|
|
161
|
+
})
|
|
162
|
+
export class LbopService {
|
|
163
|
+
private readonly CLIENT_NONCE_LENGTH = 32;
|
|
164
|
+
// There are 1024 words (10 bits), so 25 words should give ~256 bits of entropy.
|
|
165
|
+
private readonly LBOP_WORDS = 25;
|
|
166
|
+
|
|
167
|
+
constructor(
|
|
168
|
+
@Inject(LR_CONFIG) private config: LifeReadyConfig,
|
|
169
|
+
private http: HttpClient,
|
|
170
|
+
private lrApollo: LrApolloService,
|
|
171
|
+
private auth: AuthClass,
|
|
172
|
+
private authService: LifeReadyAuthService,
|
|
173
|
+
private keyFactory: KFS,
|
|
174
|
+
private keyService: KeyService,
|
|
175
|
+
private encryptionService: EncryptionService,
|
|
176
|
+
private keyGraph: KeyGraphService,
|
|
177
|
+
private passwordService: PasswordService
|
|
178
|
+
) {}
|
|
179
|
+
|
|
180
|
+
private getPartial(lbopString: string): string {
|
|
181
|
+
return lbopString.split(' ')[0];
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
public async remove(id: string): Promise<string> {
|
|
185
|
+
const res = await this.lrApollo.mutate<any>({
|
|
186
|
+
mutation: DeleteLbopQuery,
|
|
187
|
+
variables: {
|
|
188
|
+
input: {
|
|
189
|
+
id,
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
return res.deleteLbop.id;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public async update({ id, name }: UpdateLbopParams): Promise<Lbop> {
|
|
198
|
+
const lbop = await this.get(id);
|
|
199
|
+
lbop.name = name;
|
|
200
|
+
|
|
201
|
+
const masterKey = await this.keyService.getCurrentMasterKey();
|
|
202
|
+
const cipherMeta = await this.encryptionService.encrypt(
|
|
203
|
+
masterKey.jwk,
|
|
204
|
+
lbop
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
const res = await this.lrApollo.mutate<UpdateLbopQuery>({
|
|
208
|
+
mutation: UpdateLbopQuery,
|
|
209
|
+
variables: {
|
|
210
|
+
input: {
|
|
211
|
+
id,
|
|
212
|
+
cipherMeta: JSON.stringify(cipherMeta),
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
return res.updateLbop;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
public async get(id: string): Promise<Lbop> {
|
|
221
|
+
const res = await this.lrApollo.query<any>({
|
|
222
|
+
query: LbopQuery,
|
|
223
|
+
variables: {
|
|
224
|
+
id,
|
|
225
|
+
},
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const masterKey = await this.keyService.getCurrentMasterKey();
|
|
229
|
+
|
|
230
|
+
const plainCipherMeta = await this.encryptionService.decrypt(
|
|
231
|
+
masterKey.jwk,
|
|
232
|
+
JSON.parse(res.lbop.cipherMeta)
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
id: res.id,
|
|
237
|
+
...plainCipherMeta,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
public async list(): Promise<Lbop[]> {
|
|
242
|
+
const res = await this.lrApollo.query<LbopsQuery>({
|
|
243
|
+
query: LbopsQuery,
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
const masterKey = await this.keyService.getCurrentMasterKey();
|
|
247
|
+
|
|
248
|
+
return Promise.all(
|
|
249
|
+
res.lbops.edges.map(async (edge) => {
|
|
250
|
+
const plainCipherMeta = await this.encryptionService.decrypt(
|
|
251
|
+
masterKey.jwk,
|
|
252
|
+
JSON.parse(edge.node.cipherMeta)
|
|
253
|
+
);
|
|
254
|
+
return {
|
|
255
|
+
id: edge.node.id,
|
|
256
|
+
...plainCipherMeta,
|
|
257
|
+
};
|
|
258
|
+
})
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
public async create({ name }: CreateLbopParams): Promise<Lbop> {
|
|
263
|
+
if (Slip39Helper.WORD_LIST.length !== 1024) {
|
|
264
|
+
throw new LrBadLogicException('Slip39Helper.WORD_LIST.length != 1024');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Get existing to make sure there are not duplicate first words
|
|
268
|
+
const lbops = await this.list();
|
|
269
|
+
|
|
270
|
+
// Generate new one
|
|
271
|
+
let lbopString;
|
|
272
|
+
while (true) {
|
|
273
|
+
lbopString = this.keyFactory
|
|
274
|
+
.randomChoices(Slip39Helper.WORD_LIST, this.LBOP_WORDS)
|
|
275
|
+
.join(' ');
|
|
276
|
+
const partial = this.getPartial(lbopString);
|
|
277
|
+
|
|
278
|
+
if (!lbops.some((lbop) => lbop.partial === partial)) {
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
const lbopKeyParams = await this.keyFactory.createLbopKeyParams();
|
|
284
|
+
const lbopKey = (
|
|
285
|
+
await this.keyFactory.deriveLbopKey({
|
|
286
|
+
password: lbopString,
|
|
287
|
+
...lbopKeyParams,
|
|
288
|
+
})
|
|
289
|
+
).jwk;
|
|
290
|
+
|
|
291
|
+
const lbopKeyVerifier = await this.keyFactory.createSignKey();
|
|
292
|
+
const wrappedLbopKeyVerifier = await this.encryptionService.encrypt(
|
|
293
|
+
lbopKey,
|
|
294
|
+
lbopKeyVerifier.toJSON(true)
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// Re-encrypt master key with new key
|
|
298
|
+
const currentUser = await this.authService.getUser();
|
|
299
|
+
const masterKey = await this.keyGraph.getKey(
|
|
300
|
+
currentUser.currentUserKey.masterKey.id
|
|
301
|
+
);
|
|
302
|
+
const wrappedMasterKey = await this.encryptionService.encrypt(
|
|
303
|
+
lbopKey,
|
|
304
|
+
masterKey.jwk.toJSON(true)
|
|
305
|
+
);
|
|
306
|
+
|
|
307
|
+
const meta = {
|
|
308
|
+
...(name && { name }),
|
|
309
|
+
partial: this.getPartial(lbopString),
|
|
310
|
+
};
|
|
311
|
+
const cipherMeta = await this.encryptionService.encrypt(
|
|
312
|
+
masterKey.jwk,
|
|
313
|
+
meta
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
const res = await this.lrApollo.mutate<CreateLbopQuery>({
|
|
317
|
+
mutation: CreateLbopQuery,
|
|
318
|
+
variables: {
|
|
319
|
+
input: {
|
|
320
|
+
cipherMeta: JSON.stringify(cipherMeta),
|
|
321
|
+
lbopKeyParams: JSON.stringify(lbopKeyParams),
|
|
322
|
+
lbopKeyVerifier: JSON.stringify(lbopKeyVerifier.toJSON(true)),
|
|
323
|
+
wrappedLbopKeyVerifier: JSON.stringify(wrappedLbopKeyVerifier),
|
|
324
|
+
masterKeyId: currentUser.currentUserKey.masterKey.id,
|
|
325
|
+
wrappedMasterKey: JSON.stringify(wrappedMasterKey),
|
|
326
|
+
},
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
return {
|
|
331
|
+
...res.createLbop.lbop,
|
|
332
|
+
lbopString,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
337
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
338
|
+
// Flow below are for password reset via LBOP
|
|
339
|
+
//
|
|
340
|
+
// --Potential Failure Point xxx--
|
|
341
|
+
//
|
|
342
|
+
// Look for the above and you can test by interrupting at these points.
|
|
343
|
+
//
|
|
344
|
+
// The LBOP reset process can be restarted at any point before the call to "set-password/". Once "set-password/" has been
|
|
345
|
+
// 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/"
|
|
346
|
+
// will set the Idp password to a temporary random password. The user can no longer login using their current password. If the Idp
|
|
347
|
+
// password change process does not complete or takes longer than the lockout period, the account will not be accessible and a new
|
|
348
|
+
// LBOP password reset must be carried out.
|
|
349
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
350
|
+
// --------------------------------------------------------------------------------------------------------------------
|
|
351
|
+
private async verifyLbops(
|
|
352
|
+
challengeResult: ChallengeResult,
|
|
353
|
+
lbopString: string
|
|
354
|
+
): Promise<{ lbop: any; signedChallenge: any; lbopKey: JWK.Key }> {
|
|
355
|
+
const clientNonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
|
|
356
|
+
|
|
357
|
+
for (const lbop of challengeResult.lbops) {
|
|
358
|
+
const lbopKey = (
|
|
359
|
+
await this.keyFactory.deriveLbopKey({
|
|
360
|
+
password: lbopString,
|
|
361
|
+
...lbop.lbopKeyParams,
|
|
362
|
+
})
|
|
363
|
+
).jwk;
|
|
364
|
+
|
|
365
|
+
// If decoding successful then it's the correct lbop
|
|
366
|
+
try {
|
|
367
|
+
const lbopKeyVerifier = (await this.encryptionService.decrypt(
|
|
368
|
+
lbopKey,
|
|
369
|
+
lbop.wrappedLbopKeyVerifier
|
|
370
|
+
)) as any;
|
|
371
|
+
|
|
372
|
+
// Force a bad signature.
|
|
373
|
+
// const serverNonce = challengeResult.challenge.serverNonce + "1",
|
|
374
|
+
|
|
375
|
+
const serverNonce = challengeResult.challenge.serverNonce;
|
|
376
|
+
|
|
377
|
+
const signedChallenge = await this.encryptionService.sign(
|
|
378
|
+
lbopKeyVerifier,
|
|
379
|
+
{
|
|
380
|
+
serverNonce,
|
|
381
|
+
clientNonce,
|
|
382
|
+
}
|
|
383
|
+
);
|
|
384
|
+
|
|
385
|
+
return {
|
|
386
|
+
lbop,
|
|
387
|
+
signedChallenge,
|
|
388
|
+
lbopKey,
|
|
389
|
+
};
|
|
390
|
+
} catch (error) {
|
|
391
|
+
continue;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
throw new LrException({
|
|
395
|
+
source: 'LBOP',
|
|
396
|
+
code: 'INVALID_PASSPHRASE',
|
|
397
|
+
message: 'Invalid passphrase.',
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
public async verifyContact(
|
|
402
|
+
params: VerifyContactParams
|
|
403
|
+
): Promise<VerifyContactResult> {
|
|
404
|
+
const ret = this.http
|
|
405
|
+
.post<VerifyContactResult>(
|
|
406
|
+
`${this.config.authUrl}users/lbop-reset/verify-contact/`,
|
|
407
|
+
params
|
|
408
|
+
)
|
|
409
|
+
.toPromise();
|
|
410
|
+
|
|
411
|
+
// --Potential Failure Point 1 --
|
|
412
|
+
// The contact verifications are throttled. But otherwise harmless.
|
|
413
|
+
|
|
414
|
+
return ret;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
public async confirmContact(
|
|
418
|
+
params: ConfirmContactParams
|
|
419
|
+
): Promise<ConfirmContactResult> {
|
|
420
|
+
return this.http
|
|
421
|
+
.post<ConfirmContactResult>(`${this.config.authUrl}cove/respond/`, {
|
|
422
|
+
claim_id: params.claimId,
|
|
423
|
+
v_code: params.vCode,
|
|
424
|
+
})
|
|
425
|
+
.toPromise();
|
|
426
|
+
|
|
427
|
+
// --Potential Failure Point 2 --
|
|
428
|
+
// A verified claim for a contact does not prevent new ones from being generated. So it should be fine to just start again.
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
public async verify(params: VerifyParams): Promise<VerifyResult> {
|
|
432
|
+
const challengeResult = await this.http
|
|
433
|
+
.post<ChallengeResult>(
|
|
434
|
+
`${this.config.authUrl}users/lbop-reset/get-challenge/`,
|
|
435
|
+
{
|
|
436
|
+
claimId: params.claimId,
|
|
437
|
+
claimToken: params.claimToken,
|
|
438
|
+
}
|
|
439
|
+
)
|
|
440
|
+
.toPromise();
|
|
441
|
+
|
|
442
|
+
// --Potential Failure Point 3 --
|
|
443
|
+
// This does not lock anything. A second call to "get-challenge/" will create a new challenge amd invalidate the first one.
|
|
444
|
+
const { signedChallenge, lbop, lbopKey } = await this.verifyLbops(
|
|
445
|
+
challengeResult,
|
|
446
|
+
params.lbop
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
const res = await this.http
|
|
450
|
+
.post<any>(`${this.config.authUrl}users/lbop-reset/verify-challenge/`, {
|
|
451
|
+
lbopId: lbop.lbopId,
|
|
452
|
+
signedChallenge,
|
|
453
|
+
})
|
|
454
|
+
.toPromise();
|
|
455
|
+
|
|
456
|
+
// --Potential Failure Point 4 --
|
|
457
|
+
// This does not lock anything. So ok to restart.
|
|
458
|
+
|
|
459
|
+
return {
|
|
460
|
+
lbopId: lbop.lbopId,
|
|
461
|
+
verifiedToken: res.verifiedToken,
|
|
462
|
+
masterKeyId: res.masterKeyId,
|
|
463
|
+
masterKey: await KFS.asKey(
|
|
464
|
+
await this.encryptionService.decrypt(lbopKey, res.wrappedMasterKey)
|
|
465
|
+
),
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
public async setPassword(params: SetPasswordParams): Promise<any> {
|
|
470
|
+
// Generate the new password derived keys
|
|
471
|
+
const passKeyBundle = await this.passwordService.createPassKeyBundle(
|
|
472
|
+
params.newPassword
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
// Re-encrypt master key with new key
|
|
476
|
+
const newWrappedMasterKey = await this.encryptionService.encrypt(
|
|
477
|
+
passKeyBundle.passKey,
|
|
478
|
+
params.masterKey.toJSON(true)
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
const result = await this.http
|
|
482
|
+
.post<SetPasswordApiResult>(
|
|
483
|
+
`${this.config.authUrl}users/lbop-reset/set-password/`,
|
|
484
|
+
{
|
|
485
|
+
lbopId: params.lbopId,
|
|
486
|
+
verifiedToken: params.verifiedToken,
|
|
487
|
+
masterKeyId: params.masterKeyId,
|
|
488
|
+
newWrappedMasterKey,
|
|
489
|
+
newPassKey: {
|
|
490
|
+
passKeyParams: passKeyBundle.passKeyParams,
|
|
491
|
+
passIdpParams: passKeyBundle.passIdpParams,
|
|
492
|
+
passIdpVerifierPbk: passKeyBundle.passIdpVerifier.toJSON(),
|
|
493
|
+
wrappedPassIdpVerifierPrk: passKeyBundle.wrappedPassIdpVerifierPrk,
|
|
494
|
+
},
|
|
495
|
+
}
|
|
496
|
+
)
|
|
497
|
+
.toPromise();
|
|
498
|
+
|
|
499
|
+
// --Potential Failure Point 5 --
|
|
500
|
+
// A timed mutex is locked. The Idp password change must occur within a period of time.
|
|
501
|
+
// If interrupted here, the user can not login with their old password again. They must
|
|
502
|
+
// start the whole LBOP password reset process again.
|
|
503
|
+
|
|
504
|
+
// This call will go through the LR proxy which is OK since the LR server knows
|
|
505
|
+
// the temporary password anyway.
|
|
506
|
+
let user = await this.auth.signIn(result.username, result.idpPassword, {
|
|
507
|
+
noProxy: 'true',
|
|
508
|
+
});
|
|
509
|
+
|
|
510
|
+
if (user.challengeName !== 'NEW_PASSWORD_REQUIRED') {
|
|
511
|
+
throw new LrException({
|
|
512
|
+
message:
|
|
513
|
+
'Internal error. Expecting Cognito to have done a password reset.',
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// --Potential Failure Point 6 --
|
|
518
|
+
// Must restart the LBOP password reset process again.
|
|
519
|
+
|
|
520
|
+
// Set new password on Idp
|
|
521
|
+
user = await this.auth.completeNewPassword(
|
|
522
|
+
user,
|
|
523
|
+
this.passwordService.getPassIdpString(passKeyBundle.passIdp),
|
|
524
|
+
{}
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
// --Potential Failure Point 7 --
|
|
528
|
+
// Must restart the LBOP password reset process again.
|
|
529
|
+
|
|
530
|
+
await this.auth.signOut();
|
|
531
|
+
|
|
532
|
+
return await this.http
|
|
533
|
+
.post<any>(`${this.config.authUrl}users/lbop-reset/complete/`, {
|
|
534
|
+
lbopId: params.lbopId,
|
|
535
|
+
setPasswordToken: result.setPasswordToken,
|
|
536
|
+
})
|
|
537
|
+
.toPromise();
|
|
538
|
+
}
|
|
539
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { TestBed } from '@angular/core/testing';
|
|
2
|
+
import { LifeReadyAuthService } from './life-ready-auth.service';
|
|
3
|
+
import { CurrentUser } from '../../public-api';
|
|
4
|
+
import { environment } from 'projects/lr-auth-app/src/environments/environment';
|
|
5
|
+
import { lrConfigureTestingModule } from '../_common/tests';
|
|
6
|
+
|
|
7
|
+
describe('LifeReadyAuthService', () => {
|
|
8
|
+
let service: LifeReadyAuthService;
|
|
9
|
+
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
lrConfigureTestingModule();
|
|
12
|
+
service = TestBed.inject(LifeReadyAuthService);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should be created', () => {
|
|
16
|
+
expect(service).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export async function loginTestUser(
|
|
21
|
+
username?: string,
|
|
22
|
+
password?: string
|
|
23
|
+
): Promise<CurrentUser> {
|
|
24
|
+
if (!environment.test) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!username || !password) {
|
|
29
|
+
username = environment.test.users[0].username;
|
|
30
|
+
password = environment.test.users[0].password;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const authService = TestBed.inject(LifeReadyAuthService);
|
|
34
|
+
|
|
35
|
+
const originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL;
|
|
36
|
+
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
|
|
37
|
+
console.log(
|
|
38
|
+
`setting jasmine.DEFAULT_TIMEOUT_INTERVAL to ${jasmine.DEFAULT_TIMEOUT_INTERVAL}`
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
try {
|
|
43
|
+
const user = await authService.getUser();
|
|
44
|
+
if (user.username === username || user.email === username) {
|
|
45
|
+
return user;
|
|
46
|
+
}
|
|
47
|
+
} catch (error) {
|
|
48
|
+
// nothing
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
await logoutUser();
|
|
52
|
+
|
|
53
|
+
console.log('Logging in test user.');
|
|
54
|
+
|
|
55
|
+
await authService.login(username, password);
|
|
56
|
+
|
|
57
|
+
// If there's 2FA then getUser() will throw.
|
|
58
|
+
return await authService.getUser();
|
|
59
|
+
} finally {
|
|
60
|
+
console.log(
|
|
61
|
+
`setting jasmine.DEFAULT_TIMEOUT_INTERVAL back to ${jasmine.DEFAULT_TIMEOUT_INTERVAL}`
|
|
62
|
+
);
|
|
63
|
+
jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export async function logoutUser(): Promise<void> {
|
|
68
|
+
const authService = TestBed.inject(LifeReadyAuthService);
|
|
69
|
+
await authService.logout();
|
|
70
|
+
}
|