properly reply to room key requests
This commit is contained in:
parent
1fdd0a7db8
commit
2de03bc0e8
|
@ -457,22 +457,27 @@ class KeyManager {
|
||||||
}
|
}
|
||||||
if (event.content['action'] == 'request') {
|
if (event.content['action'] == 'request') {
|
||||||
// we are *receiving* a request
|
// we are *receiving* a request
|
||||||
|
print('[KeyManager] Received key sharing request...');
|
||||||
if (!event.content.containsKey('body')) {
|
if (!event.content.containsKey('body')) {
|
||||||
|
print('[KeyManager] No body, doing nothing');
|
||||||
return; // no body
|
return; // no body
|
||||||
}
|
}
|
||||||
if (!client.userDeviceKeys.containsKey(event.sender) ||
|
if (!client.userDeviceKeys.containsKey(event.sender) ||
|
||||||
!client.userDeviceKeys[event.sender].deviceKeys
|
!client.userDeviceKeys[event.sender].deviceKeys
|
||||||
.containsKey(event.content['requesting_device_id'])) {
|
.containsKey(event.content['requesting_device_id'])) {
|
||||||
|
print('[KeyManager] Device not found, doing nothing');
|
||||||
return; // device not found
|
return; // device not found
|
||||||
}
|
}
|
||||||
final device = client.userDeviceKeys[event.sender]
|
final device = client.userDeviceKeys[event.sender]
|
||||||
.deviceKeys[event.content['requesting_device_id']];
|
.deviceKeys[event.content['requesting_device_id']];
|
||||||
if (device.userId == client.userID &&
|
if (device.userId == client.userID &&
|
||||||
device.deviceId == client.deviceID) {
|
device.deviceId == client.deviceID) {
|
||||||
|
print('[KeyManager] Request is by ourself, ignoring');
|
||||||
return; // ignore requests by ourself
|
return; // ignore requests by ourself
|
||||||
}
|
}
|
||||||
final room = client.getRoomById(event.content['body']['room_id']);
|
final room = client.getRoomById(event.content['body']['room_id']);
|
||||||
if (room == null) {
|
if (room == null) {
|
||||||
|
print('[KeyManager] Unknown room, ignoring');
|
||||||
return; // unknown room
|
return; // unknown room
|
||||||
}
|
}
|
||||||
final sessionId = event.content['body']['session_id'];
|
final sessionId = event.content['body']['session_id'];
|
||||||
|
@ -480,6 +485,7 @@ class KeyManager {
|
||||||
// okay, let's see if we have this session at all
|
// okay, let's see if we have this session at all
|
||||||
if ((await loadInboundGroupSession(room.id, sessionId, senderKey)) ==
|
if ((await loadInboundGroupSession(room.id, sessionId, senderKey)) ==
|
||||||
null) {
|
null) {
|
||||||
|
print('[KeyManager] Unknown session, ignoring');
|
||||||
return; // we don't have this session anyways
|
return; // we don't have this session anyways
|
||||||
}
|
}
|
||||||
final request = KeyManagerKeyShareRequest(
|
final request = KeyManagerKeyShareRequest(
|
||||||
|
@ -490,6 +496,7 @@ class KeyManager {
|
||||||
senderKey: senderKey,
|
senderKey: senderKey,
|
||||||
);
|
);
|
||||||
if (incomingShareRequests.containsKey(request.requestId)) {
|
if (incomingShareRequests.containsKey(request.requestId)) {
|
||||||
|
print('[KeyManager] Already processed this request, ignoring');
|
||||||
return; // we don't want to process one and the same request multiple times
|
return; // we don't want to process one and the same request multiple times
|
||||||
}
|
}
|
||||||
incomingShareRequests[request.requestId] = request;
|
incomingShareRequests[request.requestId] = request;
|
||||||
|
@ -498,9 +505,11 @@ class KeyManager {
|
||||||
if (device.userId == client.userID &&
|
if (device.userId == client.userID &&
|
||||||
device.verified &&
|
device.verified &&
|
||||||
!device.blocked) {
|
!device.blocked) {
|
||||||
|
print('[KeyManager] All checks out, forwarding key...');
|
||||||
// alright, we can forward the key
|
// alright, we can forward the key
|
||||||
await roomKeyRequest.forwardKey();
|
await roomKeyRequest.forwardKey();
|
||||||
} else {
|
} else {
|
||||||
|
print('[KeyManager] Asking client, if the key should be forwarded');
|
||||||
client.onRoomKeyRequest
|
client.onRoomKeyRequest
|
||||||
.add(roomKeyRequest); // let the client handle this
|
.add(roomKeyRequest); // let the client handle this
|
||||||
}
|
}
|
||||||
|
@ -637,6 +646,20 @@ class RoomKeyRequest extends ToDeviceEvent {
|
||||||
var message = session.content;
|
var message = session.content;
|
||||||
message['forwarding_curve25519_key_chain'] = forwardedKeys;
|
message['forwarding_curve25519_key_chain'] = forwardedKeys;
|
||||||
|
|
||||||
|
message['sender_key'] = request.senderKey;
|
||||||
|
message['sender_claimed_ed25519_key'] = forwardedKeys.isEmpty ? keyManager.encryption.fingerprintKey : null;
|
||||||
|
if (message['sender_claimed_ed25519_key'] == null) {
|
||||||
|
for (final value in keyManager.client.userDeviceKeys.values) {
|
||||||
|
for (final key in value.deviceKeys.values) {
|
||||||
|
if (key.curve25519Key == forwardedKeys.first) {
|
||||||
|
message['sender_claimed_ed25519_key'] = key.ed25519Key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (message['sender_claimed_ed25519_key'] != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
message['session_key'] = session.inboundGroupSession
|
message['session_key'] = session.inboundGroupSession
|
||||||
.export_session(session.inboundGroupSession.first_known_index());
|
.export_session(session.inboundGroupSession.first_known_index());
|
||||||
// send the actual reply of the key back to the requester
|
// send the actual reply of the key back to the requester
|
||||||
|
|
Loading…
Reference in a new issue