1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-09 10:22: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(),
bobClient.initCrypto(),
]);
aliceClient._crypto.downloadKeys = async () => {};
const bobDevice = bobClient._crypto._olmDevice;
const roomId = "!someroom";
@@ -649,6 +650,7 @@ describe("MegolmDecryption", function() {
bobClient.initCrypto(),
]);
const bobDevice = bobClient._crypto._olmDevice;
aliceClient._crypto.downloadKeys = async () => {};
const roomId = "!someroom";

View File

@@ -1260,7 +1260,14 @@ MegolmDecryption.prototype.onRoomKeyWithheldEvent = async function(event) {
this.retryDecryptionFromSender(senderKey);
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,
);
if (!device) {
@@ -1272,6 +1279,7 @@ MegolmDecryption.prototype.onRoomKeyWithheldEvent = async function(event) {
this.retryDecryptionFromSender(senderKey);
return;
}
}
await olmlib.ensureOlmSessionsForDevices(
this._olmDevice, this._baseApis, {[sender]: [device]}, false,
);

View File

@@ -2723,7 +2723,12 @@ Crypto.prototype._onToDeviceBadEncrypted = async function(event) {
// on a current session.
// Note that an undecryptable message from another device could easily be spoofed -
// 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) {
logger.info(
"Couldn't find device for identity key " + deviceKey +
@@ -2733,6 +2738,7 @@ Crypto.prototype._onToDeviceBadEncrypted = async function(event) {
retryDecryption();
return;
}
}
const devicesByUser = {};
devicesByUser[sender] = [device];
await olmlib.ensureOlmSessionsForDevices(