1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-08-09 10:22:46 +03:00

Implement device blocking

We want to be able to 'block' devices, so that they are not sent copies of our
text. Implement that change, and exclude blocked devices when encrypting
messages.

THis changes the name of the 'deviceVerified' event to
'deviceVerificationChanged', but that just means that the UI won't update
correctly until the changes to react-sdk arrive.
This commit is contained in:
Richard van der Hoff
2016-06-23 17:23:23 +01:00
parent 7ff1cf4e4a
commit 90c919e7e4

View File

@@ -49,6 +49,12 @@ try {
var OLM_ALGORITHM = "m.olm.v1.curve25519-aes-sha2";
var DeviceVerification = {
VERIFIED: 1,
UNVERIFIED: 0,
BLOCKED: -1,
};
/**
* Construct a Matrix Client. Only directly construct this if you want to use
* custom modules. Normally, {@link createClient} should be used
@@ -133,7 +139,7 @@ function MatrixClient(opts) {
var deviceInfo = {
keys: this.deviceKeys.keys,
algorithms: this.deviceKeys.algorithms,
verified: true,
verified: DeviceVerification.VERIFIED,
};
var myDevices = this.sessionStore.getEndToEndDevicesForUser(
opts.userId
@@ -378,7 +384,7 @@ function _doKeyUpload(client) {
* @typedef {Object} DeviceInfo
* @property {string[]} list of algorithms supported by this device
* @property {Object} keys a map from <key type>:<id> -> key
* @property {boolean} verified true if the device has been verified by the user
* @property {DeviceVerification} whether the device has been verified by the user
*/
/**
@@ -488,7 +494,7 @@ function _updateStoredDeviceKeysForUser(userId, userStore, userResult) {
}
} else {
userStore[deviceId] = deviceStore = {
verified: false,
verified: DeviceVerification.UNVERIFIED
};
}
@@ -508,7 +514,8 @@ function _updateStoredDeviceKeysForUser(userId, userStore, userResult) {
*
* @param {string} userId the user to list keys for.
*
* @return {object[]} list of devices with "id", "verified", and "key" parameters.
* @return {object[]} list of devices with "id", "verified", "blocked", and
* "key" parameters.
*/
MatrixClient.prototype.listDeviceKeys = function(userId) {
if (!this.sessionStore) {
@@ -532,8 +539,9 @@ MatrixClient.prototype.listDeviceKeys = function(userId) {
if (ed25519Key) {
result.push({
id: deviceId,
verified: device.verified,
key: ed25519Key,
verified: device.verified == DeviceVerification.VERIFIED,
blocked: device.verified == DeviceVerification.BLOCKED,
});
}
}
@@ -550,31 +558,67 @@ MatrixClient.prototype.listDeviceKeys = function(userId) {
* @param {boolean=} verified whether to mark the device as verified. defaults
* to 'true'.
*
* @fires module:client~event:MatrixClient"deviceVerified"
* @fires module:client~event:MatrixClient"deviceVerificationChanged"
*/
MatrixClient.prototype.setDeviceVerified = function(userId, deviceId, verified) {
if (verified === undefined) {
verified = true;
}
_setDeviceVerification(this, userId, deviceId, verified, null);
};
if (!this.sessionStore) {
/**
* Mark the given device as blocked/unblocked
*
* @param {string} userId owner of the device
* @param {string} deviceId unique identifier for the device
*
* @param {boolean=} blocked whether to mark the device as blocked. defaults
* to 'true'.
*
* @fires module:client~event:MatrixClient"deviceVerificationChanged"
*/
MatrixClient.prototype.setDeviceBlocked = function(userId, deviceId, blocked) {
if (blocked === undefined) {
blocked = true;
}
_setDeviceVerification(this, userId, deviceId, null, blocked);
};
function _setDeviceVerification(client, userId, deviceId, verified, blocked) {
if (!client.sessionStore) {
throw new Error("End-to-End encryption disabled");
}
var devices = this.sessionStore.getEndToEndDevicesForUser(userId);
var devices = client.sessionStore.getEndToEndDevicesForUser(userId);
if (!devices || !devices[deviceId]) {
throw new Error("Unknown device " + userId + ":" + deviceId);
}
var dev = devices[deviceId];
if (dev.verified === verified) {
var verificationStatus = dev.verified;
if (verified) {
verificationStatus = DeviceVerification.VERIFIED;
} else if (verified !== null && verificationStatus == DeviceVerification.VERIFIED) {
verificationStatus = DeviceVerification.UNVERIFIED;
}
if (blocked) {
verificationStatus = DeviceVerification.BLOCKED;
} else if (blocked !== null && verificationStatus == DeviceVerification.BLOCKED) {
verificationStatus = DeviceVerification.UNVERIFIED;
}
if (dev.verified === verificationStatus) {
return;
}
dev.verified = verified;
this.sessionStore.storeEndToEndDevicesForUser(userId, devices);
dev.verified = verificationStatus;
client.sessionStore.storeEndToEndDevicesForUser(userId, devices);
this.emit("deviceVerified", userId, deviceId, dev);
};
client.emit("deviceVerificationChanged", userId, deviceId, dev);
}
/**
@@ -623,7 +667,7 @@ MatrixClient.prototype.isEventSenderVerified = function(event) {
}
var deviceKey = device.keys[keyId];
if (deviceKey == sender_key) {
return Boolean(device.verified);
return device.verified == DeviceVerification.VERIFIED;
}
}
}
@@ -1223,10 +1267,14 @@ function _encryptMessage(client, roomId, e2eRoomInfo, eventType, content) {
var devices = client.sessionStore.getEndToEndDevicesForUser(userId);
for (var deviceId in devices) {
if (devices.hasOwnProperty(deviceId)) {
var keys = devices[deviceId];
for (var keyId in keys.keys) {
var dev = devices[deviceId];
if (dev.verified === DeviceVerification.BLOCKED) {
continue;
}
for (var keyId in dev.keys) {
if (keyId.indexOf("curve25519:") === 0) {
participantKeys.push(keys.keys[keyId]);
participantKeys.push(dev.keys[keyId]);
}
}
}
@@ -3773,10 +3821,11 @@ module.exports.CRYPTO_ENABLED = CRYPTO_ENABLED;
*/
/**
* Fires when a device is marked as verified by {@link
* module:client~MatrixClient#setDeviceVerified|MatrixClient.setDeviceVerified}.
* Fires when a device is marked as verified/unverified/blocked/unblocked by
* {@link module:client~MatrixClient#setDeviceVerified|MatrixClient.setDeviceVerified} or
* {@link module:client~MatrixClient#setDeviceBlocked|MatrixClient.setDeviceBlocked}.
*
* @event module:client~MatrixClient#"deviceVerified"
* @event module:client~MatrixClient#"deviceVerificationChanged"
* @param {string} userId the owner of the verified device
* @param {module:client~DeviceInfo} device information about the verified device
*/