@icure/api 8.10.2 → 8.11.0

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 (289) hide show
  1. package/icc-api/api/IccPatientApi.d.ts +1 -1
  2. package/icc-api/api/IccPatientApi.js +4 -2
  3. package/icc-api/api/IccPatientApi.js.map +1 -1
  4. package/icc-x-api/crypto/ExtendedApisUtilsImpl.d.ts +11 -0
  5. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js +75 -13
  6. package/icc-x-api/crypto/ExtendedApisUtilsImpl.js.map +1 -1
  7. package/icc-x-api/crypto/SecurityMetadataDecryptor.d.ts +14 -0
  8. package/icc-x-api/crypto/SecurityMetadataDecryptor.js +28 -0
  9. package/icc-x-api/crypto/SecurityMetadataDecryptor.js.map +1 -1
  10. package/icc-x-api/icc-patient-x-api.d.ts +4 -1
  11. package/icc-x-api/icc-patient-x-api.js +5 -2
  12. package/icc-x-api/icc-patient-x-api.js.map +1 -1
  13. package/package.json +1 -1
  14. package/test/benchmarks/lzma-benchmark.spec.d.ts +1 -0
  15. package/test/benchmarks/lzma-benchmark.spec.js +131 -0
  16. package/test/benchmarks/lzma-benchmark.spec.js.map +1 -0
  17. package/test/benchmarks/lzma-compat.spec.d.ts +1 -0
  18. package/test/benchmarks/lzma-compat.spec.js +187 -0
  19. package/test/benchmarks/lzma-compat.spec.js.map +1 -0
  20. package/test/benchmarks/playwright.config.d.ts +2 -0
  21. package/test/benchmarks/playwright.config.js +18 -0
  22. package/test/benchmarks/playwright.config.js.map +1 -0
  23. package/test/icc-api/api/IccAgendaApi.d.ts +1 -0
  24. package/test/icc-api/api/IccAgendaApi.js +64 -0
  25. package/test/icc-api/api/IccAgendaApi.js.map +1 -0
  26. package/test/icc-api/api/IccAnonymousAccessApi.d.ts +1 -0
  27. package/test/icc-api/api/IccAnonymousAccessApi.js +58 -0
  28. package/test/icc-api/api/IccAnonymousAccessApi.js.map +1 -0
  29. package/test/icc-api/api/IccCalendarItemApi.d.ts +1 -0
  30. package/test/icc-api/api/IccCalendarItemApi.js +67 -0
  31. package/test/icc-api/api/IccCalendarItemApi.js.map +1 -0
  32. package/test/icc-api/api/IccCalendarItemTypeApi.d.ts +1 -0
  33. package/test/icc-api/api/IccCalendarItemTypeApi.js +96 -0
  34. package/test/icc-api/api/IccCalendarItemTypeApi.js.map +1 -0
  35. package/test/icc-api/api/IccCodeApi.d.ts +1 -0
  36. package/test/icc-api/api/IccCodeApi.js +38 -0
  37. package/test/icc-api/api/IccCodeApi.js.map +1 -0
  38. package/test/icc-api/api/IccDocumentApi.d.ts +1 -0
  39. package/test/icc-api/api/IccDocumentApi.js +199 -0
  40. package/test/icc-api/api/IccDocumentApi.js.map +1 -0
  41. package/test/icc-api/api/IccGroupApi.d.ts +1 -0
  42. package/test/icc-api/api/IccGroupApi.js +50 -0
  43. package/test/icc-api/api/IccGroupApi.js.map +1 -0
  44. package/test/icc-api/api/IccKeywordApi.d.ts +1 -0
  45. package/test/icc-api/api/IccKeywordApi.js +64 -0
  46. package/test/icc-api/api/IccKeywordApi.js.map +1 -0
  47. package/test/icc-api/api/IccMedicalLocationApi.d.ts +1 -0
  48. package/test/icc-api/api/IccMedicalLocationApi.js +64 -0
  49. package/test/icc-api/api/IccMedicalLocationApi.js.map +1 -0
  50. package/test/icc-api/api/IccPlaceApi.d.ts +1 -0
  51. package/test/icc-api/api/IccPlaceApi.js +64 -0
  52. package/test/icc-api/api/IccPlaceApi.js.map +1 -0
  53. package/test/icc-api/api/IccRecoveryDataApi.d.ts +1 -0
  54. package/test/icc-api/api/IccRecoveryDataApi.js +95 -0
  55. package/test/icc-api/api/IccRecoveryDataApi.js.map +1 -0
  56. package/test/icc-api/api/IccRoleApi.d.ts +1 -0
  57. package/test/icc-api/api/IccRoleApi.js +34 -0
  58. package/test/icc-api/api/IccRoleApi.js.map +1 -0
  59. package/test/icc-api/api/IccUserApi.d.ts +1 -0
  60. package/test/icc-api/api/IccUserApi.js +96 -0
  61. package/test/icc-api/api/IccUserApi.js.map +1 -0
  62. package/test/icc-api/e2e/IccCalendarItemApi.d.ts +1 -0
  63. package/test/icc-api/e2e/IccCalendarItemApi.js +46 -0
  64. package/test/icc-api/e2e/IccCalendarItemApi.js.map +1 -0
  65. package/test/icc-api/model/modelHelpersTest.d.ts +1 -0
  66. package/test/icc-api/model/modelHelpersTest.js +45 -0
  67. package/test/icc-api/model/modelHelpersTest.js.map +1 -0
  68. package/test/icc-x-api/auth/group-switch-test.d.ts +1 -0
  69. package/test/icc-x-api/auth/group-switch-test.js +81 -0
  70. package/test/icc-x-api/auth/group-switch-test.js.map +1 -0
  71. package/test/icc-x-api/auth/jwt-concurrency-test.d.ts +2 -0
  72. package/test/icc-x-api/auth/jwt-concurrency-test.js +112 -0
  73. package/test/icc-x-api/auth/jwt-concurrency-test.js.map +1 -0
  74. package/test/icc-x-api/auth/jwt-provider-test.d.ts +1 -0
  75. package/test/icc-x-api/auth/jwt-provider-test.js +197 -0
  76. package/test/icc-x-api/auth/jwt-provider-test.js.map +1 -0
  77. package/test/icc-x-api/auth/smart-auth-provider-test.d.ts +1 -0
  78. package/test/icc-x-api/auth/smart-auth-provider-test.js +224 -0
  79. package/test/icc-x-api/auth/smart-auth-provider-test.js.map +1 -0
  80. package/test/icc-x-api/autofix-anonymity-test.d.ts +1 -0
  81. package/test/icc-x-api/autofix-anonymity-test.js +122 -0
  82. package/test/icc-x-api/autofix-anonymity-test.js.map +1 -0
  83. package/test/icc-x-api/confidential-entities-test.d.ts +1 -0
  84. package/test/icc-x-api/confidential-entities-test.js +168 -0
  85. package/test/icc-x-api/confidential-entities-test.js.map +1 -0
  86. package/test/icc-x-api/crud/comprehensive-crud-test.d.ts +1 -0
  87. package/test/icc-x-api/crud/comprehensive-crud-test.js +276 -0
  88. package/test/icc-x-api/crud/comprehensive-crud-test.js.map +1 -0
  89. package/test/icc-x-api/crud/entities-crud-test-interface.d.ts +16 -0
  90. package/test/icc-x-api/crud/entities-crud-test-interface.js +407 -0
  91. package/test/icc-x-api/crud/entities-crud-test-interface.js.map +1 -0
  92. package/test/icc-x-api/crypto/anonymous-delegations-test.d.ts +1 -0
  93. package/test/icc-x-api/crypto/anonymous-delegations-test.js +587 -0
  94. package/test/icc-x-api/crypto/anonymous-delegations-test.js.map +1 -0
  95. package/test/icc-x-api/crypto/concurrency.d.ts +1 -0
  96. package/test/icc-x-api/crypto/concurrency.js +35 -0
  97. package/test/icc-x-api/crypto/concurrency.js.map +1 -0
  98. package/test/icc-x-api/crypto/crypto-utils.d.ts +1 -0
  99. package/test/icc-x-api/crypto/crypto-utils.js +79 -0
  100. package/test/icc-x-api/crypto/crypto-utils.js.map +1 -0
  101. package/test/icc-x-api/crypto/cryptoTest.d.ts +2 -0
  102. package/test/icc-x-api/crypto/cryptoTest.js +402 -0
  103. package/test/icc-x-api/crypto/cryptoTest.js.map +1 -0
  104. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.d.ts +1 -0
  105. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js +166 -0
  106. package/test/icc-x-api/crypto/delegate-ci-to-patient-with-missing-keys-test.js.map +1 -0
  107. package/test/icc-x-api/crypto/exchange-data-manager-test.d.ts +1 -0
  108. package/test/icc-x-api/crypto/exchange-data-manager-test.js +674 -0
  109. package/test/icc-x-api/crypto/exchange-data-manager-test.js.map +1 -0
  110. package/test/icc-x-api/crypto/full-crypto-test.d.ts +1 -0
  111. package/test/icc-x-api/crypto/full-crypto-test.js +454 -0
  112. package/test/icc-x-api/crypto/full-crypto-test.js.map +1 -0
  113. package/test/icc-x-api/crypto/legacy-metadata-migration-test.d.ts +1 -0
  114. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js +379 -0
  115. package/test/icc-x-api/crypto/legacy-metadata-migration-test.js.map +1 -0
  116. package/test/icc-x-api/crypto/secure-delegations-manager-test.d.ts +1 -0
  117. package/test/icc-x-api/crypto/secure-delegations-manager-test.js +278 -0
  118. package/test/icc-x-api/crypto/secure-delegations-manager-test.js.map +1 -0
  119. package/test/icc-x-api/crypto/shamir.d.ts +2 -0
  120. package/test/icc-x-api/crypto/shamir.js +167 -0
  121. package/test/icc-x-api/crypto/shamir.js.map +1 -0
  122. package/test/icc-x-api/crypto/share-deduplication-test.d.ts +1 -0
  123. package/test/icc-x-api/crypto/share-deduplication-test.js +250 -0
  124. package/test/icc-x-api/crypto/share-deduplication-test.js.map +1 -0
  125. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.d.ts +1 -0
  126. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js +71 -0
  127. package/test/icc-x-api/crypto/share-to-newly-created-patient-from-hcp.js.map +1 -0
  128. package/test/icc-x-api/crypto/soft-deleted-data-owners.d.ts +2 -0
  129. package/test/icc-x-api/crypto/soft-deleted-data-owners.js +113 -0
  130. package/test/icc-x-api/crypto/soft-deleted-data-owners.js.map +1 -0
  131. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.d.ts +1 -0
  132. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js +246 -0
  133. package/test/icc-x-api/crypto/user-encryption-keys-manager-test.js.map +1 -0
  134. package/test/icc-x-api/entity-with-attachments-api-test.d.ts +1 -0
  135. package/test/icc-x-api/entity-with-attachments-api-test.js +142 -0
  136. package/test/icc-x-api/entity-with-attachments-api-test.js.map +1 -0
  137. package/test/icc-x-api/filters/filters.d.ts +1 -0
  138. package/test/icc-x-api/filters/filters.js +49 -0
  139. package/test/icc-x-api/filters/filters.js.map +1 -0
  140. package/test/icc-x-api/filters/healthelement.d.ts +1 -0
  141. package/test/icc-x-api/filters/healthelement.js +333 -0
  142. package/test/icc-x-api/filters/healthelement.js.map +1 -0
  143. package/test/icc-x-api/icc-accesslog-x-api.d.ts +1 -0
  144. package/test/icc-x-api/icc-accesslog-x-api.js +106 -0
  145. package/test/icc-x-api/icc-accesslog-x-api.js.map +1 -0
  146. package/test/icc-x-api/icc-application-settings-x-api.d.ts +1 -0
  147. package/test/icc-x-api/icc-application-settings-x-api.js +91 -0
  148. package/test/icc-x-api/icc-application-settings-x-api.js.map +1 -0
  149. package/test/icc-x-api/icc-auth-api.d.ts +1 -0
  150. package/test/icc-x-api/icc-auth-api.js +47 -0
  151. package/test/icc-x-api/icc-auth-api.js.map +1 -0
  152. package/test/icc-x-api/icc-calendar-item-x-api.d.ts +1 -0
  153. package/test/icc-x-api/icc-calendar-item-x-api.js +150 -0
  154. package/test/icc-x-api/icc-calendar-item-x-api.js.map +1 -0
  155. package/test/icc-x-api/icc-code-x-api-test.d.ts +1 -0
  156. package/test/icc-x-api/icc-code-x-api-test.js +74 -0
  157. package/test/icc-x-api/icc-code-x-api-test.js.map +1 -0
  158. package/test/icc-x-api/icc-contact-x-api.d.ts +1 -0
  159. package/test/icc-x-api/icc-contact-x-api.js +355 -0
  160. package/test/icc-x-api/icc-contact-x-api.js.map +1 -0
  161. package/test/icc-x-api/icc-document-x-api.d.ts +1 -0
  162. package/test/icc-x-api/icc-document-x-api.js +76 -0
  163. package/test/icc-x-api/icc-document-x-api.js.map +1 -0
  164. package/test/icc-x-api/icc-form-x-api.d.ts +1 -0
  165. package/test/icc-x-api/icc-form-x-api.js +413 -0
  166. package/test/icc-x-api/icc-form-x-api.js.map +1 -0
  167. package/test/icc-x-api/icc-hcparty-x-api-test.d.ts +1 -0
  168. package/test/icc-x-api/icc-hcparty-x-api-test.js +43 -0
  169. package/test/icc-x-api/icc-hcparty-x-api-test.js.map +1 -0
  170. package/test/icc-x-api/icc-helement-x-api-test.d.ts +1 -0
  171. package/test/icc-x-api/icc-helement-x-api-test.js +155 -0
  172. package/test/icc-x-api/icc-helement-x-api-test.js.map +1 -0
  173. package/test/icc-x-api/icc-invoice-x-api.d.ts +1 -0
  174. package/test/icc-x-api/icc-invoice-x-api.js +99 -0
  175. package/test/icc-x-api/icc-invoice-x-api.js.map +1 -0
  176. package/test/icc-x-api/icc-maintenance-task-x-api-test.d.ts +1 -0
  177. package/test/icc-x-api/icc-maintenance-task-x-api-test.js +222 -0
  178. package/test/icc-x-api/icc-maintenance-task-x-api-test.js.map +1 -0
  179. package/test/icc-x-api/icc-message-x-api.d.ts +1 -0
  180. package/test/icc-x-api/icc-message-x-api.js +54 -0
  181. package/test/icc-x-api/icc-message-x-api.js.map +1 -0
  182. package/test/icc-x-api/icc-patient-x-api-test.d.ts +1 -0
  183. package/test/icc-x-api/icc-patient-x-api-test.js +209 -0
  184. package/test/icc-x-api/icc-patient-x-api-test.js.map +1 -0
  185. package/test/icc-x-api/icc-recovery-x-api.d.ts +1 -0
  186. package/test/icc-x-api/icc-recovery-x-api.js +175 -0
  187. package/test/icc-x-api/icc-recovery-x-api.js.map +1 -0
  188. package/test/icc-x-api/icc-topic-x-api.d.ts +1 -0
  189. package/test/icc-x-api/icc-topic-x-api.js +269 -0
  190. package/test/icc-x-api/icc-topic-x-api.js.map +1 -0
  191. package/test/icc-x-api/icc-user-x-api-test.d.ts +1 -0
  192. package/test/icc-x-api/icc-user-x-api-test.js +99 -0
  193. package/test/icc-x-api/icc-user-x-api-test.js.map +1 -0
  194. package/test/icc-x-api/keyless-api.d.ts +1 -0
  195. package/test/icc-x-api/keyless-api.js +125 -0
  196. package/test/icc-x-api/keyless-api.js.map +1 -0
  197. package/test/icc-x-api/patient-user.d.ts +2 -0
  198. package/test/icc-x-api/patient-user.js +103 -0
  199. package/test/icc-x-api/patient-user.js.map +1 -0
  200. package/test/icc-x-api/storage/storage.d.ts +1 -0
  201. package/test/icc-x-api/storage/storage.js +48 -0
  202. package/test/icc-x-api/storage/storage.js.map +1 -0
  203. package/test/icc-x-api/test-api-no-parent.d.ts +1 -0
  204. package/test/icc-x-api/test-api-no-parent.js +79 -0
  205. package/test/icc-x-api/test-api-no-parent.js.map +1 -0
  206. package/test/icc-x-api/test-legacy-data-support.d.ts +1 -0
  207. package/test/icc-x-api/test-legacy-data-support.js +375 -0
  208. package/test/icc-x-api/test-legacy-data-support.js.map +1 -0
  209. package/test/icc-x-api/utils/date-encode-test.d.ts +1 -0
  210. package/test/icc-x-api/utils/date-encode-test.js +150 -0
  211. package/test/icc-x-api/utils/date-encode-test.js.map +1 -0
  212. package/test/icc-x-api/utils/graph-test.d.ts +1 -0
  213. package/test/icc-x-api/utils/graph-test.js +54 -0
  214. package/test/icc-x-api/utils/graph-test.js.map +1 -0
  215. package/test/icc-x-api/utils/lru-temporised-async-cache-test.d.ts +1 -0
  216. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js +364 -0
  217. package/test/icc-x-api/utils/lru-temporised-async-cache-test.js.map +1 -0
  218. package/test/icc-x-api/utils/lzma-benchmark-test.d.ts +1 -0
  219. package/test/icc-x-api/utils/lzma-benchmark-test.js +132 -0
  220. package/test/icc-x-api/utils/lzma-benchmark-test.js.map +1 -0
  221. package/test/icc-x-api/utils/lzma-compat-test.d.ts +1 -0
  222. package/test/icc-x-api/utils/lzma-compat-test.js +218 -0
  223. package/test/icc-x-api/utils/lzma-compat-test.js.map +1 -0
  224. package/test/icc-x-api/utils/mutex-test.d.ts +1 -0
  225. package/test/icc-x-api/utils/mutex-test.js +114 -0
  226. package/test/icc-x-api/utils/mutex-test.js.map +1 -0
  227. package/test/icc-x-api/utils/to-moment-test.d.ts +1 -0
  228. package/test/icc-x-api/utils/to-moment-test.js +110 -0
  229. package/test/icc-x-api/utils/to-moment-test.js.map +1 -0
  230. package/test/support/CSM-185.d.ts +1 -0
  231. package/test/support/CSM-185.js +124 -0
  232. package/test/support/CSM-185.js.map +1 -0
  233. package/test/support/CSM-243.d.ts +1 -0
  234. package/test/support/CSM-243.js +120 -0
  235. package/test/support/CSM-243.js.map +1 -0
  236. package/test/support/CSM-543.d.ts +1 -0
  237. package/test/support/CSM-543.js +164 -0
  238. package/test/support/CSM-543.js.map +1 -0
  239. package/test/support/CSM-729.d.ts +1 -0
  240. package/test/support/CSM-729.js +225 -0
  241. package/test/support/CSM-729.js.map +1 -0
  242. package/test/support/CSM-814.d.ts +1 -0
  243. package/test/support/CSM-814.js +475 -0
  244. package/test/support/CSM-814.js.map +1 -0
  245. package/test/support/CSM-87.d.ts +0 -0
  246. package/test/support/CSM-87.js +21 -0
  247. package/test/support/CSM-87.js.map +1 -0
  248. package/test/support/CSM-93.d.ts +1 -0
  249. package/test/support/CSM-93.js +112 -0
  250. package/test/support/CSM-93.js.map +1 -0
  251. package/test/utils/FakeDataOwnerApi.d.ts +32 -0
  252. package/test/utils/FakeDataOwnerApi.js +136 -0
  253. package/test/utils/FakeDataOwnerApi.js.map +1 -0
  254. package/test/utils/FakeEncryptionKeysManager.d.ts +36 -0
  255. package/test/utils/FakeEncryptionKeysManager.js +97 -0
  256. package/test/utils/FakeEncryptionKeysManager.js.map +1 -0
  257. package/test/utils/FakeExchangeDataApi.d.ts +32 -0
  258. package/test/utils/FakeExchangeDataApi.js +92 -0
  259. package/test/utils/FakeExchangeDataApi.js.map +1 -0
  260. package/test/utils/FakeExchangeDataManager.d.ts +48 -0
  261. package/test/utils/FakeExchangeDataManager.js +82 -0
  262. package/test/utils/FakeExchangeDataManager.js.map +1 -0
  263. package/test/utils/FakeExchangeDataMapManager.d.ts +12 -0
  264. package/test/utils/FakeExchangeDataMapManager.js +38 -0
  265. package/test/utils/FakeExchangeDataMapManager.js.map +1 -0
  266. package/test/utils/FakeGenericApi.d.ts +16 -0
  267. package/test/utils/FakeGenericApi.js +65 -0
  268. package/test/utils/FakeGenericApi.js.map +1 -0
  269. package/test/utils/KeylessCryptoStrategies.d.ts +23 -0
  270. package/test/utils/KeylessCryptoStrategies.js +26 -0
  271. package/test/utils/KeylessCryptoStrategies.js.map +1 -0
  272. package/test/utils/TestApi.d.ts +3 -0
  273. package/test/utils/TestApi.js +30 -0
  274. package/test/utils/TestApi.js.map +1 -0
  275. package/test/utils/TestCollectionUtils.d.ts +1 -0
  276. package/test/utils/TestCollectionUtils.js +310 -0
  277. package/test/utils/TestCollectionUtils.js.map +1 -0
  278. package/test/utils/TestCryptoStrategies.d.ts +42 -0
  279. package/test/utils/TestCryptoStrategies.js +80 -0
  280. package/test/utils/TestCryptoStrategies.js.map +1 -0
  281. package/test/utils/TestStorage.d.ts +23 -0
  282. package/test/utils/TestStorage.js +61 -0
  283. package/test/utils/TestStorage.js.map +1 -0
  284. package/test/utils/roles.d.ts +14 -0
  285. package/test/utils/roles.js +345 -0
  286. package/test/utils/roles.js.map +1 -0
  287. package/test/utils/test_utils.d.ts +87 -0
  288. package/test/utils/test_utils.js +452 -0
  289. package/test/utils/test_utils.js.map +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ExtendedApisUtilsImpl.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/ExtendedApisUtilsImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { EncryptedEntity, EncryptedEntityStub } from '../../icc-api/model/models'\nimport { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport {\n b2a,\n decryptObject,\n EncryptedEntityWithType,\n EncryptedFieldsManifest,\n encryptObject,\n EntityWithDelegationTypeName,\n hex2ua,\n truncateTrailingNulls,\n ua2ab,\n ua2utf8,\n utf8_2ua,\n} from '../utils'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { SecurityMetadataDecryptor, SecurityMetadataType } from './SecurityMetadataDecryptor'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport { ExtendedApisUtils } from './ExtendedApisUtils'\nimport { EntityShareOrMetadataUpdateRequest } from '../../icc-api/model/requests/EntityShareOrMetadataUpdateRequest'\nimport { EntityBulkShareResult } from '../../icc-api/model/requests/EntityBulkShareResult'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { SecureDelegationsManager } from './SecureDelegationsManager'\nimport { ShareResult, ShareResultFailure, ShareResultSuccess } from '../utils/ShareResult'\nimport { ShareMetadataBehaviour } from './ShareMetadataBehaviour'\nimport { IccUserXApi } from '../icc-user-x-api'\nimport { MinimalEntityBulkShareResult } from '../../icc-api/model/requests/MinimalEntityBulkShareResult'\nimport { BulkShareOrUpdateMetadataParams, EntityRequestInformation } from '../../icc-api/model/requests/BulkShareOrUpdateMetadataParams'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport RequestedPermissionInternal = EntityShareRequest.RequestedPermissionInternal\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport { SecretIdUseOption } from './SecretIdUseOption'\n\n/**\n * @internal this class is for internal use only and may be changed without notice.\n * Methods to support extended apis.\n */\nexport class ExtendedApisUtilsImpl implements ExtendedApisUtils {\n constructor(\n private readonly primitives: CryptoPrimitives,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly securityMetadataDecryptor: SecurityMetadataDecryptor,\n private readonly secureDelegationsManager: SecureDelegationsManager,\n private readonly userApi: IccUserXApi,\n private readonly useParentKeys: boolean\n ) {}\n\n async encryptionKeysOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async encryptionKeysForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async secretIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n )\n }\n\n async secretIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) => this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId))\n }\n\n async owningEntityIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async owningEntityIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async hasWriteAccess(entity: EncryptedEntityWithType): Promise<boolean> {\n return (\n (await this.securityMetadataDecryptor.getEntityAccessLevel(entity.entity, await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds())) ===\n AccessLevel.WRITE\n )\n }\n\n async entityWithInitialisedEncryptedMetadata<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n owningEntity: string | undefined,\n owningEntitySecretIds: string[] | undefined,\n initialiseEncryptionKey: boolean,\n autoDelegations: { [p: string]: SecureDelegation.AccessLevelEnum },\n alternateRootDelegation: string | undefined\n ): Promise<{ updatedEntity: T; rawEncryptionKey: string | undefined; secretId: string }> {\n this.throwDetailedExceptionForInvalidParameter('entity.id', entity.id, 'entityWithInitialisedEncryptedMetadata', arguments)\n this.checkEmptyEncryptionMetadata(entity)\n const newRawKey = initialiseEncryptionKey ? await this.primitives.AES.generateCryptoKey(true) : undefined\n const newSecretId = this.primitives.randomUuid()\n return {\n updatedEntity: await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: owningEntitySecretIds ?? [],\n },\n entityType,\n newSecretId ? [newSecretId] : [],\n !!owningEntity ? [owningEntity] : [],\n newRawKey ? [newRawKey] : [],\n autoDelegations,\n alternateRootDelegation\n ),\n rawEncryptionKey: newRawKey,\n secretId: newSecretId,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<{\n updatedEntities: T[]\n unmodifiedEntitiesIds: string[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results =\n Object.keys(allRequestsByEntityId).length > 0 ? await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId }) : []\n const updatedEntities: T[] = []\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n if (result.updatedEntity) {\n updatedEntities.push(result.updatedEntity)\n }\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n // TODO implement auto-retry for failed requests if the shouldRetry flag in result.rejectedRequests is set to true\n return {\n updatedEntities,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadataNoEntities(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<MinimalEntityBulkShareResult[]>\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n successfulUpdates: { entityId: string; delegateId: string }[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results = await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId })\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n const successfulRequests = Object.entries(allRequestsByEntityId)\n .flatMap(([entityId, requests]) => Object.keys(requests).map((delegateId) => ({ entityId, delegateId })))\n .filter(({ entityId, delegateId }) => !updateErrors.some((error) => error.entityId === entityId && error.delegateId === delegateId))\n return {\n successfulUpdates: successfulRequests,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n private async prepareBulkShareRequests(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[]\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n allRequestsByEntityId: { [entityId: string]: EntityRequestInformation }\n orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n }\n }> {\n if (new Set(entitiesUpdates.map((e) => e.entity.id)).size !== entitiesUpdates.length) {\n throw new Error('Duplicate requests: the same entity id is present more than once in the input')\n }\n const allRequestsByEntityId = {} as { [entityId: string]: EntityRequestInformation }\n const orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n } = {}\n const unmodifiedEntitiesIds: string[] = []\n for (const { entity, dataForDelegates } of entitiesUpdates) {\n const entityId = entity.id\n if (!entityId) throw new Error('Share of an entity requires for the entity to already exist and have an id')\n const entityWithType = { entity, type: entitiesType }\n const currentRequests = {} as { [requestId: string]: EntityShareOrMetadataUpdateRequest }\n const currentOrderedRequests: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[] = []\n const migrationRequests = await this.makeMigrationRequestsIfNeeded(entityWithType, dataForDelegates)\n for (const [delegate, request] of Object.entries(migrationRequests)) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: dataForDelegates[delegate],\n updatedForMigration: true,\n })\n }\n for (const [delegate, userRequest] of Object.entries(dataForDelegates)) {\n if (!migrationRequests[delegate]) {\n const request = await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entityWithType,\n delegate,\n userRequest.shareSecretIds ?? [],\n userRequest.shareEncryptionKeys ?? [],\n userRequest.shareOwningEntityIds ?? [],\n userRequest.requestedPermissions\n )\n if (request) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: userRequest,\n updatedForMigration: false,\n })\n }\n }\n }\n if (Object.keys(currentRequests).length > 0) {\n const existingDelegationMembersDetails = await this.securityMetadataDecryptor.getDelegationMemberDetails(entityWithType)\n const accessibleMembers = new Set(\n this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds() : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n )\n const potentialParentDelegations = Object.entries(existingDelegationMembersDetails).flatMap(([k, members]) => {\n if ((!!members.delegate && accessibleMembers.has(members.delegate)) || (!!members.delegator && accessibleMembers.has(members.delegator))) {\n return [k]\n } else return []\n })\n allRequestsByEntityId[entityId] = { requests: currentRequests, potentialParentDelegations }\n orderedRequestsInfoByEntityId[entityId] = currentOrderedRequests\n } else {\n unmodifiedEntitiesIds.push(entityId)\n }\n }\n return { unmodifiedEntitiesIds, allRequestsByEntityId, orderedRequestsInfoByEntityId }\n }\n\n async simpleShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entity: { entity: T; type: EntityWithDelegationTypeName },\n delegates: {\n [p: string]: {\n shareSecretIds: string[] | undefined\n shareEncryptionKeys: ShareMetadataBehaviour | undefined\n shareOwningEntityIds: ShareMetadataBehaviour | undefined\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum | undefined\n }\n },\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<ShareResult<T>> {\n const availableEncryptionKeys = await this.encryptionKeysOf(entity)\n const availableOwningEntityIds = await this.owningEntityIdsOf(entity)\n const dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n } = {}\n for (const [delegateId, delegateRequests] of Object.entries(delegates)) {\n if (!availableEncryptionKeys.length && delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no encryption keys or the current data owner can't access any encryption keys, but sharing is required.`\n )\n }\n if (!availableOwningEntityIds.length && delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no owning entity ids or the current data owner can't access any owning entity ids, but sharing is required.`\n )\n }\n dataForDelegates[delegateId] = {\n shareSecretIds: delegateRequests.shareSecretIds ?? (await this.secretIdsOf(entity)),\n shareEncryptionKeys: delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.NEVER ? [] : availableEncryptionKeys,\n shareOwningEntityIds: delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.NEVER ? [] : availableOwningEntityIds,\n requestedPermissions: delegateRequests.requestedPermissions ?? RequestedPermissionEnum.MAX_WRITE,\n }\n }\n const shareResult = await this.bulkShareOrUpdateEncryptedEntityMetadata(\n entity.type,\n [\n {\n entity: entity.entity,\n dataForDelegates,\n },\n ],\n (x) => doRequestBulkShareOrUpdate(x)\n )\n if (shareResult.unmodifiedEntitiesIds.includes(entity.entity.id!)) {\n return new ShareResultSuccess(entity.entity)\n }\n if (!shareResult.updateErrors.length && shareResult.updatedEntities.length === 1) {\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n const requestedDelegates = new Set(Object.keys(delegates))\n const errorsOfRequestedDelegates = shareResult.updateErrors.filter((x) => requestedDelegates.has(x.delegateId))\n if (errorsOfRequestedDelegates.length === 0 && shareResult.updatedEntities.length === 1) {\n console.warn(`Errors with migration of encrypted metadata ${JSON.stringify(shareResult.updateErrors)}.`)\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n return new ShareResultFailure(\n shareResult.updateErrors,\n `There was an error sharing entity with id ${entity.entity.id}. Check the logs for more details.`\n )\n }\n\n private async makeMigrationRequestsIfNeeded(\n entity: EncryptedEntityWithType,\n userRequestsForEntity: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n ): Promise<{ [delegateId: string]: EntityShareOrMetadataUpdateRequest }> {\n const hierarchy = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n const legacySecretIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n const legacyEncryptionKeys = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.EncryptionKey\n )\n const legacyOwningEntityIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.OwningEntityId\n )\n const res = {} as { [delegateId: string]: EntityShareOrMetadataUpdateRequest }\n const selfId = await this.dataOwnerApi.getCurrentDataOwnerId()\n for (const hierarchyMember of hierarchy) {\n const hierarchyMemberMigration = await this.makeMigrationRequestForMemberOfHierarchy(\n entity,\n selfId,\n hierarchyMember,\n userRequestsForEntity[hierarchyMember],\n legacySecretIds,\n legacyEncryptionKeys,\n legacyOwningEntityIds\n )\n if (hierarchyMemberMigration) {\n res[hierarchyMember] = hierarchyMemberMigration\n }\n }\n return res\n }\n\n private async makeMigrationRequestForMemberOfHierarchy(\n entity: EncryptedEntityWithType,\n selfId: string,\n currMemberId: string,\n userRequestForDelegate:\n | {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n | undefined,\n legacySecretIds: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyEncryptionKeys: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyOwningEntityIds: { decrypted: string; dataOwnersWithAccess: string[] }[]\n ): Promise<EntityShareOrMetadataUpdateRequest | undefined> {\n // This implementation is very specific from migration from delegations to secure delegations. If in future we will have to migrate from secure delegations to something else, this method may need significant changes in its logic.\n const subHierarchy = this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(currMemberId) : [currMemberId]\n const subHierarchySet = new Set(subHierarchy)\n const legacyAccess =\n selfId === entity.entity.id && currMemberId === selfId\n ? AccessLevel.WRITE\n : await this.securityMetadataDecryptor.getEntityLegacyDelegationAccessLevel(entity.entity, subHierarchy)\n if (!legacyAccess) return undefined\n const selfLegacySecretIds = legacySecretIds.filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d))).map((x) => x.decrypted)\n const selfLegacyEncryptionKeys = legacyEncryptionKeys\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n const selfLegacyOwningEntityIds = legacyOwningEntityIds\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n let missingSecretIds: string[] = []\n let missingEncryptionKeys: string[] = []\n let missingOwningEntityIds: string[] = []\n if (selfLegacySecretIds.length > 0) {\n const currentSecretIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.SecretId)).map(\n (x) => x.decrypted\n )\n )\n missingSecretIds = selfLegacySecretIds.filter((x) => !currentSecretIds.has(x))\n }\n if (selfLegacyEncryptionKeys.length > 0) {\n const currentEncryptionKeys = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.EncryptionKey)).map(\n (x) => x.decrypted\n )\n )\n missingEncryptionKeys = selfLegacyEncryptionKeys.filter((x) => !currentEncryptionKeys.has(x))\n }\n if (selfLegacyOwningEntityIds.length > 0) {\n const currentOwningEntityIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.OwningEntityId)).map(\n (x) => x.decrypted\n )\n )\n missingOwningEntityIds = selfLegacyOwningEntityIds.filter((x) => !currentOwningEntityIds.has(x))\n }\n const mustCreateRootDelegation =\n selfId === entity.entity.id &&\n currMemberId === selfId &&\n !(await this.securityMetadataDecryptor.getEntitySecureDelegationAccessLevel(entity.entity, subHierarchy))\n if (missingSecretIds.length > 0 || missingEncryptionKeys.length > 0 || missingOwningEntityIds.length > 0 || mustCreateRootDelegation) {\n let requestedPermissions: RequestedPermissionInternal\n if (currMemberId === selfId) {\n requestedPermissions = RequestedPermissionInternal.ROOT\n } else {\n requestedPermissions = RequestedPermissionInternal.FULL_WRITE // Legacy permission if present is always write\n }\n return await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entity,\n currMemberId,\n Array.from(new Set([...missingSecretIds, ...(userRequestForDelegate?.shareSecretIds ?? [])])),\n Array.from(new Set([...missingEncryptionKeys, ...(userRequestForDelegate?.shareEncryptionKeys ?? [])])),\n Array.from(new Set([...missingOwningEntityIds, ...(userRequestForDelegate?.shareOwningEntityIds ?? [])])),\n requestedPermissions\n )\n } else return undefined\n }\n\n async tryDecryptDataOf(\n entity: EncryptedEntityWithType,\n content: ArrayBuffer | Uint8Array,\n postProcessor?: (decryptedData: ArrayBuffer) => Promise<ArrayBuffer | undefined>\n ): Promise<{ data: ArrayBuffer; wasDecrypted: boolean }> {\n const triedKeys: Set<string> = new Set()\n const result = await this.doIncrementallyDecryptingKeys(entity.entity, entity.type, async (e, t, keys) => {\n for (const k of keys) {\n if (!triedKeys.has(k.raw)) {\n triedKeys.add(k.raw)\n try {\n const decrypted = await this.primitives.AES.decrypt(k.key, content)\n if (postProcessor) {\n const processed = await postProcessor(decrypted)\n if (processed !== undefined) return { success: processed }\n } else {\n return { success: decrypted }\n }\n } catch (e) {\n console.warn(`Error while attempting to decrypt attachment of ${entity.entity.id} with raw key ${k.raw}: ${e}`)\n }\n }\n }\n return null\n })\n if (result != null) {\n return { data: result.success, wasDecrypted: true }\n } else {\n return { data: ua2ab(content), wasDecrypted: false }\n }\n }\n\n async encryptDataOf<T extends EncryptedEntityStub>(\n entity: T,\n type: EntityWithDelegationTypeName,\n content: ArrayBuffer | Uint8Array,\n saveEntity: (entity: T) => Promise<T>\n ): Promise<{ encryptedData: ArrayBuffer; updatedEntity: T | undefined }> {\n const ensureInitialisedKeysResult = await this.ensureEncryptionKeysInitialised(entity, type)\n let updatedEntity: T | undefined\n if (!!ensureInitialisedKeysResult) {\n updatedEntity = await saveEntity(ensureInitialisedKeysResult)\n }\n const encrypted = await this.doIncrementallyDecryptingKeys(entity, type, async (e, t, keys) => {\n for (const k of keys) {\n try {\n return {\n success: {\n encryptedData: await this.primitives.AES.encrypt(k.key, content),\n updatedEntity: updatedEntity,\n },\n }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (encrypted != null) return encrypted.success\n throw new Error(`Could not extract any valid encryption keys for entity ${JSON.stringify(entity)}.`)\n }\n\n async tryDecryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n constructor: (json: any) => T\n ): Promise<{ entity: T; decrypted: boolean }[]> {\n const nothingToDecryptResults = new Map<string, T>()\n for (const entity of entities) {\n const nothingToDecrypt = await decryptObject(entity, async (encrypted) => {\n return null\n })\n if (nothingToDecrypt != null) {\n nothingToDecryptResults.set(entity.id!, constructor(nothingToDecrypt))\n }\n }\n const actuallyDecryptedResults = await this.doManyIncrementallyDecryptingKeys(\n entities.filter((e) => !nothingToDecryptResults.has(e.id!)),\n entityType,\n async (entity, t, keys) => {\n // The decrypt object will try all keys on each of the sub-objects; this is intentional because even though it\n // shouldn't happen, but it is still possible that some entity could be accidentally merged badly and the merged\n // entity has multiple encryptedSelf (on different sub-entities) that use different keys.\n const decrypted = await decryptObject(entity, (encrypted) => this.tryDecryptJson(keys, encrypted, false))\n if (decrypted != null) {\n return { success: constructor(decrypted) }\n } else {\n return null\n }\n }\n )\n const res = []\n for (const entity of entities) {\n const decrypted = actuallyDecryptedResults.get(entity.id!) ?? nothingToDecryptResults.get(entity.id!)\n if (!decrypted) {\n res.push({ entity: entity, decrypted: false })\n } else {\n res.push({ entity: decrypted, decrypted: true })\n }\n }\n return res\n }\n\n async tryDecryptJson(\n potentialKeys: { key: CryptoKey; raw: string }[],\n encrypted: Uint8Array,\n truncateTrailingDecryptedNulls: boolean\n ): Promise<{} | null> {\n for (const key of potentialKeys) {\n try {\n const decrypted = await this.primitives.AES.decrypt(key.key, encrypted, key.raw)\n return JSON.parse(ua2utf8(truncateTrailingDecryptedNulls ? truncateTrailingNulls(new Uint8Array(decrypted)) : decrypted))\n } catch (e) {}\n }\n return null\n }\n\n async tryEncryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n fieldsToEncrypt: EncryptedFieldsManifest,\n encodeBinaryData: boolean,\n requireEncryption: boolean,\n constructor: (json: any) => T\n ): Promise<T[]> {\n const entitiesWithInitialisedEncryptionKeys: T[] = []\n for (const entity of entities) {\n entitiesWithInitialisedEncryptionKeys.push((await this.ensureEncryptionKeysInitialised(entity, entityType)) ?? entity)\n }\n const results = await this.doManyIncrementallyDecryptingKeys(entitiesWithInitialisedEncryptionKeys, entityType, async (e, t, keys) => {\n for (const k of keys) {\n try {\n const encrypted = await encryptObject(\n e,\n (obj) => {\n // TODO encoding of binary data should probably be applied to everything?\n const json = encodeBinaryData\n ? JSON.stringify(obj, (k, v) => {\n return v instanceof ArrayBuffer || ArrayBuffer.isView(v)\n ? b2a(new Uint8Array(v as ArrayBufferLike).reduce((d, b) => d + String.fromCharCode(b), ''))\n : v\n })\n : JSON.stringify(obj)\n\n return this.primitives.AES.encrypt(k.key, utf8_2ua(json), k.raw)\n },\n (encryptedSelf) => this.tryDecryptJson(keys, encryptedSelf, false),\n fieldsToEncrypt,\n entityType\n )\n return { success: constructor(encrypted) }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (results.size != entitiesWithInitialisedEncryptionKeys.length) {\n if (requireEncryption) {\n throw new Error(\n `Could not encrypt entities ${entitiesWithInitialisedEncryptionKeys.flatMap((e): string[] => (results.has(e.id!) ? [] : [e.id!]))}`\n )\n } else {\n for (const e of entitiesWithInitialisedEncryptionKeys) {\n if (!results.has(e.id!)) {\n await encryptObject(\n e,\n async (obj: { [key: string]: any }) => {\n const hasNonEmptyValues = Object.values(obj).some(\n (v) => v !== undefined && (typeof v !== 'object' || (Array.isArray(v) && v.length > 0) || Object.keys(v).length > 0)\n )\n if (hasNonEmptyValues) {\n throw new Error(\n `Impossible to modify encrypted content of an entity if no encryption key is known.\\nEntity: ${JSON.stringify(\n e\n )}\\nTo encrypt: ${JSON.stringify(obj)}`\n )\n }\n return Promise.resolve(new ArrayBuffer(1))\n },\n () => Promise.resolve(null),\n fieldsToEncrypt,\n 'entity'\n )\n results.set(e.id!, e)\n }\n }\n }\n }\n return entitiesWithInitialisedEncryptionKeys.map((e) => results.get(e.id!)!)\n }\n\n async ensureEncryptionKeysInitialised<T extends EncryptedEntity>(entity: T, entityType: EntityWithDelegationTypeName): Promise<T | undefined> {\n if (this.securityMetadataDecryptor.hasAnyEncryptionKeys(entity)) return undefined\n if (!entity.rev) {\n throw new Error(\n 'New encrypted entity is lacking encryption metadata. ' +\n 'Please instantiate new entities using the `newInstance` method from the respective extended api.'\n )\n }\n /*\n * Add encryption key and share with all auto-delegates already in legacy delegations.\n * TODO disable this logic and simply throw error for post-2018 customers.\n */\n const existingDelegations = new Set(Object.keys(entity.delegations ?? {}))\n const usersWithAccessToNewKey = Object.fromEntries(\n Object.values((await this.userApi.getCurrentUser()).autoDelegations ?? {})\n .flatMap((x) => x)\n .filter((x) => existingDelegations.has(x))\n .map((x) => [x, AccessLevelEnum.WRITE])\n )\n return await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: entity.secretForeignKeys ?? [],\n },\n entityType,\n [],\n [],\n [await this.primitives.AES.generateCryptoKey(true)],\n usersWithAccessToNewKey,\n undefined\n )\n }\n\n private async decryptHierarchy(\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<{ ownerId: string; extracted: string[] }[]> {\n const canDecryptOwnerIds = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n return await decryptedDataProvider(canDecryptOwnerIds)\n }\n\n private async decryptAndMergeHierarchy(\n dataOwnerId: string | undefined,\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<string[]> {\n const hierarchy = this.useParentKeys\n ? dataOwnerId\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(dataOwnerId)\n : await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())]\n const decryptedData = await decryptedDataProvider(hierarchy)\n const merged = decryptedData.flatMap((x) => x.extracted)\n return this.deduplicate(merged)\n }\n\n private async tryImportKey(key: string): Promise<CryptoKey | undefined> {\n if (!/^[0-9A-Fa-f\\-]+$/g.test(key)) return undefined\n try {\n return await this.primitives.AES.importKey('raw', hex2ua(key.replace(/-/g, '')))\n } catch (e) {\n console.warn(`Could not import key ${key} as an encryption key.`, e)\n return undefined\n }\n }\n\n async doIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entity: E,\n entityType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<{ success: T } | null> {\n const res = await this.doManyIncrementallyDecryptingKeys([entity], entityType, (e, t, ks) => action(e, t, ks))\n if (res.has(entity.id!)) {\n return { success: res.get(entity.id!)! }\n } else {\n return null\n }\n }\n\n async doManyIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entities: E[],\n entitiesType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<Map<string, T>> {\n if (entities.length == 0) return new Map()\n let deduplicatedEntities = entities\n if (new Set(deduplicatedEntities.map((e) => e.id)).size != deduplicatedEntities.length) {\n console.error(`Duplicate entries in entities ${deduplicatedEntities.map((x) => x.id)}`)\n deduplicatedEntities = this.deduplicateById(deduplicatedEntities)\n }\n\n const hierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n const allExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const newlyExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const results = new Map<string, T>()\n const remainingEntitiesById = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, x] as [string, E]))\n const importedKeysByRaw = new Map<string, CryptoKey>()\n const primitives = this.primitives\n\n async function updateExtractedKeysAndDoActionIfNecessary(\n newKeys: { [entityId: string]: string[] },\n forceUpdateOnEntitiesWithNewExtractedKeys: boolean\n ): Promise<void> {\n for (const [entityId, keys] of Object.entries(newKeys)) {\n const newlyExtractedSet = newlyExtractedKeysForEntities[entityId]\n const alreadyExtractedSet = allExtractedKeysForEntities[entityId]\n for (const k of keys) {\n if (!alreadyExtractedSet.has(k)) {\n newlyExtractedSet.add(k)\n if (!importedKeysByRaw.has(k)) {\n importedKeysByRaw.set(k, await primitives.AES.importKey('raw', hex2ua(k)))\n }\n }\n }\n }\n if (\n forceUpdateOnEntitiesWithNewExtractedKeys ||\n Object.keys(remainingEntitiesById).every((eId) => newlyExtractedKeysForEntities[eId].size > 0)\n ) {\n for (const entity of Object.values(remainingEntitiesById)) {\n const currId = entity.id!\n const currNewlyExtracted = newlyExtractedKeysForEntities[currId]\n if (currNewlyExtracted.size > 0) {\n const currAllExtracted = allExtractedKeysForEntities[currId]\n currNewlyExtracted.forEach((k) => currAllExtracted.add(k))\n currNewlyExtracted.clear()\n const actionResult = await action(\n entity,\n entitiesType,\n [...currAllExtracted].map((raw): { raw: string; key: CryptoKey } => ({\n raw: raw,\n key: importedKeysByRaw.get(raw)!,\n }))\n )\n if (actionResult != null) {\n delete remainingEntitiesById[currId]\n results.set(currId, actionResult.success)\n }\n }\n }\n }\n }\n\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptLegacyDelegations(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingCache(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingKnownExchangeData(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingExchangeDataMap(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary({}, true)\n return results\n }\n\n private deduplicate<T>(values: T[]): T[] {\n return [...new Set(values)]\n }\n\n private throwDetailedExceptionForInvalidParameter(argName: string, argValue: any, methodName: string, methodArgs: IArguments) {\n if (argValue) return\n\n let details = '\\nMethod name: icc-crypto-x-api.' + methodName + '()\\nArguments:'\n\n if (methodArgs) {\n try {\n const argsArray = [...methodArgs]\n argsArray.forEach((arg, index) => (details += '\\n[' + index + ']: ' + JSON.stringify(arg)))\n } catch (ex) {\n details += '; a problem occured while logging arguments details: ' + ex\n }\n }\n\n throw new Error('### THIS SHOULD NOT HAPPEN: ' + argName + ' has an invalid value: ' + argValue + details)\n }\n\n private checkEmptyEncryptionMetadata(entity: EncryptedEntity) {\n this.doCheckEmptyEncryptionMetadata(entity, true)\n }\n\n hasEmptyEncryptionMetadata(entity: EncryptedEntity): boolean {\n return this.doCheckEmptyEncryptionMetadata(entity, false)\n }\n\n private doCheckEmptyEncryptionMetadata(entity: EncryptedEntity, throwErrorIfNonEmpty: boolean): boolean {\n const existingMetadata = []\n if (entity.delegations && Object.keys(entity.delegations).length) existingMetadata.push('delegations')\n if (entity.cryptedForeignKeys && Object.keys(entity.cryptedForeignKeys).length) existingMetadata.push('cryptedForeignKeys')\n if (entity.encryptionKeys && Object.keys(entity.encryptionKeys).length) existingMetadata.push('encryptionKeys')\n if (entity.secretForeignKeys && entity.secretForeignKeys.length) existingMetadata.push('secretForeignKeys')\n if (entity.securityMetadata && Object.keys(entity.securityMetadata).length) existingMetadata.push('securityMetadata')\n if (existingMetadata.length > 0) {\n if (throwErrorIfNonEmpty) {\n throw new Error(\n `Entity should have no encryption metadata on initialisation, but the following fields already have some values: ${existingMetadata}\\n` +\n JSON.stringify(entity, undefined, 2)\n )\n } else return false\n }\n return true\n }\n\n async initialiseConfidentialSecretId<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<T | undefined> {\n if (await this.getConfidentialSecretId({ entity, type: entityType })) return undefined\n const confidentialSecretId = this.primitives.randomUuid()\n return (\n await this.simpleShareOrUpdateEncryptedEntityMetadata(\n { entity, type: entityType },\n {\n [await this.dataOwnerApi.getCurrentDataOwnerId()]: {\n shareEncryptionKeys: ShareMetadataBehaviour.NEVER,\n shareOwningEntityIds: ShareMetadataBehaviour.NEVER,\n shareSecretIds: [confidentialSecretId],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n },\n },\n (request) => doRequestBulkShareOrUpdate(request)\n )\n ).updatedEntityOrThrow\n }\n\n async getConfidentialSecretId(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string | undefined> {\n return this.getConfidentialSecretIds(entity, dataOwnerId).then((x) => x[0])\n }\n\n async getConfidentialSecretIds(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n const chosenDataOwnerId = dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())\n const dataOwnerHierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(chosenDataOwnerId)\n const hierarchySecretIds = (await this.secretIdsForHcpHierarchyOf(entity)).filter((x) => dataOwnerHierarchy.includes(x.ownerId))\n const keysForDataOwner = hierarchySecretIds.find((x) => x.ownerId === chosenDataOwnerId)\n\n if (!keysForDataOwner) return []\n return keysForDataOwner.extracted.filter((k) => !hierarchySecretIds.some((x) => x.ownerId !== chosenDataOwnerId && x.extracted.includes(k)))\n }\n\n async getAnySecretIdSharedWithParents(entity: EncryptedEntityWithType): Promise<string | undefined> {\n return (await this.getSecretIdsSharedWithParents(entity))[0]\n }\n\n async getSecretIdsSharedWithParents(entity: EncryptedEntityWithType): Promise<string[]> {\n return (await this.secretIdsForHcpHierarchyOf(entity))[0].extracted\n }\n\n async resolveSecretIdUseOptions(entity: EncryptedEntityWithType, option: SecretIdUseOption): Promise<string[]> {\n if (option == SecretIdUseOption.UseNone) {\n return []\n } else if (option == SecretIdUseOption.UseAnyConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return all\n } else if (option == SecretIdUseOption.UseAnySharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllSharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return all\n } else if (option instanceof SecretIdUseOption.Use) {\n return [...new Set(option.secretIds)]\n } else {\n throw new Error(`Unrecognized SecretIdUseOption ${option}`)\n }\n }\n\n private deduplicateById<E extends { id?: string }>(entities: E[]): E[] {\n const seen = new Set<string | undefined>()\n return entities.filter((e) => {\n if (seen.has(e.id)) return false\n seen.add(e.id)\n return true\n })\n }\n}\n"]}
1
+ {"version":3,"file":"ExtendedApisUtilsImpl.js","sourceRoot":"","sources":["../../../icc-x-api/crypto/ExtendedApisUtilsImpl.ts"],"names":[],"mappings":"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","sourcesContent":["import { EncryptedEntity, EncryptedEntityStub } from '../../icc-api/model/models'\nimport { IccDataOwnerXApi } from '../icc-data-owner-x-api'\nimport {\n b2a,\n decryptObject,\n EncryptedEntityWithType,\n EncryptedFieldsManifest,\n encryptObject,\n EntityWithDelegationTypeName,\n hex2ua,\n truncateTrailingNulls,\n ua2ab,\n ua2utf8,\n utf8_2ua,\n} from '../utils'\nimport { CryptoPrimitives } from './CryptoPrimitives'\nimport { SecurityMetadataDecryptor, SecurityMetadataType } from './SecurityMetadataDecryptor'\nimport { SecureDelegation } from '../../icc-api/model/SecureDelegation'\nimport { ExtendedApisUtils } from './ExtendedApisUtils'\nimport { EntityShareOrMetadataUpdateRequest } from '../../icc-api/model/requests/EntityShareOrMetadataUpdateRequest'\nimport { EntityBulkShareResult } from '../../icc-api/model/requests/EntityBulkShareResult'\nimport { EntityShareRequest } from '../../icc-api/model/requests/EntityShareRequest'\nimport { SecureDelegationsManager } from './SecureDelegationsManager'\nimport { ShareResult, ShareResultFailure, ShareResultSuccess } from '../utils/ShareResult'\nimport { ShareMetadataBehaviour } from './ShareMetadataBehaviour'\nimport { IccUserXApi } from '../icc-user-x-api'\nimport { MinimalEntityBulkShareResult } from '../../icc-api/model/requests/MinimalEntityBulkShareResult'\nimport { BulkShareOrUpdateMetadataParams, EntityRequestInformation } from '../../icc-api/model/requests/BulkShareOrUpdateMetadataParams'\nimport AccessLevel = SecureDelegation.AccessLevelEnum\nimport RequestedPermissionEnum = EntityShareRequest.RequestedPermissionEnum\nimport RequestedPermissionInternal = EntityShareRequest.RequestedPermissionInternal\nimport AccessLevelEnum = SecureDelegation.AccessLevelEnum\nimport { SecretIdUseOption } from './SecretIdUseOption'\n\n/**\n * @internal this class is for internal use only and may be changed without notice.\n * Methods to support extended apis.\n */\nexport class ExtendedApisUtilsImpl implements ExtendedApisUtils {\n constructor(\n private readonly primitives: CryptoPrimitives,\n private readonly dataOwnerApi: IccDataOwnerXApi,\n private readonly securityMetadataDecryptor: SecurityMetadataDecryptor,\n private readonly secureDelegationsManager: SecureDelegationsManager,\n private readonly userApi: IccUserXApi,\n private readonly useParentKeys: boolean\n ) {}\n\n async encryptionKeysOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async encryptionKeysForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.EncryptionKey)\n )\n }\n\n async secretIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n )\n }\n\n async secretIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) => this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.SecretId))\n }\n\n async owningEntityIdsOf(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n return await this.decryptAndMergeHierarchy(dataOwnerId, (hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async owningEntityIdsForHcpHierarchyOf(entity: EncryptedEntityWithType): Promise<{ ownerId: string; extracted: string[] }[]> {\n return this.decryptHierarchy((hierarchy) =>\n this.securityMetadataDecryptor.decryptAll(entity.entity, hierarchy, SecurityMetadataType.OwningEntityId)\n )\n }\n\n async hasWriteAccess(entity: EncryptedEntityWithType): Promise<boolean> {\n return (\n (await this.securityMetadataDecryptor.getEntityAccessLevel(entity.entity, await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds())) ===\n AccessLevel.WRITE\n )\n }\n\n async entityWithInitialisedEncryptedMetadata<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n owningEntity: string | undefined,\n owningEntitySecretIds: string[] | undefined,\n initialiseEncryptionKey: boolean,\n autoDelegations: { [p: string]: SecureDelegation.AccessLevelEnum },\n alternateRootDelegation: string | undefined\n ): Promise<{ updatedEntity: T; rawEncryptionKey: string | undefined; secretId: string }> {\n this.throwDetailedExceptionForInvalidParameter('entity.id', entity.id, 'entityWithInitialisedEncryptedMetadata', arguments)\n this.checkEmptyEncryptionMetadata(entity)\n const newRawKey = initialiseEncryptionKey ? await this.primitives.AES.generateCryptoKey(true) : undefined\n const newSecretId = this.primitives.randomUuid()\n return {\n updatedEntity: await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: owningEntitySecretIds ?? [],\n },\n entityType,\n newSecretId ? [newSecretId] : [],\n !!owningEntity ? [owningEntity] : [],\n newRawKey ? [newRawKey] : [],\n autoDelegations,\n alternateRootDelegation\n ),\n rawEncryptionKey: newRawKey,\n secretId: newSecretId,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<{\n updatedEntities: T[]\n unmodifiedEntitiesIds: string[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results =\n Object.keys(allRequestsByEntityId).length > 0 ? await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId }) : []\n const updatedEntities: T[] = []\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n if (result.updatedEntity) {\n updatedEntities.push(result.updatedEntity)\n }\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n // TODO implement auto-retry for failed requests if the shouldRetry flag in result.rejectedRequests is set to true\n return {\n updatedEntities,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n async bulkShareOrUpdateEncryptedEntityMetadataNoEntities(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n }\n }[],\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<MinimalEntityBulkShareResult[]>\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n successfulUpdates: { entityId: string; delegateId: string }[]\n updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[]\n }> {\n const { allRequestsByEntityId, orderedRequestsInfoByEntityId, unmodifiedEntitiesIds } = await this.prepareBulkShareRequests(\n entitiesType,\n entitiesUpdates\n )\n const results = await doRequestBulkShareOrUpdate({ requestsByEntityId: allRequestsByEntityId })\n const updateErrors: {\n entityId: string\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n code?: number\n reason?: string\n }[] = []\n for (const result of results) {\n for (const [errorRequestId, error] of Object.entries(result.rejectedRequests ?? {})) {\n const requestIndex = Number(errorRequestId)\n const { delegateId, request, updatedForMigration } = orderedRequestsInfoByEntityId[result.entityId][requestIndex]\n updateErrors.push({\n entityId: result.entityId,\n delegateId,\n request,\n updatedForMigration,\n code: error.code,\n reason: error.reason,\n })\n }\n }\n const successfulRequests = Object.entries(allRequestsByEntityId)\n .flatMap(([entityId, requests]) => Object.keys(requests).map((delegateId) => ({ entityId, delegateId })))\n .filter(({ entityId, delegateId }) => !updateErrors.some((error) => error.entityId === entityId && error.delegateId === delegateId))\n return {\n successfulUpdates: successfulRequests,\n updateErrors,\n unmodifiedEntitiesIds,\n }\n }\n\n /**\n * Whether an existing, already-established access level (`undefined` if none) is enough to satisfy a requested\n * permission, without needing to create/update a delegation just for the permission itself. `ROOT` is a special,\n * self-only request independent of any other delegation on the entity, so it is never considered satisfied by\n * unrelated existing coverage.\n *\n * `MAX_WRITE` doesn't demand write access outright: it resolves to WRITE only if the caller granting it\n * (`callerAccess`) itself has WRITE, and to READ otherwise - so an existing READ is already sufficient for a\n * `MAX_WRITE` request unless the caller could actually upgrade it to WRITE.\n */\n private isPermissionSufficient(\n existing: AccessLevel | undefined,\n requested: RequestedPermissionInternal,\n callerAccess: AccessLevel | undefined\n ): boolean {\n if (requested === 'ROOT') return false\n if (!existing) return false\n if (existing === 'WRITE') return true\n if (requested === 'FULL_READ') return true\n if (requested === 'FULL_WRITE') return false\n return callerAccess !== 'WRITE' // MAX_WRITE: existing READ is enough unless the caller could grant WRITE\n }\n\n private async prepareBulkShareRequests(\n entitiesType: EntityWithDelegationTypeName,\n entitiesUpdates: {\n entity: EncryptedEntityStub\n dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n }[]\n ): Promise<{\n unmodifiedEntitiesIds: string[]\n allRequestsByEntityId: { [entityId: string]: EntityRequestInformation }\n orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n }\n }> {\n if (new Set(entitiesUpdates.map((e) => e.entity.id)).size !== entitiesUpdates.length) {\n throw new Error('Duplicate requests: the same entity id is present more than once in the input')\n }\n const allRequestsByEntityId = {} as { [entityId: string]: EntityRequestInformation }\n const orderedRequestsInfoByEntityId: {\n [entityId: string]: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[]\n } = {}\n const unmodifiedEntitiesIds: string[] = []\n for (const { entity, dataForDelegates } of entitiesUpdates) {\n const entityId = entity.id\n if (!entityId) throw new Error('Share of an entity requires for the entity to already exist and have an id')\n const entityWithType = { entity, type: entitiesType }\n const currentRequests = {} as { [requestId: string]: EntityShareOrMetadataUpdateRequest }\n const currentOrderedRequests: {\n delegateId: string\n request?: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n updatedForMigration: boolean\n }[] = []\n const migrationRequests = await this.makeMigrationRequestsIfNeeded(entityWithType, dataForDelegates)\n for (const [delegate, request] of Object.entries(migrationRequests)) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: dataForDelegates[delegate],\n updatedForMigration: true,\n })\n }\n\n // Hoisted: needed both for the redundant-share check below and (as before) for potentialParentDelegations.\n const selfId = await this.dataOwnerApi.getCurrentDataOwnerId()\n const hierarchy = this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds() : [selfId]\n const existingDelegationMembersDetails = await this.securityMetadataDecryptor.getDelegationMemberDetails(entityWithType)\n\n // Whole-entity, content-independent permission a data owner already has via ANY existing delegation naming\n // them - matches how the backend itself authorizes writes (\"is there at least one delegation with write\n // access\"), so unlike content coverage below this is deliberately not restricted to what the current caller\n // can decrypt: permission-level metadata is not end-to-end encrypted the way secret ids/encryption keys are.\n const bestPermissionByDataOwner: { [id: string]: AccessLevel } = {}\n for (const members of Object.values(existingDelegationMembersDetails)) {\n for (const partyId of [members.delegator, members.delegate]) {\n if (partyId && bestPermissionByDataOwner[partyId] !== 'WRITE') {\n bestPermissionByDataOwner[partyId] = members.accessLevel\n }\n }\n }\n for (const dataOwnerId of Object.keys(entity.delegations ?? {})) {\n bestPermissionByDataOwner[dataOwnerId] = 'WRITE'\n }\n\n // Content a data owner already has DIRECT (decryptable-by-me) access to via any existing delegation naming\n // them as either party - only computed for content types actually requested by at least one delegate.\n const delegatesToProcess = Object.entries(dataForDelegates).filter(([delegate]) => !migrationRequests[delegate])\n const needsSecretIds = delegatesToProcess.some(([, r]) => (r.shareSecretIds ?? []).length > 0)\n const needsEncryptionKeys = delegatesToProcess.some(([, r]) => (r.shareEncryptionKeys ?? []).length > 0)\n const needsOwningEntityIds = delegatesToProcess.some(([, r]) => (r.shareOwningEntityIds ?? []).length > 0)\n const directSecretIds = needsSecretIds\n ? await this.securityMetadataDecryptor.directlyAccessibleValuesByDataOwner(entity, hierarchy, SecurityMetadataType.SecretId)\n : {}\n const directEncryptionKeys = needsEncryptionKeys\n ? await this.securityMetadataDecryptor.directlyAccessibleValuesByDataOwner(entity, hierarchy, SecurityMetadataType.EncryptionKey)\n : {}\n const directOwningEntityIds = needsOwningEntityIds\n ? await this.securityMetadataDecryptor.directlyAccessibleValuesByDataOwner(entity, hierarchy, SecurityMetadataType.OwningEntityId)\n : {}\n\n for (const [delegate, userRequest] of delegatesToProcess) {\n const filteredSecretIds = (userRequest.shareSecretIds ?? []).filter((id) => !directSecretIds[delegate]?.has(id))\n const filteredEncryptionKeys = (userRequest.shareEncryptionKeys ?? []).filter((k) => !directEncryptionKeys[delegate]?.has(k))\n const filteredOwningEntityIds = (userRequest.shareOwningEntityIds ?? []).filter((id) => !directOwningEntityIds[delegate]?.has(id))\n const nothingLeftToShare = !filteredSecretIds.length && !filteredEncryptionKeys.length && !filteredOwningEntityIds.length\n\n if (\n nothingLeftToShare &&\n this.isPermissionSufficient(bestPermissionByDataOwner[delegate], userRequest.requestedPermissions, bestPermissionByDataOwner[selfId])\n ) {\n continue // fully covered by some other already-decryptable, directly-named delegation: nothing to write\n }\n\n const request = await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entityWithType,\n delegate,\n filteredSecretIds,\n filteredEncryptionKeys,\n filteredOwningEntityIds,\n userRequest.requestedPermissions\n )\n if (request) {\n currentRequests[String(currentOrderedRequests.length)] = request\n currentOrderedRequests.push({\n delegateId: delegate,\n request: userRequest,\n updatedForMigration: false,\n })\n }\n }\n if (Object.keys(currentRequests).length > 0) {\n const accessibleMembers = new Set(hierarchy)\n const potentialParentDelegations = Object.entries(existingDelegationMembersDetails).flatMap(([k, members]) => {\n if ((!!members.delegate && accessibleMembers.has(members.delegate)) || (!!members.delegator && accessibleMembers.has(members.delegator))) {\n return [k]\n } else return []\n })\n allRequestsByEntityId[entityId] = { requests: currentRequests, potentialParentDelegations }\n orderedRequestsInfoByEntityId[entityId] = currentOrderedRequests\n } else {\n unmodifiedEntitiesIds.push(entityId)\n }\n }\n return { unmodifiedEntitiesIds, allRequestsByEntityId, orderedRequestsInfoByEntityId }\n }\n\n async simpleShareOrUpdateEncryptedEntityMetadata<T extends EncryptedEntityStub>(\n entity: { entity: T; type: EntityWithDelegationTypeName },\n delegates: {\n [p: string]: {\n shareSecretIds: string[] | undefined\n shareEncryptionKeys: ShareMetadataBehaviour | undefined\n shareOwningEntityIds: ShareMetadataBehaviour | undefined\n requestedPermissions: EntityShareRequest.RequestedPermissionEnum | undefined\n }\n },\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<ShareResult<T>> {\n const availableEncryptionKeys = await this.encryptionKeysOf(entity)\n const availableOwningEntityIds = await this.owningEntityIdsOf(entity)\n const dataForDelegates: {\n [delegateId: string]: {\n shareSecretIds: string[]\n shareEncryptionKeys: string[]\n shareOwningEntityIds: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n } = {}\n for (const [delegateId, delegateRequests] of Object.entries(delegates)) {\n if (!availableEncryptionKeys.length && delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no encryption keys or the current data owner can't access any encryption keys, but sharing is required.`\n )\n }\n if (!availableOwningEntityIds.length && delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.REQUIRED) {\n throw new Error(\n `Entity ${JSON.stringify(\n entity\n )} has no owning entity ids or the current data owner can't access any owning entity ids, but sharing is required.`\n )\n }\n dataForDelegates[delegateId] = {\n shareSecretIds: delegateRequests.shareSecretIds ?? (await this.secretIdsOf(entity)),\n shareEncryptionKeys: delegateRequests.shareEncryptionKeys === ShareMetadataBehaviour.NEVER ? [] : availableEncryptionKeys,\n shareOwningEntityIds: delegateRequests.shareOwningEntityIds === ShareMetadataBehaviour.NEVER ? [] : availableOwningEntityIds,\n requestedPermissions: delegateRequests.requestedPermissions ?? RequestedPermissionEnum.MAX_WRITE,\n }\n }\n const shareResult = await this.bulkShareOrUpdateEncryptedEntityMetadata(\n entity.type,\n [\n {\n entity: entity.entity,\n dataForDelegates,\n },\n ],\n (x) => doRequestBulkShareOrUpdate(x)\n )\n if (shareResult.unmodifiedEntitiesIds.includes(entity.entity.id!)) {\n return new ShareResultSuccess(entity.entity)\n }\n if (!shareResult.updateErrors.length && shareResult.updatedEntities.length === 1) {\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n const requestedDelegates = new Set(Object.keys(delegates))\n const errorsOfRequestedDelegates = shareResult.updateErrors.filter((x) => requestedDelegates.has(x.delegateId))\n if (errorsOfRequestedDelegates.length === 0 && shareResult.updatedEntities.length === 1) {\n console.warn(`Errors with migration of encrypted metadata ${JSON.stringify(shareResult.updateErrors)}.`)\n return new ShareResultSuccess(shareResult.updatedEntities[0])\n }\n return new ShareResultFailure(\n shareResult.updateErrors,\n `There was an error sharing entity with id ${entity.entity.id}. Check the logs for more details.`\n )\n }\n\n private async makeMigrationRequestsIfNeeded(\n entity: EncryptedEntityWithType,\n userRequestsForEntity: {\n [delegateId: string]: {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n }\n ): Promise<{ [delegateId: string]: EntityShareOrMetadataUpdateRequest }> {\n const hierarchy = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n const legacySecretIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(entity.entity, hierarchy, SecurityMetadataType.SecretId)\n const legacyEncryptionKeys = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.EncryptionKey\n )\n const legacyOwningEntityIds = await this.securityMetadataDecryptor.decryptAllLegacyDelegations(\n entity.entity,\n hierarchy,\n SecurityMetadataType.OwningEntityId\n )\n const res = {} as { [delegateId: string]: EntityShareOrMetadataUpdateRequest }\n const selfId = await this.dataOwnerApi.getCurrentDataOwnerId()\n for (const hierarchyMember of hierarchy) {\n const hierarchyMemberMigration = await this.makeMigrationRequestForMemberOfHierarchy(\n entity,\n selfId,\n hierarchyMember,\n userRequestsForEntity[hierarchyMember],\n legacySecretIds,\n legacyEncryptionKeys,\n legacyOwningEntityIds\n )\n if (hierarchyMemberMigration) {\n res[hierarchyMember] = hierarchyMemberMigration\n }\n }\n return res\n }\n\n private async makeMigrationRequestForMemberOfHierarchy(\n entity: EncryptedEntityWithType,\n selfId: string,\n currMemberId: string,\n userRequestForDelegate:\n | {\n shareSecretIds?: string[]\n shareEncryptionKeys?: string[]\n shareOwningEntityIds?: string[]\n requestedPermissions: RequestedPermissionEnum\n }\n | undefined,\n legacySecretIds: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyEncryptionKeys: { decrypted: string; dataOwnersWithAccess: string[] }[],\n legacyOwningEntityIds: { decrypted: string; dataOwnersWithAccess: string[] }[]\n ): Promise<EntityShareOrMetadataUpdateRequest | undefined> {\n // This implementation is very specific from migration from delegations to secure delegations. If in future we will have to migrate from secure delegations to something else, this method may need significant changes in its logic.\n const subHierarchy = this.useParentKeys ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(currMemberId) : [currMemberId]\n const subHierarchySet = new Set(subHierarchy)\n const legacyAccess =\n selfId === entity.entity.id && currMemberId === selfId\n ? AccessLevel.WRITE\n : await this.securityMetadataDecryptor.getEntityLegacyDelegationAccessLevel(entity.entity, subHierarchy)\n if (!legacyAccess) return undefined\n const selfLegacySecretIds = legacySecretIds.filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d))).map((x) => x.decrypted)\n const selfLegacyEncryptionKeys = legacyEncryptionKeys\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n const selfLegacyOwningEntityIds = legacyOwningEntityIds\n .filter((x) => x.dataOwnersWithAccess.some((d) => subHierarchySet.has(d)))\n .map((x) => x.decrypted)\n let missingSecretIds: string[] = []\n let missingEncryptionKeys: string[] = []\n let missingOwningEntityIds: string[] = []\n if (selfLegacySecretIds.length > 0) {\n const currentSecretIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.SecretId)).map(\n (x) => x.decrypted\n )\n )\n missingSecretIds = selfLegacySecretIds.filter((x) => !currentSecretIds.has(x))\n }\n if (selfLegacyEncryptionKeys.length > 0) {\n const currentEncryptionKeys = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.EncryptionKey)).map(\n (x) => x.decrypted\n )\n )\n missingEncryptionKeys = selfLegacyEncryptionKeys.filter((x) => !currentEncryptionKeys.has(x))\n }\n if (selfLegacyOwningEntityIds.length > 0) {\n const currentOwningEntityIds = new Set(\n (await this.securityMetadataDecryptor.decryptAllSecureDelegations(entity.entity, [currMemberId], SecurityMetadataType.OwningEntityId)).map(\n (x) => x.decrypted\n )\n )\n missingOwningEntityIds = selfLegacyOwningEntityIds.filter((x) => !currentOwningEntityIds.has(x))\n }\n const mustCreateRootDelegation =\n selfId === entity.entity.id &&\n currMemberId === selfId &&\n !(await this.securityMetadataDecryptor.getEntitySecureDelegationAccessLevel(entity.entity, subHierarchy))\n if (missingSecretIds.length > 0 || missingEncryptionKeys.length > 0 || missingOwningEntityIds.length > 0 || mustCreateRootDelegation) {\n let requestedPermissions: RequestedPermissionInternal\n if (currMemberId === selfId) {\n requestedPermissions = RequestedPermissionInternal.ROOT\n } else {\n requestedPermissions = RequestedPermissionInternal.FULL_WRITE // Legacy permission if present is always write\n }\n return await this.secureDelegationsManager.makeShareOrUpdateRequestParams(\n entity,\n currMemberId,\n Array.from(new Set([...missingSecretIds, ...(userRequestForDelegate?.shareSecretIds ?? [])])),\n Array.from(new Set([...missingEncryptionKeys, ...(userRequestForDelegate?.shareEncryptionKeys ?? [])])),\n Array.from(new Set([...missingOwningEntityIds, ...(userRequestForDelegate?.shareOwningEntityIds ?? [])])),\n requestedPermissions\n )\n } else return undefined\n }\n\n async tryDecryptDataOf(\n entity: EncryptedEntityWithType,\n content: ArrayBuffer | Uint8Array,\n postProcessor?: (decryptedData: ArrayBuffer) => Promise<ArrayBuffer | undefined>\n ): Promise<{ data: ArrayBuffer; wasDecrypted: boolean }> {\n const triedKeys: Set<string> = new Set()\n const result = await this.doIncrementallyDecryptingKeys(entity.entity, entity.type, async (e, t, keys) => {\n for (const k of keys) {\n if (!triedKeys.has(k.raw)) {\n triedKeys.add(k.raw)\n try {\n const decrypted = await this.primitives.AES.decrypt(k.key, content)\n if (postProcessor) {\n const processed = await postProcessor(decrypted)\n if (processed !== undefined) return { success: processed }\n } else {\n return { success: decrypted }\n }\n } catch (e) {\n console.warn(`Error while attempting to decrypt attachment of ${entity.entity.id} with raw key ${k.raw}: ${e}`)\n }\n }\n }\n return null\n })\n if (result != null) {\n return { data: result.success, wasDecrypted: true }\n } else {\n return { data: ua2ab(content), wasDecrypted: false }\n }\n }\n\n async encryptDataOf<T extends EncryptedEntityStub>(\n entity: T,\n type: EntityWithDelegationTypeName,\n content: ArrayBuffer | Uint8Array,\n saveEntity: (entity: T) => Promise<T>\n ): Promise<{ encryptedData: ArrayBuffer; updatedEntity: T | undefined }> {\n const ensureInitialisedKeysResult = await this.ensureEncryptionKeysInitialised(entity, type)\n let updatedEntity: T | undefined\n if (!!ensureInitialisedKeysResult) {\n updatedEntity = await saveEntity(ensureInitialisedKeysResult)\n }\n const encrypted = await this.doIncrementallyDecryptingKeys(entity, type, async (e, t, keys) => {\n for (const k of keys) {\n try {\n return {\n success: {\n encryptedData: await this.primitives.AES.encrypt(k.key, content),\n updatedEntity: updatedEntity,\n },\n }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (encrypted != null) return encrypted.success\n throw new Error(`Could not extract any valid encryption keys for entity ${JSON.stringify(entity)}.`)\n }\n\n async tryDecryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n constructor: (json: any) => T\n ): Promise<{ entity: T; decrypted: boolean }[]> {\n const nothingToDecryptResults = new Map<string, T>()\n for (const entity of entities) {\n const nothingToDecrypt = await decryptObject(entity, async (encrypted) => {\n return null\n })\n if (nothingToDecrypt != null) {\n nothingToDecryptResults.set(entity.id!, constructor(nothingToDecrypt))\n }\n }\n const actuallyDecryptedResults = await this.doManyIncrementallyDecryptingKeys(\n entities.filter((e) => !nothingToDecryptResults.has(e.id!)),\n entityType,\n async (entity, t, keys) => {\n // The decrypt object will try all keys on each of the sub-objects; this is intentional because even though it\n // shouldn't happen, but it is still possible that some entity could be accidentally merged badly and the merged\n // entity has multiple encryptedSelf (on different sub-entities) that use different keys.\n const decrypted = await decryptObject(entity, (encrypted) => this.tryDecryptJson(keys, encrypted, false))\n if (decrypted != null) {\n return { success: constructor(decrypted) }\n } else {\n return null\n }\n }\n )\n const res = []\n for (const entity of entities) {\n const decrypted = actuallyDecryptedResults.get(entity.id!) ?? nothingToDecryptResults.get(entity.id!)\n if (!decrypted) {\n res.push({ entity: entity, decrypted: false })\n } else {\n res.push({ entity: decrypted, decrypted: true })\n }\n }\n return res\n }\n\n async tryDecryptJson(\n potentialKeys: { key: CryptoKey; raw: string }[],\n encrypted: Uint8Array,\n truncateTrailingDecryptedNulls: boolean\n ): Promise<{} | null> {\n for (const key of potentialKeys) {\n try {\n const decrypted = await this.primitives.AES.decrypt(key.key, encrypted, key.raw)\n return JSON.parse(ua2utf8(truncateTrailingDecryptedNulls ? truncateTrailingNulls(new Uint8Array(decrypted)) : decrypted))\n } catch (e) {}\n }\n return null\n }\n\n async tryEncryptEntities<T extends EncryptedEntity>(\n entities: T[],\n entityType: EntityWithDelegationTypeName,\n fieldsToEncrypt: EncryptedFieldsManifest,\n encodeBinaryData: boolean,\n requireEncryption: boolean,\n constructor: (json: any) => T\n ): Promise<T[]> {\n const entitiesWithInitialisedEncryptionKeys: T[] = []\n for (const entity of entities) {\n entitiesWithInitialisedEncryptionKeys.push((await this.ensureEncryptionKeysInitialised(entity, entityType)) ?? entity)\n }\n const results = await this.doManyIncrementallyDecryptingKeys(entitiesWithInitialisedEncryptionKeys, entityType, async (e, t, keys) => {\n for (const k of keys) {\n try {\n const encrypted = await encryptObject(\n e,\n (obj) => {\n // TODO encoding of binary data should probably be applied to everything?\n const json = encodeBinaryData\n ? JSON.stringify(obj, (k, v) => {\n return v instanceof ArrayBuffer || ArrayBuffer.isView(v)\n ? b2a(new Uint8Array(v as ArrayBufferLike).reduce((d, b) => d + String.fromCharCode(b), ''))\n : v\n })\n : JSON.stringify(obj)\n\n return this.primitives.AES.encrypt(k.key, utf8_2ua(json), k.raw)\n },\n (encryptedSelf) => this.tryDecryptJson(keys, encryptedSelf, false),\n fieldsToEncrypt,\n entityType\n )\n return { success: constructor(encrypted) }\n } catch (e) {\n console.warn(`Error while encrypting with raw key ${k.raw}: ${e}`)\n }\n }\n return null\n })\n if (results.size != entitiesWithInitialisedEncryptionKeys.length) {\n if (requireEncryption) {\n throw new Error(\n `Could not encrypt entities ${entitiesWithInitialisedEncryptionKeys.flatMap((e): string[] => (results.has(e.id!) ? [] : [e.id!]))}`\n )\n } else {\n for (const e of entitiesWithInitialisedEncryptionKeys) {\n if (!results.has(e.id!)) {\n await encryptObject(\n e,\n async (obj: { [key: string]: any }) => {\n const hasNonEmptyValues = Object.values(obj).some(\n (v) => v !== undefined && (typeof v !== 'object' || (Array.isArray(v) && v.length > 0) || Object.keys(v).length > 0)\n )\n if (hasNonEmptyValues) {\n throw new Error(\n `Impossible to modify encrypted content of an entity if no encryption key is known.\\nEntity: ${JSON.stringify(\n e\n )}\\nTo encrypt: ${JSON.stringify(obj)}`\n )\n }\n return Promise.resolve(new ArrayBuffer(1))\n },\n () => Promise.resolve(null),\n fieldsToEncrypt,\n 'entity'\n )\n results.set(e.id!, e)\n }\n }\n }\n }\n return entitiesWithInitialisedEncryptionKeys.map((e) => results.get(e.id!)!)\n }\n\n async ensureEncryptionKeysInitialised<T extends EncryptedEntity>(entity: T, entityType: EntityWithDelegationTypeName): Promise<T | undefined> {\n if (this.securityMetadataDecryptor.hasAnyEncryptionKeys(entity)) return undefined\n if (!entity.rev) {\n throw new Error(\n 'New encrypted entity is lacking encryption metadata. ' +\n 'Please instantiate new entities using the `newInstance` method from the respective extended api.'\n )\n }\n /*\n * Add encryption key and share with all auto-delegates already in legacy delegations.\n * TODO disable this logic and simply throw error for post-2018 customers.\n */\n const existingDelegations = new Set(Object.keys(entity.delegations ?? {}))\n const usersWithAccessToNewKey = Object.fromEntries(\n Object.values((await this.userApi.getCurrentUser()).autoDelegations ?? {})\n .flatMap((x) => x)\n .filter((x) => existingDelegations.has(x))\n .map((x) => [x, AccessLevelEnum.WRITE])\n )\n return await this.secureDelegationsManager.entityWithInitialisedEncryptedMetadata(\n {\n ...entity,\n secretForeignKeys: entity.secretForeignKeys ?? [],\n },\n entityType,\n [],\n [],\n [await this.primitives.AES.generateCryptoKey(true)],\n usersWithAccessToNewKey,\n undefined\n )\n }\n\n private async decryptHierarchy(\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<{ ownerId: string; extracted: string[] }[]> {\n const canDecryptOwnerIds = this.useParentKeys\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [await this.dataOwnerApi.getCurrentDataOwnerId()]\n return await decryptedDataProvider(canDecryptOwnerIds)\n }\n\n private async decryptAndMergeHierarchy(\n dataOwnerId: string | undefined,\n decryptedDataProvider: (dataOwners: string[]) => Promise<{ ownerId: string; extracted: string[] }[]>\n ): Promise<string[]> {\n const hierarchy = this.useParentKeys\n ? dataOwnerId\n ? await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(dataOwnerId)\n : await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n : [dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())]\n const decryptedData = await decryptedDataProvider(hierarchy)\n const merged = decryptedData.flatMap((x) => x.extracted)\n return this.deduplicate(merged)\n }\n\n private async tryImportKey(key: string): Promise<CryptoKey | undefined> {\n if (!/^[0-9A-Fa-f\\-]+$/g.test(key)) return undefined\n try {\n return await this.primitives.AES.importKey('raw', hex2ua(key.replace(/-/g, '')))\n } catch (e) {\n console.warn(`Could not import key ${key} as an encryption key.`, e)\n return undefined\n }\n }\n\n async doIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entity: E,\n entityType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<{ success: T } | null> {\n const res = await this.doManyIncrementallyDecryptingKeys([entity], entityType, (e, t, ks) => action(e, t, ks))\n if (res.has(entity.id!)) {\n return { success: res.get(entity.id!)! }\n } else {\n return null\n }\n }\n\n async doManyIncrementallyDecryptingKeys<E extends EncryptedEntity | EncryptedEntityStub, T>(\n entities: E[],\n entitiesType: EntityWithDelegationTypeName,\n action: (entity: E, entityType: EntityWithDelegationTypeName, keys: { key: CryptoKey; raw: string }[]) => Promise<{ success: T } | null>\n ): Promise<Map<string, T>> {\n if (entities.length == 0) return new Map()\n let deduplicatedEntities = entities\n if (new Set(deduplicatedEntities.map((e) => e.id)).size != deduplicatedEntities.length) {\n console.error(`Duplicate entries in entities ${deduplicatedEntities.map((x) => x.id)}`)\n deduplicatedEntities = this.deduplicateById(deduplicatedEntities)\n }\n\n const hierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIds()\n const allExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const newlyExtractedKeysForEntities = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, new Set<string>()] as [string, Set<string>]))\n const results = new Map<string, T>()\n const remainingEntitiesById = Object.fromEntries(deduplicatedEntities.map((x) => [x.id!, x] as [string, E]))\n const importedKeysByRaw = new Map<string, CryptoKey>()\n const primitives = this.primitives\n\n async function updateExtractedKeysAndDoActionIfNecessary(\n newKeys: { [entityId: string]: string[] },\n forceUpdateOnEntitiesWithNewExtractedKeys: boolean\n ): Promise<void> {\n for (const [entityId, keys] of Object.entries(newKeys)) {\n const newlyExtractedSet = newlyExtractedKeysForEntities[entityId]\n const alreadyExtractedSet = allExtractedKeysForEntities[entityId]\n for (const k of keys) {\n if (!alreadyExtractedSet.has(k)) {\n newlyExtractedSet.add(k)\n if (!importedKeysByRaw.has(k)) {\n importedKeysByRaw.set(k, await primitives.AES.importKey('raw', hex2ua(k)))\n }\n }\n }\n }\n if (\n forceUpdateOnEntitiesWithNewExtractedKeys ||\n Object.keys(remainingEntitiesById).every((eId) => newlyExtractedKeysForEntities[eId].size > 0)\n ) {\n for (const entity of Object.values(remainingEntitiesById)) {\n const currId = entity.id!\n const currNewlyExtracted = newlyExtractedKeysForEntities[currId]\n if (currNewlyExtracted.size > 0) {\n const currAllExtracted = allExtractedKeysForEntities[currId]\n currNewlyExtracted.forEach((k) => currAllExtracted.add(k))\n currNewlyExtracted.clear()\n const actionResult = await action(\n entity,\n entitiesType,\n [...currAllExtracted].map((raw): { raw: string; key: CryptoKey } => ({\n raw: raw,\n key: importedKeysByRaw.get(raw)!,\n }))\n )\n if (actionResult != null) {\n delete remainingEntitiesById[currId]\n results.set(currId, actionResult.success)\n }\n }\n }\n }\n }\n\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptLegacyDelegations(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingCache(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingKnownExchangeData(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary(\n await this.securityMetadataDecryptor.decryptSecureDelegationsUsingExchangeDataMap(\n Object.values(remainingEntitiesById),\n hierarchy,\n SecurityMetadataType.EncryptionKey\n ),\n false\n )\n if (Object.keys(remainingEntitiesById).length == 0) return results\n await updateExtractedKeysAndDoActionIfNecessary({}, true)\n return results\n }\n\n private deduplicate<T>(values: T[]): T[] {\n return [...new Set(values)]\n }\n\n private throwDetailedExceptionForInvalidParameter(argName: string, argValue: any, methodName: string, methodArgs: IArguments) {\n if (argValue) return\n\n let details = '\\nMethod name: icc-crypto-x-api.' + methodName + '()\\nArguments:'\n\n if (methodArgs) {\n try {\n const argsArray = [...methodArgs]\n argsArray.forEach((arg, index) => (details += '\\n[' + index + ']: ' + JSON.stringify(arg)))\n } catch (ex) {\n details += '; a problem occured while logging arguments details: ' + ex\n }\n }\n\n throw new Error('### THIS SHOULD NOT HAPPEN: ' + argName + ' has an invalid value: ' + argValue + details)\n }\n\n private checkEmptyEncryptionMetadata(entity: EncryptedEntity) {\n this.doCheckEmptyEncryptionMetadata(entity, true)\n }\n\n hasEmptyEncryptionMetadata(entity: EncryptedEntity): boolean {\n return this.doCheckEmptyEncryptionMetadata(entity, false)\n }\n\n private doCheckEmptyEncryptionMetadata(entity: EncryptedEntity, throwErrorIfNonEmpty: boolean): boolean {\n const existingMetadata = []\n if (entity.delegations && Object.keys(entity.delegations).length) existingMetadata.push('delegations')\n if (entity.cryptedForeignKeys && Object.keys(entity.cryptedForeignKeys).length) existingMetadata.push('cryptedForeignKeys')\n if (entity.encryptionKeys && Object.keys(entity.encryptionKeys).length) existingMetadata.push('encryptionKeys')\n if (entity.secretForeignKeys && entity.secretForeignKeys.length) existingMetadata.push('secretForeignKeys')\n if (entity.securityMetadata && Object.keys(entity.securityMetadata).length) existingMetadata.push('securityMetadata')\n if (existingMetadata.length > 0) {\n if (throwErrorIfNonEmpty) {\n throw new Error(\n `Entity should have no encryption metadata on initialisation, but the following fields already have some values: ${existingMetadata}\\n` +\n JSON.stringify(entity, undefined, 2)\n )\n } else return false\n }\n return true\n }\n\n async initialiseConfidentialSecretId<T extends EncryptedEntity>(\n entity: T,\n entityType: EntityWithDelegationTypeName,\n doRequestBulkShareOrUpdate: (request: BulkShareOrUpdateMetadataParams) => Promise<EntityBulkShareResult<T>[]>\n ): Promise<T | undefined> {\n if (await this.getConfidentialSecretId({ entity, type: entityType })) return undefined\n const confidentialSecretId = this.primitives.randomUuid()\n return (\n await this.simpleShareOrUpdateEncryptedEntityMetadata(\n { entity, type: entityType },\n {\n [await this.dataOwnerApi.getCurrentDataOwnerId()]: {\n shareEncryptionKeys: ShareMetadataBehaviour.NEVER,\n shareOwningEntityIds: ShareMetadataBehaviour.NEVER,\n shareSecretIds: [confidentialSecretId],\n requestedPermissions: RequestedPermissionEnum.MAX_WRITE,\n },\n },\n (request) => doRequestBulkShareOrUpdate(request)\n )\n ).updatedEntityOrThrow\n }\n\n async getConfidentialSecretId(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string | undefined> {\n return this.getConfidentialSecretIds(entity, dataOwnerId).then((x) => x[0])\n }\n\n async getConfidentialSecretIds(entity: EncryptedEntityWithType, dataOwnerId?: string): Promise<string[]> {\n const chosenDataOwnerId = dataOwnerId ?? (await this.dataOwnerApi.getCurrentDataOwnerId())\n const dataOwnerHierarchy = await this.dataOwnerApi.getCurrentDataOwnerHierarchyIdsFrom(chosenDataOwnerId)\n const hierarchySecretIds = (await this.secretIdsForHcpHierarchyOf(entity)).filter((x) => dataOwnerHierarchy.includes(x.ownerId))\n const keysForDataOwner = hierarchySecretIds.find((x) => x.ownerId === chosenDataOwnerId)\n\n if (!keysForDataOwner) return []\n return keysForDataOwner.extracted.filter((k) => !hierarchySecretIds.some((x) => x.ownerId !== chosenDataOwnerId && x.extracted.includes(k)))\n }\n\n async getAnySecretIdSharedWithParents(entity: EncryptedEntityWithType): Promise<string | undefined> {\n return (await this.getSecretIdsSharedWithParents(entity))[0]\n }\n\n async getSecretIdsSharedWithParents(entity: EncryptedEntityWithType): Promise<string[]> {\n return (await this.secretIdsForHcpHierarchyOf(entity))[0].extracted\n }\n\n async resolveSecretIdUseOptions(entity: EncryptedEntityWithType, option: SecretIdUseOption): Promise<string[]> {\n if (option == SecretIdUseOption.UseNone) {\n return []\n } else if (option == SecretIdUseOption.UseAnyConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllConfidential) {\n const all = await this.getConfidentialSecretIds(entity, undefined)\n if (all.length == 0) throw new Error(\"Couldn't find any confidential secret id\")\n return all\n } else if (option == SecretIdUseOption.UseAnySharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return [all[0]]\n } else if (option == SecretIdUseOption.UseAllSharedWithParent) {\n const all = await this.getSecretIdsSharedWithParents(entity)\n if (all.length == 0) throw new Error(\"Couldn't find any secret id shared with parent\")\n return all\n } else if (option instanceof SecretIdUseOption.Use) {\n return [...new Set(option.secretIds)]\n } else {\n throw new Error(`Unrecognized SecretIdUseOption ${option}`)\n }\n }\n\n private deduplicateById<E extends { id?: string }>(entities: E[]): E[] {\n const seen = new Set<string | undefined>()\n return entities.filter((e) => {\n if (seen.has(e.id)) return false\n seen.add(e.id)\n return true\n })\n }\n}\n"]}
@@ -51,6 +51,20 @@ export declare class SecurityMetadataDecryptor {
51
51
  decrypted: string;
52
52
  dataOwnersWithAccess: string[];
53
53
  }[]>;
54
+ /**
55
+ * For every value (secret id / encryption key / owning entity id, depending on metadataType) decryptable by the
56
+ * given hierarchy, returns which data owners have DIRECT access to it: i.e. are explicitly named as either party
57
+ * (delegator/delegate, owner/delegatedTo) of the specific delegation edge that carries that value - never a data
58
+ * owner merely reachable by inference through a parent/child hierarchy relationship. Both parties of an edge get
59
+ * equal credit for its content because they have equal decrypt access to it by construction (the edge's exchange
60
+ * key can be unwrapped by either party's private key).
61
+ *
62
+ * Used to check whether sharing a value with a delegate would be redundant because some other, already-decryptable
63
+ * delegation on the entity already grants that delegate the exact same value directly.
64
+ */
65
+ directlyAccessibleValuesByDataOwner(entity: EncryptedEntityStub | EncryptedEntity, dataOwnersHierarchySubset: string[], metadataType: SecurityMetadataType): Promise<{
66
+ [dataOwnerId: string]: Set<string>;
67
+ }>;
54
68
  decryptAllSecureDelegations(entity: EncryptedEntityStub | EncryptedEntity, dataOwnersHierarchySubset: string[], metadataType: SecurityMetadataType): Promise<{
55
69
  decrypted: string;
56
70
  dataOwnersWithAccess: string[];
@@ -259,6 +259,34 @@ class SecurityMetadataDecryptor {
259
259
  return this.extractFromLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType);
260
260
  });
261
261
  }
262
+ /**
263
+ * For every value (secret id / encryption key / owning entity id, depending on metadataType) decryptable by the
264
+ * given hierarchy, returns which data owners have DIRECT access to it: i.e. are explicitly named as either party
265
+ * (delegator/delegate, owner/delegatedTo) of the specific delegation edge that carries that value - never a data
266
+ * owner merely reachable by inference through a parent/child hierarchy relationship. Both parties of an edge get
267
+ * equal credit for its content because they have equal decrypt access to it by construction (the edge's exchange
268
+ * key can be unwrapped by either party's private key).
269
+ *
270
+ * Used to check whether sharing a value with a delegate would be redundant because some other, already-decryptable
271
+ * delegation on the entity already grants that delegate the exact same value directly.
272
+ */
273
+ directlyAccessibleValuesByDataOwner(entity, dataOwnersHierarchySubset, metadataType) {
274
+ return __awaiter(this, void 0, void 0, function* () {
275
+ var _a;
276
+ const edges = [
277
+ ...(yield this.decryptAllLegacyDelegations(entity, dataOwnersHierarchySubset, metadataType)),
278
+ ...(yield this.decryptAllSecureDelegations(entity, dataOwnersHierarchySubset, metadataType)),
279
+ ];
280
+ const result = {};
281
+ for (const edge of edges) {
282
+ for (const partyId of edge.dataOwnersWithAccess) {
283
+ ;
284
+ ((_a = result[partyId]) !== null && _a !== void 0 ? _a : (result[partyId] = new Set())).add(edge.decrypted);
285
+ }
286
+ }
287
+ return result;
288
+ });
289
+ }
262
290
  decryptAllSecureDelegations(entity, dataOwnersHierarchySubset, metadataType) {
263
291
  return __awaiter(this, void 0, void 0, function* () {
264
292
  var _a, _b;