matrix-js-sdk 28.1.0 → 28.2.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/dist/browser-matrix.js +1458 -391
  3. package/dist/browser-matrix.js.map +32 -22
  4. package/dist/browser-matrix.min.js +5 -5
  5. package/dist/browser-matrix.min.js.map +1 -1
  6. package/git-revision.txt +1 -1
  7. package/lib/ReEmitter.js +1 -1
  8. package/lib/ReEmitter.js.map +1 -1
  9. package/lib/ToDeviceMessageQueue.js +1 -1
  10. package/lib/ToDeviceMessageQueue.js.map +1 -1
  11. package/lib/autodiscovery.js +17 -18
  12. package/lib/autodiscovery.js.map +1 -1
  13. package/lib/client.d.ts +14 -0
  14. package/lib/client.d.ts.map +1 -1
  15. package/lib/client.js +59 -85
  16. package/lib/client.js.map +1 -1
  17. package/lib/common-crypto/CryptoBackend.d.ts +41 -0
  18. package/lib/common-crypto/CryptoBackend.d.ts.map +1 -1
  19. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  20. package/lib/common-crypto/base64.d.ts +22 -0
  21. package/lib/common-crypto/base64.d.ts.map +1 -0
  22. package/lib/common-crypto/base64.js +55 -0
  23. package/lib/common-crypto/base64.js.map +1 -0
  24. package/lib/content-helpers.js +16 -16
  25. package/lib/content-helpers.js.map +1 -1
  26. package/lib/crypto/CrossSigning.js +3 -3
  27. package/lib/crypto/CrossSigning.js.map +1 -1
  28. package/lib/crypto/DeviceList.js +11 -14
  29. package/lib/crypto/DeviceList.js.map +1 -1
  30. package/lib/crypto/EncryptionSetup.js +3 -10
  31. package/lib/crypto/EncryptionSetup.js.map +1 -1
  32. package/lib/crypto/OlmDevice.js +1 -1
  33. package/lib/crypto/OlmDevice.js.map +1 -1
  34. package/lib/crypto/OutgoingRoomKeyRequestManager.js +19 -20
  35. package/lib/crypto/OutgoingRoomKeyRequestManager.js.map +1 -1
  36. package/lib/crypto/RoomList.js +1 -1
  37. package/lib/crypto/RoomList.js.map +1 -1
  38. package/lib/crypto/SecretSharing.js +1 -1
  39. package/lib/crypto/SecretSharing.js.map +1 -1
  40. package/lib/crypto/SecretStorage.js +0 -4
  41. package/lib/crypto/SecretStorage.js.map +1 -1
  42. package/lib/crypto/algorithms/base.js +0 -14
  43. package/lib/crypto/algorithms/base.js.map +1 -1
  44. package/lib/crypto/algorithms/megolm.js +22 -31
  45. package/lib/crypto/algorithms/megolm.js.map +1 -1
  46. package/lib/crypto/backup.d.ts +17 -0
  47. package/lib/crypto/backup.d.ts.map +1 -1
  48. package/lib/crypto/backup.js +29 -8
  49. package/lib/crypto/backup.js.map +1 -1
  50. package/lib/crypto/dehydration.js +1 -5
  51. package/lib/crypto/dehydration.js.map +1 -1
  52. package/lib/crypto/deviceinfo.js +1 -1
  53. package/lib/crypto/deviceinfo.js.map +1 -1
  54. package/lib/crypto/index.d.ts +10 -2
  55. package/lib/crypto/index.d.ts.map +1 -1
  56. package/lib/crypto/index.js +133 -68
  57. package/lib/crypto/index.js.map +1 -1
  58. package/lib/crypto/keybackup.d.ts +1 -16
  59. package/lib/crypto/keybackup.d.ts.map +1 -1
  60. package/lib/crypto/keybackup.js.map +1 -1
  61. package/lib/crypto/olmlib.js +21 -21
  62. package/lib/crypto/olmlib.js.map +1 -1
  63. package/lib/crypto/recoverykey.d.ts.map +1 -1
  64. package/lib/crypto/recoverykey.js +3 -2
  65. package/lib/crypto/recoverykey.js.map +1 -1
  66. package/lib/crypto/store/indexeddb-crypto-store-backend.js +1 -1
  67. package/lib/crypto/store/indexeddb-crypto-store-backend.js.map +1 -1
  68. package/lib/crypto/store/indexeddb-crypto-store.js +0 -2
  69. package/lib/crypto/store/indexeddb-crypto-store.js.map +1 -1
  70. package/lib/crypto/store/memory-crypto-store.js +16 -16
  71. package/lib/crypto/store/memory-crypto-store.js.map +1 -1
  72. package/lib/crypto/verification/Base.js +6 -13
  73. package/lib/crypto/verification/Base.js.map +1 -1
  74. package/lib/crypto/verification/QRCode.js +0 -1
  75. package/lib/crypto/verification/QRCode.js.map +1 -1
  76. package/lib/crypto/verification/SAS.js +0 -4
  77. package/lib/crypto/verification/SAS.js.map +1 -1
  78. package/lib/crypto/verification/request/InRoomChannel.js +0 -1
  79. package/lib/crypto/verification/request/InRoomChannel.js.map +1 -1
  80. package/lib/crypto/verification/request/ToDeviceChannel.js +0 -1
  81. package/lib/crypto/verification/request/ToDeviceChannel.js.map +1 -1
  82. package/lib/crypto/verification/request/VerificationRequest.js +5 -7
  83. package/lib/crypto/verification/request/VerificationRequest.js.map +1 -1
  84. package/lib/crypto-api/keybackup.d.ts +15 -0
  85. package/lib/crypto-api/keybackup.d.ts.map +1 -1
  86. package/lib/crypto-api/keybackup.js.map +1 -1
  87. package/lib/crypto-api.d.ts +53 -0
  88. package/lib/crypto-api.d.ts.map +1 -1
  89. package/lib/crypto-api.js +55 -29
  90. package/lib/crypto-api.js.map +1 -1
  91. package/lib/embedded.d.ts +2 -1
  92. package/lib/embedded.d.ts.map +1 -1
  93. package/lib/embedded.js +29 -14
  94. package/lib/embedded.js.map +1 -1
  95. package/lib/event-mapper.js +17 -17
  96. package/lib/event-mapper.js.map +1 -1
  97. package/lib/extensible_events_v1/MessageEvent.js +31 -31
  98. package/lib/extensible_events_v1/MessageEvent.js.map +1 -1
  99. package/lib/extensible_events_v1/PollEndEvent.js +24 -24
  100. package/lib/extensible_events_v1/PollEndEvent.js.map +1 -1
  101. package/lib/extensible_events_v1/PollResponseEvent.js +0 -1
  102. package/lib/extensible_events_v1/PollResponseEvent.js.map +1 -1
  103. package/lib/extensible_events_v1/PollStartEvent.js +44 -44
  104. package/lib/extensible_events_v1/PollStartEvent.js.map +1 -1
  105. package/lib/filter.js +17 -19
  106. package/lib/filter.js.map +1 -1
  107. package/lib/http-api/errors.js +4 -6
  108. package/lib/http-api/errors.js.map +1 -1
  109. package/lib/http-api/fetch.js +1 -1
  110. package/lib/http-api/fetch.js.map +1 -1
  111. package/lib/http-api/index.js +1 -1
  112. package/lib/http-api/index.js.map +1 -1
  113. package/lib/interactive-auth.js +6 -16
  114. package/lib/interactive-auth.js.map +1 -1
  115. package/lib/matrixrtc/CallMembership.d.ts +31 -0
  116. package/lib/matrixrtc/CallMembership.d.ts.map +1 -0
  117. package/lib/matrixrtc/CallMembership.js +80 -0
  118. package/lib/matrixrtc/CallMembership.js.map +1 -0
  119. package/lib/matrixrtc/MatrixRTCSession.d.ts +81 -0
  120. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -0
  121. package/lib/matrixrtc/MatrixRTCSession.js +345 -0
  122. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -0
  123. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts +38 -0
  124. package/lib/matrixrtc/MatrixRTCSessionManager.d.ts.map +1 -0
  125. package/lib/matrixrtc/MatrixRTCSessionManager.js +116 -0
  126. package/lib/matrixrtc/MatrixRTCSessionManager.js.map +1 -0
  127. package/lib/matrixrtc/focus.d.ts +9 -0
  128. package/lib/matrixrtc/focus.d.ts.map +1 -0
  129. package/lib/matrixrtc/focus.js +6 -0
  130. package/lib/matrixrtc/focus.js.map +1 -0
  131. package/lib/models/MSC3089Branch.js +16 -16
  132. package/lib/models/MSC3089Branch.js.map +1 -1
  133. package/lib/models/MSC3089TreeSpace.js +16 -17
  134. package/lib/models/MSC3089TreeSpace.js.map +1 -1
  135. package/lib/models/beacon.js +3 -8
  136. package/lib/models/beacon.js.map +1 -1
  137. package/lib/models/device.js +14 -16
  138. package/lib/models/device.js.map +1 -1
  139. package/lib/models/event-context.js +1 -2
  140. package/lib/models/event-context.js.map +1 -1
  141. package/lib/models/event-timeline-set.js +1 -7
  142. package/lib/models/event-timeline-set.js.map +1 -1
  143. package/lib/models/event-timeline.js +4 -8
  144. package/lib/models/event-timeline.js.map +1 -1
  145. package/lib/models/event.d.ts +1 -1
  146. package/lib/models/event.js +7 -25
  147. package/lib/models/event.js.map +1 -1
  148. package/lib/models/poll.js +4 -8
  149. package/lib/models/poll.js.map +1 -1
  150. package/lib/models/read-receipt.js +0 -1
  151. package/lib/models/read-receipt.js.map +1 -1
  152. package/lib/models/related-relations.js +0 -3
  153. package/lib/models/related-relations.js.map +1 -1
  154. package/lib/models/relations-container.js +2 -2
  155. package/lib/models/relations-container.js.map +1 -1
  156. package/lib/models/relations.js +3 -4
  157. package/lib/models/relations.js.map +1 -1
  158. package/lib/models/room-member.js +2 -20
  159. package/lib/models/room-member.js.map +1 -1
  160. package/lib/models/room-state.js +3 -3
  161. package/lib/models/room-state.js.map +1 -1
  162. package/lib/models/room.d.ts +1 -1
  163. package/lib/models/room.d.ts.map +1 -1
  164. package/lib/models/room.js +40 -76
  165. package/lib/models/room.js.map +1 -1
  166. package/lib/models/thread.js +21 -32
  167. package/lib/models/thread.js.map +1 -1
  168. package/lib/models/user.js +1 -20
  169. package/lib/models/user.js.map +1 -1
  170. package/lib/oidc/authorize.js +16 -16
  171. package/lib/oidc/authorize.js.map +1 -1
  172. package/lib/oidc/discovery.js +16 -16
  173. package/lib/oidc/discovery.js.map +1 -1
  174. package/lib/pushprocessor.js +17 -17
  175. package/lib/pushprocessor.js.map +1 -1
  176. package/lib/receipt-accumulator.js +1 -1
  177. package/lib/receipt-accumulator.js.map +1 -1
  178. package/lib/rendezvous/MSC3906Rendezvous.js +2 -5
  179. package/lib/rendezvous/MSC3906Rendezvous.js.map +1 -1
  180. package/lib/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js +1 -4
  181. package/lib/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js.map +1 -1
  182. package/lib/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js +1 -8
  183. package/lib/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js.map +1 -1
  184. package/lib/room-hierarchy.js +4 -8
  185. package/lib/room-hierarchy.js.map +1 -1
  186. package/lib/rust-crypto/CrossSigningIdentity.d.ts +1 -5
  187. package/lib/rust-crypto/CrossSigningIdentity.d.ts.map +1 -1
  188. package/lib/rust-crypto/CrossSigningIdentity.js +1 -4
  189. package/lib/rust-crypto/CrossSigningIdentity.js.map +1 -1
  190. package/lib/rust-crypto/KeyClaimManager.js +1 -2
  191. package/lib/rust-crypto/KeyClaimManager.js.map +1 -1
  192. package/lib/rust-crypto/OutgoingRequestProcessor.js +16 -16
  193. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
  194. package/lib/rust-crypto/RoomEncryptor.js +0 -3
  195. package/lib/rust-crypto/RoomEncryptor.js.map +1 -1
  196. package/lib/rust-crypto/backup.d.ts +20 -2
  197. package/lib/rust-crypto/backup.d.ts.map +1 -1
  198. package/lib/rust-crypto/backup.js +39 -4
  199. package/lib/rust-crypto/backup.js.map +1 -1
  200. package/lib/rust-crypto/index.d.ts.map +1 -1
  201. package/lib/rust-crypto/index.js +1 -0
  202. package/lib/rust-crypto/index.js.map +1 -1
  203. package/lib/rust-crypto/rust-crypto.d.ts +39 -3
  204. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
  205. package/lib/rust-crypto/rust-crypto.js +260 -61
  206. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  207. package/lib/rust-crypto/verification.js +5 -7
  208. package/lib/rust-crypto/verification.js.map +1 -1
  209. package/lib/scheduler.js +2 -2
  210. package/lib/scheduler.js.map +1 -1
  211. package/lib/sliding-sync-sdk.js +4 -7
  212. package/lib/sliding-sync-sdk.js.map +1 -1
  213. package/lib/sliding-sync.js +23 -28
  214. package/lib/sliding-sync.js.map +1 -1
  215. package/lib/store/indexeddb-local-backend.js +6 -10
  216. package/lib/store/indexeddb-local-backend.js.map +1 -1
  217. package/lib/store/indexeddb-remote-backend.js +8 -11
  218. package/lib/store/indexeddb-remote-backend.js.map +1 -1
  219. package/lib/store/indexeddb-store-worker.js +1 -2
  220. package/lib/store/indexeddb-store-worker.js.map +1 -1
  221. package/lib/store/indexeddb.js +0 -1
  222. package/lib/store/indexeddb.js.map +1 -1
  223. package/lib/store/memory.js +0 -3
  224. package/lib/store/memory.js.map +1 -1
  225. package/lib/sync-accumulator.d.ts +11 -1
  226. package/lib/sync-accumulator.d.ts.map +1 -1
  227. package/lib/sync-accumulator.js +55 -4
  228. package/lib/sync-accumulator.js.map +1 -1
  229. package/lib/sync.d.ts.map +1 -1
  230. package/lib/sync.js +53 -39
  231. package/lib/sync.js.map +1 -1
  232. package/lib/timeline-window.js +2 -6
  233. package/lib/timeline-window.js.map +1 -1
  234. package/lib/utils.js +18 -18
  235. package/lib/utils.js.map +1 -1
  236. package/lib/webrtc/audioContext.js +1 -1
  237. package/lib/webrtc/audioContext.js.map +1 -1
  238. package/lib/webrtc/call.js +35 -73
  239. package/lib/webrtc/call.js.map +1 -1
  240. package/lib/webrtc/callEventHandler.js +1 -6
  241. package/lib/webrtc/callEventHandler.js.map +1 -1
  242. package/lib/webrtc/callFeed.js +2 -17
  243. package/lib/webrtc/callFeed.js.map +1 -1
  244. package/lib/webrtc/groupCall.d.ts +7 -1
  245. package/lib/webrtc/groupCall.d.ts.map +1 -1
  246. package/lib/webrtc/groupCall.js +47 -33
  247. package/lib/webrtc/groupCall.js.map +1 -1
  248. package/lib/webrtc/groupCallEventHandler.d.ts.map +1 -1
  249. package/lib/webrtc/groupCallEventHandler.js +3 -2
  250. package/lib/webrtc/groupCallEventHandler.js.map +1 -1
  251. package/lib/webrtc/mediaHandler.js +3 -7
  252. package/lib/webrtc/mediaHandler.js.map +1 -1
  253. package/lib/webrtc/stats/callStatsReportGatherer.js +19 -22
  254. package/lib/webrtc/stats/callStatsReportGatherer.js.map +1 -1
  255. package/lib/webrtc/stats/groupCallStats.js +4 -5
  256. package/lib/webrtc/stats/groupCallStats.js.map +1 -1
  257. package/lib/webrtc/stats/media/mediaSsrcHandler.js +1 -1
  258. package/lib/webrtc/stats/media/mediaSsrcHandler.js.map +1 -1
  259. package/lib/webrtc/stats/media/mediaTrackStats.js +3 -3
  260. package/lib/webrtc/stats/media/mediaTrackStats.js.map +1 -1
  261. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js +1 -1
  262. package/lib/webrtc/stats/media/mediaTrackStatsHandler.js.map +1 -1
  263. package/package.json +4 -4
  264. package/src/client.ts +66 -23
  265. package/src/common-crypto/CryptoBackend.ts +45 -0
  266. package/src/common-crypto/base64.ts +46 -0
  267. package/src/crypto/backup.ts +30 -0
  268. package/src/crypto/index.ts +90 -3
  269. package/src/crypto/keybackup.ts +3 -20
  270. package/src/crypto/recoverykey.ts +3 -4
  271. package/src/crypto-api/keybackup.ts +19 -0
  272. package/src/crypto-api.ts +63 -0
  273. package/src/embedded.ts +28 -1
  274. package/src/matrixrtc/CallMembership.ts +95 -0
  275. package/src/matrixrtc/MatrixRTCSession.ts +418 -0
  276. package/src/matrixrtc/MatrixRTCSessionManager.ts +128 -0
  277. package/src/matrixrtc/focus.ts +24 -0
  278. package/src/models/event.ts +1 -1
  279. package/src/models/room.ts +11 -5
  280. package/src/rust-crypto/CrossSigningIdentity.ts +0 -4
  281. package/src/rust-crypto/backup.ts +56 -2
  282. package/src/rust-crypto/index.ts +3 -0
  283. package/src/rust-crypto/rust-crypto.ts +282 -44
  284. package/src/sync-accumulator.ts +63 -1
  285. package/src/sync.ts +26 -1
  286. package/src/webrtc/groupCall.ts +43 -6
  287. package/src/webrtc/groupCallEventHandler.ts +3 -0
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.RustBackupManager = void 0;
7
+ exports.RustBackupManager = exports.RustBackupDecryptor = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var RustSdkCryptoJs = _interopRequireWildcard(require("@matrix-org/matrix-sdk-crypto-wasm"));
10
10
  var _logger = require("../logger");
@@ -43,9 +43,6 @@ limitations under the License.
43
43
  class RustBackupManager extends _typedEventEmitter.TypedEventEmitter {
44
44
  constructor(olmMachine, http, outgoingRequestProcessor) {
45
45
  super();
46
- this.olmMachine = olmMachine;
47
- this.http = http;
48
- this.outgoingRequestProcessor = outgoingRequestProcessor;
49
46
  /** Have we checked if there is a backup on the server which we can use */
50
47
  (0, _defineProperty2.default)(this, "checkedForBackup", false);
51
48
  (0, _defineProperty2.default)(this, "activeBackupVersion", null);
@@ -53,6 +50,9 @@ class RustBackupManager extends _typedEventEmitter.TypedEventEmitter {
53
50
  /** whether {@link backupKeysLoop} is currently running */
54
51
  (0, _defineProperty2.default)(this, "backupKeysLoopRunning", false);
55
52
  (0, _defineProperty2.default)(this, "keyBackupCheckInProgress", null);
53
+ this.olmMachine = olmMachine;
54
+ this.http = http;
55
+ this.outgoingRequestProcessor = outgoingRequestProcessor;
56
56
  }
57
57
 
58
58
  /**
@@ -332,5 +332,40 @@ class RustBackupManager extends _typedEventEmitter.TypedEventEmitter {
332
332
  });
333
333
  }
334
334
  }
335
+
336
+ /**
337
+ * Implementation of {@link BackupDecryptor} for the rust crypto backend.
338
+ */
335
339
  exports.RustBackupManager = RustBackupManager;
340
+ class RustBackupDecryptor {
341
+ constructor(decryptionKey) {
342
+ this.decryptionKey = decryptionKey;
343
+ this.sourceTrusted = false;
344
+ }
345
+
346
+ /**
347
+ * Implements {@link BackupDecryptor#decryptSessions}
348
+ */
349
+ async decryptSessions(ciphertexts) {
350
+ const keys = [];
351
+ for (const [sessionId, sessionData] of Object.entries(ciphertexts)) {
352
+ try {
353
+ const decrypted = JSON.parse(await this.decryptionKey.decryptV1(sessionData.session_data.ephemeral, sessionData.session_data.mac, sessionData.session_data.ciphertext));
354
+ decrypted.session_id = sessionId;
355
+ keys.push(decrypted);
356
+ } catch (e) {
357
+ _logger.logger.log("Failed to decrypt megolm session from backup", e, sessionData);
358
+ }
359
+ }
360
+ return keys;
361
+ }
362
+
363
+ /**
364
+ * Implements {@link BackupDecryptor#free}
365
+ */
366
+ free() {
367
+ this.decryptionKey.free();
368
+ }
369
+ }
370
+ exports.RustBackupDecryptor = RustBackupDecryptor;
336
371
  //# sourceMappingURL=backup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backup.js","names":["RustSdkCryptoJs","_interopRequireWildcard","require","_logger","_httpApi","_crypto","_typedEventEmitter","_utils","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RustBackupManager","TypedEventEmitter","constructor","olmMachine","http","outgoingRequestProcessor","_defineProperty2","stop","stopped","getActiveBackupVersion","isBackupEnabled","activeBackupVersion","isKeyBackupTrusted","info","_backupKeys$decryptio","_info$auth_data","signatureVerification","verifyBackup","backupKeys","getBackupKeys","pubKeyForSavedPrivateKey","decryptionKey","megolmV1PublicKey","backupMatchesSavedPrivateKey","algorithm","auth_data","public_key","publicKeyBase64","matchesDecryptionKey","trusted","checkKeyBackupAndEnable","force","checkedForBackup","Promise","resolve","keyBackupCheckInProgress","doCheckKeyBackup","finally","logger","log","backupInfo","requestKeyBackupVersion","e","warn","version","activeVersion","disableKeyBackup","trustInfo","enableKeyBackup","enableBackupV1","emit","CryptoEvent","KeyBackupStatus","backupKeysLoop","maybeUploadKey","disableBackup","maxDelay","backupKeysLoopRunning","delay","Math","random","sleep","numFailures","request","backupRoomKeys","makeOutgoingRequest","keyCount","roomKeyCounts","remaining","total","backedUp","KeyBackupSessionsRemaining","err","error","MatrixError","errCode","data","errcode","KeyBackupFailed","waitTime","retry_after_ms","pow","min","authedRequest","Method","Get","undefined","prefix","ClientPrefix","V3","setupKeyBackup","signObject","deleteAllKeyBackupVersions","randomKey","BackupDecryptionKey","createRandomKey","pubKey","authData","res","Post","saveBackupDecryptionKey","_await$this$requestKe","_await$this$requestKe2","current","_await$this$requestKe3","_await$this$requestKe4","deleteKeyBackupVersion","debug","path","encodeUri","$version","Delete","exports"],"sources":["../../src/rust-crypto/backup.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { OlmMachine, SignatureVerification } from \"@matrix-org/matrix-sdk-crypto-wasm\";\nimport * as RustSdkCryptoJs from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { BackupTrustInfo, Curve25519AuthData, KeyBackupCheck, KeyBackupInfo } from \"../crypto-api/keybackup\";\nimport { logger } from \"../logger\";\nimport { ClientPrefix, IHttpOpts, MatrixError, MatrixHttpApi, Method } from \"../http-api\";\nimport { CryptoEvent } from \"../crypto\";\nimport { TypedEventEmitter } from \"../models/typed-event-emitter\";\nimport { encodeUri } from \"../utils\";\nimport { OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\nimport { sleep } from \"../utils\";\n\n/** Authentification of the backup info, depends on algorithm */\ntype AuthData = KeyBackupInfo[\"auth_data\"];\n\n/**\n * Holds information of a created keybackup.\n * Useful to get the generated private key material and save it securely somewhere.\n */\ninterface KeyBackupCreationInfo {\n version: string;\n algorithm: string;\n authData: AuthData;\n decryptionKey: RustSdkCryptoJs.BackupDecryptionKey;\n}\n\n/**\n * @internal\n */\nexport class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents, RustBackupCryptoEventMap> {\n /** Have we checked if there is a backup on the server which we can use */\n private checkedForBackup = false;\n private activeBackupVersion: string | null = null;\n private stopped = false;\n\n /** whether {@link backupKeysLoop} is currently running */\n private backupKeysLoopRunning = false;\n\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n ) {\n super();\n }\n\n /**\n * Tells the RustBackupManager to stop.\n * The RustBackupManager is scheduling background uploads of keys to the backup, this\n * call allows to cancel the process when the client is stoppped.\n */\n public stop(): void {\n this.stopped = true;\n }\n\n /**\n * Get the backup version we are currently backing up to, if any\n */\n public async getActiveBackupVersion(): Promise<string | null> {\n if (!this.olmMachine.isBackupEnabled()) return null;\n return this.activeBackupVersion;\n }\n\n /**\n * Determine if a key backup can be trusted.\n *\n * @param info - key backup info dict from {@link MatrixClient#getKeyBackupVersion}.\n */\n public async isKeyBackupTrusted(info: KeyBackupInfo): Promise<BackupTrustInfo> {\n const signatureVerification: SignatureVerification = await this.olmMachine.verifyBackup(info);\n\n const backupKeys: RustSdkCryptoJs.BackupKeys = await this.olmMachine.getBackupKeys();\n const pubKeyForSavedPrivateKey = backupKeys?.decryptionKey?.megolmV1PublicKey;\n const backupMatchesSavedPrivateKey =\n info.algorithm === pubKeyForSavedPrivateKey?.algorithm &&\n (info.auth_data as Curve25519AuthData)?.public_key === pubKeyForSavedPrivateKey.publicKeyBase64;\n\n return {\n matchesDecryptionKey: backupMatchesSavedPrivateKey,\n trusted: signatureVerification.trusted(),\n };\n }\n\n /**\n * Re-check the key backup and enable/disable it as appropriate.\n *\n * @param force - whether we should force a re-check even if one has already happened.\n */\n public checkKeyBackupAndEnable(force: boolean): Promise<KeyBackupCheck | null> {\n if (!force && this.checkedForBackup) {\n return Promise.resolve(null);\n }\n\n // make sure there is only one check going on at a time\n if (!this.keyBackupCheckInProgress) {\n this.keyBackupCheckInProgress = this.doCheckKeyBackup().finally(() => {\n this.keyBackupCheckInProgress = null;\n });\n }\n return this.keyBackupCheckInProgress;\n }\n private keyBackupCheckInProgress: Promise<KeyBackupCheck | null> | null = null;\n\n /** Helper for `checkKeyBackup` */\n private async doCheckKeyBackup(): Promise<KeyBackupCheck | null> {\n logger.log(\"Checking key backup status...\");\n let backupInfo: KeyBackupInfo | null = null;\n try {\n backupInfo = await this.requestKeyBackupVersion();\n } catch (e) {\n logger.warn(\"Error checking for active key backup\", e);\n return null;\n }\n this.checkedForBackup = true;\n\n if (backupInfo && !backupInfo.version) {\n logger.warn(\"active backup lacks a useful 'version'; ignoring it\");\n }\n\n const activeVersion = await this.getActiveBackupVersion();\n\n if (!backupInfo) {\n if (activeVersion !== null) {\n logger.log(\"No key backup present on server: disabling key backup\");\n await this.disableKeyBackup();\n } else {\n logger.log(\"No key backup present on server: not enabling key backup\");\n }\n return null;\n }\n\n const trustInfo = await this.isKeyBackupTrusted(backupInfo);\n\n if (!trustInfo.trusted) {\n if (activeVersion !== null) {\n logger.log(\"Key backup present on server but not trusted: disabling key backup\");\n await this.disableKeyBackup();\n } else {\n logger.log(\"Key backup present on server but not trusted: not enabling key backup\");\n }\n } else {\n if (activeVersion === null) {\n logger.log(`Found usable key backup v${backupInfo.version}: enabling key backups`);\n await this.enableKeyBackup(backupInfo);\n } else if (activeVersion !== backupInfo.version) {\n logger.log(`On backup version ${activeVersion} but found version ${backupInfo.version}: switching.`);\n // This will remove any pending backup request, remove the backup key and reset the backup state of each room key we have.\n await this.disableKeyBackup();\n // Enabling will now trigger re-upload of all the keys\n await this.enableKeyBackup(backupInfo);\n } else {\n logger.log(`Backup version ${backupInfo.version} still current`);\n }\n }\n return { backupInfo, trustInfo };\n }\n\n private async enableKeyBackup(backupInfo: KeyBackupInfo): Promise<void> {\n // we know for certain it must be a Curve25519 key, because we have verified it and only Curve25519\n // keys can be verified.\n //\n // we also checked it has a valid `version`.\n await this.olmMachine.enableBackupV1(\n (backupInfo.auth_data as Curve25519AuthData).public_key,\n backupInfo.version!,\n );\n this.activeBackupVersion = backupInfo.version!;\n\n this.emit(CryptoEvent.KeyBackupStatus, true);\n\n this.backupKeysLoop();\n }\n\n /**\n * Restart the backup key loop if there is an active trusted backup.\n * Doesn't try to check the backup server side. To be called when a new\n * megolm key is known locally.\n */\n public async maybeUploadKey(): Promise<void> {\n if (this.activeBackupVersion != null) {\n this.backupKeysLoop();\n }\n }\n\n private async disableKeyBackup(): Promise<void> {\n await this.olmMachine.disableBackup();\n this.activeBackupVersion = null;\n this.emit(CryptoEvent.KeyBackupStatus, false);\n }\n\n private async backupKeysLoop(maxDelay = 10000): Promise<void> {\n if (this.backupKeysLoopRunning) {\n logger.log(`Backup loop already running`);\n return;\n }\n this.backupKeysLoopRunning = true;\n\n logger.log(`Starting loop for ${this.activeBackupVersion}.`);\n\n // wait between 0 and `maxDelay` seconds, to avoid backup\n // requests from different clients hitting the server all at\n // the same time when a new key is sent\n const delay = Math.random() * maxDelay;\n await sleep(delay);\n\n try {\n let numFailures = 0; // number of consecutive network failures for exponential backoff\n\n while (!this.stopped) {\n // Get a batch of room keys to upload\n const request: RustSdkCryptoJs.KeysBackupRequest | null = await this.olmMachine.backupRoomKeys();\n\n if (!request || this.stopped || !this.activeBackupVersion) {\n logger.log(`Ending loop for ${this.activeBackupVersion}.`);\n return;\n }\n\n try {\n await this.outgoingRequestProcessor.makeOutgoingRequest(request);\n numFailures = 0;\n\n const keyCount: RustSdkCryptoJs.RoomKeyCounts = await this.olmMachine.roomKeyCounts();\n const remaining = keyCount.total - keyCount.backedUp;\n this.emit(CryptoEvent.KeyBackupSessionsRemaining, remaining);\n } catch (err) {\n numFailures++;\n logger.error(\"Error processing backup request for rust crypto-sdk\", err);\n if (err instanceof MatrixError) {\n const errCode = err.data.errcode;\n if (errCode == \"M_NOT_FOUND\" || errCode == \"M_WRONG_ROOM_KEYS_VERSION\") {\n await this.disableKeyBackup();\n this.emit(CryptoEvent.KeyBackupFailed, err.data.errcode!);\n // There was an active backup and we are out of sync with the server\n // force a check server side\n this.backupKeysLoopRunning = false;\n this.checkKeyBackupAndEnable(true);\n return;\n } else if (errCode == \"M_LIMIT_EXCEEDED\") {\n // wait for that and then continue?\n const waitTime = err.data.retry_after_ms;\n if (waitTime > 0) {\n sleep(waitTime);\n continue;\n } // else go to the normal backoff\n }\n }\n\n // Some other errors (mx, network, or CORS or invalid urls?) anyhow backoff\n // exponential backoff if we have failures\n await sleep(1000 * Math.pow(2, Math.min(numFailures - 1, 4)));\n }\n }\n } finally {\n this.backupKeysLoopRunning = false;\n }\n }\n\n /**\n * Get information about the current key backup from the server\n *\n * @returns Information object from API or null if there is no active backup.\n */\n private async requestKeyBackupVersion(): Promise<KeyBackupInfo | null> {\n try {\n return await this.http.authedRequest<KeyBackupInfo>(\n Method.Get,\n \"/room_keys/version\",\n undefined,\n undefined,\n {\n prefix: ClientPrefix.V3,\n },\n );\n } catch (e) {\n if ((<MatrixError>e).errcode === \"M_NOT_FOUND\") {\n return null;\n } else {\n throw e;\n }\n }\n }\n\n /**\n * Creates a new key backup by generating a new random private key.\n *\n * If there is an existing backup server side it will be deleted and replaced\n * by the new one.\n *\n * @param signObject - Method that should sign the backup with existing device and\n * existing identity.\n * @returns a KeyBackupCreationInfo - All information related to the backup.\n */\n public async setupKeyBackup(signObject: (authData: AuthData) => Promise<void>): Promise<KeyBackupCreationInfo> {\n // Clean up any existing backup\n await this.deleteAllKeyBackupVersions();\n\n const randomKey = RustSdkCryptoJs.BackupDecryptionKey.createRandomKey();\n const pubKey = randomKey.megolmV1PublicKey;\n\n const authData = { public_key: pubKey.publicKeyBase64 };\n\n await signObject(authData);\n\n const res = await this.http.authedRequest<{ version: string }>(\n Method.Post,\n \"/room_keys/version\",\n undefined,\n {\n algorithm: pubKey.algorithm,\n auth_data: authData,\n },\n {\n prefix: ClientPrefix.V3,\n },\n );\n\n this.olmMachine.saveBackupDecryptionKey(randomKey, res.version);\n\n return {\n version: res.version,\n algorithm: pubKey.algorithm,\n authData: authData,\n decryptionKey: randomKey,\n };\n }\n\n /**\n * Deletes all key backups.\n *\n * Will call the API to delete active backup until there is no more present.\n */\n public async deleteAllKeyBackupVersions(): Promise<void> {\n // there could be several backup versions. Delete all to be safe.\n let current = (await this.requestKeyBackupVersion())?.version ?? null;\n while (current != null) {\n await this.deleteKeyBackupVersion(current);\n current = (await this.requestKeyBackupVersion())?.version ?? null;\n }\n\n // XXX: Should this also update Secret Storage and delete any existing keys?\n }\n\n /**\n * Deletes the given key backup.\n *\n * @param version - The backup version to delete.\n */\n public async deleteKeyBackupVersion(version: string): Promise<void> {\n logger.debug(`deleteKeyBackupVersion v:${version}`);\n const path = encodeUri(\"/room_keys/version/$version\", { $version: version });\n await this.http.authedRequest<void>(Method.Delete, path, undefined, undefined, {\n prefix: ClientPrefix.V3,\n });\n }\n}\n\nexport type RustBackupCryptoEvents =\n | CryptoEvent.KeyBackupStatus\n | CryptoEvent.KeyBackupSessionsRemaining\n | CryptoEvent.KeyBackupFailed;\n\nexport type RustBackupCryptoEventMap = {\n [CryptoEvent.KeyBackupStatus]: (enabled: boolean) => void;\n [CryptoEvent.KeyBackupSessionsRemaining]: (remaining: number) => void;\n [CryptoEvent.KeyBackupFailed]: (errCode: string) => void;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"backup.js","names":["RustSdkCryptoJs","_interopRequireWildcard","require","_logger","_httpApi","_crypto","_typedEventEmitter","_utils","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","RustBackupManager","TypedEventEmitter","constructor","olmMachine","http","outgoingRequestProcessor","_defineProperty2","stop","stopped","getActiveBackupVersion","isBackupEnabled","activeBackupVersion","isKeyBackupTrusted","info","_backupKeys$decryptio","_info$auth_data","signatureVerification","verifyBackup","backupKeys","getBackupKeys","pubKeyForSavedPrivateKey","decryptionKey","megolmV1PublicKey","backupMatchesSavedPrivateKey","algorithm","auth_data","public_key","publicKeyBase64","matchesDecryptionKey","trusted","checkKeyBackupAndEnable","force","checkedForBackup","Promise","resolve","keyBackupCheckInProgress","doCheckKeyBackup","finally","logger","log","backupInfo","requestKeyBackupVersion","e","warn","version","activeVersion","disableKeyBackup","trustInfo","enableKeyBackup","enableBackupV1","emit","CryptoEvent","KeyBackupStatus","backupKeysLoop","maybeUploadKey","disableBackup","maxDelay","backupKeysLoopRunning","delay","Math","random","sleep","numFailures","request","backupRoomKeys","makeOutgoingRequest","keyCount","roomKeyCounts","remaining","total","backedUp","KeyBackupSessionsRemaining","err","error","MatrixError","errCode","data","errcode","KeyBackupFailed","waitTime","retry_after_ms","pow","min","authedRequest","Method","Get","undefined","prefix","ClientPrefix","V3","setupKeyBackup","signObject","deleteAllKeyBackupVersions","randomKey","BackupDecryptionKey","createRandomKey","pubKey","authData","res","Post","saveBackupDecryptionKey","_await$this$requestKe","_await$this$requestKe2","current","_await$this$requestKe3","_await$this$requestKe4","deleteKeyBackupVersion","debug","path","encodeUri","$version","Delete","exports","RustBackupDecryptor","sourceTrusted","decryptSessions","ciphertexts","keys","sessionId","sessionData","entries","decrypted","JSON","parse","decryptV1","session_data","ephemeral","mac","ciphertext","session_id","push","free"],"sources":["../../src/rust-crypto/backup.ts"],"sourcesContent":["/*\nCopyright 2023 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport { OlmMachine, SignatureVerification } from \"@matrix-org/matrix-sdk-crypto-wasm\";\nimport * as RustSdkCryptoJs from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport {\n BackupTrustInfo,\n Curve25519AuthData,\n KeyBackupCheck,\n KeyBackupInfo,\n KeyBackupSession,\n Curve25519SessionData,\n} from \"../crypto-api/keybackup\";\nimport { logger } from \"../logger\";\nimport { ClientPrefix, IHttpOpts, MatrixError, MatrixHttpApi, Method } from \"../http-api\";\nimport { CryptoEvent, IMegolmSessionData } from \"../crypto\";\nimport { TypedEventEmitter } from \"../models/typed-event-emitter\";\nimport { encodeUri } from \"../utils\";\nimport { OutgoingRequestProcessor } from \"./OutgoingRequestProcessor\";\nimport { sleep } from \"../utils\";\nimport { BackupDecryptor } from \"../common-crypto/CryptoBackend\";\nimport { IEncryptedPayload } from \"../crypto/aes\";\n\n/** Authentification of the backup info, depends on algorithm */\ntype AuthData = KeyBackupInfo[\"auth_data\"];\n\n/**\n * Holds information of a created keybackup.\n * Useful to get the generated private key material and save it securely somewhere.\n */\ninterface KeyBackupCreationInfo {\n version: string;\n algorithm: string;\n authData: AuthData;\n decryptionKey: RustSdkCryptoJs.BackupDecryptionKey;\n}\n\n/**\n * @internal\n */\nexport class RustBackupManager extends TypedEventEmitter<RustBackupCryptoEvents, RustBackupCryptoEventMap> {\n /** Have we checked if there is a backup on the server which we can use */\n private checkedForBackup = false;\n private activeBackupVersion: string | null = null;\n private stopped = false;\n\n /** whether {@link backupKeysLoop} is currently running */\n private backupKeysLoopRunning = false;\n\n public constructor(\n private readonly olmMachine: OlmMachine,\n private readonly http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,\n private readonly outgoingRequestProcessor: OutgoingRequestProcessor,\n ) {\n super();\n }\n\n /**\n * Tells the RustBackupManager to stop.\n * The RustBackupManager is scheduling background uploads of keys to the backup, this\n * call allows to cancel the process when the client is stoppped.\n */\n public stop(): void {\n this.stopped = true;\n }\n\n /**\n * Get the backup version we are currently backing up to, if any\n */\n public async getActiveBackupVersion(): Promise<string | null> {\n if (!this.olmMachine.isBackupEnabled()) return null;\n return this.activeBackupVersion;\n }\n\n /**\n * Determine if a key backup can be trusted.\n *\n * @param info - key backup info dict from {@link MatrixClient#getKeyBackupVersion}.\n */\n public async isKeyBackupTrusted(info: KeyBackupInfo): Promise<BackupTrustInfo> {\n const signatureVerification: SignatureVerification = await this.olmMachine.verifyBackup(info);\n\n const backupKeys: RustSdkCryptoJs.BackupKeys = await this.olmMachine.getBackupKeys();\n const pubKeyForSavedPrivateKey = backupKeys?.decryptionKey?.megolmV1PublicKey;\n const backupMatchesSavedPrivateKey =\n info.algorithm === pubKeyForSavedPrivateKey?.algorithm &&\n (info.auth_data as Curve25519AuthData)?.public_key === pubKeyForSavedPrivateKey.publicKeyBase64;\n\n return {\n matchesDecryptionKey: backupMatchesSavedPrivateKey,\n trusted: signatureVerification.trusted(),\n };\n }\n\n /**\n * Re-check the key backup and enable/disable it as appropriate.\n *\n * @param force - whether we should force a re-check even if one has already happened.\n */\n public checkKeyBackupAndEnable(force: boolean): Promise<KeyBackupCheck | null> {\n if (!force && this.checkedForBackup) {\n return Promise.resolve(null);\n }\n\n // make sure there is only one check going on at a time\n if (!this.keyBackupCheckInProgress) {\n this.keyBackupCheckInProgress = this.doCheckKeyBackup().finally(() => {\n this.keyBackupCheckInProgress = null;\n });\n }\n return this.keyBackupCheckInProgress;\n }\n private keyBackupCheckInProgress: Promise<KeyBackupCheck | null> | null = null;\n\n /** Helper for `checkKeyBackup` */\n private async doCheckKeyBackup(): Promise<KeyBackupCheck | null> {\n logger.log(\"Checking key backup status...\");\n let backupInfo: KeyBackupInfo | null = null;\n try {\n backupInfo = await this.requestKeyBackupVersion();\n } catch (e) {\n logger.warn(\"Error checking for active key backup\", e);\n return null;\n }\n this.checkedForBackup = true;\n\n if (backupInfo && !backupInfo.version) {\n logger.warn(\"active backup lacks a useful 'version'; ignoring it\");\n }\n\n const activeVersion = await this.getActiveBackupVersion();\n\n if (!backupInfo) {\n if (activeVersion !== null) {\n logger.log(\"No key backup present on server: disabling key backup\");\n await this.disableKeyBackup();\n } else {\n logger.log(\"No key backup present on server: not enabling key backup\");\n }\n return null;\n }\n\n const trustInfo = await this.isKeyBackupTrusted(backupInfo);\n\n if (!trustInfo.trusted) {\n if (activeVersion !== null) {\n logger.log(\"Key backup present on server but not trusted: disabling key backup\");\n await this.disableKeyBackup();\n } else {\n logger.log(\"Key backup present on server but not trusted: not enabling key backup\");\n }\n } else {\n if (activeVersion === null) {\n logger.log(`Found usable key backup v${backupInfo.version}: enabling key backups`);\n await this.enableKeyBackup(backupInfo);\n } else if (activeVersion !== backupInfo.version) {\n logger.log(`On backup version ${activeVersion} but found version ${backupInfo.version}: switching.`);\n // This will remove any pending backup request, remove the backup key and reset the backup state of each room key we have.\n await this.disableKeyBackup();\n // Enabling will now trigger re-upload of all the keys\n await this.enableKeyBackup(backupInfo);\n } else {\n logger.log(`Backup version ${backupInfo.version} still current`);\n }\n }\n return { backupInfo, trustInfo };\n }\n\n private async enableKeyBackup(backupInfo: KeyBackupInfo): Promise<void> {\n // we know for certain it must be a Curve25519 key, because we have verified it and only Curve25519\n // keys can be verified.\n //\n // we also checked it has a valid `version`.\n await this.olmMachine.enableBackupV1(\n (backupInfo.auth_data as Curve25519AuthData).public_key,\n backupInfo.version!,\n );\n this.activeBackupVersion = backupInfo.version!;\n\n this.emit(CryptoEvent.KeyBackupStatus, true);\n\n this.backupKeysLoop();\n }\n\n /**\n * Restart the backup key loop if there is an active trusted backup.\n * Doesn't try to check the backup server side. To be called when a new\n * megolm key is known locally.\n */\n public async maybeUploadKey(): Promise<void> {\n if (this.activeBackupVersion != null) {\n this.backupKeysLoop();\n }\n }\n\n private async disableKeyBackup(): Promise<void> {\n await this.olmMachine.disableBackup();\n this.activeBackupVersion = null;\n this.emit(CryptoEvent.KeyBackupStatus, false);\n }\n\n private async backupKeysLoop(maxDelay = 10000): Promise<void> {\n if (this.backupKeysLoopRunning) {\n logger.log(`Backup loop already running`);\n return;\n }\n this.backupKeysLoopRunning = true;\n\n logger.log(`Starting loop for ${this.activeBackupVersion}.`);\n\n // wait between 0 and `maxDelay` seconds, to avoid backup\n // requests from different clients hitting the server all at\n // the same time when a new key is sent\n const delay = Math.random() * maxDelay;\n await sleep(delay);\n\n try {\n let numFailures = 0; // number of consecutive network failures for exponential backoff\n\n while (!this.stopped) {\n // Get a batch of room keys to upload\n const request: RustSdkCryptoJs.KeysBackupRequest | null = await this.olmMachine.backupRoomKeys();\n\n if (!request || this.stopped || !this.activeBackupVersion) {\n logger.log(`Ending loop for ${this.activeBackupVersion}.`);\n return;\n }\n\n try {\n await this.outgoingRequestProcessor.makeOutgoingRequest(request);\n numFailures = 0;\n\n const keyCount: RustSdkCryptoJs.RoomKeyCounts = await this.olmMachine.roomKeyCounts();\n const remaining = keyCount.total - keyCount.backedUp;\n this.emit(CryptoEvent.KeyBackupSessionsRemaining, remaining);\n } catch (err) {\n numFailures++;\n logger.error(\"Error processing backup request for rust crypto-sdk\", err);\n if (err instanceof MatrixError) {\n const errCode = err.data.errcode;\n if (errCode == \"M_NOT_FOUND\" || errCode == \"M_WRONG_ROOM_KEYS_VERSION\") {\n await this.disableKeyBackup();\n this.emit(CryptoEvent.KeyBackupFailed, err.data.errcode!);\n // There was an active backup and we are out of sync with the server\n // force a check server side\n this.backupKeysLoopRunning = false;\n this.checkKeyBackupAndEnable(true);\n return;\n } else if (errCode == \"M_LIMIT_EXCEEDED\") {\n // wait for that and then continue?\n const waitTime = err.data.retry_after_ms;\n if (waitTime > 0) {\n sleep(waitTime);\n continue;\n } // else go to the normal backoff\n }\n }\n\n // Some other errors (mx, network, or CORS or invalid urls?) anyhow backoff\n // exponential backoff if we have failures\n await sleep(1000 * Math.pow(2, Math.min(numFailures - 1, 4)));\n }\n }\n } finally {\n this.backupKeysLoopRunning = false;\n }\n }\n\n /**\n * Get information about the current key backup from the server\n *\n * @returns Information object from API or null if there is no active backup.\n */\n private async requestKeyBackupVersion(): Promise<KeyBackupInfo | null> {\n try {\n return await this.http.authedRequest<KeyBackupInfo>(\n Method.Get,\n \"/room_keys/version\",\n undefined,\n undefined,\n {\n prefix: ClientPrefix.V3,\n },\n );\n } catch (e) {\n if ((<MatrixError>e).errcode === \"M_NOT_FOUND\") {\n return null;\n } else {\n throw e;\n }\n }\n }\n\n /**\n * Creates a new key backup by generating a new random private key.\n *\n * If there is an existing backup server side it will be deleted and replaced\n * by the new one.\n *\n * @param signObject - Method that should sign the backup with existing device and\n * existing identity.\n * @returns a KeyBackupCreationInfo - All information related to the backup.\n */\n public async setupKeyBackup(signObject: (authData: AuthData) => Promise<void>): Promise<KeyBackupCreationInfo> {\n // Clean up any existing backup\n await this.deleteAllKeyBackupVersions();\n\n const randomKey = RustSdkCryptoJs.BackupDecryptionKey.createRandomKey();\n const pubKey = randomKey.megolmV1PublicKey;\n\n const authData = { public_key: pubKey.publicKeyBase64 };\n\n await signObject(authData);\n\n const res = await this.http.authedRequest<{ version: string }>(\n Method.Post,\n \"/room_keys/version\",\n undefined,\n {\n algorithm: pubKey.algorithm,\n auth_data: authData,\n },\n {\n prefix: ClientPrefix.V3,\n },\n );\n\n this.olmMachine.saveBackupDecryptionKey(randomKey, res.version);\n\n return {\n version: res.version,\n algorithm: pubKey.algorithm,\n authData: authData,\n decryptionKey: randomKey,\n };\n }\n\n /**\n * Deletes all key backups.\n *\n * Will call the API to delete active backup until there is no more present.\n */\n public async deleteAllKeyBackupVersions(): Promise<void> {\n // there could be several backup versions. Delete all to be safe.\n let current = (await this.requestKeyBackupVersion())?.version ?? null;\n while (current != null) {\n await this.deleteKeyBackupVersion(current);\n current = (await this.requestKeyBackupVersion())?.version ?? null;\n }\n\n // XXX: Should this also update Secret Storage and delete any existing keys?\n }\n\n /**\n * Deletes the given key backup.\n *\n * @param version - The backup version to delete.\n */\n public async deleteKeyBackupVersion(version: string): Promise<void> {\n logger.debug(`deleteKeyBackupVersion v:${version}`);\n const path = encodeUri(\"/room_keys/version/$version\", { $version: version });\n await this.http.authedRequest<void>(Method.Delete, path, undefined, undefined, {\n prefix: ClientPrefix.V3,\n });\n }\n}\n\n/**\n * Implementation of {@link BackupDecryptor} for the rust crypto backend.\n */\nexport class RustBackupDecryptor implements BackupDecryptor {\n private decryptionKey: RustSdkCryptoJs.BackupDecryptionKey;\n public sourceTrusted: boolean;\n\n public constructor(decryptionKey: RustSdkCryptoJs.BackupDecryptionKey) {\n this.decryptionKey = decryptionKey;\n this.sourceTrusted = false;\n }\n\n /**\n * Implements {@link BackupDecryptor#decryptSessions}\n */\n public async decryptSessions(\n ciphertexts: Record<string, KeyBackupSession<Curve25519SessionData | IEncryptedPayload>>,\n ): Promise<IMegolmSessionData[]> {\n const keys: IMegolmSessionData[] = [];\n for (const [sessionId, sessionData] of Object.entries(ciphertexts)) {\n try {\n const decrypted = JSON.parse(\n await this.decryptionKey.decryptV1(\n sessionData.session_data.ephemeral,\n sessionData.session_data.mac,\n sessionData.session_data.ciphertext,\n ),\n );\n decrypted.session_id = sessionId;\n keys.push(decrypted);\n } catch (e) {\n logger.log(\"Failed to decrypt megolm session from backup\", e, sessionData);\n }\n }\n return keys;\n }\n\n /**\n * Implements {@link BackupDecryptor#free}\n */\n public free(): void {\n this.decryptionKey.free();\n }\n}\n\nexport type RustBackupCryptoEvents =\n | CryptoEvent.KeyBackupStatus\n | CryptoEvent.KeyBackupSessionsRemaining\n | CryptoEvent.KeyBackupFailed;\n\nexport type RustBackupCryptoEventMap = {\n [CryptoEvent.KeyBackupStatus]: (enabled: boolean) => void;\n [CryptoEvent.KeyBackupSessionsRemaining]: (remaining: number) => void;\n [CryptoEvent.KeyBackupFailed]: (errCode: string) => void;\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAChC,IAAI,EAAE,aAAa,CAAC,SAAS,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC,EACnD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,uBAAuB,EACtC,eAAe,EAAE,gBAAgB,EACjC,WAAW,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAAC,UAAU,CAAC,CAoCrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/index.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAChC,IAAI,EAAE,aAAa,CAAC,SAAS,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC,EACnD,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,uBAAuB,EACtC,eAAe,EAAE,gBAAgB,EACjC,WAAW,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAAC,UAAU,CAAC,CAuCrB"}
@@ -54,6 +54,7 @@ async function initRustCrypto(http, userId, deviceId, secretStorage, cryptoCallb
54
54
  const olmMachine = await RustSdkCryptoJs.OlmMachine.initialize(u, d, storePrefix !== null && storePrefix !== void 0 ? storePrefix : undefined, (_ref = storePrefix && "test pass") !== null && _ref !== void 0 ? _ref : undefined);
55
55
  const rustCrypto = new _rustCrypto.RustCrypto(olmMachine, http, userId, deviceId, secretStorage, cryptoCallbacks);
56
56
  await olmMachine.registerRoomKeyUpdatedCallback(sessions => rustCrypto.onRoomKeysUpdated(sessions));
57
+ await olmMachine.registerUserIdentityUpdatedCallback(userId => rustCrypto.onUserIdentityUpdated(userId));
57
58
 
58
59
  // Tell the OlmMachine to think about its outgoing requests before we hand control back to the application.
59
60
  //
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["RustSdkCryptoJs","_interopRequireWildcard","require","_rustCrypto","_logger","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","initRustCrypto","http","userId","deviceId","secretStorage","cryptoCallbacks","storePrefix","_ref","initAsync","Tracing","LoggerLevel","Trace","turnOn","u","UserId","d","DeviceId","logger","info","olmMachine","OlmMachine","initialize","undefined","rustCrypto","RustCrypto","registerRoomKeyUpdatedCallback","sessions","onRoomKeysUpdated","outgoingRequests"],"sources":["../../src/rust-crypto/index.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport * as RustSdkCryptoJs from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { RustCrypto } from \"./rust-crypto\";\nimport { logger } from \"../logger\";\nimport { IHttpOpts, MatrixHttpApi } from \"../http-api\";\nimport { ServerSideSecretStorage } from \"../secret-storage\";\nimport { ICryptoCallbacks } from \"../crypto\";\n\n/**\n * Create a new `RustCrypto` implementation\n *\n * @param http - Low-level HTTP interface: used to make outgoing requests required by the rust SDK.\n * We expect it to set the access token, etc.\n * @param userId - The local user's User ID.\n * @param deviceId - The local user's Device ID.\n * @param secretStorage - Interface to server-side secret storage.\n * @param cryptoCallbacks - Crypto callbacks provided by the application\n * @param storePrefix - the prefix to use on the indexeddbs created by rust-crypto.\n * If unset, a memory store will be used.\n *\n * @internal\n */\nexport async function initRustCrypto(\n http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,\n userId: string,\n deviceId: string,\n secretStorage: ServerSideSecretStorage,\n cryptoCallbacks: ICryptoCallbacks,\n storePrefix: string | null,\n): Promise<RustCrypto> {\n // initialise the rust matrix-sdk-crypto-wasm, if it hasn't already been done\n await RustSdkCryptoJs.initAsync();\n\n // enable tracing in the rust-sdk\n new RustSdkCryptoJs.Tracing(RustSdkCryptoJs.LoggerLevel.Trace).turnOn();\n\n const u = new RustSdkCryptoJs.UserId(userId);\n const d = new RustSdkCryptoJs.DeviceId(deviceId);\n logger.info(\"Init OlmMachine\");\n\n // TODO: use the pickle key for the passphrase\n const olmMachine = await RustSdkCryptoJs.OlmMachine.initialize(\n u,\n d,\n storePrefix ?? undefined,\n (storePrefix && \"test pass\") ?? undefined,\n );\n const rustCrypto = new RustCrypto(olmMachine, http, userId, deviceId, secretStorage, cryptoCallbacks);\n await olmMachine.registerRoomKeyUpdatedCallback((sessions: RustSdkCryptoJs.RoomKeyInfo[]) =>\n rustCrypto.onRoomKeysUpdated(sessions),\n );\n\n // Tell the OlmMachine to think about its outgoing requests before we hand control back to the application.\n //\n // This is primarily a fudge to get it to correctly populate the `users_for_key_query` list, so that future\n // calls to getIdentity (etc) block until the key queries are performed.\n //\n // Note that we don't actually need to *make* any requests here; it is sufficient to tell the Rust side to think\n // about them.\n //\n // XXX: find a less hacky way to do this.\n await olmMachine.outgoingRequests();\n\n logger.info(\"Completed rust crypto-sdk setup\");\n return rustCrypto;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["RustSdkCryptoJs","_interopRequireWildcard","require","_rustCrypto","_logger","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","initRustCrypto","http","userId","deviceId","secretStorage","cryptoCallbacks","storePrefix","_ref","initAsync","Tracing","LoggerLevel","Trace","turnOn","u","UserId","d","DeviceId","logger","info","olmMachine","OlmMachine","initialize","undefined","rustCrypto","RustCrypto","registerRoomKeyUpdatedCallback","sessions","onRoomKeysUpdated","registerUserIdentityUpdatedCallback","onUserIdentityUpdated","outgoingRequests"],"sources":["../../src/rust-crypto/index.ts"],"sourcesContent":["/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nimport * as RustSdkCryptoJs from \"@matrix-org/matrix-sdk-crypto-wasm\";\n\nimport { RustCrypto } from \"./rust-crypto\";\nimport { logger } from \"../logger\";\nimport { IHttpOpts, MatrixHttpApi } from \"../http-api\";\nimport { ServerSideSecretStorage } from \"../secret-storage\";\nimport { ICryptoCallbacks } from \"../crypto\";\n\n/**\n * Create a new `RustCrypto` implementation\n *\n * @param http - Low-level HTTP interface: used to make outgoing requests required by the rust SDK.\n * We expect it to set the access token, etc.\n * @param userId - The local user's User ID.\n * @param deviceId - The local user's Device ID.\n * @param secretStorage - Interface to server-side secret storage.\n * @param cryptoCallbacks - Crypto callbacks provided by the application\n * @param storePrefix - the prefix to use on the indexeddbs created by rust-crypto.\n * If unset, a memory store will be used.\n *\n * @internal\n */\nexport async function initRustCrypto(\n http: MatrixHttpApi<IHttpOpts & { onlyData: true }>,\n userId: string,\n deviceId: string,\n secretStorage: ServerSideSecretStorage,\n cryptoCallbacks: ICryptoCallbacks,\n storePrefix: string | null,\n): Promise<RustCrypto> {\n // initialise the rust matrix-sdk-crypto-wasm, if it hasn't already been done\n await RustSdkCryptoJs.initAsync();\n\n // enable tracing in the rust-sdk\n new RustSdkCryptoJs.Tracing(RustSdkCryptoJs.LoggerLevel.Trace).turnOn();\n\n const u = new RustSdkCryptoJs.UserId(userId);\n const d = new RustSdkCryptoJs.DeviceId(deviceId);\n logger.info(\"Init OlmMachine\");\n\n // TODO: use the pickle key for the passphrase\n const olmMachine = await RustSdkCryptoJs.OlmMachine.initialize(\n u,\n d,\n storePrefix ?? undefined,\n (storePrefix && \"test pass\") ?? undefined,\n );\n const rustCrypto = new RustCrypto(olmMachine, http, userId, deviceId, secretStorage, cryptoCallbacks);\n await olmMachine.registerRoomKeyUpdatedCallback((sessions: RustSdkCryptoJs.RoomKeyInfo[]) =>\n rustCrypto.onRoomKeysUpdated(sessions),\n );\n await olmMachine.registerUserIdentityUpdatedCallback((userId: RustSdkCryptoJs.UserId) =>\n rustCrypto.onUserIdentityUpdated(userId),\n );\n\n // Tell the OlmMachine to think about its outgoing requests before we hand control back to the application.\n //\n // This is primarily a fudge to get it to correctly populate the `users_for_key_query` list, so that future\n // calls to getIdentity (etc) block until the key queries are performed.\n //\n // Note that we don't actually need to *make* any requests here; it is sufficient to tell the Rust side to think\n // about them.\n //\n // XXX: find a less hacky way to do this.\n await olmMachine.outgoingRequests();\n\n logger.info(\"Completed rust crypto-sdk setup\");\n return rustCrypto;\n}\n"],"mappings":";;;;;;AAgBA,IAAAA,eAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AAAmC,SAAAG,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAL,wBAAAS,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAnBnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeW,cAAcA,CAChCC,IAAmD,EACnDC,MAAc,EACdC,QAAgB,EAChBC,aAAsC,EACtCC,eAAiC,EACjCC,WAA0B,EACP;EAAA,IAAAC,IAAA;EACnB;EACA,MAAMlC,eAAe,CAACmC,SAAS,CAAC,CAAC;;EAEjC;EACA,IAAInC,eAAe,CAACoC,OAAO,CAACpC,eAAe,CAACqC,WAAW,CAACC,KAAK,CAAC,CAACC,MAAM,CAAC,CAAC;EAEvE,MAAMC,CAAC,GAAG,IAAIxC,eAAe,CAACyC,MAAM,CAACZ,MAAM,CAAC;EAC5C,MAAMa,CAAC,GAAG,IAAI1C,eAAe,CAAC2C,QAAQ,CAACb,QAAQ,CAAC;EAChDc,cAAM,CAACC,IAAI,CAAC,iBAAiB,CAAC;;EAE9B;EACA,MAAMC,UAAU,GAAG,MAAM9C,eAAe,CAAC+C,UAAU,CAACC,UAAU,CAC1DR,CAAC,EACDE,CAAC,EACDT,WAAW,aAAXA,WAAW,cAAXA,WAAW,GAAIgB,SAAS,GAAAf,IAAA,GACvBD,WAAW,IAAI,WAAW,cAAAC,IAAA,cAAAA,IAAA,GAAKe,SACpC,CAAC;EACD,MAAMC,UAAU,GAAG,IAAIC,sBAAU,CAACL,UAAU,EAAElB,IAAI,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,aAAa,EAAEC,eAAe,CAAC;EACrG,MAAMc,UAAU,CAACM,8BAA8B,CAAEC,QAAuC,IACpFH,UAAU,CAACI,iBAAiB,CAACD,QAAQ,CACzC,CAAC;EACD,MAAMP,UAAU,CAACS,mCAAmC,CAAE1B,MAA8B,IAChFqB,UAAU,CAACM,qBAAqB,CAAC3B,MAAM,CAC3C,CAAC;;EAED;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAMiB,UAAU,CAACW,gBAAgB,CAAC,CAAC;EAEnCb,cAAM,CAACC,IAAI,CAAC,iCAAiC,CAAC;EAC9C,OAAOK,UAAU;AACrB"}
@@ -5,9 +5,9 @@ import type { IEncryptedEventInfo } from "../crypto/api";
5
5
  import { MatrixEvent } from "../models/event";
6
6
  import { Room } from "../models/room";
7
7
  import { RoomMember } from "../models/room-member";
8
- import { CryptoBackend, OnSyncCompletedData } from "../common-crypto/CryptoBackend";
8
+ import { BackupDecryptor, CryptoBackend, OnSyncCompletedData } from "../common-crypto/CryptoBackend";
9
9
  import { IHttpOpts, MatrixHttpApi } from "../http-api";
10
- import { BackupTrustInfo, BootstrapCrossSigningOpts, CreateSecretStorageOpts, CrossSigningKey, CrossSigningStatus, CryptoCallbacks, DeviceVerificationStatus, GeneratedSecretStorageKey, ImportRoomKeysOpts, KeyBackupCheck, KeyBackupInfo, UserVerificationStatus, VerificationRequest } from "../crypto-api";
10
+ import { BackupTrustInfo, BootstrapCrossSigningOpts, CreateSecretStorageOpts, CrossSigningKey, CrossSigningStatus, CryptoCallbacks, DeviceVerificationStatus, EventEncryptionInfo, GeneratedSecretStorageKey, ImportRoomKeysOpts, KeyBackupCheck, KeyBackupInfo, UserVerificationStatus, VerificationRequest } from "../crypto-api";
11
11
  import { DeviceMap } from "../models/device";
12
12
  import { ServerSideSecretStorage } from "../secret-storage";
13
13
  import { CryptoEvent } from "../crypto";
@@ -39,6 +39,12 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
39
39
  private stopped;
40
40
  /** whether {@link outgoingRequestLoop} is currently running */
41
41
  private outgoingRequestLoopRunning;
42
+ /**
43
+ * whether we check the outgoing requests queue again after the current check finishes.
44
+ *
45
+ * This should never be `true` unless `outgoingRequestLoopRunning` is also true.
46
+ */
47
+ private outgoingRequestLoopOneMoreLoop;
42
48
  /** mapping of roomId → encryptor class */
43
49
  private roomEncryptors;
44
50
  private eventDecryptor;
@@ -46,6 +52,7 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
46
52
  private outgoingRequestProcessor;
47
53
  private crossSigningIdentity;
48
54
  private readonly backupManager;
55
+ private sessionLastCheckAttemptedTime;
49
56
  private readonly reemitter;
50
57
  constructor(
51
58
  /** The `OlmMachine` from the underlying rust crypto sdk. */
@@ -66,6 +73,11 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
66
73
  secretStorage: ServerSideSecretStorage,
67
74
  /** Crypto callbacks provided by the application */
68
75
  cryptoCallbacks: CryptoCallbacks);
76
+ /**
77
+ * Attempts to retrieve a session from a key backup, if enough time
78
+ * has elapsed since the last check for this session id.
79
+ */
80
+ queryKeyBackupRateLimited(targetRoomId: string, targetSessionId: string): Promise<void>;
69
81
  /**
70
82
  * Return the OlmMachine only if {@link RustCrypto#stop} has not been called.
71
83
  *
@@ -77,6 +89,11 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
77
89
  stop(): void;
78
90
  encryptEvent(event: MatrixEvent, _room: Room): Promise<void>;
79
91
  decryptEvent(event: MatrixEvent): Promise<IEventDecryptionResult>;
92
+ /**
93
+ * Implementation of (deprecated) {@link MatrixClient#getEventEncryptionInfo}.
94
+ *
95
+ * @param event - event to inspect
96
+ */
80
97
  getEventEncryptionInfo(event: MatrixEvent): IEncryptedEventInfo;
81
98
  /**
82
99
  * Implementation of {@link CryptoBackend#checkUserTrust}.
@@ -199,6 +216,10 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
199
216
  * Implementation of {@link CryptoApi#createRecoveryKeyFromPassphrase}
200
217
  */
201
218
  createRecoveryKeyFromPassphrase(password?: string): Promise<GeneratedSecretStorageKey>;
219
+ /**
220
+ * Implementation of {@link CryptoApi.getEncryptionInfoForEvent}.
221
+ */
222
+ getEncryptionInfoForEvent(event: MatrixEvent): Promise<EventEncryptionInfo | null>;
202
223
  /**
203
224
  * Returns to-device verification requests that are already in progress for the given user id.
204
225
  *
@@ -319,6 +340,10 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
319
340
  * @param obj - The object to sign
320
341
  */
321
342
  private signObject;
343
+ /**
344
+ * Implementation of {@link CryptoBackend#getBackupDecryptor}.
345
+ */
346
+ getBackupDecryptor(backupInfo: KeyBackupInfo, privKey: ArrayLike<number>): Promise<BackupDecryptor>;
322
347
  /**
323
348
  * Apply sync changes to the olm machine
324
349
  * @param events - the received to-device messages
@@ -383,6 +408,15 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
383
408
  */
384
409
  onRoomKeysUpdated(keys: RustSdkCryptoJs.RoomKeyInfo[]): Promise<void>;
385
410
  private onRoomKeyUpdated;
411
+ /**
412
+ * Callback for `OlmMachine.registerUserIdentityUpdatedCallback`
413
+ *
414
+ * Called by the rust-sdk whenever there is an update to any user's cross-signing status. We re-check their trust
415
+ * status and emit a `UserTrustStatusChanged` event.
416
+ *
417
+ * @param userId - the user with the updated identity
418
+ */
419
+ onUserIdentityUpdated(userId: RustSdkCryptoJs.UserId): Promise<void>;
386
420
  /**
387
421
  * Handle a live event received via /sync.
388
422
  * See {@link ClientEventHandlerMap#event}
@@ -396,7 +430,9 @@ export declare class RustCrypto extends TypedEventEmitter<RustCryptoEvents, Rust
396
430
  * @param event - a key validation request event.
397
431
  */
398
432
  private onKeyVerificationRequest;
433
+ /** start the outgoing request loop if it is not already running */
399
434
  private outgoingRequestLoop;
435
+ private outgoingRequestLoopInner;
400
436
  }
401
437
  type RustCryptoEvents = CryptoEvent.VerificationRequestReceived | CryptoEvent.UserTrustStatusChanged | RustBackupCryptoEvents;
402
438
  type RustCryptoEventMap = {
@@ -405,7 +441,7 @@ type RustCryptoEventMap = {
405
441
  */
406
442
  [CryptoEvent.VerificationRequestReceived]: (request: VerificationRequest) => void;
407
443
  /**
408
- * Fires when the cross signing keys are imported during {@link CryptoApi#bootstrapCrossSigning}
444
+ * Fires when the trust status of a user changes.
409
445
  */
410
446
  [CryptoEvent.UserTrustStatusChanged]: (userId: string, userTrustLevel: UserVerificationStatus) => void;
411
447
  } & RustBackupCryptoEventMap;
@@ -1 +1 @@
1
- {"version":3,"file":"rust-crypto.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/rust-crypto.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rust-crypto.d.ts","sourceRoot":"","sources":["../../src/rust-crypto/rust-crypto.ts"],"names":[],"mappings":"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"}