1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-12 08:42:46 +03:00

try to re-fetch devices before giving up on trying to heal a broken olm (#1224)

This commit is contained in:
Hubert Chathi
2020-02-21 10:20:46 -05:00
committed by GitHub
parent 0112701145
commit bf92cb1522
3 changed files with 31 additions and 15 deletions

View File

@@ -598,6 +598,7 @@ describe("MegolmDecryption", function() {
aliceClient.initCrypto(), aliceClient.initCrypto(),
bobClient.initCrypto(), bobClient.initCrypto(),
]); ]);
aliceClient._crypto.downloadKeys = async () => {};
const bobDevice = bobClient._crypto._olmDevice; const bobDevice = bobClient._crypto._olmDevice;
const roomId = "!someroom"; const roomId = "!someroom";
@@ -649,6 +650,7 @@ describe("MegolmDecryption", function() {
bobClient.initCrypto(), bobClient.initCrypto(),
]); ]);
const bobDevice = bobClient._crypto._olmDevice; const bobDevice = bobClient._crypto._olmDevice;
aliceClient._crypto.downloadKeys = async () => {};
const roomId = "!someroom"; const roomId = "!someroom";

View File

@@ -1260,7 +1260,14 @@ MegolmDecryption.prototype.onRoomKeyWithheldEvent = async function(event) {
this.retryDecryptionFromSender(senderKey); this.retryDecryptionFromSender(senderKey);
return; return;
} }
const device = this._crypto._deviceList.getDeviceByIdentityKey( let device = this._crypto._deviceList.getDeviceByIdentityKey(
content.algorithm, senderKey,
);
if (!device) {
// if we don't know about the device, fetch the user's devices again
// and retry before giving up
await this._crypto.downloadKeys([sender], false);
device = this._crypto._deviceList.getDeviceByIdentityKey(
content.algorithm, senderKey, content.algorithm, senderKey,
); );
if (!device) { if (!device) {
@@ -1272,6 +1279,7 @@ MegolmDecryption.prototype.onRoomKeyWithheldEvent = async function(event) {
this.retryDecryptionFromSender(senderKey); this.retryDecryptionFromSender(senderKey);
return; return;
} }
}
await olmlib.ensureOlmSessionsForDevices( await olmlib.ensureOlmSessionsForDevices(
this._olmDevice, this._baseApis, {[sender]: [device]}, false, this._olmDevice, this._baseApis, {[sender]: [device]}, false,
); );

View File

@@ -2723,7 +2723,12 @@ Crypto.prototype._onToDeviceBadEncrypted = async function(event) {
// on a current session. // on a current session.
// Note that an undecryptable message from another device could easily be spoofed - // Note that an undecryptable message from another device could easily be spoofed -
// is there anything we can do to mitigate this? // is there anything we can do to mitigate this?
const device = this._deviceList.getDeviceByIdentityKey(algorithm, deviceKey); let device = this._deviceList.getDeviceByIdentityKey(algorithm, deviceKey);
if (!device) {
// if we don't know about the device, fetch the user's devices again
// and retry before giving up
await this.downloadKeys([sender], false);
device = this._deviceList.getDeviceByIdentityKey(algorithm, deviceKey);
if (!device) { if (!device) {
logger.info( logger.info(
"Couldn't find device for identity key " + deviceKey + "Couldn't find device for identity key " + deviceKey +
@@ -2733,6 +2738,7 @@ Crypto.prototype._onToDeviceBadEncrypted = async function(event) {
retryDecryption(); retryDecryption();
return; return;
} }
}
const devicesByUser = {}; const devicesByUser = {};
devicesByUser[sender] = [device]; devicesByUser[sender] = [device];
await olmlib.ensureOlmSessionsForDevices( await olmlib.ensureOlmSessionsForDevices(