@icure/api 8.0.8 → 8.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/icc-api/model/models.d.ts +1 -0
  2. package/icc-api/model/models.js +1 -0
  3. package/icc-api/model/models.js.map +1 -1
  4. package/icc-x-api/crypto/BaseExchangeDataManager.js +1 -1
  5. package/icc-x-api/crypto/BaseExchangeDataManager.js.map +1 -1
  6. package/icc-x-api/crypto/BaseExchangeKeysManager.js +7 -3
  7. package/icc-x-api/crypto/BaseExchangeKeysManager.js.map +1 -1
  8. package/icc-x-api/crypto/ExchangeDataManager.js +3 -2
  9. package/icc-x-api/crypto/ExchangeDataManager.js.map +1 -1
  10. package/icc-x-api/crypto/KeyRecovery.js +6 -5
  11. package/icc-x-api/crypto/KeyRecovery.js.map +1 -1
  12. package/icc-x-api/crypto/RSA.d.ts +4 -1
  13. package/icc-x-api/crypto/RSA.js +6 -1
  14. package/icc-x-api/crypto/RSA.js.map +1 -1
  15. package/icc-x-api/crypto/SecureDelegationsManager.js +2 -1
  16. package/icc-x-api/crypto/SecureDelegationsManager.js.map +1 -1
  17. package/icc-x-api/crypto/ShamirKeysManager.js +8 -9
  18. package/icc-x-api/crypto/ShamirKeysManager.js.map +1 -1
  19. package/icc-x-api/crypto/TransferKeysManager.js +4 -3
  20. package/icc-x-api/crypto/TransferKeysManager.js.map +1 -1
  21. package/icc-x-api/crypto/UserEncryptionKeysManager.js +4 -4
  22. package/icc-x-api/crypto/UserEncryptionKeysManager.js.map +1 -1
  23. package/icc-x-api/crypto/UserSignatureKeysManager.js +9 -5
  24. package/icc-x-api/crypto/UserSignatureKeysManager.js.map +1 -1
  25. package/icc-x-api/crypto/utils.d.ts +13 -4
  26. package/icc-x-api/crypto/utils.js +27 -9
  27. package/icc-x-api/crypto/utils.js.map +1 -1
  28. package/icc-x-api/icc-accesslog-x-api.js +16 -14
  29. package/icc-x-api/icc-accesslog-x-api.js.map +1 -1
  30. package/icc-x-api/icc-calendar-item-x-api.d.ts +2 -2
  31. package/icc-x-api/icc-calendar-item-x-api.js +17 -17
  32. package/icc-x-api/icc-calendar-item-x-api.js.map +1 -1
  33. package/icc-x-api/icc-classification-x-api.js +12 -11
  34. package/icc-x-api/icc-classification-x-api.js.map +1 -1
  35. package/icc-x-api/icc-contact-x-api.d.ts +2 -2
  36. package/icc-x-api/icc-contact-x-api.js +23 -20
  37. package/icc-x-api/icc-contact-x-api.js.map +1 -1
  38. package/icc-x-api/icc-data-owner-x-api.js +1 -1
  39. package/icc-x-api/icc-data-owner-x-api.js.map +1 -1
  40. package/icc-x-api/icc-document-x-api.js +17 -16
  41. package/icc-x-api/icc-document-x-api.js.map +1 -1
  42. package/icc-x-api/icc-form-x-api.js +13 -12
  43. package/icc-x-api/icc-form-x-api.js.map +1 -1
  44. package/icc-x-api/icc-helement-x-api.js +18 -16
  45. package/icc-x-api/icc-helement-x-api.js.map +1 -1
  46. package/icc-x-api/icc-icure-maintenance-x-api.js +4 -3
  47. package/icc-x-api/icc-icure-maintenance-x-api.js.map +1 -1
  48. package/icc-x-api/icc-invoice-x-api.js +12 -11
  49. package/icc-x-api/icc-invoice-x-api.js.map +1 -1
  50. package/icc-x-api/icc-maintenance-task-x-api.js +11 -11
  51. package/icc-x-api/icc-maintenance-task-x-api.js.map +1 -1
  52. package/icc-x-api/icc-message-x-api.js +14 -14
  53. package/icc-x-api/icc-message-x-api.js.map +1 -1
  54. package/icc-x-api/icc-patient-x-api.js +28 -27
  55. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  56. package/icc-x-api/icc-receipt-x-api.js +11 -10
  57. package/icc-x-api/icc-receipt-x-api.js.map +1 -1
  58. package/icc-x-api/icc-recovery-x-api.js +3 -2
  59. package/icc-x-api/icc-recovery-x-api.js.map +1 -1
  60. package/icc-x-api/icc-time-table-x-api.js +9 -8
  61. package/icc-x-api/icc-time-table-x-api.js.map +1 -1
  62. package/icc-x-api/icc-topic-x-api.js +13 -13
  63. package/icc-x-api/icc-topic-x-api.js.map +1 -1
  64. package/icc-x-api/storage/IcureStorageFacade.js +4 -1
  65. package/icc-x-api/storage/IcureStorageFacade.js.map +1 -1
  66. package/icc-x-api/utils/EntityWithDelegationTypeName.d.ts +17 -1
  67. package/icc-x-api/utils/EntityWithDelegationTypeName.js +33 -15
  68. package/icc-x-api/utils/EntityWithDelegationTypeName.js.map +1 -1
  69. package/package.json +1 -1
  70. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +1 -0
  71. package/test/icc-api/api/IccAnonymousAccessApi.js +58 -0
  72. package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -0
  73. package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
  74. package/test/icc-api/api/IccDocumentApi.js +208 -0
  75. package/test/icc-api/api/IccDocumentApi.js.map +1 -0
  76. package/test/icc-api/api/IccGroupApi.d.ts +1 -0
  77. package/test/icc-api/api/IccGroupApi.js +50 -0
  78. package/test/icc-api/api/IccGroupApi.js.map +1 -0
  79. package/test/icc-api/api/IccRecoveryDataApi.d.ts +1 -0
  80. package/test/icc-api/api/IccRecoveryDataApi.js +95 -0
  81. package/test/icc-api/api/IccRecoveryDataApi.js.map +1 -0
  82. package/test/icc-api/api/IccRoleApi.d.ts +1 -0
  83. package/test/icc-api/api/IccRoleApi.js +34 -0
  84. package/test/icc-api/api/IccRoleApi.js.map +1 -0
  85. package/test/icc-api/api/IccUserApi.d.ts +1 -0
  86. package/test/icc-api/api/IccUserApi.js +96 -0
  87. package/test/icc-api/api/IccUserApi.js.map +1 -0
  88. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
  89. package/test/icc-api/e2e/IccCalendarItemApi.js +46 -0
  90. package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
  91. package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
  92. package/test/icc-api/model/modelHelpersTest.js +45 -0
  93. package/test/icc-api/model/modelHelpersTest.js.map +1 -0
  94. package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
  95. package/test/icc-x-api/auth/group-switch-test.js +81 -0
  96. package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
  97. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
  98. package/test/icc-x-api/auth/jwt-concurrency-test.js +113 -0
  99. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
  100. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
  101. package/test/icc-x-api/auth/smart-auth-provider-test.js +224 -0
  102. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
  103. package/test/icc-x-api/autofix-anonymity-test.d.ts +1 -0
  104. package/test/icc-x-api/autofix-anonymity-test.js +108 -0
  105. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -0
  106. package/test/icc-x-api/confidential-entities-test.d.ts +1 -0
  107. package/test/icc-x-api/confidential-entities-test.js +110 -0
  108. package/test/icc-x-api/confidential-entities-test.js.map +1 -0
  109. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +1 -0
  110. package/test/icc-x-api/crud/comprehensive-crud-test.js +276 -0
  111. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -0
  112. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +16 -0
  113. package/test/icc-x-api/crud/entities-crud-test-interface.js +422 -0
  114. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -0
  115. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +1 -0
  116. package/test/icc-x-api/crypto/anonymous-delegations-test.js +588 -0
  117. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -0
  118. package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
  119. package/test/icc-x-api/crypto/concurrency.js +35 -0
  120. package/test/icc-x-api/crypto/concurrency.js.map +1 -0
  121. package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
  122. package/test/icc-x-api/crypto/crypto-utils.js +80 -0
  123. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
  124. package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
  125. package/test/icc-x-api/crypto/cryptoTest.js +302 -0
  126. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
  127. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
  128. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +166 -0
  129. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
  130. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +1 -0
  131. package/test/icc-x-api/crypto/exchange-data-manager-test.js +690 -0
  132. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -0
  133. package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
  134. package/test/icc-x-api/crypto/full-crypto-test.js +457 -0
  135. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
  136. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +1 -0
  137. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +266 -0
  138. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -0
  139. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.d.ts +1 -0
  140. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js +393 -0
  141. package/test/icc-x-api/crypto/secure-delegations-metadata-decryptor-test.js.map +1 -0
  142. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.d.ts +1 -0
  143. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js +213 -0
  144. package/test/icc-x-api/crypto/security-metadata-decryptor-chain-test.js.map +1 -0
  145. package/test/icc-x-api/crypto/shamir.d.ts +2 -0
  146. package/test/icc-x-api/crypto/shamir.js +166 -0
  147. package/test/icc-x-api/crypto/shamir.js.map +1 -0
  148. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
  149. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +71 -0
  150. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
  151. package/test/icc-x-api/crypto/signature-keys-manager-test.d.ts +1 -0
  152. package/test/icc-x-api/crypto/signature-keys-manager-test.js +44 -0
  153. package/test/icc-x-api/crypto/signature-keys-manager-test.js.map +1 -0
  154. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +1 -0
  155. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +246 -0
  156. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -0
  157. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
  158. package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
  159. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
  160. package/test/icc-x-api/filters/filters.d.ts +1 -0
  161. package/test/icc-x-api/filters/filters.js +49 -0
  162. package/test/icc-x-api/filters/filters.js.map +1 -0
  163. package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
  164. package/test/icc-x-api/icc-accesslog-x-api.js +106 -0
  165. package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
  166. package/test/icc-x-api/icc-auth-api.d.ts +1 -0
  167. package/test/icc-x-api/icc-auth-api.js +47 -0
  168. package/test/icc-x-api/icc-auth-api.js.map +1 -0
  169. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
  170. package/test/icc-x-api/icc-calendar-item-x-api.js +150 -0
  171. package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
  172. package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
  173. package/test/icc-x-api/icc-contact-x-api.js +279 -0
  174. package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
  175. package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
  176. package/test/icc-x-api/icc-form-x-api.js +98 -0
  177. package/test/icc-x-api/icc-form-x-api.js.map +1 -0
  178. package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
  179. package/test/icc-x-api/icc-helement-x-api-test.js +153 -0
  180. package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
  181. package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
  182. package/test/icc-x-api/icc-invoice-x-api.js +99 -0
  183. package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
  184. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
  185. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +221 -0
  186. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
  187. package/test/icc-x-api/icc-message-x-api.d.ts +1 -0
  188. package/test/icc-x-api/icc-message-x-api.js +328 -0
  189. package/test/icc-x-api/icc-message-x-api.js.map +1 -0
  190. package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
  191. package/test/icc-x-api/icc-patient-x-api-test.js +158 -0
  192. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
  193. package/test/icc-x-api/icc-recovery-x-api.d.ts +1 -0
  194. package/test/icc-x-api/icc-recovery-x-api.js +170 -0
  195. package/test/icc-x-api/icc-recovery-x-api.js.map +1 -0
  196. package/test/icc-x-api/icc-time-table-x-api.d.ts +1 -0
  197. package/test/icc-x-api/icc-time-table-x-api.js +100 -0
  198. package/test/icc-x-api/icc-time-table-x-api.js.map +1 -0
  199. package/test/icc-x-api/icc-topic-x-api.d.ts +1 -0
  200. package/test/icc-x-api/icc-topic-x-api.js +269 -0
  201. package/test/icc-x-api/icc-topic-x-api.js.map +1 -0
  202. package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
  203. package/test/icc-x-api/icc-user-x-api-test.js +99 -0
  204. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
  205. package/test/icc-x-api/patient-user.d.ts +2 -0
  206. package/test/icc-x-api/patient-user.js +104 -0
  207. package/test/icc-x-api/patient-user.js.map +1 -0
  208. package/test/icc-x-api/storage/storage.d.ts +1 -0
  209. package/test/icc-x-api/storage/storage.js +48 -0
  210. package/test/icc-x-api/storage/storage.js.map +1 -0
  211. package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
  212. package/test/icc-x-api/test-api-no-parent.js +79 -0
  213. package/test/icc-x-api/test-api-no-parent.js.map +1 -0
  214. package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
  215. package/test/icc-x-api/test-legacy-data-support.js +376 -0
  216. package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
  217. package/test/icc-x-api/utils/graph-test.d.ts +1 -0
  218. package/test/icc-x-api/utils/graph-test.js +54 -0
  219. package/test/icc-x-api/utils/graph-test.js.map +1 -0
  220. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +1 -0
  221. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +364 -0
  222. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -0
  223. package/test/support/CSM-185.d.ts +1 -0
  224. package/test/support/CSM-185.js +124 -0
  225. package/test/support/CSM-185.js.map +1 -0
  226. package/test/support/CSM-243.d.ts +1 -0
  227. package/test/support/CSM-243.js +120 -0
  228. package/test/support/CSM-243.js.map +1 -0
  229. package/test/support/CSM-87.d.ts +0 -0
  230. package/test/support/CSM-87.js +21 -0
  231. package/test/support/CSM-87.js.map +1 -0
  232. package/test/support/CSM-93.d.ts +1 -0
  233. package/test/support/CSM-93.js +112 -0
  234. package/test/support/CSM-93.js.map +1 -0
  235. package/test/utils/FakeDataOwnerApi.d.ts +32 -0
  236. package/test/utils/FakeDataOwnerApi.js +136 -0
  237. package/test/utils/FakeDataOwnerApi.js.map +1 -0
  238. package/test/utils/FakeEncryptionKeysManager.d.ts +35 -0
  239. package/test/utils/FakeEncryptionKeysManager.js +87 -0
  240. package/test/utils/FakeEncryptionKeysManager.js.map +1 -0
  241. package/test/utils/FakeExchangeDataApi.d.ts +30 -0
  242. package/test/utils/FakeExchangeDataApi.js +74 -0
  243. package/test/utils/FakeExchangeDataApi.js.map +1 -0
  244. package/test/utils/FakeExchangeDataManager.d.ts +40 -0
  245. package/test/utils/FakeExchangeDataManager.js +89 -0
  246. package/test/utils/FakeExchangeDataManager.js.map +1 -0
  247. package/test/utils/FakeExchangeDataMapManager.d.ts +12 -0
  248. package/test/utils/FakeExchangeDataMapManager.js +38 -0
  249. package/test/utils/FakeExchangeDataMapManager.js.map +1 -0
  250. package/test/utils/FakeGenericApi.d.ts +16 -0
  251. package/test/utils/FakeGenericApi.js +65 -0
  252. package/test/utils/FakeGenericApi.js.map +1 -0
  253. package/test/utils/FakeSignatureKeysManager.d.ts +16 -0
  254. package/test/utils/FakeSignatureKeysManager.js +54 -0
  255. package/test/utils/FakeSignatureKeysManager.js.map +1 -0
  256. package/test/utils/TestApi.d.ts +3 -0
  257. package/test/utils/TestApi.js +30 -0
  258. package/test/utils/TestApi.js.map +1 -0
  259. package/test/utils/TestCollectionUtils.d.ts +1 -0
  260. package/test/utils/TestCollectionUtils.js +109 -0
  261. package/test/utils/TestCollectionUtils.js.map +1 -0
  262. package/test/utils/TestCryptoStrategies.d.ts +42 -0
  263. package/test/utils/TestCryptoStrategies.js +80 -0
  264. package/test/utils/TestCryptoStrategies.js.map +1 -0
  265. package/test/utils/TestStorage.d.ts +23 -0
  266. package/test/utils/TestStorage.js +61 -0
  267. package/test/utils/TestStorage.js.map +1 -0
  268. package/test/utils/test_utils.d.ts +76 -0
  269. package/test/utils/test_utils.js +419 -0
  270. package/test/utils/test_utils.js.map +1 -0
@@ -0,0 +1,120 @@
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 test_utils_1 = require("../utils/test_utils");
13
+ const crypto_1 = require("crypto");
14
+ const chai_1 = require("chai");
15
+ require("isomorphic-fetch");
16
+ const types_1 = require("@icure/test-setup/types");
17
+ (0, test_utils_1.setLocalStorage)(fetch);
18
+ const chaiAsPromised = require("chai-as-promised");
19
+ (0, chai_1.use)(chaiAsPromised);
20
+ let env;
21
+ function createMessage(api, user, props) {
22
+ var _a, _b;
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const messageBase = {
25
+ subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,
26
+ fromAddress: (_a = props.includeFromAddress) !== null && _a !== void 0 ? _a : api.cryptoApi.primitives.randomUuid(),
27
+ toAddresses: [api.cryptoApi.primitives.randomUuid(), (_b = props.includeToAddress) !== null && _b !== void 0 ? _b : api.cryptoApi.primitives.randomUuid()],
28
+ received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,
29
+ };
30
+ return yield api.messageApi.createMessage(yield api.messageApi.newInstance(user, messageBase));
31
+ });
32
+ }
33
+ function createTestMessages(api, user, propsForAccessibleMessages, propsForInaccessibleMessages) {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ const expectedMessages = [];
36
+ for (let i = 0; i < 100; i++) {
37
+ expectedMessages.push(yield createMessage(api, user, propsForAccessibleMessages));
38
+ yield createMessage(api, user, propsForInaccessibleMessages);
39
+ }
40
+ // Also creates some messages from an unrelated hcp and same from address that should not be retrieved by the test.
41
+ const { api: otherApi, user: otherUser } = yield (0, test_utils_1.createNewHcpApi)(env);
42
+ for (let i = 0; i < 100; i++) {
43
+ yield createMessage(otherApi, otherUser, propsForAccessibleMessages);
44
+ }
45
+ return expectedMessages;
46
+ });
47
+ }
48
+ function getAllPaginatedMessages(listFunction) {
49
+ var _a, _b, _c;
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ let latestRetrieved;
52
+ let allResults = [];
53
+ do {
54
+ const nextKey = (_a = latestRetrieved === null || latestRetrieved === void 0 ? void 0 : latestRetrieved.nextKeyPair) === null || _a === void 0 ? void 0 : _a.startKey;
55
+ latestRetrieved = yield listFunction(nextKey ? JSON.stringify(nextKey) : undefined, (_b = latestRetrieved === null || latestRetrieved === void 0 ? void 0 : latestRetrieved.nextKeyPair) === null || _b === void 0 ? void 0 : _b.startKeyDocId);
56
+ allResults.push(...latestRetrieved.rows);
57
+ } while (((_c = latestRetrieved === null || latestRetrieved === void 0 ? void 0 : latestRetrieved.nextKeyPair) === null || _c === void 0 ? void 0 : _c.startKey) !== undefined);
58
+ console.log(JSON.stringify(allResults.map((m) => m.received)));
59
+ return allResults;
60
+ });
61
+ }
62
+ describe('CSM-243', function () {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ before(function () {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ this.timeout(600000);
67
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
68
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
69
+ });
70
+ });
71
+ function doTestWithoutReceived(propsForAccessibleMessages, listFunction) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ const { api, user } = yield (0, test_utils_1.createNewHcpApi)(env);
74
+ const expectedMessages = yield createTestMessages(api, user, Object.assign(Object.assign({}, propsForAccessibleMessages), { includeRandomReceived: false }), { includeRandomReceived: false });
75
+ let allResults = yield getAllPaginatedMessages((nextKey, nextKeyDocId) => listFunction(api.messageApi, nextKey, nextKeyDocId, 30));
76
+ (0, chai_1.expect)(allResults.length).to.equal(expectedMessages.length);
77
+ (0, chai_1.expect)(allResults.map((m) => m.id)).to.have.members(expectedMessages.map((m) => m.id));
78
+ });
79
+ }
80
+ function doTestWithReceived(propsForAccessibleMessages, listFunction) {
81
+ return __awaiter(this, void 0, void 0, function* () {
82
+ const { api, user } = yield (0, test_utils_1.createNewHcpApi)(env);
83
+ const expectedMessagesWithReceived = yield createTestMessages(api, user, Object.assign(Object.assign({}, propsForAccessibleMessages), { includeRandomReceived: true }), { includeRandomReceived: true });
84
+ const messageWithoutReceived = yield createMessage(api, user, Object.assign(Object.assign({}, propsForAccessibleMessages), { includeRandomReceived: false }));
85
+ let allResults = yield getAllPaginatedMessages((nextKey, nextKeyDocId) => listFunction(api.messageApi, nextKey, nextKeyDocId, 30));
86
+ (0, chai_1.expect)(allResults.length).to.equal(expectedMessagesWithReceived.length + 1);
87
+ (0, chai_1.expect)(allResults.map((m) => m.id)).to.have.members([...expectedMessagesWithReceived.map((m) => m.id), messageWithoutReceived.id]);
88
+ (0, chai_1.expect)(allResults.map((m) => m.received)).to.deep.equal([
89
+ undefined,
90
+ ...expectedMessagesWithReceived.sort((a, b) => b.received - a.received).map((m) => m.received),
91
+ ]);
92
+ });
93
+ }
94
+ it('A user should be able to retrieve paginated messages without received date by fromAddress', function () {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const targetAddress = (0, crypto_1.randomUUID)();
97
+ yield doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit));
98
+ });
99
+ });
100
+ it('A user should be able to retrieve paginated messages with received date by fromAddress', function () {
101
+ return __awaiter(this, void 0, void 0, function* () {
102
+ const targetAddress = (0, crypto_1.randomUUID)();
103
+ yield doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit));
104
+ });
105
+ });
106
+ it('A user should be able to retrieve paginated messages without received date by toAddress', function () {
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ const targetAddress = (0, crypto_1.randomUUID)();
109
+ yield doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit));
110
+ });
111
+ });
112
+ it('A user should be able to retrieve paginated messages with received date by toAddress', function () {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ const targetAddress = (0, crypto_1.randomUUID)();
115
+ yield doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) => messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit));
116
+ });
117
+ });
118
+ });
119
+ });
120
+ //# sourceMappingURL=CSM-243.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSM-243.js","sourceRoot":"","sources":["../../../test/support/CSM-243.ts"],"names":[],"mappings":"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","sourcesContent":["import { createNewHcpApi, getEnvironmentInitializer, setLocalStorage } from '../utils/test_utils'\nimport { IccMessageXApi, IcureApi } from '../../icc-x-api'\nimport { randomUUID } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\n\nsetLocalStorage(fetch)\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { User } from '../../icc-api/model/User'\nimport { Message } from '../../icc-api/model/Message'\nimport { PaginatedListMessage } from '../../icc-api/model/PaginatedListMessage'\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\nasync function createMessage(\n api: IcureApi,\n user: User,\n props: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message> {\n const messageBase: Message = {\n subject: `Test message - ${api.cryptoApi.primitives.randomUuid()}`,\n fromAddress: props.includeFromAddress ?? api.cryptoApi.primitives.randomUuid(),\n toAddresses: [api.cryptoApi.primitives.randomUuid(), props.includeToAddress ?? api.cryptoApi.primitives.randomUuid()],\n received: props.includeRandomReceived ? Math.floor(Math.random() * 1000000) : undefined,\n }\n return await api.messageApi.createMessage(await api.messageApi.newInstance(user, messageBase))\n}\n\nasync function createTestMessages(\n api: IcureApi,\n user: User,\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n },\n propsForInaccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n includeRandomReceived: boolean\n }\n): Promise<Message[]> {\n const expectedMessages: Message[] = []\n for (let i = 0; i < 100; i++) {\n expectedMessages.push(await createMessage(api, user, propsForAccessibleMessages))\n await createMessage(api, user, propsForInaccessibleMessages)\n }\n // Also creates some messages from an unrelated hcp and same from address that should not be retrieved by the test.\n const { api: otherApi, user: otherUser } = await createNewHcpApi(env)\n for (let i = 0; i < 100; i++) {\n await createMessage(otherApi, otherUser, propsForAccessibleMessages)\n }\n return expectedMessages\n}\n\nasync function getAllPaginatedMessages(listFunction: (nextKey?: string, nextKeyDocId?: string) => Promise<PaginatedListMessage>): Promise<Message[]> {\n let latestRetrieved: PaginatedListMessage | undefined\n let allResults: Message[] = []\n do {\n const nextKey = latestRetrieved?.nextKeyPair?.startKey\n latestRetrieved = await listFunction(nextKey ? JSON.stringify(nextKey) : undefined, latestRetrieved?.nextKeyPair?.startKeyDocId)\n allResults.push(...latestRetrieved.rows!)\n } while (latestRetrieved?.nextKeyPair?.startKey !== undefined)\n console.log(JSON.stringify(allResults.map((m) => m.received)))\n return allResults\n}\n\ndescribe('CSM-243', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n async function doTestWithoutReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessages: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: false },\n { includeRandomReceived: false }\n )\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessages.length)\n expect(allResults.map((m) => m.id)).to.have.members(expectedMessages.map((m) => m.id))\n }\n\n async function doTestWithReceived(\n propsForAccessibleMessages: {\n includeToAddress?: string\n includeFromAddress?: string\n },\n listFunction: (\n messageApi: IccMessageXApi,\n nextKey: string | undefined,\n nextKeyDocId: string | undefined,\n limit: number\n ) => Promise<PaginatedListMessage>\n ) {\n const { api, user } = await createNewHcpApi(env)\n const expectedMessagesWithReceived: Message[] = await createTestMessages(\n api,\n user,\n { ...propsForAccessibleMessages, includeRandomReceived: true },\n { includeRandomReceived: true }\n )\n const messageWithoutReceived = await createMessage(api, user, { ...propsForAccessibleMessages, includeRandomReceived: false })\n let allResults: Message[] = await getAllPaginatedMessages((nextKey?: string, nextKeyDocId?: string) =>\n listFunction(api.messageApi, nextKey, nextKeyDocId, 30)\n )\n expect(allResults.length).to.equal(expectedMessagesWithReceived.length + 1)\n expect(allResults.map((m) => m.id)).to.have.members([...expectedMessagesWithReceived.map((m) => m.id), messageWithoutReceived.id!])\n expect(allResults.map((m) => m.received)).to.deep.equal([\n undefined,\n ...expectedMessagesWithReceived.sort((a, b) => b.received! - a.received!).map((m) => m.received),\n ])\n }\n it('A user should be able to retrieve paginated messages without received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by fromAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeFromAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByFromAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages without received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithoutReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n\n it('A user should be able to retrieve paginated messages with received date by toAddress', async function () {\n const targetAddress = randomUUID()\n await doTestWithReceived({ includeToAddress: targetAddress }, (messageApi, nextKey, nextKeyDocId, limit) =>\n messageApi.findMessagesByToAddress(targetAddress, nextKey, nextKeyDocId, limit)\n )\n })\n})\n"]}
File without changes
@@ -0,0 +1,21 @@
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
+ describe('CSM-87', function () {
12
+ return __awaiter(this, void 0, void 0, function* () {
13
+ it('An hcp should be able to load his key with `loadKeyPairsAsJwkInBrowserLocalStorage` and then create shamir partitions for himself', function () {
14
+ return __awaiter(this, void 0, void 0, function* () {
15
+ // This test does not apply to v7 or higher: it was a bug related to a specific method
16
+ this.skip();
17
+ });
18
+ });
19
+ });
20
+ });
21
+ //# sourceMappingURL=CSM-87.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSM-87.js","sourceRoot":"","sources":["../../../test/support/CSM-87.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,QAAQ,CAAC,QAAQ,EAAE;;QACjB,EAAE,CAAC,mIAAmI,EAAE;;gBACtI,sFAAsF;gBACtF,IAAI,CAAC,IAAI,EAAE,CAAA;YACb,CAAC;SAAA,CAAC,CAAA;IACJ,CAAC;CAAA,CAAC,CAAA","sourcesContent":["describe('CSM-87', async function () {\n it('An hcp should be able to load his key with `loadKeyPairsAsJwkInBrowserLocalStorage` and then create shamir partitions for himself', async function () {\n // This test does not apply to v7 or higher: it was a bug related to a specific method\n this.skip()\n })\n})\n"]}
@@ -0,0 +1 @@
1
+ import 'isomorphic-fetch';
@@ -0,0 +1,112 @@
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 test_utils_1 = require("../utils/test_utils");
13
+ const icc_x_api_1 = require("../../icc-x-api");
14
+ const crypto_1 = require("crypto");
15
+ const chai_1 = require("chai");
16
+ require("isomorphic-fetch");
17
+ const FilterChainMaintenanceTask_1 = require("../../icc-api/model/FilterChainMaintenanceTask");
18
+ const MaintenanceTaskAfterDateFilter_1 = require("../../icc-x-api/filters/MaintenanceTaskAfterDateFilter");
19
+ const Service_1 = require("../../icc-api/model/Service");
20
+ const types_1 = require("@icure/test-setup/types");
21
+ const TestCryptoStrategies_1 = require("../utils/TestCryptoStrategies");
22
+ const KeyPairUpdateRequest_1 = require("../../icc-x-api/maintenance/KeyPairUpdateRequest");
23
+ const chaiAsPromised = require("chai-as-promised");
24
+ const TestStorage_1 = require("../utils/TestStorage");
25
+ var initApi = test_utils_1.TestUtils.initApi;
26
+ (0, test_utils_1.setLocalStorage)(fetch);
27
+ (0, chai_1.use)(chaiAsPromised);
28
+ let env;
29
+ describe('CSM-93', function () {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ before(function () {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ this.timeout(600000);
34
+ const initializer = yield (0, test_utils_1.getEnvironmentInitializer)();
35
+ env = yield initializer.execute((0, types_1.getEnvVariables)());
36
+ });
37
+ });
38
+ it('A patient should be able retrieve existing data after give access back', function () {
39
+ var _a;
40
+ return __awaiter(this, void 0, void 0, function* () {
41
+ const hcpApis = yield initApi(env, test_utils_1.hcp1Username);
42
+ const hcpUser = yield hcpApis.userApi.getCurrentUser();
43
+ const patApis = yield initApi(env, test_utils_1.patUsername);
44
+ const patUser = yield patApis.userApi.getCurrentUser();
45
+ const patientNote = 'Some secret note';
46
+ const p2 = yield hcpApis.patientApi.createPatientWithUser(hcpUser, yield hcpApis.patientApi.newInstance(hcpUser, {
47
+ firstName: 'John',
48
+ lastName: 'Doe',
49
+ note: patientNote,
50
+ }, { additionalDelegates: { [patUser.patientId]: 'WRITE' } }));
51
+ yield patApis.cryptoApi.forceReload();
52
+ const heNote = 'Another secret note';
53
+ const he = yield patApis.healthcareElementApi.createHealthElementWithUser(patUser, yield patApis.healthcareElementApi.newInstance(patUser, p2, { note: heNote }, { additionalDelegates: { [hcpUser.healthcarePartyId]: 'WRITE' } }));
54
+ const ctcData = 'Some data';
55
+ const ctcDescr = 'Some description';
56
+ const ctc = yield hcpApis.contactApi.createContactWithUser(hcpUser, yield hcpApis.contactApi.newInstance(hcpUser, p2, {
57
+ services: [new Service_1.Service({ label: 'svc', content: { fr: { stringValue: ctcData } } })],
58
+ descr: ctcDescr,
59
+ }, { additionalDelegates: { [patUser.patientId]: 'WRITE' } }));
60
+ function checkContactDecrypted(ctc) {
61
+ var _a, _b, _c, _d;
62
+ (0, chai_1.expect)((_d = (_c = (_b = (_a = ctc.services) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.content) === null || _c === void 0 ? void 0 : _c.fr) === null || _d === void 0 ? void 0 : _d.stringValue).to.equal(ctcData);
63
+ (0, chai_1.expect)(ctc.descr).to.equal(ctcDescr);
64
+ }
65
+ function checkContactEncrypted(ctc) {
66
+ var _a, _b;
67
+ (0, chai_1.expect)((_a = ctc.services) === null || _a === void 0 ? void 0 : _a[0]).to.not.be.undefined;
68
+ (0, chai_1.expect)(Object.keys((_b = ctc.services[0].content) !== null && _b !== void 0 ? _b : {})).to.be.empty;
69
+ (0, chai_1.expect)(ctc.descr).to.be.undefined;
70
+ }
71
+ (0, chai_1.expect)((yield hcpApis.patientApi.getPatientWithUser(hcpUser, p2.id)).note).to.equal(patientNote);
72
+ (0, chai_1.expect)((yield patApis.patientApi.getPatientWithUser(patUser, p2.id)).note).to.equal(patientNote);
73
+ (0, chai_1.expect)((yield hcpApis.healthcareElementApi.getHealthElementWithUser(hcpUser, he.id)).note).to.equal(heNote);
74
+ (0, chai_1.expect)((yield patApis.healthcareElementApi.getHealthElementWithUser(patUser, he.id)).note).to.equal(heNote);
75
+ checkContactDecrypted(yield hcpApis.contactApi.getContactWithUser(hcpUser, ctc.id));
76
+ checkContactDecrypted(yield patApis.contactApi.getContactWithUser(patUser, ctc.id));
77
+ const startTimestamp = new Date().getTime();
78
+ const newPair = yield patApis.cryptoApi.primitives.RSA.generateKeyPair(icc_x_api_1.ShaVersion.Sha256);
79
+ const patApisLost = yield icc_x_api_1.IcureApi.initialise(env.iCureUrl, { username: env.dataOwnerDetails[test_utils_1.patUsername].user, password: env.dataOwnerDetails[test_utils_1.patUsername].password }, new TestCryptoStrategies_1.TestCryptoStrategies(newPair), crypto_1.webcrypto, fetch, {
80
+ createMaintenanceTasksOnNewKey: true,
81
+ storage: new TestStorage_1.TestStorage(),
82
+ keyStorage: new TestStorage_1.TestKeyStorage(),
83
+ });
84
+ if (!(0, test_utils_1.isLiteTest)()) {
85
+ yield (0, chai_1.expect)(patApisLost.patientApi.getPatientWithUser(patUser, p2.id)).to.be.rejected;
86
+ yield (0, chai_1.expect)(patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id)).to.be.rejected;
87
+ yield (0, chai_1.expect)(patApisLost.contactApi.getContactWithUser(patUser, ctc.id)).to.be.rejected;
88
+ }
89
+ // The patient had to create a new aes exchange key to share the maintenance task with the hcp:
90
+ // If you don't clear the cache of the hcp he will not be able to decrypt the maintenance task
91
+ yield hcpApis.cryptoApi.forceReload();
92
+ const foundTasks = (_a = (yield hcpApis.maintenanceTaskApi.filterMaintenanceTasksByWithUser(hcpUser, undefined, undefined, new FilterChainMaintenanceTask_1.FilterChainMaintenanceTask({
93
+ filter: new MaintenanceTaskAfterDateFilter_1.MaintenanceTaskAfterDateFilter({
94
+ healthcarePartyId: hcpUser.healthcarePartyId,
95
+ date: startTimestamp - 1,
96
+ }),
97
+ }))).rows) !== null && _a !== void 0 ? _a : [];
98
+ (0, chai_1.expect)(foundTasks.length).to.equal(1);
99
+ const task = KeyPairUpdateRequest_1.KeyPairUpdateRequest.fromMaintenanceTask(foundTasks[0]);
100
+ (0, chai_1.expect)(task.concernedDataOwnerId).to.equal(patUser.patientId);
101
+ (0, chai_1.expect)(task.newPublicKey).to.equal((0, icc_x_api_1.ua2hex)(yield hcpApis.cryptoApi.primitives.RSA.exportKey(newPair.publicKey, 'spki')));
102
+ yield hcpApis.icureMaintenanceTaskApi.applyKeyPairUpdate(task);
103
+ // Clear the caches to ensure the user uses the latest version of the exchange keys with the 'give access back' data
104
+ yield patApisLost.cryptoApi.forceReload();
105
+ (0, chai_1.expect)((yield patApisLost.patientApi.getPatientWithUser(patUser, p2.id)).note).to.equal(patientNote);
106
+ (0, chai_1.expect)((yield patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id)).note).to.equal(heNote);
107
+ checkContactDecrypted(yield patApisLost.contactApi.getContactWithUser(patUser, ctc.id));
108
+ });
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=CSM-93.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSM-93.js","sourceRoot":"","sources":["../../../test/support/CSM-93.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEnvironmentInitializer, hcp1Username, isLiteTest, patUsername, setLocalStorage, TestUtils } from '../utils/test_utils'\nimport { IcureApi, ShaVersion, ua2hex } from '../../icc-x-api'\nimport { webcrypto } from 'crypto'\nimport { expect, use as chaiUse } from 'chai'\nimport 'isomorphic-fetch'\nimport { FilterChainMaintenanceTask } from '../../icc-api/model/FilterChainMaintenanceTask'\nimport { MaintenanceTask } from '../../icc-api/model/MaintenanceTask'\nimport { MaintenanceTaskAfterDateFilter } from '../../icc-x-api/filters/MaintenanceTaskAfterDateFilter'\nimport { Service } from '../../icc-api/model/Service'\nimport { Contact } from '../../icc-api/model/Contact'\nimport { getEnvVariables, TestVars } from '@icure/test-setup/types'\nimport { TestCryptoStrategies } from '../utils/TestCryptoStrategies'\nimport { KeyPairUpdateRequest } from '../../icc-x-api/maintenance/KeyPairUpdateRequest'\nimport * as chaiAsPromised from 'chai-as-promised'\nimport { TestKeyStorage, TestStorage } from '../utils/TestStorage'\nimport initApi = TestUtils.initApi\n\nsetLocalStorage(fetch)\nchaiUse(chaiAsPromised)\n\nlet env: TestVars\n\ndescribe('CSM-93', async function () {\n before(async function () {\n this.timeout(600000)\n const initializer = await getEnvironmentInitializer()\n env = await initializer.execute(getEnvVariables())\n })\n\n it('A patient should be able retrieve existing data after give access back', async function () {\n const hcpApis = await initApi(env, hcp1Username)\n const hcpUser = await hcpApis.userApi.getCurrentUser()\n const patApis = await initApi(env, patUsername)\n const patUser = await patApis.userApi.getCurrentUser()\n const patientNote = 'Some secret note'\n const p2 = await hcpApis.patientApi.createPatientWithUser(\n hcpUser,\n await hcpApis.patientApi.newInstance(\n hcpUser,\n {\n firstName: 'John',\n lastName: 'Doe',\n note: patientNote,\n },\n { additionalDelegates: { [patUser.patientId!]: 'WRITE' } }\n )\n )\n await patApis.cryptoApi.forceReload()\n const heNote = 'Another secret note'\n const he = await patApis.healthcareElementApi.createHealthElementWithUser(\n patUser,\n await patApis.healthcareElementApi.newInstance(\n patUser,\n p2,\n { note: heNote },\n { additionalDelegates: { [hcpUser.healthcarePartyId!]: 'WRITE' } }\n )\n )\n const ctcData = 'Some data'\n const ctcDescr = 'Some description'\n const ctc = await hcpApis.contactApi.createContactWithUser(\n hcpUser,\n await hcpApis.contactApi.newInstance(\n hcpUser,\n p2,\n {\n services: [new Service({ label: 'svc', content: { fr: { stringValue: ctcData } } })],\n descr: ctcDescr,\n },\n { additionalDelegates: { [patUser.patientId!]: 'WRITE' } }\n )\n )\n function checkContactDecrypted(ctc: Contact) {\n expect(ctc.services?.[0]?.content?.fr?.stringValue).to.equal(ctcData)\n expect(ctc.descr).to.equal(ctcDescr)\n }\n function checkContactEncrypted(ctc: Contact) {\n expect(ctc.services?.[0]).to.not.be.undefined\n expect(Object.keys(ctc.services![0].content ?? {})).to.be.empty\n expect(ctc.descr).to.be.undefined\n }\n expect((await hcpApis.patientApi.getPatientWithUser(hcpUser, p2.id!)).note).to.equal(patientNote)\n expect((await patApis.patientApi.getPatientWithUser(patUser, p2.id!)).note).to.equal(patientNote)\n expect((await hcpApis.healthcareElementApi.getHealthElementWithUser(hcpUser, he.id!)).note).to.equal(heNote)\n expect((await patApis.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).note).to.equal(heNote)\n checkContactDecrypted(await hcpApis.contactApi.getContactWithUser(hcpUser, ctc!.id!))\n checkContactDecrypted(await patApis.contactApi.getContactWithUser(patUser, ctc!.id!))\n const startTimestamp = new Date().getTime()\n const newPair = await patApis.cryptoApi.primitives.RSA.generateKeyPair(ShaVersion.Sha256)\n const patApisLost = await IcureApi.initialise(\n env.iCureUrl,\n { username: env.dataOwnerDetails[patUsername].user, password: env.dataOwnerDetails[patUsername].password },\n new TestCryptoStrategies(newPair),\n webcrypto as any,\n fetch,\n {\n createMaintenanceTasksOnNewKey: true,\n storage: new TestStorage(),\n keyStorage: new TestKeyStorage(),\n }\n )\n if (!isLiteTest()) {\n await expect(patApisLost.patientApi.getPatientWithUser(patUser, p2.id!)).to.be.rejected\n await expect(patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).to.be.rejected\n await expect(patApisLost.contactApi.getContactWithUser(patUser, ctc!.id!)).to.be.rejected\n }\n // The patient had to create a new aes exchange key to share the maintenance task with the hcp:\n // If you don't clear the cache of the hcp he will not be able to decrypt the maintenance task\n await hcpApis.cryptoApi.forceReload()\n const foundTasks =\n (\n await hcpApis.maintenanceTaskApi.filterMaintenanceTasksByWithUser(\n hcpUser,\n undefined,\n undefined,\n new FilterChainMaintenanceTask({\n filter: new MaintenanceTaskAfterDateFilter({\n healthcarePartyId: hcpUser.healthcarePartyId!,\n date: startTimestamp - 1,\n }),\n })\n )\n ).rows ?? []\n expect(foundTasks.length).to.equal(1)\n const task = KeyPairUpdateRequest.fromMaintenanceTask(foundTasks[0] as MaintenanceTask)\n expect(task.concernedDataOwnerId).to.equal(patUser.patientId)\n expect(task.newPublicKey).to.equal(ua2hex(await hcpApis.cryptoApi.primitives.RSA.exportKey(newPair.publicKey, 'spki')))\n await hcpApis.icureMaintenanceTaskApi.applyKeyPairUpdate(task)\n // Clear the caches to ensure the user uses the latest version of the exchange keys with the 'give access back' data\n await patApisLost.cryptoApi.forceReload()\n expect((await patApisLost.patientApi.getPatientWithUser(patUser, p2.id!)).note).to.equal(patientNote)\n expect((await patApisLost.healthcareElementApi.getHealthElementWithUser(patUser, he.id!)).note).to.equal(heNote)\n checkContactDecrypted(await patApisLost.contactApi.getContactWithUser(patUser, ctc!.id!))\n })\n})\n"]}
@@ -0,0 +1,32 @@
1
+ import { DataOwner, DataOwnerOrStub, IccDataOwnerXApi } from '../../icc-x-api/icc-data-owner-x-api';
2
+ import { KeyPair } from '../../icc-x-api/crypto/RSA';
3
+ import { DataOwnerTypeEnum } from '../../icc-api/model/DataOwnerTypeEnum';
4
+ import { DataOwnerWithType } from '../../icc-api/model/DataOwnerWithType';
5
+ import { CryptoActorStubWithType } from '../../icc-api/model/CryptoActorStub';
6
+ import { User } from '../../icc-api/model/User';
7
+ export declare class FakeDataOwnerApi extends IccDataOwnerXApi {
8
+ private readonly selfId;
9
+ private readonly data;
10
+ private readonly primitives;
11
+ constructor(self: DataOwner & {
12
+ type: DataOwnerTypeEnum;
13
+ }, others?: (DataOwner & {
14
+ type: DataOwnerTypeEnum;
15
+ })[]);
16
+ getCurrentDataOwnerId(): Promise<string>;
17
+ getCurrentDataOwnerHierarchyIds(): Promise<string[]>;
18
+ getCurrentDataOwnerHierarchyIdsFrom(parentId: string): Promise<string[]>;
19
+ getCurrentDataOwner(): Promise<DataOwnerWithType>;
20
+ getCurrentDataOwnerHierarchy(): Promise<DataOwnerWithType[]>;
21
+ getCurrentDataOwnerType(): Promise<DataOwnerTypeEnum>;
22
+ getHexPublicKeysWithSha1Of(dataOwner: DataOwnerOrStub): Set<string>;
23
+ getHexPublicKeysWithSha256Of(dataOwner: DataOwnerOrStub): Set<string>;
24
+ getCurrentDataOwnerStub(): Promise<CryptoActorStubWithType>;
25
+ getDataOwnerIdOf(user: User): string;
26
+ getDataOwner(ownerId: string): Promise<DataOwnerWithType>;
27
+ clearCurrentDataOwnerIdsCache(): void;
28
+ modifyCryptoActorStub(stub: CryptoActorStubWithType): Promise<CryptoActorStubWithType>;
29
+ getCryptoActorStub(ownerId: string): Promise<CryptoActorStubWithType>;
30
+ addPublicKeyForOwner(dataOwnerId: string, keyPair: KeyPair<CryptoKey>): Promise<void>;
31
+ private mapObject;
32
+ }
@@ -0,0 +1,136 @@
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
+ exports.FakeDataOwnerApi = void 0;
13
+ const icc_data_owner_x_api_1 = require("../../icc-x-api/icc-data-owner-x-api");
14
+ const FakeGenericApi_1 = require("./FakeGenericApi");
15
+ const CryptoPrimitives_1 = require("../../icc-x-api/crypto/CryptoPrimitives");
16
+ const crypto_1 = require("crypto");
17
+ const icc_x_api_1 = require("../../icc-x-api");
18
+ const DataOwnerTypeEnum_1 = require("../../icc-api/model/DataOwnerTypeEnum");
19
+ const CryptoActorStub_1 = require("../../icc-api/model/CryptoActorStub");
20
+ class FakeDataOwnerApi extends icc_data_owner_x_api_1.IccDataOwnerXApi {
21
+ constructor(self, others = []) {
22
+ super('fake', {}, null, null);
23
+ this.data = new FakeGenericApi_1.FakeGenericApi();
24
+ this.primitives = new CryptoPrimitives_1.CryptoPrimitives(crypto_1.webcrypto);
25
+ this.selfId = self.id;
26
+ this.data.createObject(self);
27
+ others.forEach((x) => this.data.createObject(x));
28
+ }
29
+ getCurrentDataOwnerId() {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ return this.selfId;
32
+ });
33
+ }
34
+ getCurrentDataOwnerHierarchyIds() {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ let res = [this.selfId];
37
+ let latestCheck = this.data.getById(this.selfId);
38
+ while (latestCheck && latestCheck.parentId) {
39
+ const currId = latestCheck.parentId;
40
+ latestCheck = this.data.getById(currId);
41
+ res = [currId, ...res];
42
+ }
43
+ return res;
44
+ });
45
+ }
46
+ getCurrentDataOwnerHierarchyIdsFrom(parentId) {
47
+ return __awaiter(this, void 0, void 0, function* () {
48
+ const res = [];
49
+ for (const dataOwnerId of yield this.getCurrentDataOwnerHierarchyIds()) {
50
+ res.push(dataOwnerId);
51
+ if (dataOwnerId === parentId)
52
+ return res;
53
+ }
54
+ throw new Error(`${parentId} is not part of the data owner hierarchy for the current user`);
55
+ });
56
+ }
57
+ getCurrentDataOwner() {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ return this.mapObject(this.data.getById(this.selfId));
60
+ });
61
+ }
62
+ getCurrentDataOwnerHierarchy() {
63
+ return __awaiter(this, void 0, void 0, function* () {
64
+ return (yield this.getCurrentDataOwnerHierarchyIds()).map((id) => this.mapObject(this.data.getById(id)));
65
+ });
66
+ }
67
+ getCurrentDataOwnerType() {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ return this.data.getById(this.selfId).type;
70
+ });
71
+ }
72
+ getHexPublicKeysWithSha1Of(dataOwner) {
73
+ return super.getHexPublicKeysWithSha1Of(dataOwner);
74
+ }
75
+ getHexPublicKeysWithSha256Of(dataOwner) {
76
+ return super.getHexPublicKeysWithSha256Of(dataOwner);
77
+ }
78
+ getCurrentDataOwnerStub() {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ return CryptoActorStub_1.CryptoActorStubWithType.fromDataOwner(yield this.getCurrentDataOwner());
81
+ });
82
+ }
83
+ getDataOwnerIdOf(user) {
84
+ return super.getDataOwnerIdOf(user);
85
+ }
86
+ getDataOwner(ownerId) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ return this.mapObject(this.data.getById(ownerId));
89
+ });
90
+ }
91
+ clearCurrentDataOwnerIdsCache() {
92
+ super.clearCurrentDataOwnerIdsCache();
93
+ }
94
+ modifyCryptoActorStub(stub) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const existing = this.data.getById(stub.stub.id);
97
+ if (!existing)
98
+ throw new Error('Data owner not found.');
99
+ if (existing.type !== stub.type)
100
+ throw new Error('Unexpected type for data owner.');
101
+ return CryptoActorStub_1.CryptoActorStubWithType.fromDataOwner(this.mapObject(this.data.modifyObject(Object.assign(Object.assign({}, existing), stub.stub))));
102
+ });
103
+ }
104
+ getCryptoActorStub(ownerId) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ return CryptoActorStub_1.CryptoActorStubWithType.fromDataOwner(yield this.getDataOwner(ownerId));
107
+ });
108
+ }
109
+ addPublicKeyForOwner(dataOwnerId, keyPair) {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ const retrieved = yield this.getCryptoActorStub(dataOwnerId);
112
+ const publicHex = (0, icc_x_api_1.ua2hex)(yield this.primitives.RSA.exportKey(keyPair.publicKey, 'spki'));
113
+ yield this.modifyCryptoActorStub({
114
+ type: retrieved.type,
115
+ stub: Object.assign(Object.assign({}, retrieved.stub), { publicKeysForOaepWithSha256: [...(retrieved.stub.publicKeysForOaepWithSha256 || []), publicHex] }),
116
+ });
117
+ });
118
+ }
119
+ mapObject(x) {
120
+ const type = x.type;
121
+ delete x.type;
122
+ if (type === DataOwnerTypeEnum_1.DataOwnerTypeEnum.Patient) {
123
+ return { type, dataOwner: x };
124
+ }
125
+ else if (type === DataOwnerTypeEnum_1.DataOwnerTypeEnum.Device) {
126
+ return { type, dataOwner: x };
127
+ }
128
+ else if (type === DataOwnerTypeEnum_1.DataOwnerTypeEnum.Hcp) {
129
+ return { type, dataOwner: x };
130
+ }
131
+ else
132
+ throw new Error('Unexpected type for data owner.');
133
+ }
134
+ }
135
+ exports.FakeDataOwnerApi = FakeDataOwnerApi;
136
+ //# sourceMappingURL=FakeDataOwnerApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FakeDataOwnerApi.js","sourceRoot":"","sources":["../../../test/utils/FakeDataOwnerApi.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataOwner, DataOwnerOrStub, IccDataOwnerXApi } from '../../icc-x-api/icc-data-owner-x-api'\nimport { FakeGenericApi } from './FakeGenericApi'\nimport { Patient } from '../../icc-api/model/Patient'\nimport { Device } from '../../icc-api/model/Device'\nimport { HealthcareParty } from '../../icc-api/model/HealthcareParty'\nimport { KeyPair } from '../../icc-x-api/crypto/RSA'\nimport { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives'\nimport { webcrypto } from 'crypto'\nimport { ua2hex } from '../../icc-x-api'\nimport { DataOwnerTypeEnum } from '../../icc-api/model/DataOwnerTypeEnum'\nimport { DataOwnerWithType } from '../../icc-api/model/DataOwnerWithType'\nimport { CryptoActorStubWithType } from '../../icc-api/model/CryptoActorStub'\nimport { User } from '../../icc-api/model/User'\n\nexport class FakeDataOwnerApi extends IccDataOwnerXApi {\n private readonly selfId: string\n private readonly data = new FakeGenericApi<DataOwner & { type: DataOwnerTypeEnum }>()\n private readonly primitives = new CryptoPrimitives(webcrypto as any)\n\n constructor(self: DataOwner & { type: DataOwnerTypeEnum }, others: (DataOwner & { type: DataOwnerTypeEnum })[] = []) {\n super('fake', {}, null as any, null as any)\n this.selfId = self.id!\n this.data.createObject(self)\n others.forEach((x) => this.data.createObject(x))\n }\n\n async getCurrentDataOwnerId(): Promise<string> {\n return this.selfId\n }\n\n async getCurrentDataOwnerHierarchyIds(): Promise<string[]> {\n let res = [this.selfId]\n let latestCheck = this.data.getById(this.selfId)\n while (latestCheck && (latestCheck as any).parentId) {\n const currId: string = (latestCheck as any).parentId\n latestCheck = this.data.getById(currId)!\n res = [currId, ...res]\n }\n return res\n }\n\n async getCurrentDataOwnerHierarchyIdsFrom(parentId: string): Promise<string[]> {\n const res = []\n for (const dataOwnerId of await this.getCurrentDataOwnerHierarchyIds()) {\n res.push(dataOwnerId)\n if (dataOwnerId === parentId) return res\n }\n throw new Error(`${parentId} is not part of the data owner hierarchy for the current user`)\n }\n\n async getCurrentDataOwner(): Promise<DataOwnerWithType> {\n return this.mapObject(this.data.getById(this.selfId)!)\n }\n\n async getCurrentDataOwnerHierarchy(): Promise<DataOwnerWithType[]> {\n return (await this.getCurrentDataOwnerHierarchyIds()).map((id) => this.mapObject(this.data.getById(id)!))\n }\n\n async getCurrentDataOwnerType(): Promise<DataOwnerTypeEnum> {\n return this.data.getById(this.selfId)!.type\n }\n\n getHexPublicKeysWithSha1Of(dataOwner: DataOwnerOrStub): Set<string> {\n return super.getHexPublicKeysWithSha1Of(dataOwner)\n }\n\n getHexPublicKeysWithSha256Of(dataOwner: DataOwnerOrStub): Set<string> {\n return super.getHexPublicKeysWithSha256Of(dataOwner)\n }\n\n async getCurrentDataOwnerStub(): Promise<CryptoActorStubWithType> {\n return CryptoActorStubWithType.fromDataOwner(await this.getCurrentDataOwner())\n }\n\n getDataOwnerIdOf(user: User): string {\n return super.getDataOwnerIdOf(user)\n }\n\n async getDataOwner(ownerId: string): Promise<DataOwnerWithType> {\n return this.mapObject(this.data.getById(ownerId)!)\n }\n\n clearCurrentDataOwnerIdsCache() {\n super.clearCurrentDataOwnerIdsCache()\n }\n\n async modifyCryptoActorStub(stub: CryptoActorStubWithType): Promise<CryptoActorStubWithType> {\n const existing = this.data.getById(stub.stub.id!)\n if (!existing) throw new Error('Data owner not found.')\n if (existing.type !== stub.type) throw new Error('Unexpected type for data owner.')\n return CryptoActorStubWithType.fromDataOwner(this.mapObject(this.data.modifyObject({ ...existing, ...stub.stub })))\n }\n\n async getCryptoActorStub(ownerId: string): Promise<CryptoActorStubWithType> {\n return CryptoActorStubWithType.fromDataOwner(await this.getDataOwner(ownerId))\n }\n\n async addPublicKeyForOwner(dataOwnerId: string, keyPair: KeyPair<CryptoKey>) {\n const retrieved = await this.getCryptoActorStub(dataOwnerId)\n const publicHex = ua2hex(await this.primitives.RSA.exportKey(keyPair.publicKey, 'spki'))\n await this.modifyCryptoActorStub({\n type: retrieved.type,\n stub: {\n ...retrieved.stub,\n publicKeysForOaepWithSha256: [...(retrieved.stub.publicKeysForOaepWithSha256 || []), publicHex],\n },\n })\n }\n\n private mapObject(x: DataOwner & { type: DataOwnerTypeEnum }): DataOwnerWithType {\n const type = x.type\n delete (x as any).type\n if (type === DataOwnerTypeEnum.Patient) {\n return { type, dataOwner: x as Patient }\n } else if (type === DataOwnerTypeEnum.Device) {\n return { type, dataOwner: x as Device }\n } else if (type === DataOwnerTypeEnum.Hcp) {\n return { type, dataOwner: x as HealthcareParty }\n } else throw new Error('Unexpected type for data owner.')\n }\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import { UserEncryptionKeysManager } from '../../icc-x-api/crypto/UserEncryptionKeysManager';
2
+ import { DataOwner } from '../../icc-x-api/icc-data-owner-x-api';
3
+ import { KeyPair } from '../../icc-x-api/crypto/RSA';
4
+ import { CryptoPrimitives } from '../../icc-x-api/crypto/CryptoPrimitives';
5
+ export declare class FakeEncryptionKeysManager extends UserEncryptionKeysManager {
6
+ private readonly keys;
7
+ constructor(keys: {
8
+ [fingerprint: string]: {
9
+ pair: KeyPair<CryptoKey>;
10
+ verified: boolean;
11
+ };
12
+ });
13
+ static create(primitives: CryptoPrimitives, verifiedKeys: KeyPair<CryptoKey>[], unverifiedKeys?: KeyPair<CryptoKey>[]): Promise<FakeEncryptionKeysManager>;
14
+ getCurrentUserAvailablePublicKeysHex(verifiedOnly: boolean): Promise<string[]>;
15
+ getCurrentUserHierarchyAvailablePublicKeysHex(): Promise<string[]>;
16
+ getKeyPairForFingerprint(fingerprint: string): {
17
+ pair: KeyPair<CryptoKey>;
18
+ verified: boolean;
19
+ } | undefined;
20
+ initialiseKeys(): Promise<{
21
+ newKeyPair: KeyPair<CryptoKey>;
22
+ newKeyFingerprint: string;
23
+ } | undefined>;
24
+ reloadKeys(): Promise<void>;
25
+ getSelfVerifiedKeys(): {
26
+ fingerprint: string;
27
+ pair: KeyPair<CryptoKey>;
28
+ }[];
29
+ getVerifiedPublicKeysFor(dataOwner: DataOwner): Promise<string[]>;
30
+ getDecryptionKeys(): {
31
+ [p: string]: KeyPair<CryptoKey>;
32
+ };
33
+ deleteKey(fp: string): void;
34
+ addOrUpdateKey(primitives: CryptoPrimitives, pair: KeyPair<CryptoKey>, verified: boolean): Promise<void>;
35
+ }