@unwanted/matrix-sdk-mini 34.12.0-2 → 34.12.0-4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (492) hide show
  1. package/git-revision.txt +1 -1
  2. package/lib/@types/global.d.js +0 -2
  3. package/lib/@types/global.d.js.map +1 -1
  4. package/lib/browser-index.d.ts.map +1 -1
  5. package/lib/browser-index.js +0 -11
  6. package/lib/browser-index.js.map +1 -1
  7. package/lib/client.d.ts +2 -1221
  8. package/lib/client.d.ts.map +1 -1
  9. package/lib/client.js +331 -2821
  10. package/lib/client.js.map +1 -1
  11. package/lib/embedded.d.ts +0 -22
  12. package/lib/embedded.d.ts.map +1 -1
  13. package/lib/embedded.js +24 -166
  14. package/lib/embedded.js.map +1 -1
  15. package/lib/event-mapper.d.ts.map +1 -1
  16. package/lib/event-mapper.js +0 -4
  17. package/lib/event-mapper.js.map +1 -1
  18. package/lib/matrix.d.ts +0 -19
  19. package/lib/matrix.d.ts.map +1 -1
  20. package/lib/matrix.js +1 -26
  21. package/lib/matrix.js.map +1 -1
  22. package/lib/models/MSC3089Branch.d.ts.map +1 -1
  23. package/lib/models/MSC3089Branch.js +0 -3
  24. package/lib/models/MSC3089Branch.js.map +1 -1
  25. package/lib/models/event.d.ts +0 -94
  26. package/lib/models/event.d.ts.map +1 -1
  27. package/lib/models/event.js +0 -274
  28. package/lib/models/event.js.map +1 -1
  29. package/lib/models/poll.d.ts.map +1 -1
  30. package/lib/models/poll.js +1 -5
  31. package/lib/models/poll.js.map +1 -1
  32. package/lib/models/relations-container.d.ts.map +1 -1
  33. package/lib/models/relations-container.js +1 -7
  34. package/lib/models/relations-container.js.map +1 -1
  35. package/lib/models/relations.d.ts +0 -1
  36. package/lib/models/relations.d.ts.map +1 -1
  37. package/lib/models/relations.js +0 -8
  38. package/lib/models/relations.js.map +1 -1
  39. package/lib/models/room-state.d.ts.map +1 -1
  40. package/lib/models/room-state.js +10 -26
  41. package/lib/models/room-state.js.map +1 -1
  42. package/lib/models/room.d.ts +0 -18
  43. package/lib/models/room.d.ts.map +1 -1
  44. package/lib/models/room.js +94 -148
  45. package/lib/models/room.js.map +1 -1
  46. package/lib/models/thread.d.ts.map +1 -1
  47. package/lib/models/thread.js +0 -1
  48. package/lib/models/thread.js.map +1 -1
  49. package/lib/sliding-sync-sdk.d.ts +2 -3
  50. package/lib/sliding-sync-sdk.d.ts.map +1 -1
  51. package/lib/sliding-sync-sdk.js +41 -90
  52. package/lib/sliding-sync-sdk.js.map +1 -1
  53. package/lib/sync.d.ts +0 -12
  54. package/lib/sync.d.ts.map +1 -1
  55. package/lib/sync.js +1 -73
  56. package/lib/sync.js.map +1 -1
  57. package/lib/testing.d.ts +0 -48
  58. package/lib/testing.d.ts.map +1 -1
  59. package/lib/testing.js +0 -105
  60. package/lib/testing.js.map +1 -1
  61. package/lib/types.d.ts +0 -1
  62. package/lib/types.d.ts.map +1 -1
  63. package/lib/types.js.map +1 -1
  64. package/package.json +1 -3
  65. package/src/@types/global.d.ts +0 -3
  66. package/src/browser-index.ts +0 -11
  67. package/src/client.ts +60 -2882
  68. package/src/embedded.ts +3 -130
  69. package/src/event-mapper.ts +0 -4
  70. package/src/matrix.ts +0 -28
  71. package/src/models/MSC3089Branch.ts +0 -3
  72. package/src/models/event.ts +0 -289
  73. package/src/models/poll.ts +0 -6
  74. package/src/models/relations-container.ts +1 -8
  75. package/src/models/relations.ts +0 -8
  76. package/src/models/room-state.ts +2 -8
  77. package/src/models/room.ts +0 -62
  78. package/src/models/thread.ts +0 -1
  79. package/src/sliding-sync-sdk.ts +2 -72
  80. package/src/sync.ts +1 -98
  81. package/src/testing.ts +0 -108
  82. package/src/types.ts +0 -1
  83. package/CHANGELOG.md +0 -5910
  84. package/lib/@types/AESEncryptedSecretStoragePayload.d.ts +0 -14
  85. package/lib/@types/AESEncryptedSecretStoragePayload.d.ts.map +0 -1
  86. package/lib/@types/AESEncryptedSecretStoragePayload.js +0 -1
  87. package/lib/@types/AESEncryptedSecretStoragePayload.js.map +0 -1
  88. package/lib/@types/crypto.d.ts +0 -47
  89. package/lib/@types/crypto.d.ts.map +0 -1
  90. package/lib/@types/crypto.js +0 -1
  91. package/lib/@types/crypto.js.map +0 -1
  92. package/lib/@types/matrix-sdk-crypto-wasm.d.js +0 -1
  93. package/lib/@types/matrix-sdk-crypto-wasm.d.js.map +0 -1
  94. package/lib/common-crypto/CryptoBackend.d.ts +0 -240
  95. package/lib/common-crypto/CryptoBackend.d.ts.map +0 -1
  96. package/lib/common-crypto/CryptoBackend.js +0 -73
  97. package/lib/common-crypto/CryptoBackend.js.map +0 -1
  98. package/lib/common-crypto/key-passphrase.d.ts +0 -14
  99. package/lib/common-crypto/key-passphrase.d.ts.map +0 -1
  100. package/lib/common-crypto/key-passphrase.js +0 -33
  101. package/lib/common-crypto/key-passphrase.js.map +0 -1
  102. package/lib/crypto/CrossSigning.d.ts +0 -184
  103. package/lib/crypto/CrossSigning.d.ts.map +0 -1
  104. package/lib/crypto/CrossSigning.js +0 -718
  105. package/lib/crypto/CrossSigning.js.map +0 -1
  106. package/lib/crypto/DeviceList.d.ts +0 -216
  107. package/lib/crypto/DeviceList.d.ts.map +0 -1
  108. package/lib/crypto/DeviceList.js +0 -892
  109. package/lib/crypto/DeviceList.js.map +0 -1
  110. package/lib/crypto/EncryptionSetup.d.ts +0 -152
  111. package/lib/crypto/EncryptionSetup.d.ts.map +0 -1
  112. package/lib/crypto/EncryptionSetup.js +0 -356
  113. package/lib/crypto/EncryptionSetup.js.map +0 -1
  114. package/lib/crypto/OlmDevice.d.ts +0 -457
  115. package/lib/crypto/OlmDevice.d.ts.map +0 -1
  116. package/lib/crypto/OlmDevice.js +0 -1241
  117. package/lib/crypto/OlmDevice.js.map +0 -1
  118. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts +0 -109
  119. package/lib/crypto/OutgoingRoomKeyRequestManager.d.ts.map +0 -1
  120. package/lib/crypto/OutgoingRoomKeyRequestManager.js +0 -415
  121. package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +0 -1
  122. package/lib/crypto/RoomList.d.ts +0 -26
  123. package/lib/crypto/RoomList.d.ts.map +0 -1
  124. package/lib/crypto/RoomList.js +0 -71
  125. package/lib/crypto/RoomList.js.map +0 -1
  126. package/lib/crypto/SecretSharing.d.ts +0 -24
  127. package/lib/crypto/SecretSharing.d.ts.map +0 -1
  128. package/lib/crypto/SecretSharing.js +0 -194
  129. package/lib/crypto/SecretSharing.js.map +0 -1
  130. package/lib/crypto/SecretStorage.d.ts +0 -55
  131. package/lib/crypto/SecretStorage.d.ts.map +0 -1
  132. package/lib/crypto/SecretStorage.js +0 -118
  133. package/lib/crypto/SecretStorage.js.map +0 -1
  134. package/lib/crypto/aes.d.ts +0 -6
  135. package/lib/crypto/aes.d.ts.map +0 -1
  136. package/lib/crypto/aes.js +0 -24
  137. package/lib/crypto/aes.js.map +0 -1
  138. package/lib/crypto/algorithms/base.d.ts +0 -156
  139. package/lib/crypto/algorithms/base.d.ts.map +0 -1
  140. package/lib/crypto/algorithms/base.js +0 -187
  141. package/lib/crypto/algorithms/base.js.map +0 -1
  142. package/lib/crypto/algorithms/index.d.ts +0 -4
  143. package/lib/crypto/algorithms/index.d.ts.map +0 -1
  144. package/lib/crypto/algorithms/index.js +0 -20
  145. package/lib/crypto/algorithms/index.js.map +0 -1
  146. package/lib/crypto/algorithms/megolm.d.ts +0 -385
  147. package/lib/crypto/algorithms/megolm.d.ts.map +0 -1
  148. package/lib/crypto/algorithms/megolm.js +0 -1822
  149. package/lib/crypto/algorithms/megolm.js.map +0 -1
  150. package/lib/crypto/algorithms/olm.d.ts +0 -5
  151. package/lib/crypto/algorithms/olm.d.ts.map +0 -1
  152. package/lib/crypto/algorithms/olm.js +0 -299
  153. package/lib/crypto/algorithms/olm.js.map +0 -1
  154. package/lib/crypto/api.d.ts +0 -32
  155. package/lib/crypto/api.d.ts.map +0 -1
  156. package/lib/crypto/api.js +0 -22
  157. package/lib/crypto/api.js.map +0 -1
  158. package/lib/crypto/backup.d.ts +0 -227
  159. package/lib/crypto/backup.d.ts.map +0 -1
  160. package/lib/crypto/backup.js +0 -824
  161. package/lib/crypto/backup.js.map +0 -1
  162. package/lib/crypto/crypto.d.ts +0 -3
  163. package/lib/crypto/crypto.d.ts.map +0 -1
  164. package/lib/crypto/crypto.js +0 -19
  165. package/lib/crypto/crypto.js.map +0 -1
  166. package/lib/crypto/dehydration.d.ts +0 -34
  167. package/lib/crypto/dehydration.d.ts.map +0 -1
  168. package/lib/crypto/dehydration.js +0 -252
  169. package/lib/crypto/dehydration.js.map +0 -1
  170. package/lib/crypto/device-converter.d.ts +0 -9
  171. package/lib/crypto/device-converter.d.ts.map +0 -1
  172. package/lib/crypto/device-converter.js +0 -42
  173. package/lib/crypto/device-converter.js.map +0 -1
  174. package/lib/crypto/deviceinfo.d.ts +0 -99
  175. package/lib/crypto/deviceinfo.d.ts.map +0 -1
  176. package/lib/crypto/deviceinfo.js +0 -148
  177. package/lib/crypto/deviceinfo.js.map +0 -1
  178. package/lib/crypto/index.d.ts +0 -1209
  179. package/lib/crypto/index.d.ts.map +0 -1
  180. package/lib/crypto/index.js +0 -4097
  181. package/lib/crypto/index.js.map +0 -1
  182. package/lib/crypto/key_passphrase.d.ts +0 -14
  183. package/lib/crypto/key_passphrase.d.ts.map +0 -1
  184. package/lib/crypto/key_passphrase.js +0 -44
  185. package/lib/crypto/key_passphrase.js.map +0 -1
  186. package/lib/crypto/keybackup.d.ts +0 -18
  187. package/lib/crypto/keybackup.d.ts.map +0 -1
  188. package/lib/crypto/keybackup.js +0 -1
  189. package/lib/crypto/keybackup.js.map +0 -1
  190. package/lib/crypto/olmlib.d.ts +0 -129
  191. package/lib/crypto/olmlib.d.ts.map +0 -1
  192. package/lib/crypto/olmlib.js +0 -492
  193. package/lib/crypto/olmlib.js.map +0 -1
  194. package/lib/crypto/recoverykey.d.ts +0 -2
  195. package/lib/crypto/recoverykey.d.ts.map +0 -1
  196. package/lib/crypto/recoverykey.js +0 -19
  197. package/lib/crypto/recoverykey.js.map +0 -1
  198. package/lib/crypto/store/base.d.ts +0 -252
  199. package/lib/crypto/store/base.d.ts.map +0 -1
  200. package/lib/crypto/store/base.js +0 -64
  201. package/lib/crypto/store/base.js.map +0 -1
  202. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts +0 -187
  203. package/lib/crypto/store/indexeddb-crypto-store-backend.d.ts.map +0 -1
  204. package/lib/crypto/store/indexeddb-crypto-store-backend.js +0 -1145
  205. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +0 -1
  206. package/lib/crypto/store/indexeddb-crypto-store.d.ts +0 -432
  207. package/lib/crypto/store/indexeddb-crypto-store.d.ts.map +0 -1
  208. package/lib/crypto/store/indexeddb-crypto-store.js +0 -728
  209. package/lib/crypto/store/indexeddb-crypto-store.js.map +0 -1
  210. package/lib/crypto/store/localStorage-crypto-store.d.ts +0 -119
  211. package/lib/crypto/store/localStorage-crypto-store.d.ts.map +0 -1
  212. package/lib/crypto/store/localStorage-crypto-store.js +0 -531
  213. package/lib/crypto/store/localStorage-crypto-store.js.map +0 -1
  214. package/lib/crypto/store/memory-crypto-store.d.ts +0 -215
  215. package/lib/crypto/store/memory-crypto-store.d.ts.map +0 -1
  216. package/lib/crypto/store/memory-crypto-store.js +0 -622
  217. package/lib/crypto/store/memory-crypto-store.js.map +0 -1
  218. package/lib/crypto/verification/Base.d.ts +0 -105
  219. package/lib/crypto/verification/Base.d.ts.map +0 -1
  220. package/lib/crypto/verification/Base.js +0 -372
  221. package/lib/crypto/verification/Base.js.map +0 -1
  222. package/lib/crypto/verification/Error.d.ts +0 -35
  223. package/lib/crypto/verification/Error.d.ts.map +0 -1
  224. package/lib/crypto/verification/Error.js +0 -86
  225. package/lib/crypto/verification/Error.js.map +0 -1
  226. package/lib/crypto/verification/IllegalMethod.d.ts +0 -15
  227. package/lib/crypto/verification/IllegalMethod.d.ts.map +0 -1
  228. package/lib/crypto/verification/IllegalMethod.js +0 -43
  229. package/lib/crypto/verification/IllegalMethod.js.map +0 -1
  230. package/lib/crypto/verification/QRCode.d.ts +0 -51
  231. package/lib/crypto/verification/QRCode.d.ts.map +0 -1
  232. package/lib/crypto/verification/QRCode.js +0 -277
  233. package/lib/crypto/verification/QRCode.js.map +0 -1
  234. package/lib/crypto/verification/SAS.d.ts +0 -27
  235. package/lib/crypto/verification/SAS.d.ts.map +0 -1
  236. package/lib/crypto/verification/SAS.js +0 -485
  237. package/lib/crypto/verification/SAS.js.map +0 -1
  238. package/lib/crypto/verification/SASDecimal.d.ts +0 -8
  239. package/lib/crypto/verification/SASDecimal.d.ts.map +0 -1
  240. package/lib/crypto/verification/SASDecimal.js +0 -34
  241. package/lib/crypto/verification/SASDecimal.js.map +0 -1
  242. package/lib/crypto/verification/request/Channel.d.ts +0 -18
  243. package/lib/crypto/verification/request/Channel.d.ts.map +0 -1
  244. package/lib/crypto/verification/request/Channel.js +0 -1
  245. package/lib/crypto/verification/request/Channel.js.map +0 -1
  246. package/lib/crypto/verification/request/InRoomChannel.d.ts +0 -113
  247. package/lib/crypto/verification/request/InRoomChannel.d.ts.map +0 -1
  248. package/lib/crypto/verification/request/InRoomChannel.js +0 -351
  249. package/lib/crypto/verification/request/InRoomChannel.js.map +0 -1
  250. package/lib/crypto/verification/request/ToDeviceChannel.d.ts +0 -105
  251. package/lib/crypto/verification/request/ToDeviceChannel.d.ts.map +0 -1
  252. package/lib/crypto/verification/request/ToDeviceChannel.js +0 -328
  253. package/lib/crypto/verification/request/ToDeviceChannel.js.map +0 -1
  254. package/lib/crypto/verification/request/VerificationRequest.d.ts +0 -227
  255. package/lib/crypto/verification/request/VerificationRequest.d.ts.map +0 -1
  256. package/lib/crypto/verification/request/VerificationRequest.js +0 -937
  257. package/lib/crypto/verification/request/VerificationRequest.js.map +0 -1
  258. package/lib/crypto-api/CryptoEvent.d.ts +0 -69
  259. package/lib/crypto-api/CryptoEvent.d.ts.map +0 -1
  260. package/lib/crypto-api/CryptoEvent.js +0 -33
  261. package/lib/crypto-api/CryptoEvent.js.map +0 -1
  262. package/lib/crypto-api/CryptoEventHandlerMap.d.ts +0 -16
  263. package/lib/crypto-api/CryptoEventHandlerMap.d.ts.map +0 -1
  264. package/lib/crypto-api/CryptoEventHandlerMap.js +0 -22
  265. package/lib/crypto-api/CryptoEventHandlerMap.js.map +0 -1
  266. package/lib/crypto-api/index.d.ts +0 -978
  267. package/lib/crypto-api/index.d.ts.map +0 -1
  268. package/lib/crypto-api/index.js +0 -304
  269. package/lib/crypto-api/index.js.map +0 -1
  270. package/lib/crypto-api/key-passphrase.d.ts +0 -11
  271. package/lib/crypto-api/key-passphrase.d.ts.map +0 -1
  272. package/lib/crypto-api/key-passphrase.js +0 -51
  273. package/lib/crypto-api/key-passphrase.js.map +0 -1
  274. package/lib/crypto-api/keybackup.d.ts +0 -88
  275. package/lib/crypto-api/keybackup.d.ts.map +0 -1
  276. package/lib/crypto-api/keybackup.js +0 -1
  277. package/lib/crypto-api/keybackup.js.map +0 -1
  278. package/lib/crypto-api/recovery-key.d.ts +0 -11
  279. package/lib/crypto-api/recovery-key.d.ts.map +0 -1
  280. package/lib/crypto-api/recovery-key.js +0 -65
  281. package/lib/crypto-api/recovery-key.js.map +0 -1
  282. package/lib/crypto-api/verification.d.ts +0 -344
  283. package/lib/crypto-api/verification.d.ts.map +0 -1
  284. package/lib/crypto-api/verification.js +0 -91
  285. package/lib/crypto-api/verification.js.map +0 -1
  286. package/lib/rendezvous/MSC4108SignInWithQR.d.ts +0 -112
  287. package/lib/rendezvous/MSC4108SignInWithQR.d.ts.map +0 -1
  288. package/lib/rendezvous/MSC4108SignInWithQR.js +0 -392
  289. package/lib/rendezvous/MSC4108SignInWithQR.js.map +0 -1
  290. package/lib/rendezvous/RendezvousChannel.d.ts +0 -27
  291. package/lib/rendezvous/RendezvousChannel.d.ts.map +0 -1
  292. package/lib/rendezvous/RendezvousChannel.js +0 -1
  293. package/lib/rendezvous/RendezvousChannel.js.map +0 -1
  294. package/lib/rendezvous/RendezvousCode.d.ts +0 -9
  295. package/lib/rendezvous/RendezvousCode.d.ts.map +0 -1
  296. package/lib/rendezvous/RendezvousCode.js +0 -1
  297. package/lib/rendezvous/RendezvousCode.js.map +0 -1
  298. package/lib/rendezvous/RendezvousError.d.ts +0 -6
  299. package/lib/rendezvous/RendezvousError.d.ts.map +0 -1
  300. package/lib/rendezvous/RendezvousError.js +0 -23
  301. package/lib/rendezvous/RendezvousError.js.map +0 -1
  302. package/lib/rendezvous/RendezvousFailureReason.d.ts +0 -31
  303. package/lib/rendezvous/RendezvousFailureReason.d.ts.map +0 -1
  304. package/lib/rendezvous/RendezvousFailureReason.js +0 -38
  305. package/lib/rendezvous/RendezvousFailureReason.js.map +0 -1
  306. package/lib/rendezvous/RendezvousIntent.d.ts +0 -5
  307. package/lib/rendezvous/RendezvousIntent.d.ts.map +0 -1
  308. package/lib/rendezvous/RendezvousIntent.js +0 -22
  309. package/lib/rendezvous/RendezvousIntent.js.map +0 -1
  310. package/lib/rendezvous/RendezvousTransport.d.ts +0 -36
  311. package/lib/rendezvous/RendezvousTransport.d.ts.map +0 -1
  312. package/lib/rendezvous/RendezvousTransport.js +0 -1
  313. package/lib/rendezvous/RendezvousTransport.js.map +0 -1
  314. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts +0 -58
  315. package/lib/rendezvous/channels/MSC4108SecureChannel.d.ts.map +0 -1
  316. package/lib/rendezvous/channels/MSC4108SecureChannel.js +0 -246
  317. package/lib/rendezvous/channels/MSC4108SecureChannel.js.map +0 -1
  318. package/lib/rendezvous/channels/index.d.ts +0 -2
  319. package/lib/rendezvous/channels/index.d.ts.map +0 -1
  320. package/lib/rendezvous/channels/index.js +0 -18
  321. package/lib/rendezvous/channels/index.js.map +0 -1
  322. package/lib/rendezvous/index.d.ts +0 -10
  323. package/lib/rendezvous/index.d.ts.map +0 -1
  324. package/lib/rendezvous/index.js +0 -23
  325. package/lib/rendezvous/index.js.map +0 -1
  326. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts +0 -61
  327. package/lib/rendezvous/transports/MSC4108RendezvousSession.d.ts.map +0 -1
  328. package/lib/rendezvous/transports/MSC4108RendezvousSession.js +0 -253
  329. package/lib/rendezvous/transports/MSC4108RendezvousSession.js.map +0 -1
  330. package/lib/rendezvous/transports/index.d.ts +0 -2
  331. package/lib/rendezvous/transports/index.d.ts.map +0 -1
  332. package/lib/rendezvous/transports/index.js +0 -18
  333. package/lib/rendezvous/transports/index.js.map +0 -1
  334. package/lib/rust-crypto/CrossSigningIdentity.d.ts +0 -33
  335. package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +0 -1
  336. package/lib/rust-crypto/CrossSigningIdentity.js +0 -157
  337. package/lib/rust-crypto/CrossSigningIdentity.js.map +0 -1
  338. package/lib/rust-crypto/DehydratedDeviceManager.d.ts +0 -98
  339. package/lib/rust-crypto/DehydratedDeviceManager.d.ts.map +0 -1
  340. package/lib/rust-crypto/DehydratedDeviceManager.js +0 -285
  341. package/lib/rust-crypto/DehydratedDeviceManager.js.map +0 -1
  342. package/lib/rust-crypto/KeyClaimManager.d.ts +0 -33
  343. package/lib/rust-crypto/KeyClaimManager.d.ts.map +0 -1
  344. package/lib/rust-crypto/KeyClaimManager.js +0 -82
  345. package/lib/rust-crypto/KeyClaimManager.js.map +0 -1
  346. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts +0 -43
  347. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +0 -1
  348. package/lib/rust-crypto/OutgoingRequestProcessor.js +0 -195
  349. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +0 -1
  350. package/lib/rust-crypto/OutgoingRequestsManager.d.ts +0 -47
  351. package/lib/rust-crypto/OutgoingRequestsManager.d.ts.map +0 -1
  352. package/lib/rust-crypto/OutgoingRequestsManager.js +0 -148
  353. package/lib/rust-crypto/OutgoingRequestsManager.js.map +0 -1
  354. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts +0 -120
  355. package/lib/rust-crypto/PerSessionKeyBackupDownloader.d.ts.map +0 -1
  356. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js +0 -467
  357. package/lib/rust-crypto/PerSessionKeyBackupDownloader.js.map +0 -1
  358. package/lib/rust-crypto/RoomEncryptor.d.ts +0 -98
  359. package/lib/rust-crypto/RoomEncryptor.d.ts.map +0 -1
  360. package/lib/rust-crypto/RoomEncryptor.js +0 -299
  361. package/lib/rust-crypto/RoomEncryptor.js.map +0 -1
  362. package/lib/rust-crypto/backup.d.ts +0 -254
  363. package/lib/rust-crypto/backup.d.ts.map +0 -1
  364. package/lib/rust-crypto/backup.js +0 -837
  365. package/lib/rust-crypto/backup.js.map +0 -1
  366. package/lib/rust-crypto/constants.d.ts +0 -3
  367. package/lib/rust-crypto/constants.d.ts.map +0 -1
  368. package/lib/rust-crypto/constants.js +0 -19
  369. package/lib/rust-crypto/constants.js.map +0 -1
  370. package/lib/rust-crypto/device-converter.d.ts +0 -28
  371. package/lib/rust-crypto/device-converter.d.ts.map +0 -1
  372. package/lib/rust-crypto/device-converter.js +0 -123
  373. package/lib/rust-crypto/device-converter.js.map +0 -1
  374. package/lib/rust-crypto/index.d.ts +0 -61
  375. package/lib/rust-crypto/index.d.ts.map +0 -1
  376. package/lib/rust-crypto/index.js +0 -152
  377. package/lib/rust-crypto/index.js.map +0 -1
  378. package/lib/rust-crypto/libolm_migration.d.ts +0 -81
  379. package/lib/rust-crypto/libolm_migration.d.ts.map +0 -1
  380. package/lib/rust-crypto/libolm_migration.js +0 -459
  381. package/lib/rust-crypto/libolm_migration.js.map +0 -1
  382. package/lib/rust-crypto/rust-crypto.d.ts +0 -556
  383. package/lib/rust-crypto/rust-crypto.d.ts.map +0 -1
  384. package/lib/rust-crypto/rust-crypto.js +0 -2016
  385. package/lib/rust-crypto/rust-crypto.js.map +0 -1
  386. package/lib/rust-crypto/secret-storage.d.ts +0 -22
  387. package/lib/rust-crypto/secret-storage.d.ts.map +0 -1
  388. package/lib/rust-crypto/secret-storage.js +0 -63
  389. package/lib/rust-crypto/secret-storage.js.map +0 -1
  390. package/lib/rust-crypto/verification.d.ts +0 -319
  391. package/lib/rust-crypto/verification.d.ts.map +0 -1
  392. package/lib/rust-crypto/verification.js +0 -816
  393. package/lib/rust-crypto/verification.js.map +0 -1
  394. package/lib/secret-storage.d.ts +0 -370
  395. package/lib/secret-storage.d.ts.map +0 -1
  396. package/lib/secret-storage.js +0 -466
  397. package/lib/secret-storage.js.map +0 -1
  398. package/lib/utils/decryptAESSecretStorageItem.d.ts +0 -12
  399. package/lib/utils/decryptAESSecretStorageItem.d.ts.map +0 -1
  400. package/lib/utils/decryptAESSecretStorageItem.js +0 -50
  401. package/lib/utils/decryptAESSecretStorageItem.js.map +0 -1
  402. package/lib/utils/encryptAESSecretStorageItem.d.ts +0 -16
  403. package/lib/utils/encryptAESSecretStorageItem.d.ts.map +0 -1
  404. package/lib/utils/encryptAESSecretStorageItem.js +0 -68
  405. package/lib/utils/encryptAESSecretStorageItem.js.map +0 -1
  406. package/lib/utils/internal/deriveKeys.d.ts +0 -10
  407. package/lib/utils/internal/deriveKeys.d.ts.map +0 -1
  408. package/lib/utils/internal/deriveKeys.js +0 -60
  409. package/lib/utils/internal/deriveKeys.js.map +0 -1
  410. package/src/@types/AESEncryptedSecretStoragePayload.ts +0 -29
  411. package/src/@types/crypto.ts +0 -73
  412. package/src/@types/matrix-sdk-crypto-wasm.d.ts +0 -44
  413. package/src/common-crypto/CryptoBackend.ts +0 -302
  414. package/src/common-crypto/README.md +0 -4
  415. package/src/common-crypto/key-passphrase.ts +0 -43
  416. package/src/crypto/CrossSigning.ts +0 -773
  417. package/src/crypto/DeviceList.ts +0 -989
  418. package/src/crypto/EncryptionSetup.ts +0 -351
  419. package/src/crypto/OlmDevice.ts +0 -1500
  420. package/src/crypto/OutgoingRoomKeyRequestManager.ts +0 -485
  421. package/src/crypto/RoomList.ts +0 -70
  422. package/src/crypto/SecretSharing.ts +0 -240
  423. package/src/crypto/SecretStorage.ts +0 -136
  424. package/src/crypto/aes.ts +0 -23
  425. package/src/crypto/algorithms/base.ts +0 -236
  426. package/src/crypto/algorithms/index.ts +0 -20
  427. package/src/crypto/algorithms/megolm.ts +0 -2216
  428. package/src/crypto/algorithms/olm.ts +0 -381
  429. package/src/crypto/api.ts +0 -70
  430. package/src/crypto/backup.ts +0 -922
  431. package/src/crypto/crypto.ts +0 -18
  432. package/src/crypto/dehydration.ts +0 -272
  433. package/src/crypto/device-converter.ts +0 -45
  434. package/src/crypto/deviceinfo.ts +0 -158
  435. package/src/crypto/index.ts +0 -4414
  436. package/src/crypto/key_passphrase.ts +0 -42
  437. package/src/crypto/keybackup.ts +0 -47
  438. package/src/crypto/olmlib.ts +0 -539
  439. package/src/crypto/recoverykey.ts +0 -18
  440. package/src/crypto/store/base.ts +0 -348
  441. package/src/crypto/store/indexeddb-crypto-store-backend.ts +0 -1250
  442. package/src/crypto/store/indexeddb-crypto-store.ts +0 -845
  443. package/src/crypto/store/localStorage-crypto-store.ts +0 -579
  444. package/src/crypto/store/memory-crypto-store.ts +0 -680
  445. package/src/crypto/verification/Base.ts +0 -409
  446. package/src/crypto/verification/Error.ts +0 -76
  447. package/src/crypto/verification/IllegalMethod.ts +0 -50
  448. package/src/crypto/verification/QRCode.ts +0 -310
  449. package/src/crypto/verification/SAS.ts +0 -494
  450. package/src/crypto/verification/SASDecimal.ts +0 -37
  451. package/src/crypto/verification/request/Channel.ts +0 -34
  452. package/src/crypto/verification/request/InRoomChannel.ts +0 -371
  453. package/src/crypto/verification/request/ToDeviceChannel.ts +0 -354
  454. package/src/crypto/verification/request/VerificationRequest.ts +0 -976
  455. package/src/crypto-api/CryptoEvent.ts +0 -93
  456. package/src/crypto-api/CryptoEventHandlerMap.ts +0 -32
  457. package/src/crypto-api/index.ts +0 -1175
  458. package/src/crypto-api/key-passphrase.ts +0 -58
  459. package/src/crypto-api/keybackup.ts +0 -115
  460. package/src/crypto-api/recovery-key.ts +0 -69
  461. package/src/crypto-api/verification.ts +0 -408
  462. package/src/rendezvous/MSC4108SignInWithQR.ts +0 -444
  463. package/src/rendezvous/RendezvousChannel.ts +0 -48
  464. package/src/rendezvous/RendezvousCode.ts +0 -25
  465. package/src/rendezvous/RendezvousError.ts +0 -26
  466. package/src/rendezvous/RendezvousFailureReason.ts +0 -49
  467. package/src/rendezvous/RendezvousIntent.ts +0 -20
  468. package/src/rendezvous/RendezvousTransport.ts +0 -58
  469. package/src/rendezvous/channels/MSC4108SecureChannel.ts +0 -270
  470. package/src/rendezvous/channels/index.ts +0 -17
  471. package/src/rendezvous/index.ts +0 -25
  472. package/src/rendezvous/transports/MSC4108RendezvousSession.ts +0 -270
  473. package/src/rendezvous/transports/index.ts +0 -17
  474. package/src/rust-crypto/CrossSigningIdentity.ts +0 -183
  475. package/src/rust-crypto/DehydratedDeviceManager.ts +0 -306
  476. package/src/rust-crypto/KeyClaimManager.ts +0 -86
  477. package/src/rust-crypto/OutgoingRequestProcessor.ts +0 -236
  478. package/src/rust-crypto/OutgoingRequestsManager.ts +0 -143
  479. package/src/rust-crypto/PerSessionKeyBackupDownloader.ts +0 -501
  480. package/src/rust-crypto/RoomEncryptor.ts +0 -352
  481. package/src/rust-crypto/backup.ts +0 -881
  482. package/src/rust-crypto/constants.ts +0 -18
  483. package/src/rust-crypto/device-converter.ts +0 -128
  484. package/src/rust-crypto/index.ts +0 -237
  485. package/src/rust-crypto/libolm_migration.ts +0 -530
  486. package/src/rust-crypto/rust-crypto.ts +0 -2205
  487. package/src/rust-crypto/secret-storage.ts +0 -60
  488. package/src/rust-crypto/verification.ts +0 -830
  489. package/src/secret-storage.ts +0 -693
  490. package/src/utils/decryptAESSecretStorageItem.ts +0 -54
  491. package/src/utils/encryptAESSecretStorageItem.ts +0 -73
  492. package/src/utils/internal/deriveKeys.ts +0 -63
@@ -1,989 +0,0 @@
1
- /*
2
- Copyright 2017 - 2021 The Matrix.org Foundation C.I.C.
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
15
- */
16
-
17
- /**
18
- * Manages the list of other users' devices
19
- */
20
-
21
- import { logger } from "../logger.ts";
22
- import { DeviceInfo, IDevice } from "./deviceinfo.ts";
23
- import { CrossSigningInfo, ICrossSigningInfo } from "./CrossSigning.ts";
24
- import * as olmlib from "./olmlib.ts";
25
- import { IndexedDBCryptoStore } from "./store/indexeddb-crypto-store.ts";
26
- import { chunkPromises, defer, IDeferred, sleep } from "../utils.ts";
27
- import { DeviceKeys, IDownloadKeyResult, Keys, MatrixClient, SigningKeys } from "../client.ts";
28
- import { OlmDevice } from "./OlmDevice.ts";
29
- import { CryptoStore } from "./store/base.ts";
30
- import { TypedEventEmitter } from "../models/typed-event-emitter.ts";
31
- import { CryptoEvent, CryptoEventHandlerMap } from "./index.ts";
32
-
33
- /* State transition diagram for DeviceList.deviceTrackingStatus
34
- *
35
- * |
36
- * stopTrackingDeviceList V
37
- * +---------------------> NOT_TRACKED
38
- * | |
39
- * +<--------------------+ | startTrackingDeviceList
40
- * | | V
41
- * | +-------------> PENDING_DOWNLOAD <--------------------+-+
42
- * | | ^ | | |
43
- * | | restart download | | start download | | invalidateUserDeviceList
44
- * | | client failed | | | |
45
- * | | | V | |
46
- * | +------------ DOWNLOAD_IN_PROGRESS -------------------+ |
47
- * | | | |
48
- * +<-------------------+ | download successful |
49
- * ^ V |
50
- * +----------------------- UP_TO_DATE ------------------------+
51
- */
52
-
53
- // constants for DeviceList.deviceTrackingStatus
54
- export enum TrackingStatus {
55
- NotTracked,
56
- PendingDownload,
57
- DownloadInProgress,
58
- UpToDate,
59
- }
60
-
61
- // user-Id → device-Id → DeviceInfo
62
- export type DeviceInfoMap = Map<string, Map<string, DeviceInfo>>;
63
-
64
- type EmittedEvents = CryptoEvent.WillUpdateDevices | CryptoEvent.DevicesUpdated | CryptoEvent.UserCrossSigningUpdated;
65
-
66
- export class DeviceList extends TypedEventEmitter<EmittedEvents, CryptoEventHandlerMap> {
67
- private devices: { [userId: string]: { [deviceId: string]: IDevice } } = {};
68
-
69
- public crossSigningInfo: { [userId: string]: ICrossSigningInfo } = {};
70
-
71
- // map of identity keys to the user who owns it
72
- private userByIdentityKey: Record<string, string> = {};
73
-
74
- // which users we are tracking device status for.
75
- private deviceTrackingStatus: { [userId: string]: TrackingStatus } = {}; // loaded from storage in load()
76
-
77
- // The 'next_batch' sync token at the point the data was written,
78
- // ie. a token representing the point immediately after the
79
- // moment represented by the snapshot in the db.
80
- private syncToken: string | null = null;
81
-
82
- private keyDownloadsInProgressByUser = new Map<string, Promise<void>>();
83
-
84
- // Set whenever changes are made other than setting the sync token
85
- private dirty = false;
86
-
87
- // Promise resolved when device data is saved
88
- private savePromise: Promise<boolean> | null = null;
89
- // Function that resolves the save promise
90
- private resolveSavePromise: ((saved: boolean) => void) | null = null;
91
- // The time the save is scheduled for
92
- private savePromiseTime: number | null = null;
93
- // The timer used to delay the save
94
- private saveTimer: ReturnType<typeof setTimeout> | null = null;
95
- // True if we have fetched data from the server or loaded a non-empty
96
- // set of device data from the store
97
- private hasFetched: boolean | null = null;
98
-
99
- private readonly serialiser: DeviceListUpdateSerialiser;
100
-
101
- public constructor(
102
- baseApis: MatrixClient,
103
- private readonly cryptoStore: CryptoStore,
104
- olmDevice: OlmDevice,
105
- // Maximum number of user IDs per request to prevent server overload (#1619)
106
- public readonly keyDownloadChunkSize = 250,
107
- ) {
108
- super();
109
-
110
- this.serialiser = new DeviceListUpdateSerialiser(baseApis, olmDevice, this);
111
- }
112
-
113
- /**
114
- * Load the device tracking state from storage
115
- */
116
- public async load(): Promise<void> {
117
- await this.cryptoStore.doTxn("readonly", [IndexedDBCryptoStore.STORE_DEVICE_DATA], (txn) => {
118
- this.cryptoStore.getEndToEndDeviceData(txn, (deviceData) => {
119
- this.hasFetched = Boolean(deviceData?.devices);
120
- this.devices = deviceData ? deviceData.devices : {};
121
- this.crossSigningInfo = deviceData ? deviceData.crossSigningInfo || {} : {};
122
- this.deviceTrackingStatus = deviceData ? deviceData.trackingStatus : {};
123
- this.syncToken = deviceData?.syncToken ?? null;
124
- this.userByIdentityKey = {};
125
- for (const user of Object.keys(this.devices)) {
126
- const userDevices = this.devices[user];
127
- for (const device of Object.keys(userDevices)) {
128
- const idKey = userDevices[device].keys["curve25519:" + device];
129
- if (idKey !== undefined) {
130
- this.userByIdentityKey[idKey] = user;
131
- }
132
- }
133
- }
134
- });
135
- });
136
-
137
- for (const u of Object.keys(this.deviceTrackingStatus)) {
138
- // if a download was in progress when we got shut down, it isn't any more.
139
- if (this.deviceTrackingStatus[u] == TrackingStatus.DownloadInProgress) {
140
- this.deviceTrackingStatus[u] = TrackingStatus.PendingDownload;
141
- }
142
- }
143
- }
144
-
145
- public stop(): void {
146
- if (this.saveTimer !== null) {
147
- clearTimeout(this.saveTimer);
148
- }
149
- }
150
-
151
- /**
152
- * Save the device tracking state to storage, if any changes are
153
- * pending other than updating the sync token
154
- *
155
- * The actual save will be delayed by a short amount of time to
156
- * aggregate multiple writes to the database.
157
- *
158
- * @param delay - Time in ms before which the save actually happens.
159
- * By default, the save is delayed for a short period in order to batch
160
- * multiple writes, but this behaviour can be disabled by passing 0.
161
- *
162
- * @returns true if the data was saved, false if
163
- * it was not (eg. because no changes were pending). The promise
164
- * will only resolve once the data is saved, so may take some time
165
- * to resolve.
166
- */
167
- public async saveIfDirty(delay = 500): Promise<boolean> {
168
- if (!this.dirty) return Promise.resolve(false);
169
- // Delay saves for a bit so we can aggregate multiple saves that happen
170
- // in quick succession (eg. when a whole room's devices are marked as known)
171
-
172
- const targetTime = Date.now() + delay;
173
- if (this.savePromiseTime && targetTime < this.savePromiseTime) {
174
- // There's a save scheduled but for after we would like: cancel
175
- // it & schedule one for the time we want
176
- clearTimeout(this.saveTimer!);
177
- this.saveTimer = null;
178
- this.savePromiseTime = null;
179
- // (but keep the save promise since whatever called save before
180
- // will still want to know when the save is done)
181
- }
182
-
183
- let savePromise = this.savePromise;
184
- if (savePromise === null) {
185
- savePromise = new Promise((resolve) => {
186
- this.resolveSavePromise = resolve;
187
- });
188
- this.savePromise = savePromise;
189
- }
190
-
191
- if (this.saveTimer === null) {
192
- const resolveSavePromise = this.resolveSavePromise;
193
- this.savePromiseTime = targetTime;
194
- this.saveTimer = setTimeout(() => {
195
- logger.log("Saving device tracking data", this.syncToken);
196
-
197
- // null out savePromise now (after the delay but before the write),
198
- // otherwise we could return the existing promise when the save has
199
- // actually already happened.
200
- this.savePromiseTime = null;
201
- this.saveTimer = null;
202
- this.savePromise = null;
203
- this.resolveSavePromise = null;
204
-
205
- this.cryptoStore
206
- .doTxn("readwrite", [IndexedDBCryptoStore.STORE_DEVICE_DATA], (txn) => {
207
- this.cryptoStore.storeEndToEndDeviceData(
208
- {
209
- devices: this.devices,
210
- crossSigningInfo: this.crossSigningInfo,
211
- trackingStatus: this.deviceTrackingStatus,
212
- syncToken: this.syncToken ?? undefined,
213
- },
214
- txn,
215
- );
216
- })
217
- .then(
218
- () => {
219
- // The device list is considered dirty until the write completes.
220
- this.dirty = false;
221
- resolveSavePromise?.(true);
222
- },
223
- (err) => {
224
- logger.error("Failed to save device tracking data", this.syncToken);
225
- logger.error(err);
226
- },
227
- );
228
- }, delay);
229
- }
230
-
231
- return savePromise;
232
- }
233
-
234
- /**
235
- * Gets the sync token last set with setSyncToken
236
- *
237
- * @returns The sync token
238
- */
239
- public getSyncToken(): string | null {
240
- return this.syncToken;
241
- }
242
-
243
- /**
244
- * Sets the sync token that the app will pass as the 'since' to the /sync
245
- * endpoint next time it syncs.
246
- * The sync token must always be set after any changes made as a result of
247
- * data in that sync since setting the sync token to a newer one will mean
248
- * those changed will not be synced from the server if a new client starts
249
- * up with that data.
250
- *
251
- * @param st - The sync token
252
- */
253
- public setSyncToken(st: string | null): void {
254
- this.syncToken = st;
255
- }
256
-
257
- /**
258
- * Ensures up to date keys for a list of users are stored in the session store,
259
- * downloading and storing them if they're not (or if forceDownload is
260
- * true).
261
- * @param userIds - The users to fetch.
262
- * @param forceDownload - Always download the keys even if cached.
263
- *
264
- * @returns A promise which resolves to a map userId-\>deviceId-\>{@link DeviceInfo}.
265
- */
266
- public downloadKeys(userIds: string[], forceDownload: boolean): Promise<DeviceInfoMap> {
267
- const usersToDownload: string[] = [];
268
- const promises: Promise<unknown>[] = [];
269
-
270
- userIds.forEach((u) => {
271
- const trackingStatus = this.deviceTrackingStatus[u];
272
- if (this.keyDownloadsInProgressByUser.has(u)) {
273
- // already a key download in progress/queued for this user; its results
274
- // will be good enough for us.
275
- logger.log(`downloadKeys: already have a download in progress for ` + `${u}: awaiting its result`);
276
- promises.push(this.keyDownloadsInProgressByUser.get(u)!);
277
- } else if (forceDownload || trackingStatus != TrackingStatus.UpToDate) {
278
- usersToDownload.push(u);
279
- }
280
- });
281
-
282
- if (usersToDownload.length != 0) {
283
- logger.log("downloadKeys: downloading for", usersToDownload);
284
- const downloadPromise = this.doKeyDownload(usersToDownload);
285
- promises.push(downloadPromise);
286
- }
287
-
288
- if (promises.length === 0) {
289
- logger.log("downloadKeys: already have all necessary keys");
290
- }
291
-
292
- return Promise.all(promises).then(() => {
293
- return this.getDevicesFromStore(userIds);
294
- });
295
- }
296
-
297
- /**
298
- * Get the stored device keys for a list of user ids
299
- *
300
- * @param userIds - the list of users to list keys for.
301
- *
302
- * @returns userId-\>deviceId-\>{@link DeviceInfo}.
303
- */
304
- private getDevicesFromStore(userIds: string[]): DeviceInfoMap {
305
- const stored: DeviceInfoMap = new Map();
306
- userIds.forEach((userId) => {
307
- const deviceMap = new Map();
308
- this.getStoredDevicesForUser(userId)?.forEach(function (device) {
309
- deviceMap.set(device.deviceId, device);
310
- });
311
- stored.set(userId, deviceMap);
312
- });
313
- return stored;
314
- }
315
-
316
- /**
317
- * Returns a list of all user IDs the DeviceList knows about
318
- *
319
- * @returns All known user IDs
320
- */
321
- public getKnownUserIds(): string[] {
322
- return Object.keys(this.devices);
323
- }
324
-
325
- /**
326
- * Get the stored device keys for a user id
327
- *
328
- * @param userId - the user to list keys for.
329
- *
330
- * @returns list of devices, or null if we haven't
331
- * managed to get a list of devices for this user yet.
332
- */
333
- public getStoredDevicesForUser(userId: string): DeviceInfo[] | null {
334
- const devs = this.devices[userId];
335
- if (!devs) {
336
- return null;
337
- }
338
- const res: DeviceInfo[] = [];
339
- for (const deviceId in devs) {
340
- if (devs.hasOwnProperty(deviceId)) {
341
- res.push(DeviceInfo.fromStorage(devs[deviceId], deviceId));
342
- }
343
- }
344
- return res;
345
- }
346
-
347
- /**
348
- * Get the stored device data for a user, in raw object form
349
- *
350
- * @param userId - the user to get data for
351
- *
352
- * @returns `deviceId->{object}` devices, or undefined if
353
- * there is no data for this user.
354
- */
355
- public getRawStoredDevicesForUser(userId: string): Record<string, IDevice> {
356
- return this.devices[userId];
357
- }
358
-
359
- public getStoredCrossSigningForUser(userId: string): CrossSigningInfo | null {
360
- if (!this.crossSigningInfo[userId]) return null;
361
-
362
- return CrossSigningInfo.fromStorage(this.crossSigningInfo[userId], userId);
363
- }
364
-
365
- public storeCrossSigningForUser(userId: string, info: ICrossSigningInfo): void {
366
- this.crossSigningInfo[userId] = info;
367
- this.dirty = true;
368
- }
369
-
370
- /**
371
- * Get the stored keys for a single device
372
- *
373
- *
374
- * @returns device, or undefined
375
- * if we don't know about this device
376
- */
377
- public getStoredDevice(userId: string, deviceId: string): DeviceInfo | undefined {
378
- const devs = this.devices[userId];
379
- if (!devs?.[deviceId]) {
380
- return undefined;
381
- }
382
- return DeviceInfo.fromStorage(devs[deviceId], deviceId);
383
- }
384
-
385
- /**
386
- * Get a user ID by one of their device's curve25519 identity key
387
- *
388
- * @param algorithm - encryption algorithm
389
- * @param senderKey - curve25519 key to match
390
- *
391
- * @returns user ID
392
- */
393
- public getUserByIdentityKey(algorithm: string, senderKey: string): string | null {
394
- if (algorithm !== olmlib.OLM_ALGORITHM && algorithm !== olmlib.MEGOLM_ALGORITHM) {
395
- // we only deal in olm keys
396
- return null;
397
- }
398
-
399
- return this.userByIdentityKey[senderKey];
400
- }
401
-
402
- /**
403
- * Find a device by curve25519 identity key
404
- *
405
- * @param algorithm - encryption algorithm
406
- * @param senderKey - curve25519 key to match
407
- */
408
- public getDeviceByIdentityKey(algorithm: string, senderKey: string): DeviceInfo | null {
409
- const userId = this.getUserByIdentityKey(algorithm, senderKey);
410
- if (!userId) {
411
- return null;
412
- }
413
-
414
- const devices = this.devices[userId];
415
- if (!devices) {
416
- return null;
417
- }
418
-
419
- for (const deviceId in devices) {
420
- if (!devices.hasOwnProperty(deviceId)) {
421
- continue;
422
- }
423
-
424
- const device = devices[deviceId];
425
- for (const keyId in device.keys) {
426
- if (!device.keys.hasOwnProperty(keyId)) {
427
- continue;
428
- }
429
- if (keyId.indexOf("curve25519:") !== 0) {
430
- continue;
431
- }
432
- const deviceKey = device.keys[keyId];
433
- if (deviceKey == senderKey) {
434
- return DeviceInfo.fromStorage(device, deviceId);
435
- }
436
- }
437
- }
438
-
439
- // doesn't match a known device
440
- return null;
441
- }
442
-
443
- /**
444
- * Replaces the list of devices for a user with the given device list
445
- *
446
- * @param userId - The user ID
447
- * @param devices - New device info for user
448
- */
449
- public storeDevicesForUser(userId: string, devices: Record<string, IDevice>): void {
450
- this.setRawStoredDevicesForUser(userId, devices);
451
- this.dirty = true;
452
- }
453
-
454
- /**
455
- * flag the given user for device-list tracking, if they are not already.
456
- *
457
- * This will mean that a subsequent call to refreshOutdatedDeviceLists()
458
- * will download the device list for the user, and that subsequent calls to
459
- * invalidateUserDeviceList will trigger more updates.
460
- *
461
- */
462
- public startTrackingDeviceList(userId: string): void {
463
- // sanity-check the userId. This is mostly paranoia, but if synapse
464
- // can't parse the userId we give it as an mxid, it 500s the whole
465
- // request and we can never update the device lists again (because
466
- // the broken userId is always 'invalid' and always included in any
467
- // refresh request).
468
- // By checking it is at least a string, we can eliminate a class of
469
- // silly errors.
470
- if (typeof userId !== "string") {
471
- throw new Error("userId must be a string; was " + userId);
472
- }
473
- if (!this.deviceTrackingStatus[userId]) {
474
- logger.log("Now tracking device list for " + userId);
475
- this.deviceTrackingStatus[userId] = TrackingStatus.PendingDownload;
476
- // we don't yet persist the tracking status, since there may be a lot
477
- // of calls; we save all data together once the sync is done
478
- this.dirty = true;
479
- }
480
- }
481
-
482
- /**
483
- * Mark the given user as no longer being tracked for device-list updates.
484
- *
485
- * This won't affect any in-progress downloads, which will still go on to
486
- * complete; it will just mean that we don't think that we have an up-to-date
487
- * list for future calls to downloadKeys.
488
- *
489
- */
490
- public stopTrackingDeviceList(userId: string): void {
491
- if (this.deviceTrackingStatus[userId]) {
492
- logger.log("No longer tracking device list for " + userId);
493
- this.deviceTrackingStatus[userId] = TrackingStatus.NotTracked;
494
-
495
- // we don't yet persist the tracking status, since there may be a lot
496
- // of calls; we save all data together once the sync is done
497
- this.dirty = true;
498
- }
499
- }
500
-
501
- /**
502
- * Set all users we're currently tracking to untracked
503
- *
504
- * This will flag each user whose devices we are tracking as in need of an
505
- * update.
506
- */
507
- public stopTrackingAllDeviceLists(): void {
508
- for (const userId of Object.keys(this.deviceTrackingStatus)) {
509
- this.deviceTrackingStatus[userId] = TrackingStatus.NotTracked;
510
- }
511
- this.dirty = true;
512
- }
513
-
514
- /**
515
- * Mark the cached device list for the given user outdated.
516
- *
517
- * If we are not tracking this user's devices, we'll do nothing. Otherwise
518
- * we flag the user as needing an update.
519
- *
520
- * This doesn't actually set off an update, so that several users can be
521
- * batched together. Call refreshOutdatedDeviceLists() for that.
522
- *
523
- */
524
- public invalidateUserDeviceList(userId: string): void {
525
- if (this.deviceTrackingStatus[userId]) {
526
- logger.log("Marking device list outdated for", userId);
527
- this.deviceTrackingStatus[userId] = TrackingStatus.PendingDownload;
528
-
529
- // we don't yet persist the tracking status, since there may be a lot
530
- // of calls; we save all data together once the sync is done
531
- this.dirty = true;
532
- }
533
- }
534
-
535
- /**
536
- * If we have users who have outdated device lists, start key downloads for them
537
- *
538
- * @returns which completes when the download completes; normally there
539
- * is no need to wait for this (it's mostly for the unit tests).
540
- */
541
- public refreshOutdatedDeviceLists(): Promise<void> {
542
- this.saveIfDirty();
543
-
544
- const usersToDownload: string[] = [];
545
- for (const userId of Object.keys(this.deviceTrackingStatus)) {
546
- const stat = this.deviceTrackingStatus[userId];
547
- if (stat == TrackingStatus.PendingDownload) {
548
- usersToDownload.push(userId);
549
- }
550
- }
551
-
552
- return this.doKeyDownload(usersToDownload);
553
- }
554
-
555
- /**
556
- * Set the stored device data for a user, in raw object form
557
- * Used only by internal class DeviceListUpdateSerialiser
558
- *
559
- * @param userId - the user to get data for
560
- *
561
- * @param devices - `deviceId->{object}` the new devices
562
- */
563
- public setRawStoredDevicesForUser(userId: string, devices: Record<string, IDevice>): void {
564
- // remove old devices from userByIdentityKey
565
- if (this.devices[userId] !== undefined) {
566
- for (const [deviceId, dev] of Object.entries(this.devices[userId])) {
567
- const identityKey = dev.keys["curve25519:" + deviceId];
568
-
569
- delete this.userByIdentityKey[identityKey];
570
- }
571
- }
572
-
573
- this.devices[userId] = devices;
574
-
575
- // add new devices into userByIdentityKey
576
- for (const [deviceId, dev] of Object.entries(devices)) {
577
- const identityKey = dev.keys["curve25519:" + deviceId];
578
-
579
- this.userByIdentityKey[identityKey] = userId;
580
- }
581
- }
582
-
583
- public setRawStoredCrossSigningForUser(userId: string, info: ICrossSigningInfo): void {
584
- this.crossSigningInfo[userId] = info;
585
- }
586
-
587
- /**
588
- * Fire off download update requests for the given users, and update the
589
- * device list tracking status for them, and the
590
- * keyDownloadsInProgressByUser map for them.
591
- *
592
- * @param users - list of userIds
593
- *
594
- * @returns resolves when all the users listed have
595
- * been updated. rejects if there was a problem updating any of the
596
- * users.
597
- */
598
- private doKeyDownload(users: string[]): Promise<void> {
599
- if (users.length === 0) {
600
- // nothing to do
601
- return Promise.resolve();
602
- }
603
-
604
- const prom = this.serialiser.updateDevicesForUsers(users, this.syncToken!).then(
605
- () => {
606
- finished(true);
607
- },
608
- (e) => {
609
- logger.error("Error downloading keys for " + users + ":", e);
610
- finished(false);
611
- throw e;
612
- },
613
- );
614
-
615
- users.forEach((u) => {
616
- this.keyDownloadsInProgressByUser.set(u, prom);
617
- const stat = this.deviceTrackingStatus[u];
618
- if (stat == TrackingStatus.PendingDownload) {
619
- this.deviceTrackingStatus[u] = TrackingStatus.DownloadInProgress;
620
- }
621
- });
622
-
623
- const finished = (success: boolean): void => {
624
- this.emit(CryptoEvent.WillUpdateDevices, users, !this.hasFetched);
625
- users.forEach((u) => {
626
- this.dirty = true;
627
-
628
- // we may have queued up another download request for this user
629
- // since we started this request. If that happens, we should
630
- // ignore the completion of the first one.
631
- if (this.keyDownloadsInProgressByUser.get(u) !== prom) {
632
- logger.log("Another update in the queue for", u, "- not marking up-to-date");
633
- return;
634
- }
635
- this.keyDownloadsInProgressByUser.delete(u);
636
- const stat = this.deviceTrackingStatus[u];
637
- if (stat == TrackingStatus.DownloadInProgress) {
638
- if (success) {
639
- // we didn't get any new invalidations since this download started:
640
- // this user's device list is now up to date.
641
- this.deviceTrackingStatus[u] = TrackingStatus.UpToDate;
642
- logger.log("Device list for", u, "now up to date");
643
- } else {
644
- this.deviceTrackingStatus[u] = TrackingStatus.PendingDownload;
645
- }
646
- }
647
- });
648
- this.saveIfDirty();
649
- this.emit(CryptoEvent.DevicesUpdated, users, !this.hasFetched);
650
- this.hasFetched = true;
651
- };
652
-
653
- return prom;
654
- }
655
- }
656
-
657
- /**
658
- * Serialises updates to device lists
659
- *
660
- * Ensures that results from /keys/query are not overwritten if a second call
661
- * completes *before* an earlier one.
662
- *
663
- * It currently does this by ensuring only one call to /keys/query happens at a
664
- * time (and queuing other requests up).
665
- */
666
- class DeviceListUpdateSerialiser {
667
- private downloadInProgress = false;
668
-
669
- // users which are queued for download
670
- // userId -> true
671
- private keyDownloadsQueuedByUser: Record<string, boolean> = {};
672
-
673
- // deferred which is resolved when the queued users are downloaded.
674
- // non-null indicates that we have users queued for download.
675
- private queuedQueryDeferred?: IDeferred<void>;
676
-
677
- private syncToken?: string; // The sync token we send with the requests
678
-
679
- /*
680
- * @param baseApis - Base API object
681
- * @param olmDevice - The Olm Device
682
- * @param deviceList - The device list object, the device list to be updated
683
- */
684
- public constructor(
685
- private readonly baseApis: MatrixClient,
686
- private readonly olmDevice: OlmDevice,
687
- private readonly deviceList: DeviceList,
688
- ) {}
689
-
690
- /**
691
- * Make a key query request for the given users
692
- *
693
- * @param users - list of user ids
694
- *
695
- * @param syncToken - sync token to pass in the query request, to
696
- * help the HS give the most recent results
697
- *
698
- * @returns resolves when all the users listed have
699
- * been updated. rejects if there was a problem updating any of the
700
- * users.
701
- */
702
- public updateDevicesForUsers(users: string[], syncToken: string): Promise<void> {
703
- users.forEach((u) => {
704
- this.keyDownloadsQueuedByUser[u] = true;
705
- });
706
-
707
- if (!this.queuedQueryDeferred) {
708
- this.queuedQueryDeferred = defer();
709
- }
710
-
711
- // We always take the new sync token and just use the latest one we've
712
- // been given, since it just needs to be at least as recent as the
713
- // sync response the device invalidation message arrived in
714
- this.syncToken = syncToken;
715
-
716
- if (this.downloadInProgress) {
717
- // just queue up these users
718
- logger.log("Queued key download for", users);
719
- return this.queuedQueryDeferred.promise;
720
- }
721
-
722
- // start a new download.
723
- return this.doQueuedQueries();
724
- }
725
-
726
- private doQueuedQueries(): Promise<void> {
727
- if (this.downloadInProgress) {
728
- throw new Error("DeviceListUpdateSerialiser.doQueuedQueries called with request active");
729
- }
730
-
731
- const downloadUsers = Object.keys(this.keyDownloadsQueuedByUser);
732
- this.keyDownloadsQueuedByUser = {};
733
- const deferred = this.queuedQueryDeferred;
734
- this.queuedQueryDeferred = undefined;
735
-
736
- logger.log("Starting key download for", downloadUsers);
737
- this.downloadInProgress = true;
738
-
739
- const opts: Parameters<MatrixClient["downloadKeysForUsers"]>[1] = {};
740
- if (this.syncToken) {
741
- opts.token = this.syncToken;
742
- }
743
-
744
- const factories: Array<() => Promise<IDownloadKeyResult>> = [];
745
- for (let i = 0; i < downloadUsers.length; i += this.deviceList.keyDownloadChunkSize) {
746
- const userSlice = downloadUsers.slice(i, i + this.deviceList.keyDownloadChunkSize);
747
- factories.push(() => this.baseApis.downloadKeysForUsers(userSlice, opts));
748
- }
749
-
750
- chunkPromises(factories, 3)
751
- .then(async (responses: IDownloadKeyResult[]) => {
752
- const dk: IDownloadKeyResult["device_keys"] = Object.assign(
753
- {},
754
- ...responses.map((res) => res.device_keys || {}),
755
- );
756
- const masterKeys: IDownloadKeyResult["master_keys"] = Object.assign(
757
- {},
758
- ...responses.map((res) => res.master_keys || {}),
759
- );
760
- const ssks: IDownloadKeyResult["self_signing_keys"] = Object.assign(
761
- {},
762
- ...responses.map((res) => res.self_signing_keys || {}),
763
- );
764
- const usks: IDownloadKeyResult["user_signing_keys"] = Object.assign(
765
- {},
766
- ...responses.map((res) => res.user_signing_keys || {}),
767
- );
768
-
769
- // yield to other things that want to execute in between users, to
770
- // avoid wedging the CPU
771
- // (https://github.com/vector-im/element-web/issues/3158)
772
- //
773
- // of course we ought to do this in a web worker or similar, but
774
- // this serves as an easy solution for now.
775
- for (const userId of downloadUsers) {
776
- await sleep(5);
777
- try {
778
- await this.processQueryResponseForUser(userId, dk[userId], {
779
- master: masterKeys?.[userId],
780
- self_signing: ssks?.[userId],
781
- user_signing: usks?.[userId],
782
- });
783
- } catch (e) {
784
- // log the error but continue, so that one bad key
785
- // doesn't kill the whole process
786
- logger.error(`Error processing keys for ${userId}:`, e);
787
- }
788
- }
789
- })
790
- .then(
791
- () => {
792
- logger.log("Completed key download for " + downloadUsers);
793
-
794
- this.downloadInProgress = false;
795
- deferred?.resolve();
796
-
797
- // if we have queued users, fire off another request.
798
- if (this.queuedQueryDeferred) {
799
- this.doQueuedQueries();
800
- }
801
- },
802
- (e) => {
803
- logger.warn("Error downloading keys for " + downloadUsers + ":", e);
804
- this.downloadInProgress = false;
805
- deferred?.reject(e);
806
- },
807
- );
808
-
809
- return deferred!.promise;
810
- }
811
-
812
- private async processQueryResponseForUser(
813
- userId: string,
814
- dkResponse: DeviceKeys,
815
- crossSigningResponse: {
816
- master?: Keys;
817
- self_signing?: SigningKeys;
818
- user_signing?: SigningKeys;
819
- },
820
- ): Promise<void> {
821
- logger.log("got device keys for " + userId + ":", dkResponse);
822
- logger.log("got cross-signing keys for " + userId + ":", crossSigningResponse);
823
-
824
- {
825
- // map from deviceid -> deviceinfo for this user
826
- const userStore: Record<string, DeviceInfo> = {};
827
- const devs = this.deviceList.getRawStoredDevicesForUser(userId);
828
- if (devs) {
829
- Object.keys(devs).forEach((deviceId) => {
830
- const d = DeviceInfo.fromStorage(devs[deviceId], deviceId);
831
- userStore[deviceId] = d;
832
- });
833
- }
834
-
835
- await updateStoredDeviceKeysForUser(
836
- this.olmDevice,
837
- userId,
838
- userStore,
839
- dkResponse || {},
840
- this.baseApis.getUserId()!,
841
- this.baseApis.deviceId!,
842
- );
843
-
844
- // put the updates into the object that will be returned as our results
845
- const storage: Record<string, IDevice> = {};
846
- Object.keys(userStore).forEach((deviceId) => {
847
- storage[deviceId] = userStore[deviceId].toStorage();
848
- });
849
-
850
- this.deviceList.setRawStoredDevicesForUser(userId, storage);
851
- }
852
-
853
- // now do the same for the cross-signing keys
854
- {
855
- // FIXME: should we be ignoring empty cross-signing responses, or
856
- // should we be dropping the keys?
857
- if (
858
- crossSigningResponse &&
859
- (crossSigningResponse.master || crossSigningResponse.self_signing || crossSigningResponse.user_signing)
860
- ) {
861
- const crossSigning =
862
- this.deviceList.getStoredCrossSigningForUser(userId) || new CrossSigningInfo(userId);
863
-
864
- crossSigning.setKeys(crossSigningResponse);
865
-
866
- this.deviceList.setRawStoredCrossSigningForUser(userId, crossSigning.toStorage());
867
-
868
- // NB. Unlike most events in the js-sdk, this one is internal to the
869
- // js-sdk and is not re-emitted
870
- this.deviceList.emit(CryptoEvent.UserCrossSigningUpdated, userId);
871
- }
872
- }
873
- }
874
- }
875
-
876
- async function updateStoredDeviceKeysForUser(
877
- olmDevice: OlmDevice,
878
- userId: string,
879
- userStore: Record<string, DeviceInfo>,
880
- userResult: IDownloadKeyResult["device_keys"]["user_id"],
881
- localUserId: string,
882
- localDeviceId: string,
883
- ): Promise<boolean> {
884
- let updated = false;
885
-
886
- // remove any devices in the store which aren't in the response
887
- for (const deviceId in userStore) {
888
- if (!userStore.hasOwnProperty(deviceId)) {
889
- continue;
890
- }
891
-
892
- if (!(deviceId in userResult)) {
893
- if (userId === localUserId && deviceId === localDeviceId) {
894
- logger.warn(`Local device ${deviceId} missing from sync, skipping removal`);
895
- continue;
896
- }
897
-
898
- logger.log("Device " + userId + ":" + deviceId + " has been removed");
899
- delete userStore[deviceId];
900
- updated = true;
901
- }
902
- }
903
-
904
- for (const deviceId in userResult) {
905
- if (!userResult.hasOwnProperty(deviceId)) {
906
- continue;
907
- }
908
-
909
- const deviceResult = userResult[deviceId];
910
-
911
- // check that the user_id and device_id in the response object are
912
- // correct
913
- if (deviceResult.user_id !== userId) {
914
- logger.warn("Mismatched user_id " + deviceResult.user_id + " in keys from " + userId + ":" + deviceId);
915
- continue;
916
- }
917
- if (deviceResult.device_id !== deviceId) {
918
- logger.warn("Mismatched device_id " + deviceResult.device_id + " in keys from " + userId + ":" + deviceId);
919
- continue;
920
- }
921
-
922
- if (await storeDeviceKeys(olmDevice, userStore, deviceResult)) {
923
- updated = true;
924
- }
925
- }
926
-
927
- return updated;
928
- }
929
-
930
- /*
931
- * Process a device in a /query response, and add it to the userStore
932
- *
933
- * returns (a promise for) true if a change was made, else false
934
- */
935
- async function storeDeviceKeys(
936
- olmDevice: OlmDevice,
937
- userStore: Record<string, DeviceInfo>,
938
- deviceResult: IDownloadKeyResult["device_keys"]["user_id"]["device_id"],
939
- ): Promise<boolean> {
940
- if (!deviceResult.keys) {
941
- // no keys?
942
- return false;
943
- }
944
-
945
- const deviceId = deviceResult.device_id;
946
- const userId = deviceResult.user_id;
947
-
948
- const signKeyId = "ed25519:" + deviceId;
949
- const signKey = deviceResult.keys[signKeyId];
950
- if (!signKey) {
951
- logger.warn("Device " + userId + ":" + deviceId + " has no ed25519 key");
952
- return false;
953
- }
954
-
955
- const unsigned = deviceResult.unsigned || {};
956
- const signatures = deviceResult.signatures || {};
957
-
958
- try {
959
- await olmlib.verifySignature(olmDevice, deviceResult, userId, deviceId, signKey);
960
- } catch (e) {
961
- logger.warn("Unable to verify signature on device " + userId + ":" + deviceId + ":" + e);
962
- return false;
963
- }
964
-
965
- // DeviceInfo
966
- let deviceStore;
967
-
968
- if (deviceId in userStore) {
969
- // already have this device.
970
- deviceStore = userStore[deviceId];
971
-
972
- if (deviceStore.getFingerprint() != signKey) {
973
- // this should only happen if the list has been MITMed; we are
974
- // best off sticking with the original keys.
975
- //
976
- // Should we warn the user about it somehow?
977
- logger.warn("Ed25519 key for device " + userId + ":" + deviceId + " has changed");
978
- return false;
979
- }
980
- } else {
981
- userStore[deviceId] = deviceStore = new DeviceInfo(deviceId);
982
- }
983
-
984
- deviceStore.keys = deviceResult.keys || {};
985
- deviceStore.algorithms = deviceResult.algorithms || [];
986
- deviceStore.unsigned = unsigned;
987
- deviceStore.signatures = signatures;
988
- return true;
989
- }