@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
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import gql from 'graphql-tag';
|
|
3
|
-
import { JWK } from 'node-jose';
|
|
4
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
5
|
-
import { KeyGraphService } from '../cryptography/key-graph.service';
|
|
6
|
-
import { KeyGraphFragment } from '../_common/queries.gql';
|
|
7
|
-
import { KeyExchangeService } from './key-exchange.service';
|
|
8
|
-
import { LrApolloService } from './lr-apollo.service';
|
|
9
|
-
import { KeyFactoryService as KFS } from '../cryptography/key-factory.service';
|
|
10
|
-
|
|
11
|
-
export const SendMessageMutation = gql`
|
|
12
|
-
mutation SendMessage($input: SendMessageInput!) {
|
|
13
|
-
sendMessage(input: $input) {
|
|
14
|
-
message {
|
|
15
|
-
id
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
`;
|
|
20
|
-
|
|
21
|
-
export const MessageQuery = gql`
|
|
22
|
-
query Message($id: LrRelayIdInput!) {
|
|
23
|
-
message(id: $id) {
|
|
24
|
-
id
|
|
25
|
-
sender {
|
|
26
|
-
username
|
|
27
|
-
}
|
|
28
|
-
receiver {
|
|
29
|
-
username
|
|
30
|
-
}
|
|
31
|
-
plainMessage
|
|
32
|
-
signedCipherMessage
|
|
33
|
-
sharedKey {
|
|
34
|
-
id
|
|
35
|
-
}
|
|
36
|
-
senderSigPbk {
|
|
37
|
-
id
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
keyGraph {
|
|
41
|
-
...KeyGraphFragment
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
${KeyGraphFragment}
|
|
45
|
-
`;
|
|
46
|
-
|
|
47
|
-
export interface SendMessage {
|
|
48
|
-
message: {
|
|
49
|
-
id: string;
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface SendMessageInput {
|
|
54
|
-
username?: string;
|
|
55
|
-
userId?: string;
|
|
56
|
-
plainMessageJson?: any;
|
|
57
|
-
plainCipherMessageJson?: any;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface Message {
|
|
61
|
-
id: string;
|
|
62
|
-
sender: {
|
|
63
|
-
id: string;
|
|
64
|
-
username: string;
|
|
65
|
-
};
|
|
66
|
-
receiver: {
|
|
67
|
-
id: string;
|
|
68
|
-
username: string;
|
|
69
|
-
};
|
|
70
|
-
plainMessage: string;
|
|
71
|
-
plainMessageJson?: any;
|
|
72
|
-
signedCipherMessage: string;
|
|
73
|
-
plainSignedCipherMessageJson?: any;
|
|
74
|
-
senderSigPbk: {
|
|
75
|
-
id: string;
|
|
76
|
-
};
|
|
77
|
-
sharedKey: {
|
|
78
|
-
id: string;
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
interface DecryptMessageOptions {
|
|
83
|
-
sharedKey: JWK.Key;
|
|
84
|
-
senderSigPbk: JWK.Key;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
@Injectable({
|
|
88
|
-
providedIn: 'root',
|
|
89
|
-
})
|
|
90
|
-
export class MessageService {
|
|
91
|
-
private readonly encrypt = this.encryptionService.encrypt.bind(
|
|
92
|
-
this.encryptionService
|
|
93
|
-
);
|
|
94
|
-
private readonly decrypt = this.encryptionService.decrypt.bind(
|
|
95
|
-
this.encryptionService
|
|
96
|
-
);
|
|
97
|
-
private readonly sign = this.encryptionService.sign.bind(
|
|
98
|
-
this.encryptionService
|
|
99
|
-
);
|
|
100
|
-
private readonly verify = this.encryptionService.verify.bind(
|
|
101
|
-
this.encryptionService
|
|
102
|
-
);
|
|
103
|
-
|
|
104
|
-
constructor(
|
|
105
|
-
private lrApollo: LrApolloService,
|
|
106
|
-
private keyGraph: KeyGraphService,
|
|
107
|
-
private encryptionService: EncryptionService,
|
|
108
|
-
private keyExchangeService: KeyExchangeService
|
|
109
|
-
) {}
|
|
110
|
-
|
|
111
|
-
async sendMessage({
|
|
112
|
-
username,
|
|
113
|
-
userId,
|
|
114
|
-
plainMessageJson,
|
|
115
|
-
plainCipherMessageJson,
|
|
116
|
-
}: SendMessageInput): Promise<SendMessage> {
|
|
117
|
-
const userSharedKey = await this.keyExchangeService.currentUserSharedKey({
|
|
118
|
-
username,
|
|
119
|
-
userId,
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
const input: any = {
|
|
123
|
-
receiverUsername: username,
|
|
124
|
-
receiverId: userId,
|
|
125
|
-
sharedKeyId: userSharedKey.sharedKey.id,
|
|
126
|
-
senderSigPbkId: userSharedKey.userSigPrk.id,
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
if (plainCipherMessageJson) {
|
|
130
|
-
const sharedKey = await this.keyGraph.getJwkKey(
|
|
131
|
-
userSharedKey.sharedKey.id
|
|
132
|
-
);
|
|
133
|
-
const cipherMessage = await this.encrypt(
|
|
134
|
-
sharedKey,
|
|
135
|
-
plainCipherMessageJson
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
const senderSigPrk = await this.keyGraph.getJwkKey(
|
|
139
|
-
userSharedKey.userSigPrk.id
|
|
140
|
-
);
|
|
141
|
-
const signedCipherMessage = await this.sign(senderSigPrk, cipherMessage);
|
|
142
|
-
|
|
143
|
-
input.signedCipherMessage = JSON.stringify(signedCipherMessage);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (plainMessageJson) {
|
|
147
|
-
input.plainMessage = JSON.stringify(plainMessageJson);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const res = await this.lrApollo.query<any>({
|
|
151
|
-
query: SendMessageMutation,
|
|
152
|
-
variables: {
|
|
153
|
-
input,
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
return res.sendMessage;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async decryptMessage(
|
|
161
|
-
message: Message,
|
|
162
|
-
{ sharedKey, senderSigPbk }: DecryptMessageOptions
|
|
163
|
-
): Promise<void> {
|
|
164
|
-
const signedCipherMessage = await this.verify(
|
|
165
|
-
senderSigPbk,
|
|
166
|
-
JSON.parse(message.signedCipherMessage)
|
|
167
|
-
);
|
|
168
|
-
|
|
169
|
-
message.plainSignedCipherMessageJson = await this.decrypt(
|
|
170
|
-
sharedKey,
|
|
171
|
-
signedCipherMessage
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
async getMessage(id: string): Promise<Message> {
|
|
176
|
-
const res = await this.lrApollo.query<any>({
|
|
177
|
-
query: MessageQuery,
|
|
178
|
-
variables: {
|
|
179
|
-
id,
|
|
180
|
-
},
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
this.keyGraph.addKeys(res.keyGraph);
|
|
184
|
-
|
|
185
|
-
const message = res.message as Message;
|
|
186
|
-
|
|
187
|
-
const sharedKey = await this.keyGraph.getJwkKey(message.sharedKey.id);
|
|
188
|
-
|
|
189
|
-
// The sender would be getting the Prk back. The receiver gets the Pbk back.
|
|
190
|
-
// But only the Pbk is needed here to verify signature.
|
|
191
|
-
// So both sender and receiver can access this message.
|
|
192
|
-
const senderSigPbk = await this.keyGraph.getJwkKey(message.senderSigPbk.id);
|
|
193
|
-
|
|
194
|
-
// Test bad signature
|
|
195
|
-
// senderSigPbk = senderSigPbk.toJSON();
|
|
196
|
-
// senderSigPbk.n = "x" + senderSigPbk.n.substring(1);
|
|
197
|
-
// senderSigPbk = await KFS.asKey(senderSigPbk);
|
|
198
|
-
|
|
199
|
-
await this.decryptMessage(message, {
|
|
200
|
-
sharedKey,
|
|
201
|
-
senderSigPbk,
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
if (message.plainMessage) {
|
|
205
|
-
message.plainMessageJson = JSON.parse(message.plainMessage);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return res.message;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import { TestBed } from '@angular/core/testing';
|
|
2
|
-
import {
|
|
3
|
-
delaySec,
|
|
4
|
-
lrConfigureTestingModule,
|
|
5
|
-
lrExpectAsyncThrow,
|
|
6
|
-
lrit,
|
|
7
|
-
} from '../_common/tests';
|
|
8
|
-
import { PersistService } from 'projects/core/src/lib/api/persist.service';
|
|
9
|
-
import {
|
|
10
|
-
loginTestUser,
|
|
11
|
-
logoutUser,
|
|
12
|
-
} from '../auth/life-ready-auth.service.spec';
|
|
13
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
14
|
-
import { JWK } from 'node-jose';
|
|
15
|
-
import { CookieService } from 'ngx-cookie-service';
|
|
16
|
-
import { LifeReadyConfig, LR_CONFIG } from '../life-ready.config';
|
|
17
|
-
|
|
18
|
-
const TIMEOUT = 1000 * 60 * 10;
|
|
19
|
-
|
|
20
|
-
describe('PersistService', () => {
|
|
21
|
-
let persistService: PersistService;
|
|
22
|
-
let encryptionService: EncryptionService;
|
|
23
|
-
let cookieService: CookieService;
|
|
24
|
-
let config: LifeReadyConfig;
|
|
25
|
-
|
|
26
|
-
beforeEach(async () => {
|
|
27
|
-
lrConfigureTestingModule();
|
|
28
|
-
persistService = TestBed.inject(PersistService);
|
|
29
|
-
encryptionService = TestBed.inject(EncryptionService);
|
|
30
|
-
cookieService = TestBed.inject(CookieService);
|
|
31
|
-
config = TestBed.inject(LR_CONFIG);
|
|
32
|
-
}, TIMEOUT);
|
|
33
|
-
|
|
34
|
-
function expiresAfter(seconds: number) {
|
|
35
|
-
return new Date(Date.now() + 1000 * seconds);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
lrit(
|
|
39
|
-
'should persist',
|
|
40
|
-
async () => {
|
|
41
|
-
let res: any;
|
|
42
|
-
const name1 = 'name1';
|
|
43
|
-
const value1 = 'value1';
|
|
44
|
-
const name2 = 'name2';
|
|
45
|
-
const value2 = {
|
|
46
|
-
test: 2,
|
|
47
|
-
};
|
|
48
|
-
const name3 = 'name3';
|
|
49
|
-
const value3 = {
|
|
50
|
-
test: 3,
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
await persistService.set({
|
|
54
|
-
name: name1,
|
|
55
|
-
value: value1,
|
|
56
|
-
serverSession: false,
|
|
57
|
-
});
|
|
58
|
-
res = await persistService.get(name1);
|
|
59
|
-
console.log('res:', res);
|
|
60
|
-
expect(res).toEqual(value1);
|
|
61
|
-
|
|
62
|
-
await persistService.set({
|
|
63
|
-
name: name2,
|
|
64
|
-
value: value2,
|
|
65
|
-
serverSession: false,
|
|
66
|
-
});
|
|
67
|
-
res = await persistService.get(name2);
|
|
68
|
-
console.log('res:', res);
|
|
69
|
-
expect(res).toEqual(value2);
|
|
70
|
-
|
|
71
|
-
await persistService.set({
|
|
72
|
-
name: name3,
|
|
73
|
-
value: value3,
|
|
74
|
-
serverSession: false,
|
|
75
|
-
expiry: expiresAfter(3),
|
|
76
|
-
});
|
|
77
|
-
res = await persistService.get(name3);
|
|
78
|
-
console.log('res:', res);
|
|
79
|
-
expect(res).toEqual(value3);
|
|
80
|
-
|
|
81
|
-
await delaySec(1);
|
|
82
|
-
res = await persistService.get(name3);
|
|
83
|
-
console.log('res:', res);
|
|
84
|
-
expect(res).toEqual(value3);
|
|
85
|
-
|
|
86
|
-
await delaySec(2);
|
|
87
|
-
await delaySec(1); // give it some buffer to make sure it's expired.
|
|
88
|
-
res = await persistService.get(name3);
|
|
89
|
-
console.log('res:', res);
|
|
90
|
-
expect(res).toBeNull();
|
|
91
|
-
},
|
|
92
|
-
TIMEOUT
|
|
93
|
-
);
|
|
94
|
-
|
|
95
|
-
lrit(
|
|
96
|
-
'should persist with serverSession',
|
|
97
|
-
async () => {
|
|
98
|
-
expect(config.disableSessionEncryptionKey).toBeFalsy(
|
|
99
|
-
'Current tests can not run because disableSessionEncryptionKey=True. You can ignore this if this is deliberate decision.'
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
let res: any;
|
|
103
|
-
const name1 = 'name1';
|
|
104
|
-
const value1 = 'value1';
|
|
105
|
-
const name2 = 'name2';
|
|
106
|
-
const value2 = {
|
|
107
|
-
test: 2,
|
|
108
|
-
};
|
|
109
|
-
const name3 = 'name3';
|
|
110
|
-
const value3 = {
|
|
111
|
-
test: 3,
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
await logoutUser();
|
|
115
|
-
|
|
116
|
-
(
|
|
117
|
-
await lrExpectAsyncThrow(
|
|
118
|
-
persistService.set({
|
|
119
|
-
name: name1,
|
|
120
|
-
value: value1,
|
|
121
|
-
serverSession: true,
|
|
122
|
-
})
|
|
123
|
-
)
|
|
124
|
-
).toBeTruthy('Pre-auth will should not have session key.');
|
|
125
|
-
|
|
126
|
-
const user = await loginTestUser();
|
|
127
|
-
|
|
128
|
-
// --------------------------------------------------------
|
|
129
|
-
// Test with server session
|
|
130
|
-
// --------------------------------------------------------
|
|
131
|
-
await persistService.set({
|
|
132
|
-
name: name1,
|
|
133
|
-
value: value1,
|
|
134
|
-
serverSession: true,
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
res = await persistService.get(name1);
|
|
138
|
-
expect(res).toEqual(value1);
|
|
139
|
-
|
|
140
|
-
// Independently make sure the encryption is done properly in localstorage and cookies.
|
|
141
|
-
res = await encryptionService.decrypt(
|
|
142
|
-
await JWK.asKey(JSON.parse(user.sessionEncryptionKey)),
|
|
143
|
-
JSON.parse(localStorage.getItem(`lrSession-${name1}`)).data
|
|
144
|
-
);
|
|
145
|
-
expect(res).toEqual(value1);
|
|
146
|
-
expect(cookieService.get(`lrSession-${name1}`)).toBe('');
|
|
147
|
-
|
|
148
|
-
// --------------------------------------------------------
|
|
149
|
-
// Test with cookie expiry
|
|
150
|
-
// --------------------------------------------------------
|
|
151
|
-
await persistService.set({
|
|
152
|
-
name: name1,
|
|
153
|
-
value: value1,
|
|
154
|
-
serverSession: false,
|
|
155
|
-
expiry: new Date(Date.now() + 1000 * 2),
|
|
156
|
-
});
|
|
157
|
-
res = await persistService.get(name1);
|
|
158
|
-
expect(res).toEqual(value1);
|
|
159
|
-
|
|
160
|
-
// Manual verification
|
|
161
|
-
res = await encryptionService.decrypt(
|
|
162
|
-
// Cookie key
|
|
163
|
-
await JWK.asKey(
|
|
164
|
-
JSON.parse(cookieService.get(`lrSession-${name1}`)).key
|
|
165
|
-
),
|
|
166
|
-
JSON.parse(localStorage.getItem(`lrSession-${name1}`)).data
|
|
167
|
-
);
|
|
168
|
-
expect(res).toEqual(value1);
|
|
169
|
-
|
|
170
|
-
await delaySec(2);
|
|
171
|
-
|
|
172
|
-
res = await persistService.get(name1);
|
|
173
|
-
expect(res).toBeNull('Should have expired');
|
|
174
|
-
|
|
175
|
-
// --------------------------------------------------------
|
|
176
|
-
// Test with both server session and cookie expiry
|
|
177
|
-
// --------------------------------------------------------
|
|
178
|
-
await persistService.set({
|
|
179
|
-
name: name1,
|
|
180
|
-
value: value1,
|
|
181
|
-
serverSession: true,
|
|
182
|
-
expiry: new Date(Date.now() + 1000 * 2),
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
res = await persistService.get(name1);
|
|
186
|
-
expect(res).toEqual(value1);
|
|
187
|
-
|
|
188
|
-
// Manual verification
|
|
189
|
-
res = await encryptionService.decrypt(
|
|
190
|
-
// Cookie key
|
|
191
|
-
await JWK.asKey(
|
|
192
|
-
JSON.parse(cookieService.get(`lrSession-${name1}`)).key
|
|
193
|
-
),
|
|
194
|
-
JSON.parse(localStorage.getItem(`lrSession-${name1}`)).data
|
|
195
|
-
);
|
|
196
|
-
res = await encryptionService.decrypt(
|
|
197
|
-
// session key
|
|
198
|
-
await JWK.asKey(JSON.parse(user.sessionEncryptionKey)),
|
|
199
|
-
res
|
|
200
|
-
);
|
|
201
|
-
expect(res).toEqual(value1);
|
|
202
|
-
|
|
203
|
-
await delaySec(2);
|
|
204
|
-
res = await persistService.get(name1);
|
|
205
|
-
expect(res).toBeNull('Should have expired');
|
|
206
|
-
},
|
|
207
|
-
TIMEOUT
|
|
208
|
-
);
|
|
209
|
-
});
|
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
import { JWK } from 'node-jose';
|
|
2
|
-
import { Injectable, Injector } from '@angular/core';
|
|
3
|
-
import { CookieService } from 'ngx-cookie-service';
|
|
4
|
-
import { EncryptionService } from '../cryptography/encryption.service';
|
|
5
|
-
import { isDevMode } from '@angular/core';
|
|
6
|
-
import { LrBadArgumentException } from '../_common/exceptions';
|
|
7
|
-
import { KeyFactoryService as KFS } from '../cryptography/key-factory.service';
|
|
8
|
-
|
|
9
|
-
interface Item {
|
|
10
|
-
data: string;
|
|
11
|
-
expiry?: string; // iso format
|
|
12
|
-
serverSession?: boolean;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
interface CookieItem {
|
|
16
|
-
key: any;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
@Injectable({
|
|
20
|
-
providedIn: 'root',
|
|
21
|
-
})
|
|
22
|
-
export class PersistService {
|
|
23
|
-
private readonly KEY_PREFIX = 'lrSession-';
|
|
24
|
-
|
|
25
|
-
private cookieSecure = true;
|
|
26
|
-
private serverSessionEncryptionKey: JWK.Key = null;
|
|
27
|
-
|
|
28
|
-
constructor(
|
|
29
|
-
private keyFactory: KFS,
|
|
30
|
-
private cookieService: CookieService,
|
|
31
|
-
private encryptionService: EncryptionService,
|
|
32
|
-
private injector: Injector
|
|
33
|
-
) {
|
|
34
|
-
if (isDevMode()) {
|
|
35
|
-
this.setCookieSecure(false);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
setServerSessionEncryptionKey(key: JWK.Key) {
|
|
40
|
-
this.serverSessionEncryptionKey = key;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
clearServerSessionEncryptionKey() {
|
|
44
|
-
this.serverSessionEncryptionKey = null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// It's important that set and delete cookie use exactly the same set of parameters.
|
|
48
|
-
private getCookieParams() {
|
|
49
|
-
return {
|
|
50
|
-
path: '/',
|
|
51
|
-
domain: null, // which means the current domain of the frontend app.
|
|
52
|
-
secure: this.cookieSecure,
|
|
53
|
-
sameSite: 'Lax' as 'Lax' | 'None' | 'Strict',
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
public clear() {
|
|
58
|
-
// Remove all cookies
|
|
59
|
-
Object.keys(this.cookieService.getAll()).forEach((key) => {
|
|
60
|
-
if (key.startsWith(this.KEY_PREFIX)) {
|
|
61
|
-
this.deletePrefixedName(key);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// Remove all persisted session variables
|
|
66
|
-
Object.keys(localStorage).forEach((key) => {
|
|
67
|
-
if (key.startsWith(this.KEY_PREFIX)) {
|
|
68
|
-
this.deletePrefixedName(key);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
public setCookieSecure(value: boolean) {
|
|
74
|
-
this.cookieSecure = value;
|
|
75
|
-
if (!value) {
|
|
76
|
-
if (isDevMode()) {
|
|
77
|
-
console.warn(
|
|
78
|
-
'The cookie secure flag in persistService has been set to false, set it to true in production mode'
|
|
79
|
-
);
|
|
80
|
-
} else {
|
|
81
|
-
throw new LrBadArgumentException(
|
|
82
|
-
'Can not set PersistService cookie secure flag to false in production mode.'
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
private prefixName(name: string): string {
|
|
89
|
-
return this.KEY_PREFIX + name;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
public delete(name: string): void {
|
|
93
|
-
this.deletePrefixedName(this.prefixName(name));
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private deletePrefixedName(prefixedName: string): void {
|
|
97
|
-
const params = this.getCookieParams();
|
|
98
|
-
this.cookieService.delete(
|
|
99
|
-
prefixedName, // name: string,
|
|
100
|
-
params.path, // path?: string,
|
|
101
|
-
params.domain, // domain ?: string,
|
|
102
|
-
params.secure, // secure ?: boolean,
|
|
103
|
-
params.sameSite // sameSite ?: 'Lax' | 'None' | 'Strict'): void;
|
|
104
|
-
);
|
|
105
|
-
localStorage.removeItem(prefixedName);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
public async set({
|
|
109
|
-
name,
|
|
110
|
-
value,
|
|
111
|
-
serverSession,
|
|
112
|
-
expiry,
|
|
113
|
-
}: {
|
|
114
|
-
name: string;
|
|
115
|
-
value: any;
|
|
116
|
-
serverSession: boolean;
|
|
117
|
-
expiry?: Date;
|
|
118
|
-
}): Promise<void> {
|
|
119
|
-
const prefixedName = this.prefixName(name);
|
|
120
|
-
|
|
121
|
-
let item: Item;
|
|
122
|
-
|
|
123
|
-
if (serverSession) {
|
|
124
|
-
item = {
|
|
125
|
-
serverSession: true,
|
|
126
|
-
data: await this.encryptionService.encryptToString(
|
|
127
|
-
this.serverSessionEncryptionKey,
|
|
128
|
-
value
|
|
129
|
-
),
|
|
130
|
-
};
|
|
131
|
-
} else {
|
|
132
|
-
item = {
|
|
133
|
-
data: value,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (expiry) {
|
|
138
|
-
const key = await this.keyFactory.createKey();
|
|
139
|
-
item.expiry = expiry.toISOString();
|
|
140
|
-
item.data = await this.encryptionService.encryptToString(key, item.data);
|
|
141
|
-
|
|
142
|
-
const cookieItem: CookieItem = {
|
|
143
|
-
key: key.toJSON(true),
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
// If path is set to anything other than "/" then the cookie is only
|
|
147
|
-
// accessible by JS if the current URL has the same prefix as the path.
|
|
148
|
-
// Ideally we don't want the encryption key cookie to be sent at all, but
|
|
149
|
-
// since the encrypted content is held in localstorage, it is not a security
|
|
150
|
-
// risk, i.e. it is at least as secure as storing only in localstorage.
|
|
151
|
-
const params = this.getCookieParams();
|
|
152
|
-
this.cookieService.set(
|
|
153
|
-
prefixedName, // name: string,
|
|
154
|
-
JSON.stringify(cookieItem), // value: string,
|
|
155
|
-
expiry, // expires?: number | Date,
|
|
156
|
-
params.path, // path?: string,
|
|
157
|
-
params.domain, // domain?: string,
|
|
158
|
-
params.secure, // secure?: boolean,
|
|
159
|
-
params.sameSite // sameSite?: 'Lax' | 'None' | 'Strict'
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
localStorage.setItem(prefixedName, JSON.stringify(item));
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
public async get(name: string): Promise<any> {
|
|
167
|
-
const prefixedName = this.prefixName(name);
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
const ret = await this.getImpl(prefixedName);
|
|
171
|
-
if (ret == null) {
|
|
172
|
-
// Clear any cookies to keep things in sync.
|
|
173
|
-
this.deletePrefixedName(prefixedName);
|
|
174
|
-
}
|
|
175
|
-
return ret;
|
|
176
|
-
} catch (error) {
|
|
177
|
-
this.deletePrefixedName(prefixedName);
|
|
178
|
-
throw error;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
private async getImpl(name: string): Promise<any> {
|
|
183
|
-
const itemString = localStorage.getItem(name);
|
|
184
|
-
if (!itemString) {
|
|
185
|
-
return null;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const item: Item = JSON.parse(itemString);
|
|
189
|
-
|
|
190
|
-
let data: any;
|
|
191
|
-
|
|
192
|
-
if (item.expiry) {
|
|
193
|
-
const cookieItemString = this.cookieService.get(name);
|
|
194
|
-
if (!cookieItemString) {
|
|
195
|
-
// Probably expired, but we won't make any interpretations since if we only used
|
|
196
|
-
// cookies we can't tell if it's expired or explicitly removed. So we just make
|
|
197
|
-
// the behaviour here consistent with that.
|
|
198
|
-
console.log('No cookie.');
|
|
199
|
-
return null;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const cookieItem = JSON.parse(cookieItemString);
|
|
203
|
-
|
|
204
|
-
const key = await KFS.asKey(cookieItem.key);
|
|
205
|
-
|
|
206
|
-
data = await this.encryptionService.decrypt(key, item.data);
|
|
207
|
-
} else {
|
|
208
|
-
data = item.data;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
if (item.serverSession) {
|
|
212
|
-
data = await this.encryptionService.decrypt(
|
|
213
|
-
this.serverSessionEncryptionKey,
|
|
214
|
-
data
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
return data;
|
|
219
|
-
}
|
|
220
|
-
}
|