@icure/api 8.6.19 → 8.7.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/icc-api/api/IccDocumentApi.d.ts +10 -2
- package/icc-api/api/IccDocumentApi.js +22 -4
- package/icc-api/api/IccDocumentApi.js.map +1 -1
- package/icc-api/api/IccReceiptApi.d.ts +17 -0
- package/icc-api/api/IccReceiptApi.js +52 -0
- package/icc-api/api/IccReceiptApi.js.map +1 -1
- package/icc-api/model/DataAttachment.d.ts +22 -0
- package/icc-api/model/DataAttachment.js.map +1 -1
- package/icc-api/model/Document.d.ts +6 -0
- package/icc-api/model/Document.js.map +1 -1
- package/icc-api/model/Receipt.d.ts +6 -0
- package/icc-api/model/Receipt.js.map +1 -1
- package/icc-x-api/crypto/BaseExchangeDataManager.js +2 -2
- package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExchangeDataManager.js +3 -3
- package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtils.d.ts +1 -1
- package/icc-x-api/crypto/ExtendedApisUtils.js.map +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +1 -1
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +8 -2
- package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
- package/icc-x-api/crypto/RecoveryDataEncryption.js.map +1 -1
- package/icc-x-api/icc-accesslog-x-api.js +7 -7
- package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
- package/icc-x-api/icc-calendar-item-x-api.js +7 -7
- package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
- package/icc-x-api/icc-classification-x-api.js +4 -5
- package/icc-x-api/icc-classification-x-api.js.map +1 -1
- package/icc-x-api/icc-code-x-api.d.ts +2 -2
- package/icc-x-api/icc-code-x-api.js +3 -33
- package/icc-x-api/icc-code-x-api.js.map +1 -1
- package/icc-x-api/icc-contact-x-api.js +20 -33
- package/icc-x-api/icc-contact-x-api.js.map +1 -1
- package/icc-x-api/icc-doctemplate-x-api.js.map +1 -1
- package/icc-x-api/icc-document-x-api.d.ts +8 -7
- package/icc-x-api/icc-document-x-api.js +64 -22
- package/icc-x-api/icc-document-x-api.js.map +1 -1
- package/icc-x-api/icc-form-x-api.js +3 -4
- package/icc-x-api/icc-form-x-api.js.map +1 -1
- package/icc-x-api/icc-helement-x-api.js +11 -11
- package/icc-x-api/icc-helement-x-api.js.map +1 -1
- package/icc-x-api/icc-invoice-x-api.js +3 -4
- package/icc-x-api/icc-invoice-x-api.js.map +1 -1
- package/icc-x-api/icc-maintenance-task-x-api.js +3 -3
- package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
- package/icc-x-api/icc-patient-x-api.js +29 -29
- package/icc-x-api/icc-patient-x-api.js.map +1 -1
- package/icc-x-api/icc-receipt-x-api.d.ts +40 -0
- package/icc-x-api/icc-receipt-x-api.js +79 -1
- package/icc-x-api/icc-receipt-x-api.js.map +1 -1
- package/icc-x-api/icc-topic-x-api.js.map +1 -1
- package/icc-x-api/utils/code-util.d.ts +23 -0
- package/icc-x-api/utils/code-util.js +39 -2
- package/icc-x-api/utils/code-util.js.map +1 -1
- package/icc-x-api/utils/collection-utils.d.ts +13 -0
- package/icc-x-api/utils/collection-utils.js +79 -0
- package/icc-x-api/utils/collection-utils.js.map +1 -1
- package/icc-x-api/utils/compression-utils.d.ts +28 -0
- package/icc-x-api/utils/compression-utils.js +106 -0
- package/icc-x-api/utils/compression-utils.js.map +1 -0
- package/icc-x-api/utils/crypto-utils.js +7 -7
- package/icc-x-api/utils/crypto-utils.js.map +1 -1
- package/icc-x-api/utils/formatting-util.d.ts +3 -3
- package/icc-x-api/utils/formatting-util.js +22 -23
- package/icc-x-api/utils/formatting-util.js.map +1 -1
- package/icc-x-api/utils/hcp-util.js +2 -3
- package/icc-x-api/utils/hcp-util.js.map +1 -1
- package/icc-x-api/utils/insurability-util.js +10 -8
- package/icc-x-api/utils/insurability-util.js.map +1 -1
- package/icc-x-api/utils/lzma-wasm.d.ts +6 -0
- package/icc-x-api/utils/lzma-wasm.js +81 -0
- package/icc-x-api/utils/lzma-wasm.js.map +1 -0
- package/icc-x-api/utils/mutex.d.ts +12 -0
- package/icc-x-api/utils/mutex.js +26 -0
- package/icc-x-api/utils/mutex.js.map +1 -0
- package/icc-x-api/utils/websocket.js +7 -7
- package/icc-x-api/utils/websocket.js.map +1 -1
- package/icc-x-api/wasm/lzma/lzma.js +2 -0
- package/icc-x-api/wasm/lzma/lzma.wasm +0 -0
- package/package.json +2 -11
- package/icc-x-api/utils/uuid-encoder.d.ts +0 -44
- package/icc-x-api/utils/uuid-encoder.js +0 -114
- package/icc-x-api/utils/uuid-encoder.js.map +0 -1
- package/test/icc-api/api/IccAgendaApi.d.ts +0 -1
- package/test/icc-api/api/IccAgendaApi.js +0 -64
- package/test/icc-api/api/IccAgendaApi.js.map +0 -1
- package/test/icc-api/api/IccAnonymousAccessApi.d.ts +0 -1
- package/test/icc-api/api/IccAnonymousAccessApi.js +0 -58
- package/test/icc-api/api/IccAnonymousAccessApi.js.map +0 -1
- package/test/icc-api/api/IccCalendarItemApi.d.ts +0 -1
- package/test/icc-api/api/IccCalendarItemApi.js +0 -67
- package/test/icc-api/api/IccCalendarItemApi.js.map +0 -1
- package/test/icc-api/api/IccCalendarItemTypeApi.d.ts +0 -1
- package/test/icc-api/api/IccCalendarItemTypeApi.js +0 -96
- package/test/icc-api/api/IccCalendarItemTypeApi.js.map +0 -1
- package/test/icc-api/api/IccCodeApi.d.ts +0 -1
- package/test/icc-api/api/IccCodeApi.js +0 -38
- package/test/icc-api/api/IccCodeApi.js.map +0 -1
- package/test/icc-api/api/IccDocumentApi.d.ts +0 -1
- package/test/icc-api/api/IccDocumentApi.js +0 -199
- package/test/icc-api/api/IccDocumentApi.js.map +0 -1
- package/test/icc-api/api/IccGroupApi.d.ts +0 -1
- package/test/icc-api/api/IccGroupApi.js +0 -50
- package/test/icc-api/api/IccGroupApi.js.map +0 -1
- package/test/icc-api/api/IccKeywordApi.d.ts +0 -1
- package/test/icc-api/api/IccKeywordApi.js +0 -64
- package/test/icc-api/api/IccKeywordApi.js.map +0 -1
- package/test/icc-api/api/IccMedicalLocationApi.d.ts +0 -1
- package/test/icc-api/api/IccMedicalLocationApi.js +0 -64
- package/test/icc-api/api/IccMedicalLocationApi.js.map +0 -1
- package/test/icc-api/api/IccPlaceApi.d.ts +0 -1
- package/test/icc-api/api/IccPlaceApi.js +0 -64
- package/test/icc-api/api/IccPlaceApi.js.map +0 -1
- package/test/icc-api/api/IccRecoveryDataApi.d.ts +0 -1
- package/test/icc-api/api/IccRecoveryDataApi.js +0 -95
- package/test/icc-api/api/IccRecoveryDataApi.js.map +0 -1
- package/test/icc-api/api/IccRoleApi.d.ts +0 -1
- package/test/icc-api/api/IccRoleApi.js +0 -34
- package/test/icc-api/api/IccRoleApi.js.map +0 -1
- package/test/icc-api/api/IccUserApi.d.ts +0 -1
- package/test/icc-api/api/IccUserApi.js +0 -96
- package/test/icc-api/api/IccUserApi.js.map +0 -1
- package/test/icc-api/e2e/IccCalendarItemApi.d.ts +0 -1
- package/test/icc-api/e2e/IccCalendarItemApi.js +0 -46
- package/test/icc-api/e2e/IccCalendarItemApi.js.map +0 -1
- package/test/icc-api/model/modelHelpersTest.d.ts +0 -1
- package/test/icc-api/model/modelHelpersTest.js +0 -45
- package/test/icc-api/model/modelHelpersTest.js.map +0 -1
- package/test/icc-x-api/auth/group-switch-test.d.ts +0 -1
- package/test/icc-x-api/auth/group-switch-test.js +0 -81
- package/test/icc-x-api/auth/group-switch-test.js.map +0 -1
- package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +0 -2
- package/test/icc-x-api/auth/jwt-concurrency-test.js +0 -112
- package/test/icc-x-api/auth/jwt-concurrency-test.js.map +0 -1
- package/test/icc-x-api/auth/jwt-provider-test.d.ts +0 -1
- package/test/icc-x-api/auth/jwt-provider-test.js +0 -197
- package/test/icc-x-api/auth/jwt-provider-test.js.map +0 -1
- package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +0 -1
- package/test/icc-x-api/auth/smart-auth-provider-test.js +0 -224
- package/test/icc-x-api/auth/smart-auth-provider-test.js.map +0 -1
- package/test/icc-x-api/autofix-anonymity-test.d.ts +0 -1
- package/test/icc-x-api/autofix-anonymity-test.js +0 -122
- package/test/icc-x-api/autofix-anonymity-test.js.map +0 -1
- package/test/icc-x-api/confidential-entities-test.d.ts +0 -1
- package/test/icc-x-api/confidential-entities-test.js +0 -168
- package/test/icc-x-api/confidential-entities-test.js.map +0 -1
- package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +0 -1
- package/test/icc-x-api/crud/comprehensive-crud-test.js +0 -276
- package/test/icc-x-api/crud/comprehensive-crud-test.js.map +0 -1
- package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +0 -16
- package/test/icc-x-api/crud/entities-crud-test-interface.js +0 -408
- package/test/icc-x-api/crud/entities-crud-test-interface.js.map +0 -1
- package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +0 -1
- package/test/icc-x-api/crypto/anonymous-delegations-test.js +0 -587
- package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +0 -1
- package/test/icc-x-api/crypto/concurrency.d.ts +0 -1
- package/test/icc-x-api/crypto/concurrency.js +0 -35
- package/test/icc-x-api/crypto/concurrency.js.map +0 -1
- package/test/icc-x-api/crypto/crypto-utils.d.ts +0 -1
- package/test/icc-x-api/crypto/crypto-utils.js +0 -79
- package/test/icc-x-api/crypto/crypto-utils.js.map +0 -1
- package/test/icc-x-api/crypto/cryptoTest.d.ts +0 -2
- package/test/icc-x-api/crypto/cryptoTest.js +0 -402
- package/test/icc-x-api/crypto/cryptoTest.js.map +0 -1
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +0 -1
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +0 -166
- package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +0 -1
- package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +0 -1
- package/test/icc-x-api/crypto/exchange-data-manager-test.js +0 -674
- package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +0 -1
- package/test/icc-x-api/crypto/full-crypto-test.d.ts +0 -1
- package/test/icc-x-api/crypto/full-crypto-test.js +0 -454
- package/test/icc-x-api/crypto/full-crypto-test.js.map +0 -1
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.d.ts +0 -1
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +0 -379
- package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +0 -1
- package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +0 -1
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js +0 -278
- package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +0 -1
- package/test/icc-x-api/crypto/shamir.d.ts +0 -2
- package/test/icc-x-api/crypto/shamir.js +0 -167
- package/test/icc-x-api/crypto/shamir.js.map +0 -1
- package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +0 -1
- package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +0 -71
- package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +0 -1
- package/test/icc-x-api/crypto/soft-deleted-data-owners.d.ts +0 -2
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js +0 -113
- package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +0 -1
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +0 -1
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +0 -246
- package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +0 -1
- package/test/icc-x-api/entity-with-attachments-api-test.d.ts +0 -1
- package/test/icc-x-api/entity-with-attachments-api-test.js +0 -142
- package/test/icc-x-api/entity-with-attachments-api-test.js.map +0 -1
- package/test/icc-x-api/filters/filters.d.ts +0 -1
- package/test/icc-x-api/filters/filters.js +0 -49
- package/test/icc-x-api/filters/filters.js.map +0 -1
- package/test/icc-x-api/filters/healthelement.d.ts +0 -1
- package/test/icc-x-api/filters/healthelement.js +0 -333
- package/test/icc-x-api/filters/healthelement.js.map +0 -1
- package/test/icc-x-api/icc-accesslog-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-accesslog-x-api.js +0 -106
- package/test/icc-x-api/icc-accesslog-x-api.js.map +0 -1
- package/test/icc-x-api/icc-application-settings-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-application-settings-x-api.js +0 -91
- package/test/icc-x-api/icc-application-settings-x-api.js.map +0 -1
- package/test/icc-x-api/icc-auth-api.d.ts +0 -1
- package/test/icc-x-api/icc-auth-api.js +0 -47
- package/test/icc-x-api/icc-auth-api.js.map +0 -1
- package/test/icc-x-api/icc-calendar-item-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-calendar-item-x-api.js +0 -150
- package/test/icc-x-api/icc-calendar-item-x-api.js.map +0 -1
- package/test/icc-x-api/icc-contact-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-contact-x-api.js +0 -355
- package/test/icc-x-api/icc-contact-x-api.js.map +0 -1
- package/test/icc-x-api/icc-document-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-document-x-api.js +0 -76
- package/test/icc-x-api/icc-document-x-api.js.map +0 -1
- package/test/icc-x-api/icc-form-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-form-x-api.js +0 -413
- package/test/icc-x-api/icc-form-x-api.js.map +0 -1
- package/test/icc-x-api/icc-hcparty-x-api-test.d.ts +0 -1
- package/test/icc-x-api/icc-hcparty-x-api-test.js +0 -43
- package/test/icc-x-api/icc-hcparty-x-api-test.js.map +0 -1
- package/test/icc-x-api/icc-helement-x-api-test.d.ts +0 -1
- package/test/icc-x-api/icc-helement-x-api-test.js +0 -155
- package/test/icc-x-api/icc-helement-x-api-test.js.map +0 -1
- package/test/icc-x-api/icc-invoice-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-invoice-x-api.js +0 -99
- package/test/icc-x-api/icc-invoice-x-api.js.map +0 -1
- package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +0 -1
- package/test/icc-x-api/icc-maintenance-task-x-api-test.js +0 -222
- package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +0 -1
- package/test/icc-x-api/icc-message-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-message-x-api.js +0 -54
- package/test/icc-x-api/icc-message-x-api.js.map +0 -1
- package/test/icc-x-api/icc-patient-x-api-test.d.ts +0 -1
- package/test/icc-x-api/icc-patient-x-api-test.js +0 -165
- package/test/icc-x-api/icc-patient-x-api-test.js.map +0 -1
- package/test/icc-x-api/icc-recovery-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-recovery-x-api.js +0 -175
- package/test/icc-x-api/icc-recovery-x-api.js.map +0 -1
- package/test/icc-x-api/icc-topic-x-api.d.ts +0 -1
- package/test/icc-x-api/icc-topic-x-api.js +0 -269
- package/test/icc-x-api/icc-topic-x-api.js.map +0 -1
- package/test/icc-x-api/icc-user-x-api-test.d.ts +0 -1
- package/test/icc-x-api/icc-user-x-api-test.js +0 -99
- package/test/icc-x-api/icc-user-x-api-test.js.map +0 -1
- package/test/icc-x-api/keyless-api.d.ts +0 -1
- package/test/icc-x-api/keyless-api.js +0 -125
- package/test/icc-x-api/keyless-api.js.map +0 -1
- package/test/icc-x-api/patient-user.d.ts +0 -2
- package/test/icc-x-api/patient-user.js +0 -103
- package/test/icc-x-api/patient-user.js.map +0 -1
- package/test/icc-x-api/storage/storage.d.ts +0 -1
- package/test/icc-x-api/storage/storage.js +0 -48
- package/test/icc-x-api/storage/storage.js.map +0 -1
- package/test/icc-x-api/test-api-no-parent.d.ts +0 -1
- package/test/icc-x-api/test-api-no-parent.js +0 -79
- package/test/icc-x-api/test-api-no-parent.js.map +0 -1
- package/test/icc-x-api/test-legacy-data-support.d.ts +0 -1
- package/test/icc-x-api/test-legacy-data-support.js +0 -375
- package/test/icc-x-api/test-legacy-data-support.js.map +0 -1
- package/test/icc-x-api/utils/graph-test.d.ts +0 -1
- package/test/icc-x-api/utils/graph-test.js +0 -54
- package/test/icc-x-api/utils/graph-test.js.map +0 -1
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +0 -1
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +0 -364
- package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +0 -1
- package/test/support/CSM-185.d.ts +0 -1
- package/test/support/CSM-185.js +0 -124
- package/test/support/CSM-185.js.map +0 -1
- package/test/support/CSM-243.d.ts +0 -1
- package/test/support/CSM-243.js +0 -120
- package/test/support/CSM-243.js.map +0 -1
- package/test/support/CSM-543.d.ts +0 -1
- package/test/support/CSM-543.js +0 -164
- package/test/support/CSM-543.js.map +0 -1
- package/test/support/CSM-729.d.ts +0 -1
- package/test/support/CSM-729.js +0 -225
- package/test/support/CSM-729.js.map +0 -1
- package/test/support/CSM-87.d.ts +0 -0
- package/test/support/CSM-87.js +0 -21
- package/test/support/CSM-87.js.map +0 -1
- package/test/support/CSM-93.d.ts +0 -1
- package/test/support/CSM-93.js +0 -112
- package/test/support/CSM-93.js.map +0 -1
- package/test/utils/FakeDataOwnerApi.d.ts +0 -32
- package/test/utils/FakeDataOwnerApi.js +0 -136
- package/test/utils/FakeDataOwnerApi.js.map +0 -1
- package/test/utils/FakeEncryptionKeysManager.d.ts +0 -36
- package/test/utils/FakeEncryptionKeysManager.js +0 -98
- package/test/utils/FakeEncryptionKeysManager.js.map +0 -1
- package/test/utils/FakeExchangeDataApi.d.ts +0 -32
- package/test/utils/FakeExchangeDataApi.js +0 -92
- package/test/utils/FakeExchangeDataApi.js.map +0 -1
- package/test/utils/FakeExchangeDataManager.d.ts +0 -48
- package/test/utils/FakeExchangeDataManager.js +0 -82
- package/test/utils/FakeExchangeDataManager.js.map +0 -1
- package/test/utils/FakeExchangeDataMapManager.d.ts +0 -12
- package/test/utils/FakeExchangeDataMapManager.js +0 -38
- package/test/utils/FakeExchangeDataMapManager.js.map +0 -1
- package/test/utils/FakeGenericApi.d.ts +0 -16
- package/test/utils/FakeGenericApi.js +0 -65
- package/test/utils/FakeGenericApi.js.map +0 -1
- package/test/utils/KeylessCryptoStrategies.d.ts +0 -23
- package/test/utils/KeylessCryptoStrategies.js +0 -26
- package/test/utils/KeylessCryptoStrategies.js.map +0 -1
- package/test/utils/TestApi.d.ts +0 -3
- package/test/utils/TestApi.js +0 -30
- package/test/utils/TestApi.js.map +0 -1
- package/test/utils/TestCollectionUtils.d.ts +0 -1
- package/test/utils/TestCollectionUtils.js +0 -109
- package/test/utils/TestCollectionUtils.js.map +0 -1
- package/test/utils/TestCryptoStrategies.d.ts +0 -42
- package/test/utils/TestCryptoStrategies.js +0 -80
- package/test/utils/TestCryptoStrategies.js.map +0 -1
- package/test/utils/TestStorage.d.ts +0 -23
- package/test/utils/TestStorage.js +0 -61
- package/test/utils/TestStorage.js.map +0 -1
- package/test/utils/roles.d.ts +0 -14
- package/test/utils/roles.js +0 -345
- package/test/utils/roles.js.map +0 -1
- package/test/utils/test_utils.d.ts +0 -87
- package/test/utils/test_utils.js +0 -452
- package/test/utils/test_utils.js.map +0 -1
|
@@ -1,454 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
const icc_x_api_1 = require("../../../icc-x-api");
|
|
13
|
-
const uuid_1 = require("uuid");
|
|
14
|
-
const Patient_1 = require("../../../icc-api/model/Patient");
|
|
15
|
-
const Contact_1 = require("../../../icc-api/model/Contact");
|
|
16
|
-
const HealthElement_1 = require("../../../icc-api/model/HealthElement");
|
|
17
|
-
const CalendarItem_1 = require("../../../icc-api/model/CalendarItem");
|
|
18
|
-
const models_1 = require("../../../icc-api/model/models");
|
|
19
|
-
const mocha_1 = require("mocha");
|
|
20
|
-
const crypto_1 = require("crypto");
|
|
21
|
-
require("isomorphic-fetch");
|
|
22
|
-
const chai_1 = require("chai");
|
|
23
|
-
const test_utils_1 = require("../../utils/test_utils");
|
|
24
|
-
const TestApi_1 = require("../../utils/TestApi");
|
|
25
|
-
const TestStorage_1 = require("../../utils/TestStorage");
|
|
26
|
-
const TestCryptoStrategies_1 = require("../../utils/TestCryptoStrategies");
|
|
27
|
-
const MaintenanceTaskAfterDateFilter_1 = require("../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter");
|
|
28
|
-
const KeyPairUpdateRequest_1 = require("../../../icc-x-api/maintenance/KeyPairUpdateRequest");
|
|
29
|
-
var initMasterApi = test_utils_1.TestUtils.initMasterApi;
|
|
30
|
-
const SecureDelegation_1 = require("../../../icc-api/model/SecureDelegation");
|
|
31
|
-
var AccessLevel = SecureDelegation_1.SecureDelegation.AccessLevelEnum;
|
|
32
|
-
const EntityShareRequest_1 = require("../../../icc-api/model/requests/EntityShareRequest");
|
|
33
|
-
var RequestedPermissionEnum = EntityShareRequest_1.EntityShareRequest.RequestedPermissionEnum;
|
|
34
|
-
const types_1 = require("@icure/test-setup/types");
|
|
35
|
-
const utils_1 = require("../../../icc-x-api/crypto/utils");
|
|
36
|
-
(0, test_utils_1.setLocalStorage)(fetch);
|
|
37
|
-
const FULL_WRITE = RequestedPermissionEnum.FULL_WRITE;
|
|
38
|
-
const facades = {
|
|
39
|
-
Patient: {
|
|
40
|
-
create: (api, r) => __awaiter(void 0, void 0, void 0, function* () { return api.patientApi.createPatientWithUser(yield api.userApi.getCurrentUser(), r); }),
|
|
41
|
-
get: (api, id) => __awaiter(void 0, void 0, void 0, function* () { return api.patientApi.getPatientWithUser(yield api.userApi.getCurrentUser(), id); }),
|
|
42
|
-
share: (api, r, doId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
43
|
-
return yield api.patientApi.shareWith(doId, r, yield api.patientApi.decryptSecretIdsOf(r), { requestedPermissions: FULL_WRITE });
|
|
44
|
-
}),
|
|
45
|
-
isDecrypted: (entityToCheck) => __awaiter(void 0, void 0, void 0, function* () {
|
|
46
|
-
return entityToCheck.note != undefined;
|
|
47
|
-
}),
|
|
48
|
-
},
|
|
49
|
-
Contact: {
|
|
50
|
-
create: (api, r) => __awaiter(void 0, void 0, void 0, function* () { return api.contactApi.createContactWithUser(yield api.userApi.getCurrentUser(), r); }),
|
|
51
|
-
get: (api, id) => __awaiter(void 0, void 0, void 0, function* () { return api.contactApi.getContactWithUser(yield api.userApi.getCurrentUser(), id); }),
|
|
52
|
-
share: (api, r, doId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
53
|
-
return yield api.contactApi.shareWith(doId, r, { requestedPermissions: FULL_WRITE });
|
|
54
|
-
}),
|
|
55
|
-
isDecrypted: (entityToCheck) => __awaiter(void 0, void 0, void 0, function* () {
|
|
56
|
-
var _a, _b;
|
|
57
|
-
return ((_a = entityToCheck.services) === null || _a === void 0 ? void 0 : _a[0].content) != undefined && Object.entries((_b = entityToCheck.services) === null || _b === void 0 ? void 0 : _b[0].content).length > 0;
|
|
58
|
-
}),
|
|
59
|
-
},
|
|
60
|
-
HealthElement: {
|
|
61
|
-
create: (api, r) => __awaiter(void 0, void 0, void 0, function* () { return api.healthcareElementApi.createHealthElementWithUser(yield api.userApi.getCurrentUser(), r); }),
|
|
62
|
-
get: (api, id) => __awaiter(void 0, void 0, void 0, function* () { return api.healthcareElementApi.getHealthElementWithUser(yield api.userApi.getCurrentUser(), id); }),
|
|
63
|
-
share: (api, r, doId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
64
|
-
return yield api.healthcareElementApi.shareWith(doId, r, { requestedPermissions: FULL_WRITE });
|
|
65
|
-
}),
|
|
66
|
-
isDecrypted: (entityToCheck) => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
-
return entityToCheck.descr != undefined;
|
|
68
|
-
}),
|
|
69
|
-
},
|
|
70
|
-
CalendarItem: {
|
|
71
|
-
create: (api, r) => __awaiter(void 0, void 0, void 0, function* () { return api.calendarItemApi.createCalendarItemWithHcParty(yield api.userApi.getCurrentUser(), r); }),
|
|
72
|
-
get: (api, id) => __awaiter(void 0, void 0, void 0, function* () { return api.calendarItemApi.getCalendarItemWithUser(yield api.userApi.getCurrentUser(), id); }),
|
|
73
|
-
share: (api, r, doId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
74
|
-
return yield api.calendarItemApi.shareWith(doId, r, { requestedPermissions: FULL_WRITE });
|
|
75
|
-
}),
|
|
76
|
-
isDecrypted: (entityToCheck) => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
-
return entityToCheck.title != undefined;
|
|
78
|
-
}),
|
|
79
|
-
},
|
|
80
|
-
};
|
|
81
|
-
const users = [];
|
|
82
|
-
const primitives = new icc_x_api_1.WebCryptoPrimitives(crypto_1.webcrypto);
|
|
83
|
-
let delegateUser = undefined;
|
|
84
|
-
let delegateHcp = undefined;
|
|
85
|
-
let delegateHcpPassword = undefined;
|
|
86
|
-
let userGivingAccessBack = undefined;
|
|
87
|
-
let userGivingAccessBackPassword = undefined;
|
|
88
|
-
let hcpGivingAccessBack = undefined;
|
|
89
|
-
const entities = {
|
|
90
|
-
Patient: ({ patientApi }, id, user, _, delegateIds) => {
|
|
91
|
-
var _a;
|
|
92
|
-
return patientApi.newInstance(user, new Patient_1.Patient({ id, firstName: 'test', lastName: 'test', note: 'data', dateOfBirth: 20000101 }), {
|
|
93
|
-
additionalDelegates: Object.fromEntries((_a = delegateIds === null || delegateIds === void 0 ? void 0 : delegateIds.map((id) => [id, AccessLevel.WRITE])) !== null && _a !== void 0 ? _a : []),
|
|
94
|
-
});
|
|
95
|
-
},
|
|
96
|
-
Contact: ({ contactApi }, id, user, patient, delegateIds) => {
|
|
97
|
-
var _a;
|
|
98
|
-
return contactApi.newInstance(user, patient, new Contact_1.Contact({ id, services: [new models_1.Service({ label: 'svc', content: { fr: { stringValue: 'data' } } })] }), {
|
|
99
|
-
additionalDelegates: Object.fromEntries((_a = delegateIds === null || delegateIds === void 0 ? void 0 : delegateIds.map((id) => [id, AccessLevel.WRITE])) !== null && _a !== void 0 ? _a : []),
|
|
100
|
-
});
|
|
101
|
-
},
|
|
102
|
-
HealthElement: ({ healthcareElementApi }, id, user, patient, delegateIds) => {
|
|
103
|
-
var _a;
|
|
104
|
-
return healthcareElementApi.newInstance(user, patient, new HealthElement_1.HealthElement({ id, descr: 'HE' }), {
|
|
105
|
-
additionalDelegates: Object.fromEntries((_a = delegateIds === null || delegateIds === void 0 ? void 0 : delegateIds.map((id) => [id, AccessLevel.WRITE])) !== null && _a !== void 0 ? _a : []),
|
|
106
|
-
});
|
|
107
|
-
},
|
|
108
|
-
CalendarItem: ({ calendarItemApi }, id, user, patient, delegateIds) => {
|
|
109
|
-
var _a;
|
|
110
|
-
return calendarItemApi.newInstancePatient(user, patient, new CalendarItem_1.CalendarItem({ id, title: 'CI' }), {
|
|
111
|
-
additionalDelegates: Object.fromEntries((_a = delegateIds === null || delegateIds === void 0 ? void 0 : delegateIds.map((id) => [id, AccessLevel.WRITE])) !== null && _a !== void 0 ? _a : []),
|
|
112
|
-
});
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
const userDefinitions = {
|
|
116
|
-
'one available key and one lost key recoverable through transfer keys': (user, password, originalKey) => __awaiter(void 0, void 0, void 0, function* () {
|
|
117
|
-
const newKey = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
118
|
-
const apiWithOnlyNewKey = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, {
|
|
119
|
-
username: user.login,
|
|
120
|
-
password,
|
|
121
|
-
}, new TestCryptoStrategies_1.TestCryptoStrategies(newKey, {
|
|
122
|
-
[(0, utils_1.fingerprintV1)((0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(originalKey.publicKey, 'spki')))]: true,
|
|
123
|
-
}), crypto_1.webcrypto, fetch, {
|
|
124
|
-
storage: new TestStorage_1.TestStorage(),
|
|
125
|
-
keyStorage: new TestStorage_1.TestKeyStorage(),
|
|
126
|
-
});
|
|
127
|
-
const apis = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, {
|
|
128
|
-
username: user.login,
|
|
129
|
-
password,
|
|
130
|
-
}, new TestCryptoStrategies_1.TestCryptoStrategies(originalKey, {
|
|
131
|
-
[(0, utils_1.fingerprintV1)((0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(newKey.publicKey, 'spki')))]: true,
|
|
132
|
-
}), crypto_1.webcrypto, fetch, {
|
|
133
|
-
storage: new TestStorage_1.TestStorage(),
|
|
134
|
-
keyStorage: new TestStorage_1.TestKeyStorage(),
|
|
135
|
-
});
|
|
136
|
-
(0, chai_1.expect)(Object.keys(apis.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(2);
|
|
137
|
-
yield apiWithOnlyNewKey.cryptoApi.forceReload();
|
|
138
|
-
(0, chai_1.expect)(Object.keys(apiWithOnlyNewKey.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(2);
|
|
139
|
-
return { user, apis: apiWithOnlyNewKey };
|
|
140
|
-
}),
|
|
141
|
-
'two available keys': (user, password, originalKey) => __awaiter(void 0, void 0, void 0, function* () {
|
|
142
|
-
var _a;
|
|
143
|
-
const newKey = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
144
|
-
const apiWithOnlyNewKey = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: user.login, password }, new TestCryptoStrategies_1.TestCryptoStrategies(newKey), crypto_1.webcrypto, fetch, {
|
|
145
|
-
storage: new TestStorage_1.TestStorage(),
|
|
146
|
-
keyStorage: new TestStorage_1.TestKeyStorage(),
|
|
147
|
-
}); // Initializes the new key for the data owner
|
|
148
|
-
const keyStrings = yield Promise.all([originalKey, newKey].map((pair) => __awaiter(void 0, void 0, void 0, function* () {
|
|
149
|
-
return ({
|
|
150
|
-
publicKey: (0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(pair.publicKey, 'spki')),
|
|
151
|
-
privateKey: (0, icc_x_api_1.ua2hex)(yield primitives.RSA.exportKey(pair.privateKey, 'pkcs8')),
|
|
152
|
-
});
|
|
153
|
-
})));
|
|
154
|
-
const storage = yield (0, TestStorage_1.testStorageWithKeys)([
|
|
155
|
-
{
|
|
156
|
-
dataOwnerId: (_a = user.healthcarePartyId) !== null && _a !== void 0 ? _a : user.patientId,
|
|
157
|
-
pairs: keyStrings.map((key) => {
|
|
158
|
-
return { keyPair: key, shaVersion: icc_x_api_1.ShaVersion.Sha256 };
|
|
159
|
-
}),
|
|
160
|
-
},
|
|
161
|
-
]);
|
|
162
|
-
const apis = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: user.login, password }, new TestCryptoStrategies_1.TestCryptoStrategies(), crypto_1.webcrypto, fetch, {
|
|
163
|
-
entryKeysFactory: storage.keyFactory,
|
|
164
|
-
keyStorage: storage.keyStorage,
|
|
165
|
-
storage: storage.storage,
|
|
166
|
-
});
|
|
167
|
-
return { user, apis };
|
|
168
|
-
}),
|
|
169
|
-
'a single available key in old format': (user, password, originalKey) => __awaiter(void 0, void 0, void 0, function* () {
|
|
170
|
-
return ({
|
|
171
|
-
user,
|
|
172
|
-
apis: yield (0, TestApi_1.TestApi)(env.iCureUrl, user.login, password, crypto_1.webcrypto, originalKey),
|
|
173
|
-
});
|
|
174
|
-
}),
|
|
175
|
-
'one lost key and one available key': (user, password) => __awaiter(void 0, void 0, void 0, function* () {
|
|
176
|
-
const newKeyPair = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
177
|
-
const apis = yield (0, TestApi_1.TestApi)(env.iCureUrl, user.login, password, crypto_1.webcrypto, newKeyPair);
|
|
178
|
-
yield apis.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(user, newKeyPair);
|
|
179
|
-
return { user, apis };
|
|
180
|
-
}),
|
|
181
|
-
'one lost key and one upgraded available key thanks to delegate who gave access back to previous data': (user, password) => __awaiter(void 0, void 0, void 0, function* () {
|
|
182
|
-
const newKeyPair = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
183
|
-
const api = yield (0, TestApi_1.TestApi)(env.iCureUrl, user.login, password, crypto_1.webcrypto, newKeyPair);
|
|
184
|
-
yield api.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(user, newKeyPair);
|
|
185
|
-
const giveAccessBackApi = apis['givingAccessBack'];
|
|
186
|
-
const keyPairUpdateRequests = (yield giveAccessBackApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(userGivingAccessBack, undefined, undefined, new models_1.FilterChainMaintenanceTask({
|
|
187
|
-
filter: new MaintenanceTaskAfterDateFilter_1.MaintenanceTaskAfterDateFilter({
|
|
188
|
-
date: new Date().getTime() - 100000,
|
|
189
|
-
}),
|
|
190
|
-
}))).rows.map((x) => KeyPairUpdateRequest_1.KeyPairUpdateRequest.fromMaintenanceTask(x));
|
|
191
|
-
const concernedRequest = keyPairUpdateRequests.find((x) => { var _a; return x.concernedDataOwnerId === ((_a = user.healthcarePartyId) !== null && _a !== void 0 ? _a : user.patientId); });
|
|
192
|
-
if (!concernedRequest)
|
|
193
|
-
throw new Error('Could not find maintenance task');
|
|
194
|
-
yield giveAccessBackApi.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest);
|
|
195
|
-
yield api.cryptoApi.forceReload();
|
|
196
|
-
return { user, apis: api };
|
|
197
|
-
}),
|
|
198
|
-
};
|
|
199
|
-
function createPartialsForHcp(entityFacades, entityCreators, user, password) {
|
|
200
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
201
|
-
const key = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
202
|
-
const api1 = yield (0, TestApi_1.TestApi)(env.iCureUrl, user.login, password, crypto_1.webcrypto, key);
|
|
203
|
-
yield Object.entries(entityFacades).reduce((p, f) => __awaiter(this, void 0, void 0, function* () {
|
|
204
|
-
yield p;
|
|
205
|
-
const type = f[0];
|
|
206
|
-
const facade = f[1];
|
|
207
|
-
const parent = type !== 'Patient' ? yield api1.patientApi.getPatientWithUser(user, `partial-${user.id}-Patient`) : undefined;
|
|
208
|
-
const record = yield entityCreators[type](api1, `partial-${user.id}-${type}`, user, parent, [hcpGivingAccessBack.id]);
|
|
209
|
-
yield facade.create(api1, record);
|
|
210
|
-
}), Promise.resolve());
|
|
211
|
-
return key;
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
function createPartialsForPatient(entityFacades, entityCreators, user, password, patientCreatorUser, patientCreatorApis) {
|
|
215
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
216
|
-
const key = yield primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
|
|
217
|
-
const api1 = yield (0, TestApi_1.TestApi)(env.iCureUrl, user.login, password, crypto_1.webcrypto, key);
|
|
218
|
-
const pat = yield patientCreatorApis.patientApi.getPatientWithUser(patientCreatorUser, user.patientId);
|
|
219
|
-
yield patientCreatorApis.patientApi.shareWith(user.patientId, pat, yield patientCreatorApis.patientApi.decryptSecretIdsOf(pat), {
|
|
220
|
-
requestedPermissions: FULL_WRITE,
|
|
221
|
-
});
|
|
222
|
-
yield Object.entries(entityFacades)
|
|
223
|
-
.filter((it) => it[0] !== 'Patient')
|
|
224
|
-
.reduce((p, f) => __awaiter(this, void 0, void 0, function* () {
|
|
225
|
-
yield p;
|
|
226
|
-
const type = f[0];
|
|
227
|
-
const facade = f[1];
|
|
228
|
-
const parent = yield api1.patientApi.getPatientWithUser(user, user.patientId);
|
|
229
|
-
const record = yield entityCreators[type](api1, `partial-${user.id}-${type}`, user, parent, [hcpGivingAccessBack.id]);
|
|
230
|
-
yield facade.create(api1, record);
|
|
231
|
-
}), Promise.resolve());
|
|
232
|
-
return key;
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
let env;
|
|
236
|
-
let apis;
|
|
237
|
-
(0, mocha_1.describe)('Full crypto test - Creation scenarios', function () {
|
|
238
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
239
|
-
(0, mocha_1.before)(function () {
|
|
240
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
241
|
-
this.timeout(6000000);
|
|
242
|
-
const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
|
|
243
|
-
env = yield initializer.execute((0, types_1.getEnvVariables)());
|
|
244
|
-
const api = yield initMasterApi(env);
|
|
245
|
-
const user = yield api.userApi.getCurrentUser();
|
|
246
|
-
const dataOwnerId = api.dataOwnerApi.getDataOwnerIdOf(user);
|
|
247
|
-
const { userApi, patientApi, healthcarePartyApi, cryptoApi } = api;
|
|
248
|
-
delegateHcp = yield healthcarePartyApi.createHealthcareParty(new models_1.HealthcareParty({ id: (0, uuid_1.v4)(), firstName: 'test', lastName: 'test' }));
|
|
249
|
-
delegateUser = yield userApi.createUser(new models_1.User({
|
|
250
|
-
id: `user-${(0, uuid_1.v4)()}-hcp`,
|
|
251
|
-
login: `hcp-delegate-${(0, uuid_1.v4)()}`,
|
|
252
|
-
status: 'ACTIVE',
|
|
253
|
-
healthcarePartyId: delegateHcp.id,
|
|
254
|
-
}));
|
|
255
|
-
delegateHcpPassword = yield userApi.getToken(delegateUser.id, (0, uuid_1.v4)());
|
|
256
|
-
hcpGivingAccessBack = yield healthcarePartyApi.createHealthcareParty(new models_1.HealthcareParty({ id: (0, uuid_1.v4)(), firstName: 'test', lastName: 'test' }));
|
|
257
|
-
userGivingAccessBack = yield userApi.createUser(new models_1.User({
|
|
258
|
-
id: `user-${(0, uuid_1.v4)()}-hcp`,
|
|
259
|
-
login: `hcp-giving-access-back-${(0, uuid_1.v4)()}`,
|
|
260
|
-
status: 'ACTIVE',
|
|
261
|
-
healthcarePartyId: hcpGivingAccessBack.id,
|
|
262
|
-
}));
|
|
263
|
-
userGivingAccessBackPassword = yield userApi.getToken(userGivingAccessBack.id, (0, uuid_1.v4)());
|
|
264
|
-
apis = {
|
|
265
|
-
delegate: yield (0, TestApi_1.TestApi)(env.iCureUrl, delegateUser.login, delegateHcpPassword, crypto_1.webcrypto),
|
|
266
|
-
givingAccessBack: yield (0, TestApi_1.TestApi)(env.iCureUrl, userGivingAccessBack.login, userGivingAccessBackPassword, crypto_1.webcrypto),
|
|
267
|
-
};
|
|
268
|
-
yield Object.entries(userDefinitions).reduce((p_1, _a) => __awaiter(this, [p_1, _a], void 0, function* (p, [login, creationProcess]) {
|
|
269
|
-
yield p;
|
|
270
|
-
const newPatientEmail = (0, test_utils_1.getTempEmail)();
|
|
271
|
-
const patientToCreate = yield patientApi.newInstance(user, new Patient_1.Patient({ id: (0, uuid_1.v4)(), firstName: 'test', lastName: 'test' }));
|
|
272
|
-
const patient = yield patientApi.createPatientWithUser(user, patientToCreate);
|
|
273
|
-
const newHcpEmail = (0, test_utils_1.getTempEmail)();
|
|
274
|
-
const hcp = yield healthcarePartyApi.createHealthcareParty(new models_1.HealthcareParty({ id: (0, uuid_1.v4)(), firstName: 'test', lastName: 'test' }));
|
|
275
|
-
const newPatientUser = yield userApi.createUser(new models_1.User({
|
|
276
|
-
id: `user-${(0, uuid_1.v4)()}-patient`,
|
|
277
|
-
name: `patient-${login}`,
|
|
278
|
-
login: newPatientEmail,
|
|
279
|
-
email: newPatientEmail,
|
|
280
|
-
status: 'ACTIVE',
|
|
281
|
-
patientId: patient.id,
|
|
282
|
-
}));
|
|
283
|
-
const newPatientUserPassword = yield userApi.getToken(newPatientUser.id, (0, uuid_1.v4)());
|
|
284
|
-
const newHcpUser = yield userApi.createUser(new models_1.User({
|
|
285
|
-
id: `user-${(0, uuid_1.v4)()}-hcp`,
|
|
286
|
-
login: newHcpEmail,
|
|
287
|
-
email: newHcpEmail,
|
|
288
|
-
name: `hcp-${login}`,
|
|
289
|
-
status: 'ACTIVE',
|
|
290
|
-
healthcarePartyId: hcp.id,
|
|
291
|
-
}));
|
|
292
|
-
const newHcpUserPassword = yield userApi.getToken(newHcpUser.id, (0, uuid_1.v4)());
|
|
293
|
-
const originalKeyPat = yield createPartialsForPatient(facades, entities, newPatientUser, newPatientUserPassword, user, api);
|
|
294
|
-
const originalKeyHcp = yield createPartialsForHcp(facades, entities, newHcpUser, newHcpUserPassword);
|
|
295
|
-
const patDetails = yield creationProcess(newPatientUser, newPatientUserPassword, originalKeyPat);
|
|
296
|
-
const hcpDetails = yield creationProcess(newHcpUser, newHcpUserPassword, originalKeyHcp);
|
|
297
|
-
users.push({ user: patDetails.user, password: newPatientUserPassword });
|
|
298
|
-
apis[patDetails.user.name] = patDetails.apis;
|
|
299
|
-
users.push({ user: hcpDetails.user, password: newHcpUserPassword });
|
|
300
|
-
apis[hcpDetails.user.name] = hcpDetails.apis;
|
|
301
|
-
}), Promise.resolve());
|
|
302
|
-
yield users
|
|
303
|
-
.filter((it) => it.user.id.endsWith('patient'))
|
|
304
|
-
.map((it) => it.user)
|
|
305
|
-
.reduce((prev, it) => __awaiter(this, void 0, void 0, function* () {
|
|
306
|
-
yield prev;
|
|
307
|
-
const otherUsers = users.filter((u) => u.user.id.endsWith('patient') && u.user.id !== it.id).map((u) => u.user);
|
|
308
|
-
yield otherUsers.reduce((p, u) => __awaiter(this, void 0, void 0, function* () {
|
|
309
|
-
yield p;
|
|
310
|
-
const patientToShare = yield facades.Patient.get(api, it.patientId);
|
|
311
|
-
const sharedPatient = yield facades.Patient.share(api, patientToShare, u.patientId);
|
|
312
|
-
return Promise.resolve();
|
|
313
|
-
}), Promise.resolve());
|
|
314
|
-
return Promise.resolve();
|
|
315
|
-
}), Promise.resolve());
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
['patient', 'hcp'].forEach((uType) => {
|
|
319
|
-
Object.keys(userDefinitions).forEach((uId) => {
|
|
320
|
-
Object.entries(facades).forEach((f) => {
|
|
321
|
-
(0, mocha_1.it)(`Create ${f[0]} as a ${uType} with ${uId}`, function () {
|
|
322
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
323
|
-
if (f[0] === 'Patient' && uType === 'patient') {
|
|
324
|
-
this.skip();
|
|
325
|
-
}
|
|
326
|
-
const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
|
|
327
|
-
const facade = f[1];
|
|
328
|
-
const api = apis[`${uType}-${uId}`];
|
|
329
|
-
const parent = f[0] !== 'Patient'
|
|
330
|
-
? uType === 'patient'
|
|
331
|
-
? yield api.patientApi.getPatientWithUser(user, user.patientId)
|
|
332
|
-
: yield api.patientApi.getPatientWithUser(user, `${user.id}-Patient`)
|
|
333
|
-
: undefined;
|
|
334
|
-
const record = yield entities[f[0]](api, `${user.id}-${f[0]}`, user, parent);
|
|
335
|
-
const entity = yield facade.create(api, record);
|
|
336
|
-
const retrieved = yield facade.get(api, entity.id);
|
|
337
|
-
(0, chai_1.expect)(entity.id).to.be.not.null;
|
|
338
|
-
(0, chai_1.expect)(entity.rev).to.equal(retrieved.rev);
|
|
339
|
-
(0, chai_1.expect)(yield facade.isDecrypted(entity)).to.equal(true);
|
|
340
|
-
});
|
|
341
|
-
});
|
|
342
|
-
(0, mocha_1.it)(`Create ${f[0]} as delegate with delegation for ${uType} with ${uId}`, function () {
|
|
343
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
344
|
-
var _a, _b;
|
|
345
|
-
const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
|
|
346
|
-
const facade = f[1];
|
|
347
|
-
const api = apis['delegate'];
|
|
348
|
-
const patApi = apis[`${uType}-${uId}`];
|
|
349
|
-
const dataOwnerId = api.dataOwnerApi.getDataOwnerIdOf(user);
|
|
350
|
-
const dataOwner = (yield patApi.dataOwnerApi.getCryptoActorStub(dataOwnerId)).stub;
|
|
351
|
-
const parent = f[0] !== 'Patient' ? yield api.patientApi.getPatientWithUser(delegateUser, `delegate-${user.id}-Patient`) : undefined;
|
|
352
|
-
const record = yield entities[f[0]](api, `delegate-${user.id}-${f[0]}`, delegateUser, parent, [
|
|
353
|
-
((_b = (_a = user.patientId) !== null && _a !== void 0 ? _a : user.healthcarePartyId) !== null && _b !== void 0 ? _b : user.deviceId),
|
|
354
|
-
]);
|
|
355
|
-
const entity = yield facade.create(api, record);
|
|
356
|
-
const retrieved = yield facade.get(api, entity.id);
|
|
357
|
-
(0, chai_1.expect)(entity.id).to.be.not.null;
|
|
358
|
-
(0, chai_1.expect)(entity.rev).to.equal(retrieved.rev);
|
|
359
|
-
(0, chai_1.expect)(yield facade.isDecrypted(entity)).to.equal(true);
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
});
|
|
367
|
-
(0, mocha_1.describe)('Full crypto test - Read/Share scenarios', function () {
|
|
368
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
369
|
-
;
|
|
370
|
-
['patient', 'hcp'].forEach((uType) => {
|
|
371
|
-
Object.keys(userDefinitions).forEach((uId) => {
|
|
372
|
-
Object.entries(facades).forEach((f) => {
|
|
373
|
-
(0, mocha_1.it)(`Read ${f[0]} as the initial ${uType} with ${uId}`, function () {
|
|
374
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
375
|
-
if (f[0] === 'Patient' && uType === 'patient') {
|
|
376
|
-
this.skip();
|
|
377
|
-
}
|
|
378
|
-
const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
|
|
379
|
-
const facade = f[1];
|
|
380
|
-
const api = apis[`${uType}-${uId}`];
|
|
381
|
-
const retrievePromise = facade.get(api, `partial-${user.id}-${f[0]}`);
|
|
382
|
-
const lostInitialKey = uId.includes('one lost key and one available key');
|
|
383
|
-
if (uType === 'patient' && lostInitialKey && !(0, test_utils_1.isLiteTest)()) {
|
|
384
|
-
// Patient with lost key can't prove he has access to data: he will get an error
|
|
385
|
-
let gaveError = false;
|
|
386
|
-
try {
|
|
387
|
-
yield retrievePromise;
|
|
388
|
-
}
|
|
389
|
-
catch (_a) {
|
|
390
|
-
gaveError = true;
|
|
391
|
-
}
|
|
392
|
-
(0, chai_1.expect)(gaveError).to.equal(true, 'Patient with lost key should not be able to retrieve data');
|
|
393
|
-
}
|
|
394
|
-
else {
|
|
395
|
-
const entity = yield retrievePromise;
|
|
396
|
-
(0, chai_1.expect)(entity.id).to.equal(`partial-${user.id}-${f[0]}`);
|
|
397
|
-
(0, chai_1.expect)(yield facade.isDecrypted(entity)).to.equal(!lostInitialKey); // data is accessible only with initial key for this test.
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
});
|
|
401
|
-
(0, mocha_1.it)(`Read ${f[0]} as a ${uType} with ${uId}`, function () {
|
|
402
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
403
|
-
if (f[0] === 'Patient' && uType === 'patient') {
|
|
404
|
-
this.skip();
|
|
405
|
-
}
|
|
406
|
-
const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
|
|
407
|
-
const facade = f[1];
|
|
408
|
-
const api = apis[`${uType}-${uId}`];
|
|
409
|
-
const entity = yield facade.get(api, `${user.id}-${f[0]}`);
|
|
410
|
-
(0, chai_1.expect)(entity.id).to.equal(`${user.id}-${f[0]}`);
|
|
411
|
-
(0, chai_1.expect)(yield facade.isDecrypted(entity)).to.equal(true);
|
|
412
|
-
});
|
|
413
|
-
});
|
|
414
|
-
(0, mocha_1.it)(`Read ${f[0]} shared by delegate as a ${uType} with ${uId}`, () => __awaiter(this, void 0, void 0, function* () {
|
|
415
|
-
const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
|
|
416
|
-
const facade = f[1];
|
|
417
|
-
const api = apis[`${uType}-${uId}`];
|
|
418
|
-
yield api.cryptoApi.forceReload();
|
|
419
|
-
const entity = yield facade.get(api, `delegate-${user.id}-${f[0]}`);
|
|
420
|
-
(0, chai_1.expect)(entity.id).to.equal(`delegate-${user.id}-${f[0]}`);
|
|
421
|
-
(0, chai_1.expect)(yield facade.isDecrypted(entity)).to.equal(true);
|
|
422
|
-
}));
|
|
423
|
-
['patient', 'hcp'].forEach((duType) => {
|
|
424
|
-
Object.keys(userDefinitions).forEach((duId) => {
|
|
425
|
-
(0, mocha_1.it)(`Share ${f[0]} as a ${uType} with ${uId} to a ${duType} with ${duId}`, function () {
|
|
426
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
427
|
-
var _a;
|
|
428
|
-
if (f[0] === 'Patient' && uType === 'patient') {
|
|
429
|
-
this.skip();
|
|
430
|
-
}
|
|
431
|
-
const { user } = users.find((it) => it.user.name === `${uType}-${uId}`);
|
|
432
|
-
const { user: delUser } = users.find((it) => it.user.name === `${duType}-${duId}`);
|
|
433
|
-
const delegateDoId = (_a = delUser.healthcarePartyId) !== null && _a !== void 0 ? _a : delUser.patientId;
|
|
434
|
-
const facade = f[1];
|
|
435
|
-
const api = apis[`${uType}-${uId}`];
|
|
436
|
-
const delApi = apis[`${duType}-${duId}`];
|
|
437
|
-
// Data was created (in a previous test) after lost key -> fully accessible
|
|
438
|
-
const entity = yield facade.share(api, yield facade.get(api, `${user.id}-${f[0]}`), delegateDoId);
|
|
439
|
-
const retrieved = yield facade.get(api, entity.id);
|
|
440
|
-
(0, chai_1.expect)(entity.rev).to.equal(retrieved.rev);
|
|
441
|
-
yield delApi.cryptoApi.forceReload();
|
|
442
|
-
const obj = yield facade.get(delApi, `${user.id}-${f[0]}`);
|
|
443
|
-
(0, chai_1.expect)(yield delApi.cryptoApi.xapi.hasWriteAccess({ entity: obj, type: f[0] })).to.equal(true);
|
|
444
|
-
(0, chai_1.expect)(yield facade.isDecrypted(obj)).to.equal(true);
|
|
445
|
-
});
|
|
446
|
-
});
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
});
|
|
450
|
-
});
|
|
451
|
-
});
|
|
452
|
-
});
|
|
453
|
-
});
|
|
454
|
-
//# sourceMappingURL=full-crypto-test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"full-crypto-test.js","sourceRoot":"","sources":["../../../../test/icc-x-api/crypto/full-crypto-test.ts"],"names":[],"mappings":"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","sourcesContent":["import { Apis, WebCryptoPrimitives, IcureApi, ShaVersion, ua2hex } from '../../../icc-x-api'\nimport { v4 as uuid } from 'uuid'\nimport { Patient } from '../../../icc-api/model/Patient'\nimport { Contact } from '../../../icc-api/model/Contact'\nimport { HealthElement } from '../../../icc-api/model/HealthElement'\nimport { CalendarItem } from '../../../icc-api/model/CalendarItem'\nimport { EncryptedEntity, FilterChainMaintenanceTask, HealthcareParty, Service, User } from '../../../icc-api/model/models'\nimport { before, describe, it } from 'mocha'\n\nimport { webcrypto } from 'crypto'\nimport 'isomorphic-fetch'\n\nimport { expect } from 'chai'\nimport { getEnvironmentInitializer, getTempEmail, isLiteTest, setLocalStorage, TestUtils } from '../../utils/test_utils'\nimport { TestApi } from '../../utils/TestApi'\nimport { KeyPair } from '../../../icc-x-api/crypto/RSA'\nimport { CryptoPrimitives } from '../../../icc-x-api/crypto/CryptoPrimitives'\nimport { TestKeyStorage, TestStorage, testStorageWithKeys } from '../../utils/TestStorage'\nimport { TestCryptoStrategies } from '../../utils/TestCryptoStrategies'\nimport { MaintenanceTaskAfterDateFilter } from '../../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { KeyPairUpdateRequest } from '../../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport initMasterApi = TestUtils.initMasterApi\nimport { SecureDelegation } from '../../../icc-api/model/SecureDelegation'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport { EntityShareRequest } from '../../../icc-api/model/requests/EntityShareRequest'\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { fingerprintV1 } from '../../../icc-x-api/crypto/utils'\n\nsetLocalStorage(fetch)\n\nconst FULL_WRITE = RequestedPermissionEnum.FULL_WRITE\n\ntype TestedEntity = 'Patient' | 'Contact' | 'HealthElement' | 'CalendarItem'\n\ninterface EntityFacade<T extends EncryptedEntity> {\n create: (api: Apis, record: Omit<T, 'rev'>) => Promise<T>\n get: (api: Apis, id: string) => Promise<T>\n share: (api: Apis, record: T, dataOwnerId: string) => Promise<T>\n isDecrypted: (entityToCheck: T) => Promise<boolean>\n}\n\ntype EntityCreator<T> = (api: Apis, id: string, user: User, patient?: Patient, delegateIds?: string[]) => Promise<T>\n\ninterface EntityFacades {\n Patient: EntityFacade<Patient>\n Contact: EntityFacade<Contact>\n HealthElement: EntityFacade<HealthElement>\n CalendarItem: EntityFacade<CalendarItem>\n}\n\ninterface EntityCreators {\n Patient: EntityCreator<Patient>\n Contact: EntityCreator<Contact>\n HealthElement: EntityCreator<HealthElement>\n CalendarItem: EntityCreator<CalendarItem>\n}\n\nconst facades: EntityFacades = {\n Patient: {\n create: async (api, r) => api.patientApi.createPatientWithUser(await api.userApi.getCurrentUser(), r),\n get: async (api, id) => api.patientApi.getPatientWithUser(await api.userApi.getCurrentUser(), id),\n share: async (api, r, doId) => {\n return await api.patientApi.shareWith(doId, r, await api.patientApi.decryptSecretIdsOf(r), { requestedPermissions: FULL_WRITE })\n },\n isDecrypted: async (entityToCheck) => {\n return entityToCheck.note != undefined\n },\n } as EntityFacade<Patient>,\n Contact: {\n create: async (api, r) => api.contactApi.createContactWithUser(await api.userApi.getCurrentUser(), r),\n get: async (api, id) => api.contactApi.getContactWithUser(await api.userApi.getCurrentUser(), id),\n share: async (api, r, doId) => {\n return await api.contactApi.shareWith(doId, r, { requestedPermissions: FULL_WRITE })\n },\n isDecrypted: async (entityToCheck) => {\n return entityToCheck.services?.[0].content != undefined && Object.entries(entityToCheck.services?.[0].content).length > 0\n },\n } as EntityFacade<Contact>,\n HealthElement: {\n create: async (api, r) => api.healthcareElementApi.createHealthElementWithUser(await api.userApi.getCurrentUser(), r),\n get: async (api, id) => api.healthcareElementApi.getHealthElementWithUser(await api.userApi.getCurrentUser(), id),\n share: async (api, r, doId) => {\n return await api.healthcareElementApi.shareWith(doId, r, { requestedPermissions: FULL_WRITE })\n },\n isDecrypted: async (entityToCheck) => {\n return entityToCheck.descr != undefined\n },\n } as EntityFacade<HealthElement>,\n CalendarItem: {\n create: async (api, r) => api.calendarItemApi.createCalendarItemWithHcParty(await api.userApi.getCurrentUser(), r),\n get: async (api, id) => api.calendarItemApi.getCalendarItemWithUser(await api.userApi.getCurrentUser(), id),\n share: async (api, r, doId) => {\n return await api.calendarItemApi.shareWith(doId, r, { requestedPermissions: FULL_WRITE })\n },\n isDecrypted: async (entityToCheck) => {\n return entityToCheck.title != undefined\n },\n } as EntityFacade<CalendarItem>,\n}\n\nconst users: { user: User; password: string }[] = []\nconst primitives = new WebCryptoPrimitives(webcrypto as any)\nlet delegateUser: User | undefined = undefined\nlet delegateHcp: HealthcareParty | undefined = undefined\nlet delegateHcpPassword: string | undefined = undefined\n\nlet userGivingAccessBack: User | undefined = undefined\nlet userGivingAccessBackPassword: string | undefined = undefined\nlet hcpGivingAccessBack: HealthcareParty | undefined = undefined\n\nconst entities: EntityCreators = {\n Patient: ({ patientApi }, id, user, _, delegateIds) => {\n return patientApi.newInstance(user, new Patient({ id, firstName: 'test', lastName: 'test', note: 'data', dateOfBirth: 20000101 }), {\n additionalDelegates: Object.fromEntries(delegateIds?.map((id) => [id, AccessLevel.WRITE]) ?? []),\n })\n },\n Contact: ({ contactApi }, id, user, patient, delegateIds) => {\n return contactApi.newInstance(\n user,\n patient!,\n new Contact({ id, services: [new Service({ label: 'svc', content: { fr: { stringValue: 'data' } } })] }),\n {\n additionalDelegates: Object.fromEntries(delegateIds?.map((id) => [id, AccessLevel.WRITE]) ?? []),\n }\n )\n },\n HealthElement: ({ healthcareElementApi }, id, user, patient, delegateIds) => {\n return healthcareElementApi.newInstance(user, patient!, new HealthElement({ id, descr: 'HE' }), {\n additionalDelegates: Object.fromEntries(delegateIds?.map((id) => [id, AccessLevel.WRITE]) ?? []),\n })\n },\n CalendarItem: ({ calendarItemApi }, id, user, patient, delegateIds) => {\n return calendarItemApi.newInstancePatient(user, patient!, new CalendarItem({ id, title: 'CI' }), {\n additionalDelegates: Object.fromEntries(delegateIds?.map((id) => [id, AccessLevel.WRITE]) ?? []),\n })\n },\n}\n\nconst userDefinitions: Record<string, (user: User, password: string, pair: KeyPair<CryptoKey>) => Promise<{ user: User; apis: Apis }>> = {\n 'one available key and one lost key recoverable through transfer keys': async (user, password, originalKey) => {\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const apiWithOnlyNewKey = await IcureApi.initialise(\n env!.iCureUrl,\n {\n username: user.login!,\n password,\n },\n new TestCryptoStrategies(newKey, {\n [fingerprintV1(ua2hex(await primitives.RSA.exportKey(originalKey.publicKey, 'spki')))]: true,\n }),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n const apis = await IcureApi.initialise(\n env!.iCureUrl,\n {\n username: user.login!,\n password,\n },\n new TestCryptoStrategies(originalKey, {\n [fingerprintV1(ua2hex(await primitives.RSA.exportKey(newKey.publicKey, 'spki')))]: true,\n }),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n expect(Object.keys(apis.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(2)\n await apiWithOnlyNewKey.cryptoApi.forceReload()\n expect(Object.keys(apiWithOnlyNewKey.cryptoApi.userKeysManager.getDecryptionKeys())).to.have.length(2)\n return { user, apis: apiWithOnlyNewKey }\n },\n 'two available keys': async (user, password, originalKey) => {\n const newKey = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const apiWithOnlyNewKey = await IcureApi.initialise(\n env!.iCureUrl,\n { username: user.login!, password },\n new TestCryptoStrategies(newKey),\n webcrypto as any,\n fetch,\n {\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n ) // Initializes the new key for the data owner\n const keyStrings = await Promise.all(\n [originalKey, newKey].map(async (pair) => ({\n publicKey: ua2hex(await primitives.RSA.exportKey(pair.publicKey, 'spki')),\n privateKey: ua2hex(await primitives.RSA.exportKey(pair.privateKey, 'pkcs8')),\n }))\n )\n const storage = await testStorageWithKeys([\n {\n dataOwnerId: user.healthcarePartyId ?? user.patientId!,\n pairs: keyStrings.map((key) => {\n return { keyPair: key, shaVersion: ShaVersion.Sha256 }\n }),\n },\n ])\n const apis = await IcureApi.initialise(env!.iCureUrl, { username: user.login!, password }, new TestCryptoStrategies(), webcrypto as any, fetch, {\n entryKeysFactory: storage.keyFactory,\n keyStorage: storage.keyStorage,\n storage: storage.storage,\n })\n return { user, apis }\n },\n 'a single available key in old format': async (user, password, originalKey) => ({\n user,\n apis: await TestApi(env.iCureUrl, user.login!, password, webcrypto as any, originalKey),\n }),\n 'one lost key and one available key': async (user, password) => {\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const apis = await TestApi(env.iCureUrl, user.login!, password, webcrypto as any, newKeyPair)\n await apis.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(user, newKeyPair)\n return { user, apis }\n },\n 'one lost key and one upgraded available key thanks to delegate who gave access back to previous data': async (user, password) => {\n const newKeyPair = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const api = await TestApi(env.iCureUrl, user.login!, password, webcrypto as any, newKeyPair)\n await api.icureMaintenanceTaskApi.createMaintenanceTasksForNewKeypair(user, newKeyPair)\n const giveAccessBackApi = apis['givingAccessBack']\n const keyPairUpdateRequests = (\n await giveAccessBackApi.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n userGivingAccessBack!,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n date: new Date().getTime() - 100000,\n }),\n })\n )\n ).rows!.map((x) => KeyPairUpdateRequest.fromMaintenanceTask(x))\n const concernedRequest = keyPairUpdateRequests.find((x) => x.concernedDataOwnerId === (user.healthcarePartyId ?? user.patientId))\n if (!concernedRequest) throw new Error('Could not find maintenance task')\n await giveAccessBackApi.icureMaintenanceTaskApi.applyKeyPairUpdate(concernedRequest)\n\n await api.cryptoApi.forceReload()\n\n return { user, apis: api }\n },\n}\n\nasync function createPartialsForHcp(\n entityFacades: EntityFacades,\n entityCreators: EntityCreators,\n user: User,\n password: string\n): Promise<KeyPair<CryptoKey>> {\n const key = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const api1 = await TestApi(env!.iCureUrl, user.login!, password, webcrypto as any, key)\n await Object.entries(entityFacades).reduce(async (p, f) => {\n await p\n const type = f[0]\n const facade = f[1]\n const parent = type !== 'Patient' ? await api1.patientApi.getPatientWithUser(user, `partial-${user.id}-Patient`) : undefined\n const record = await entityCreators[type as TestedEntity](api1, `partial-${user.id}-${type}`, user, parent, [hcpGivingAccessBack!.id!])\n await facade.create(api1, record)\n }, Promise.resolve())\n return key\n}\n\nasync function createPartialsForPatient(\n entityFacades: EntityFacades,\n entityCreators: EntityCreators,\n user: User,\n password: string,\n patientCreatorUser: User,\n patientCreatorApis: Apis\n): Promise<KeyPair<CryptoKey>> {\n const key = await primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const api1 = await TestApi(env!.iCureUrl, user.login!, password, webcrypto as any, key)\n const pat = await patientCreatorApis.patientApi.getPatientWithUser(patientCreatorUser, user.patientId!)\n await patientCreatorApis.patientApi.shareWith(user.patientId!, pat, await patientCreatorApis.patientApi.decryptSecretIdsOf(pat), {\n requestedPermissions: FULL_WRITE,\n })\n await Object.entries(entityFacades)\n .filter((it) => it[0] !== 'Patient')\n .reduce(async (p, f) => {\n await p\n const type = f[0]\n const facade = f[1]\n const parent = await api1.patientApi.getPatientWithUser(user, user.patientId!)\n const record = await entityCreators[type as TestedEntity](api1, `partial-${user.id}-${type}`, user, parent, [hcpGivingAccessBack!.id!])\n await facade.create(api1, record)\n }, Promise.resolve())\n return key\n}\n\nlet env: TestVars\nlet apis: { [key: string]: Apis }\n\ndescribe('Full crypto test - Creation scenarios', async function () {\n before(async function () {\n this.timeout(6000000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n\n const api = await initMasterApi(env!)\n const user = await api.userApi.getCurrentUser()\n const dataOwnerId = api.dataOwnerApi.getDataOwnerIdOf(user)\n\n const { userApi, patientApi, healthcarePartyApi, cryptoApi } = api\n\n delegateHcp = await healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n delegateUser = await userApi.createUser(\n new User({\n id: `user-${uuid()}-hcp`,\n login: `hcp-delegate-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: delegateHcp.id,\n })\n )\n delegateHcpPassword = await userApi.getToken(delegateUser!.id!, uuid())\n\n hcpGivingAccessBack = await healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n userGivingAccessBack = await userApi.createUser(\n new User({\n id: `user-${uuid()}-hcp`,\n login: `hcp-giving-access-back-${uuid()}`,\n status: 'ACTIVE',\n healthcarePartyId: hcpGivingAccessBack.id,\n })\n )\n userGivingAccessBackPassword = await userApi.getToken(userGivingAccessBack!.id!, uuid())\n\n apis = {\n delegate: await TestApi(env.iCureUrl!, delegateUser.login!, delegateHcpPassword, webcrypto as any),\n givingAccessBack: await TestApi(env.iCureUrl!, userGivingAccessBack.login!, userGivingAccessBackPassword, webcrypto as any),\n }\n\n await Object.entries(userDefinitions).reduce(async (p, [login, creationProcess]) => {\n await p\n const newPatientEmail = getTempEmail()\n const patientToCreate = await patientApi.newInstance(user, new Patient({ id: uuid(), firstName: 'test', lastName: 'test' }))\n const patient = await patientApi.createPatientWithUser(user, patientToCreate)\n\n const newHcpEmail = getTempEmail()\n const hcp = await healthcarePartyApi.createHealthcareParty(new HealthcareParty({ id: uuid(), firstName: 'test', lastName: 'test' }))\n\n const newPatientUser = await userApi.createUser(\n new User({\n id: `user-${uuid()}-patient`,\n name: `patient-${login}`,\n login: newPatientEmail,\n email: newPatientEmail,\n status: 'ACTIVE',\n patientId: patient.id,\n })\n )\n const newPatientUserPassword = await userApi.getToken(newPatientUser!.id!, uuid())\n\n const newHcpUser = await userApi.createUser(\n new User({\n id: `user-${uuid()}-hcp`,\n login: newHcpEmail,\n email: newHcpEmail,\n name: `hcp-${login}`,\n status: 'ACTIVE',\n healthcarePartyId: hcp.id,\n })\n )\n const newHcpUserPassword = await userApi.getToken(newHcpUser!.id!, uuid())\n\n const originalKeyPat = await createPartialsForPatient(facades, entities, newPatientUser, newPatientUserPassword, user, api)\n const originalKeyHcp = await createPartialsForHcp(facades, entities, newHcpUser, newHcpUserPassword)\n\n const patDetails = await creationProcess(newPatientUser, newPatientUserPassword, originalKeyPat)\n const hcpDetails = await creationProcess(newHcpUser, newHcpUserPassword, originalKeyHcp)\n\n users.push({ user: patDetails.user, password: newPatientUserPassword })\n apis[patDetails.user.name!] = patDetails.apis\n users.push({ user: hcpDetails.user, password: newHcpUserPassword })\n apis[hcpDetails.user.name!] = hcpDetails.apis\n }, Promise.resolve())\n\n await users\n .filter((it) => it.user.id!.endsWith('patient'))\n .map((it) => it.user)\n .reduce(async (prev, it) => {\n await prev\n const otherUsers = users.filter((u) => u.user.id!.endsWith('patient') && u.user.id !== it.id).map((u) => u.user)\n\n await otherUsers.reduce(async (p, u) => {\n await p\n const patientToShare = await facades.Patient.get(api, it.patientId!)\n const sharedPatient = await facades.Patient.share(api, patientToShare, u.patientId!)\n return Promise.resolve()\n }, Promise.resolve())\n\n return Promise.resolve()\n }, Promise.resolve())\n })\n ;['patient', 'hcp'].forEach((uType) => {\n Object.keys(userDefinitions).forEach((uId) => {\n Object.entries(facades).forEach((f) => {\n it(`Create ${f[0]} as a ${uType} with ${uId}`, async function () {\n if (f[0] === 'Patient' && uType === 'patient') {\n this.skip()\n }\n const { user } = users.find((it) => it.user.name === `${uType}-${uId}`)!\n const facade: EntityFacade<any> = f[1]\n const api = apis[`${uType}-${uId}`]\n\n const parent =\n f[0] !== 'Patient'\n ? uType === 'patient'\n ? await api.patientApi.getPatientWithUser(user, user.patientId!)\n : await api.patientApi.getPatientWithUser(user, `${user.id}-Patient`)\n : undefined\n const record = await entities[f[0] as TestedEntity](api, `${user.id}-${f[0]}`, user, parent)\n const entity = await facade.create(api, record)\n const retrieved = await facade.get(api, entity.id)\n\n expect(entity.id).to.be.not.null\n expect(entity.rev).to.equal(retrieved.rev)\n expect(await facade.isDecrypted(entity)).to.equal(true)\n })\n it(`Create ${f[0]} as delegate with delegation for ${uType} with ${uId}`, async function () {\n const { user } = users.find((it) => it.user.name === `${uType}-${uId}`)!\n const facade: EntityFacade<any> = f[1]\n\n const api = apis['delegate']\n const patApi = apis[`${uType}-${uId}`]\n const dataOwnerId = api.dataOwnerApi.getDataOwnerIdOf(user)\n const dataOwner = (await patApi.dataOwnerApi.getCryptoActorStub(dataOwnerId))!.stub\n\n const parent = f[0] !== 'Patient' ? await api.patientApi.getPatientWithUser(delegateUser!, `delegate-${user.id}-Patient`) : undefined\n\n const record = await entities[f[0] as TestedEntity](api, `delegate-${user.id}-${f[0]}`, delegateUser!, parent, [\n (user.patientId ?? user.healthcarePartyId ?? user.deviceId)!,\n ])\n const entity = await facade.create(api, record)\n const retrieved = await facade.get(api, entity.id)\n expect(entity.id).to.be.not.null\n expect(entity.rev).to.equal(retrieved.rev)\n expect(await facade.isDecrypted(entity)).to.equal(true)\n })\n })\n })\n })\n})\n\ndescribe('Full crypto test - Read/Share scenarios', async function () {\n ;['patient', 'hcp'].forEach((uType) => {\n Object.keys(userDefinitions).forEach((uId) => {\n Object.entries(facades).forEach((f) => {\n it(`Read ${f[0]} as the initial ${uType} with ${uId}`, async function () {\n if (f[0] === 'Patient' && uType === 'patient') {\n this.skip()\n }\n const { user } = users.find((it) => it.user.name === `${uType}-${uId}`)!\n const facade = f[1]\n const api = apis[`${uType}-${uId}`]\n\n const retrievePromise = facade.get(api, `partial-${user.id}-${f[0]}`)\n const lostInitialKey = uId.includes('one lost key and one available key')\n if (uType === 'patient' && lostInitialKey && !isLiteTest()) {\n // Patient with lost key can't prove he has access to data: he will get an error\n let gaveError = false\n try {\n await retrievePromise\n } catch {\n gaveError = true\n }\n expect(gaveError).to.equal(true, 'Patient with lost key should not be able to retrieve data')\n } else {\n const entity = await retrievePromise\n expect(entity.id).to.equal(`partial-${user.id}-${f[0]}`)\n expect(await facade.isDecrypted(entity)).to.equal(!lostInitialKey) // data is accessible only with initial key for this test.\n }\n })\n it(`Read ${f[0]} as a ${uType} with ${uId}`, async function () {\n if (f[0] === 'Patient' && uType === 'patient') {\n this.skip()\n }\n const { user } = users.find((it) => it.user.name === `${uType}-${uId}`)!\n const facade = f[1]\n const api = apis[`${uType}-${uId}`]\n\n const entity = await facade.get(api, `${user.id}-${f[0]}`)\n expect(entity.id).to.equal(`${user.id}-${f[0]}`)\n expect(await facade.isDecrypted(entity)).to.equal(true)\n })\n it(`Read ${f[0]} shared by delegate as a ${uType} with ${uId}`, async () => {\n const { user } = users.find((it) => it.user.name === `${uType}-${uId}`)!\n const facade = f[1]\n const api = apis[`${uType}-${uId}`]\n await api.cryptoApi.forceReload()\n const entity = await facade.get(api, `delegate-${user.id}-${f[0]}`)\n expect(entity.id).to.equal(`delegate-${user.id}-${f[0]}`)\n expect(await facade.isDecrypted(entity)).to.equal(true)\n })\n ;['patient', 'hcp'].forEach((duType) => {\n Object.keys(userDefinitions).forEach((duId) => {\n it(`Share ${f[0]} as a ${uType} with ${uId} to a ${duType} with ${duId}`, async function () {\n if (f[0] === 'Patient' && uType === 'patient') {\n this.skip()\n }\n const { user } = users.find((it) => it.user.name === `${uType}-${uId}`)!\n const { user: delUser } = users.find((it) => it.user.name === `${duType}-${duId}`)!\n const delegateDoId = delUser.healthcarePartyId ?? delUser.patientId\n const facade = f[1]\n const api = apis[`${uType}-${uId}`]\n const delApi = apis[`${duType}-${duId}`]\n // Data was created (in a previous test) after lost key -> fully accessible\n const entity = await facade.share(api, await facade.get(api, `${user.id}-${f[0]}`), delegateDoId)\n const retrieved = await facade.get(api, entity.id)\n expect(entity.rev).to.equal(retrieved.rev)\n\n await delApi.cryptoApi.forceReload()\n const obj = await facade.get(delApi, `${user.id}-${f[0]}`)\n expect(await delApi.cryptoApi.xapi.hasWriteAccess({ entity: obj, type: f[0] as any })).to.equal(true)\n expect(await facade.isDecrypted(obj)).to.equal(true)\n })\n })\n })\n })\n })\n })\n})\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|