Skip to content

Commit 3762c20

Browse files
authored
Revert "Always block sending keys to unverified devices of verified users (#2562)" (#2571)
This will be rolled out again later with more accompanying UI adjustments, including clearer error messages and possibly the option to disable it per-room.
1 parent c96f1ba commit 3762c20

File tree

2 files changed

+2
-127
lines changed

2 files changed

+2
-127
lines changed

spec/unit/crypto/algorithms/megolm.spec.ts

Lines changed: 1 addition & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ import * as olmlib from "../../../../src/crypto/olmlib";
3030
import { TypedEventEmitter } from '../../../../src/models/typed-event-emitter';
3131
import { ClientEvent, MatrixClient, RoomMember } from '../../../../src';
3232
import { DeviceInfo, IDevice } from '../../../../src/crypto/deviceinfo';
33-
import { DeviceTrustLevel, UserTrustLevel } from '../../../../src/crypto/CrossSigning';
34-
import { resetCrossSigningKeys } from "../crypto-utils";
33+
import { DeviceTrustLevel } from '../../../../src/crypto/CrossSigning';
3534

3635
const MegolmDecryption = algorithms.DECRYPTION_CLASSES['m.megolm.v1.aes-sha2'];
3736
const MegolmEncryption = algorithms.ENCRYPTION_CLASSES['m.megolm.v1.aes-sha2'];
@@ -345,10 +344,6 @@ describe("MegolmDecryption", function() {
345344
},
346345
}));
347346

348-
mockCrypto.checkUserTrust.mockReturnValue({
349-
isVerified: () => false,
350-
} as UserTrustLevel);
351-
352347
mockCrypto.checkDeviceTrust.mockReturnValue({
353348
isVerified: () => false,
354349
} as DeviceTrustLevel);
@@ -582,120 +577,6 @@ describe("MegolmDecryption", function() {
582577
bobClient2.stopClient();
583578
});
584579

585-
it("always blocks unverified devices of verified users", async function() {
586-
const keys = {};
587-
function getCrossSigningKey(keyType: string) {
588-
return keys[keyType];
589-
}
590-
591-
function saveCrossSigningKeys(k: Record<string, Uint8Array>) {
592-
Object.assign(keys, k);
593-
}
594-
595-
const aliceClient = (new TestClient(
596-
"@alice:example.com", "alicedevice",
597-
undefined, undefined,
598-
{ cryptoCallbacks: { getCrossSigningKey, saveCrossSigningKeys } },
599-
)).client;
600-
const bobClient1 = (new TestClient(
601-
"@bob:example.com", "bobdevice1",
602-
)).client;
603-
await Promise.all([
604-
aliceClient.initCrypto(),
605-
bobClient1.initCrypto(),
606-
]);
607-
const aliceDevice = aliceClient.crypto.olmDevice;
608-
const bobDevice1 = bobClient1.crypto.olmDevice;
609-
610-
aliceClient.uploadDeviceSigningKeys = async () => ({});
611-
aliceClient.uploadKeySignatures = async () => ({ failures: {} });
612-
// set Alice's cross-signing key
613-
await resetCrossSigningKeys(aliceClient);
614-
// Alice downloads Bob's device key
615-
aliceClient.crypto.deviceList.storeCrossSigningForUser("@bob:example.com", {
616-
keys: {
617-
master: {
618-
user_id: "@bob:example.com",
619-
usage: ["master"],
620-
keys: {
621-
"ed25519:bobs+master+pubkey": "bobs+master+pubkey",
622-
},
623-
},
624-
},
625-
firstUse: false,
626-
crossSigningVerifiedBefore: false,
627-
});
628-
await aliceClient.setDeviceVerified("@bob:example.com", "bobs+master+pubkey", true);
629-
630-
const encryptionCfg = {
631-
"algorithm": "m.megolm.v1.aes-sha2",
632-
};
633-
const roomId = "!someroom";
634-
const room = new Room(roomId, aliceClient, "@alice:example.com", {});
635-
const bobMember = new RoomMember(roomId, "@bob:example.com");
636-
room.getEncryptionTargetMembers = async function() {
637-
return [bobMember];
638-
};
639-
room.setBlacklistUnverifiedDevices(false);
640-
aliceClient.store.storeRoom(room);
641-
await aliceClient.setRoomEncryption(roomId, encryptionCfg);
642-
643-
const BOB_DEVICES = {
644-
bobdevice1: {
645-
user_id: "@bob:example.com",
646-
device_id: "bobdevice1",
647-
algorithms: [olmlib.OLM_ALGORITHM, olmlib.MEGOLM_ALGORITHM],
648-
keys: {
649-
"ed25519:Dynabook": bobDevice1.deviceEd25519Key,
650-
"curve25519:Dynabook": bobDevice1.deviceCurve25519Key,
651-
},
652-
verified: 0,
653-
known: true,
654-
},
655-
};
656-
657-
aliceClient.crypto.deviceList.storeDevicesForUser(
658-
"@bob:example.com", BOB_DEVICES,
659-
);
660-
aliceClient.crypto.deviceList.downloadKeys = async function(userIds) {
661-
return this.getDevicesFromStore(userIds);
662-
};
663-
664-
aliceClient.sendToDevice = jest.fn().mockResolvedValue({});
665-
666-
const event = new MatrixEvent({
667-
type: "m.room.message",
668-
sender: "@alice:example.com",
669-
room_id: roomId,
670-
event_id: "$event",
671-
content: {
672-
msgtype: "m.text",
673-
body: "secret",
674-
},
675-
});
676-
await aliceClient.crypto.encryptEvent(event, room);
677-
678-
expect(aliceClient.sendToDevice).toHaveBeenCalled();
679-
const [msgtype, contentMap] = mocked(aliceClient.sendToDevice).mock.calls[0];
680-
expect(msgtype).toMatch(/^(org.matrix|m).room_key.withheld$/);
681-
delete contentMap["@bob:example.com"].bobdevice1.session_id;
682-
expect(contentMap).toStrictEqual({
683-
'@bob:example.com': {
684-
bobdevice1: {
685-
algorithm: "m.megolm.v1.aes-sha2",
686-
room_id: roomId,
687-
code: 'm.unverified',
688-
reason:
689-
'The sender has disabled encrypting to unverified devices.',
690-
sender_key: aliceDevice.deviceCurve25519Key,
691-
},
692-
},
693-
});
694-
695-
aliceClient.stopClient();
696-
bobClient1.stopClient();
697-
});
698-
699580
it("notifies devices when unable to create olm session", async function() {
700581
const aliceClient = (new TestClient(
701582
"@alice:example.com", "alicedevice",

src/crypto/algorithms/megolm.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,16 +1156,10 @@ class MegolmEncryption extends EncryptionAlgorithm {
11561156
continue;
11571157
}
11581158

1159-
const userTrust = this.crypto.checkUserTrust(userId);
11601159
const deviceTrust = this.crypto.checkDeviceTrust(userId, deviceId);
11611160

11621161
if (userDevices[deviceId].isBlocked() ||
1163-
(!deviceTrust.isVerified() && isBlacklisting) ||
1164-
// Always withhold keys from unverified devices of verified users
1165-
(!deviceTrust.isVerified() &&
1166-
userTrust.isVerified() &&
1167-
this.crypto.getCryptoTrustCrossSignedDevices()
1168-
)
1162+
(!deviceTrust.isVerified() && isBlacklisting)
11691163
) {
11701164
if (!blocked[userId]) {
11711165
blocked[userId] = {};

0 commit comments

Comments
 (0)