From fe6e7b09b568fa608a397a963b24b2e73b19d044 Mon Sep 17 00:00:00 2001 From: Bruno Windels <274386+bwindels@users.noreply.github.com> Date: Thu, 7 Apr 2022 16:50:16 +0200 Subject: [PATCH] don't encrypt to_device messages for now --- src/matrix/DeviceMessageHandler.js | 38 ++++++++++++++++++++---------- src/matrix/calls/group/Member.ts | 18 +++++++++++--- 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/matrix/DeviceMessageHandler.js b/src/matrix/DeviceMessageHandler.js index ee10716e..c33236aa 100644 --- a/src/matrix/DeviceMessageHandler.js +++ b/src/matrix/DeviceMessageHandler.js @@ -38,6 +38,7 @@ export class DeviceMessageHandler { async prepareSync(toDeviceEvents, lock, txn, log) { log.set("messageTypes", countBy(toDeviceEvents, e => e.type)); + this._handleUnencryptedCallEvents(toDeviceEvents, log); const encryptedEvents = toDeviceEvents.filter(e => e.type === "m.room.encrypted"); if (!this._olmDecryption) { log.log("can't decrypt, encryption not enabled", log.level.Warn); @@ -52,19 +53,21 @@ export class DeviceMessageHandler { log.child("decrypt_error").catch(err); } const newRoomKeys = this._megolmDecryption.roomKeysFromDeviceMessages(olmDecryptChanges.results, log); - const callMessages = olmDecryptChanges.results.filter(dr => this._callHandler.handlesDeviceMessageEventType(dr.event?.type)); - // load devices by sender key - await Promise.all(callMessages.map(async dr => { - dr.setDevice(await this._getDevice(dr.senderCurve25519Key, txn)); - })); - // TODO: pass this in the prep and run it in afterSync or afterSyncComplete (as callHandler can send events as well)? - for (const dr of callMessages) { - if (dr.device) { - this._callHandler.handleDeviceMessage(dr.event, dr.device.userId, dr.device.deviceId, log); - } else { - console.error("could not deliver message because don't have device for sender key", dr.event); - } - } + + // const callMessages = olmDecryptChanges.results.filter(dr => this._callHandler.handlesDeviceMessageEventType(dr.event?.type)); + // // load devices by sender key + // await Promise.all(callMessages.map(async dr => { + // dr.setDevice(await this._getDevice(dr.senderCurve25519Key, txn)); + // })); + // // TODO: pass this in the prep and run it in afterSync or afterSyncComplete (as callHandler can send events as well)? + // for (const dr of callMessages) { + // if (dr.device) { + // this._callHandler.handleDeviceMessage(dr.event, dr.device.userId, dr.device.deviceId, log); + // } else { + // console.error("could not deliver message because don't have device for sender key", dr.event); + // } + // } + // TODO: somehow include rooms that received a call to_device message in the sync state? // or have updates flow through event emitter? // well, we don't really need to update the room other then when a call starts or stops @@ -73,6 +76,15 @@ export class DeviceMessageHandler { } } + _handleUnencryptedCallEvents(toDeviceEvents, log) { + const callMessages = toDeviceEvents.filter(e => this._callHandler.handlesDeviceMessageEventType(e.type)); + for (const event of callMessages) { + const userId = event.sender; + const deviceId = event.content.device_id; + this._callHandler.handleDeviceMessage(event, userId, deviceId, log); + } + } + /** check that prep is not undefined before calling this */ async writeSync(prep, txn) { // write olm changes diff --git a/src/matrix/calls/group/Member.ts b/src/matrix/calls/group/Member.ts index cd26fba2..fe2de0af 100644 --- a/src/matrix/calls/group/Member.ts +++ b/src/matrix/calls/group/Member.ts @@ -110,10 +110,22 @@ export class Member { sendSignallingMessage = async (message: SignallingMessage, log: ILogItem): Promise => { const groupMessage = message as SignallingMessage; groupMessage.content.conf_id = this.options.confId; - const encryptedMessages = await this.options.encryptDeviceMessage(this.member.userId, groupMessage, log); - const payload = formatToDeviceMessagesPayload(encryptedMessages); + groupMessage.content.device_id = this.options.ownDeviceId; + groupMessage.content.party_id = this.options.ownDeviceId; + groupMessage.content.sender_session_id = this.options.sessionId; + groupMessage.content.dest_session_id = this.destSessionId!; + // const encryptedMessages = await this.options.encryptDeviceMessage(this.member.userId, groupMessage, log); + // const payload = formatToDeviceMessagesPayload(encryptedMessages); + const payload = { + messages: { + [this.member.userId]: { + ['*']: groupMessage.content + } + } + }; const request = this.options.hsApi.sendToDevice( - "m.room.encrypted", + message.type, + //"m.room.encrypted", payload, makeTxnId(), {log}