1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-26 17:03:12 +03:00

Make olmlib.encryptMessageForDevice async

This commit is contained in:
Richard van der Hoff
2017-07-26 08:04:46 +01:00
parent 951df61aa0
commit aff32afefa
4 changed files with 45 additions and 33 deletions

View File

@@ -60,7 +60,8 @@ describe("MegolmDecryption", function() {
// we stub out the olm encryption bits // we stub out the olm encryption bits
mockOlmLib = {}; mockOlmLib = {};
mockOlmLib.ensureOlmSessionsForDevices = expect.createSpy(); mockOlmLib.ensureOlmSessionsForDevices = expect.createSpy();
mockOlmLib.encryptMessageForDevice = expect.createSpy(); mockOlmLib.encryptMessageForDevice =
expect.createSpy().andReturn(Promise.resolve());
megolmDecryption.olmlib = mockOlmLib; megolmDecryption.olmlib = mockOlmLib;
}); });

View File

@@ -288,7 +288,7 @@ MegolmEncryption.prototype._shareKeyWithDevices = function(session, devicesByUse
return olmlib.ensureOlmSessionsForDevices( return olmlib.ensureOlmSessionsForDevices(
this._olmDevice, this._baseApis, devicesByUser, this._olmDevice, this._baseApis, devicesByUser,
).then(function(devicemap) { ).then(function(devicemap) {
let haveTargets = false; const promises = [];
for (const userId in devicesByUser) { for (const userId in devicesByUser) {
if (!devicesByUser.hasOwnProperty(userId)) { if (!devicesByUser.hasOwnProperty(userId)) {
@@ -328,6 +328,13 @@ MegolmEncryption.prototype._shareKeyWithDevices = function(session, devicesByUse
ciphertext: {}, ciphertext: {},
}; };
if (!contentMap[userId]) {
contentMap[userId] = {};
}
contentMap[userId][deviceId] = encryptedContent;
promises.push(
olmlib.encryptMessageForDevice( olmlib.encryptMessageForDevice(
encryptedContent.ciphertext, encryptedContent.ciphertext,
self._userId, self._userId,
@@ -336,23 +343,20 @@ MegolmEncryption.prototype._shareKeyWithDevices = function(session, devicesByUse
userId, userId,
deviceInfo, deviceInfo,
payload, payload,
),
); );
if (!contentMap[userId]) {
contentMap[userId] = {};
}
contentMap[userId][deviceId] = encryptedContent;
haveTargets = true;
} }
} }
if (!haveTargets) { if (promises.length === 0) {
// no devices to send to
return Promise.resolve(); return Promise.resolve();
} }
return Promise.all(promises).then(() => {
// TODO: retries // TODO: retries
return self._baseApis.sendToDevice("m.room.encrypted", contentMap); return self._baseApis.sendToDevice("m.room.encrypted", contentMap);
});
}).then(function() { }).then(function() {
console.log(`Completed megolm keyshare in ${self._roomId}`); console.log(`Completed megolm keyshare in ${self._roomId}`);
@@ -753,7 +757,7 @@ MegolmDecryption.prototype.shareKeysWithDevice = function(keyRequest) {
// //
// ensureOlmSessionsForUsers has already done the logging, // ensureOlmSessionsForUsers has already done the logging,
// so just skip it. // so just skip it.
return; return null;
} }
console.log( console.log(
@@ -772,7 +776,7 @@ MegolmDecryption.prototype.shareKeysWithDevice = function(keyRequest) {
ciphertext: {}, ciphertext: {},
}; };
this.olmlib.encryptMessageForDevice( return this.olmlib.encryptMessageForDevice(
encryptedContent.ciphertext, encryptedContent.ciphertext,
this._userId, this._userId,
this._deviceId, this._deviceId,
@@ -780,8 +784,7 @@ MegolmDecryption.prototype.shareKeysWithDevice = function(keyRequest) {
userId, userId,
deviceInfo, deviceInfo,
payload, payload,
); ).then(() => {
const contentMap = { const contentMap = {
[userId]: { [userId]: {
[deviceId]: encryptedContent, [deviceId]: encryptedContent,
@@ -790,6 +793,7 @@ MegolmDecryption.prototype.shareKeysWithDevice = function(keyRequest) {
// TODO: retries // TODO: retries
return this._baseApis.sendToDevice("m.room.encrypted", contentMap); return this._baseApis.sendToDevice("m.room.encrypted", contentMap);
});
}).done(); }).done();
}; };

View File

@@ -107,6 +107,8 @@ OlmEncryption.prototype.encryptMessage = function(room, eventType, content) {
ciphertext: {}, ciphertext: {},
}; };
const promises = [];
for (let i = 0; i < users.length; ++i) { for (let i = 0; i < users.length; ++i) {
const userId = users[i]; const userId = users[i];
const devices = self._crypto.getStoredDevicesForUser(userId); const devices = self._crypto.getStoredDevicesForUser(userId);
@@ -123,15 +125,17 @@ OlmEncryption.prototype.encryptMessage = function(room, eventType, content) {
continue; continue;
} }
promises.push(
olmlib.encryptMessageForDevice( olmlib.encryptMessageForDevice(
encryptedContent.ciphertext, encryptedContent.ciphertext,
self._userId, self._deviceId, self._olmDevice, self._userId, self._deviceId, self._olmDevice,
userId, deviceInfo, payloadFields, userId, deviceInfo, payloadFields,
),
); );
} }
} }
return encryptedContent; return Promise.all(promises).return(encryptedContent);
}); });
}; };

View File

@@ -48,8 +48,11 @@ module.exports.MEGOLM_ALGORITHM = "m.megolm.v1.aes-sha2";
* @param {string} recipientUserId * @param {string} recipientUserId
* @param {module:crypto/deviceinfo} recipientDevice * @param {module:crypto/deviceinfo} recipientDevice
* @param {object} payloadFields fields to include in the encrypted payload * @param {object} payloadFields fields to include in the encrypted payload
*
* Returns a promise which resolves (to undefined) when the payload
* has been encrypted into `resultsObject`
*/ */
module.exports.encryptMessageForDevice = function( module.exports.encryptMessageForDevice = async function(
resultsObject, resultsObject,
ourUserId, ourDeviceId, olmDevice, recipientUserId, recipientDevice, ourUserId, ourDeviceId, olmDevice, recipientUserId, recipientDevice,
payloadFields, payloadFields,