forked from mystiq/hydrogen-web
hookup megolm encryption in session
This commit is contained in:
parent
be4d887178
commit
c5c9505ce2
2 changed files with 29 additions and 13 deletions
|
@ -23,6 +23,7 @@ import {DeviceMessageHandler} from "./DeviceMessageHandler.js";
|
|||
import {Decryption as OlmDecryption} from "./e2ee/olm/Decryption.js";
|
||||
import {Encryption as OlmEncryption} from "./e2ee/olm/Encryption.js";
|
||||
import {Decryption as MegOlmDecryption} from "./e2ee/megolm/Decryption.js";
|
||||
import {Encryption as MegOlmEncryption} from "./e2ee/megolm/Encryption.js";
|
||||
import {RoomEncryption} from "./e2ee/RoomEncryption.js";
|
||||
import {DeviceTracker} from "./e2ee/DeviceTracker.js";
|
||||
import {LockMap} from "../utils/LockMap.js";
|
||||
|
@ -83,11 +84,19 @@ export class Session {
|
|||
olmUtil: this._olmUtil,
|
||||
senderKeyLock
|
||||
});
|
||||
this._megolmEncryption = new MegOlmEncryption({
|
||||
account: this._e2eeAccount,
|
||||
pickleKey: PICKLE_KEY,
|
||||
olm: this._olm,
|
||||
storage: this._storage,
|
||||
now: this._clock.now,
|
||||
ownDeviceId: this._sessionInfo.deviceId,
|
||||
})
|
||||
const megolmDecryption = new MegOlmDecryption({pickleKey: PICKLE_KEY, olm: this._olm});
|
||||
this._deviceMessageHandler.enableEncryption({olmDecryption, megolmDecryption});
|
||||
}
|
||||
|
||||
_createRoomEncryption(room, encryptionEventContent) {
|
||||
_createRoomEncryption(room, encryptionParams) {
|
||||
// TODO: this will actually happen when users start using the e2ee version for the first time
|
||||
|
||||
// this should never happen because either a session was already synced once
|
||||
|
@ -103,7 +112,8 @@ export class Session {
|
|||
room,
|
||||
deviceTracker: this._deviceTracker,
|
||||
olmEncryption: this._olmEncryption,
|
||||
encryptionEventContent
|
||||
megolmEncryption: this._megolmEncryption,
|
||||
encryptionParams
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -17,14 +17,16 @@ limitations under the License.
|
|||
import {groupBy} from "../../utils/groupBy.js";
|
||||
import {makeTxnId} from "../common.js";
|
||||
|
||||
const ENCRYPTED_TYPE = "m.room.encrypted";
|
||||
|
||||
export class RoomEncryption {
|
||||
constructor({room, deviceTracker, olmEncryption, encryptionEventContent}) {
|
||||
constructor({room, deviceTracker, olmEncryption, megolmEncryption, encryptionParams}) {
|
||||
this._room = room;
|
||||
this._deviceTracker = deviceTracker;
|
||||
this._olmEncryption = olmEncryption;
|
||||
this._megolmEncryption = megolmEncryption;
|
||||
// content of the m.room.encryption event
|
||||
this._encryptionEventContent = encryptionEventContent;
|
||||
this._encryptionParams = encryptionParams;
|
||||
}
|
||||
|
||||
async writeMemberChanges(memberChanges, txn) {
|
||||
|
@ -32,15 +34,19 @@ export class RoomEncryption {
|
|||
}
|
||||
|
||||
async encrypt(type, content, hsApi) {
|
||||
const megolmResult = await this._megolmEncryption.encrypt(this._room.id, type, content, this._encryptionParams);
|
||||
// share the new megolm session if needed
|
||||
if (megolmResult.roomKeyMessage) {
|
||||
await this._deviceTracker.trackRoom(this._room);
|
||||
const devices = await this._deviceTracker.deviceIdentitiesForTrackedRoom(this._room.id, hsApi);
|
||||
const messages = await this._olmEncryption.encrypt("m.foo", {body: "hello at " + new Date()}, devices, hsApi);
|
||||
await this._sendMessagesToDevices("m.room.encrypted", messages, hsApi);
|
||||
return {type, content};
|
||||
// return {
|
||||
// type: "m.room.encrypted",
|
||||
// content: encryptedContent,
|
||||
// }
|
||||
const messages = await this._olmEncryption.encrypt(
|
||||
"m.room_key", megolmResult.roomKeyMessage, devices, hsApi);
|
||||
await this._sendMessagesToDevices(ENCRYPTED_TYPE, messages, hsApi);
|
||||
}
|
||||
return {
|
||||
type: ENCRYPTED_TYPE,
|
||||
content: megolmResult.content
|
||||
};
|
||||
}
|
||||
|
||||
async _sendMessagesToDevices(type, messages, hsApi) {
|
||||
|
|
Loading…
Reference in a new issue