mirror of
https://github.com/element-hq/element-web.git
synced 2024-12-12 04:35:55 +03:00
handle room key request cancellations
This commit is contained in:
parent
d5bc24d9f7
commit
7d55f3e75d
2 changed files with 52 additions and 6 deletions
|
@ -21,16 +21,18 @@ export default class KeyRequestHandler {
|
||||||
constructor(matrixClient) {
|
constructor(matrixClient) {
|
||||||
this._matrixClient = matrixClient;
|
this._matrixClient = matrixClient;
|
||||||
|
|
||||||
this._isDialogOpen = false;
|
// the user/device for which we currently have a dialog open
|
||||||
|
this._currentUser = null;
|
||||||
|
this._currentDevice = null;
|
||||||
|
|
||||||
// userId -> deviceId -> [keyRequest]
|
// userId -> deviceId -> [keyRequest]
|
||||||
this._pendingKeyRequests = {};
|
this._pendingKeyRequests = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
handleKeyRequest(keyRequest) {
|
handleKeyRequest(keyRequest) {
|
||||||
const userId = keyRequest.userId;
|
const userId = keyRequest.userId;
|
||||||
const deviceId = keyRequest.deviceId;
|
const deviceId = keyRequest.deviceId;
|
||||||
|
const requestId = keyRequest.requestId;
|
||||||
|
|
||||||
if (!this._pendingKeyRequests[userId]) {
|
if (!this._pendingKeyRequests[userId]) {
|
||||||
this._pendingKeyRequests[userId] = {};
|
this._pendingKeyRequests[userId] = {};
|
||||||
|
@ -38,9 +40,17 @@ export default class KeyRequestHandler {
|
||||||
if (!this._pendingKeyRequests[userId][deviceId]) {
|
if (!this._pendingKeyRequests[userId][deviceId]) {
|
||||||
this._pendingKeyRequests[userId][deviceId] = [];
|
this._pendingKeyRequests[userId][deviceId] = [];
|
||||||
}
|
}
|
||||||
this._pendingKeyRequests[userId][deviceId].push(keyRequest);
|
|
||||||
|
|
||||||
if (this._isDialogOpen) {
|
// check if we already have this request
|
||||||
|
const requests = this._pendingKeyRequests[userId][deviceId];
|
||||||
|
if (requests.find((r) => r.requestId === requestId)) {
|
||||||
|
console.log("Already have this key request, ignoring");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
requests.push(keyRequest);
|
||||||
|
|
||||||
|
if (this._currentUser) {
|
||||||
// ignore for now
|
// ignore for now
|
||||||
console.log("Key request, but we already have a dialog open");
|
console.log("Key request, but we already have a dialog open");
|
||||||
return;
|
return;
|
||||||
|
@ -49,6 +59,37 @@ export default class KeyRequestHandler {
|
||||||
this._processNextRequest();
|
this._processNextRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleKeyRequestCancellation(cancellation) {
|
||||||
|
// see if we can find the request in the queue
|
||||||
|
const userId = cancellation.userId;
|
||||||
|
const deviceId = cancellation.deviceId;
|
||||||
|
const requestId = cancellation.requestId;
|
||||||
|
|
||||||
|
if (userId === this._currentUser && deviceId === this._currentDevice) {
|
||||||
|
console.log(
|
||||||
|
"room key request cancellation for the user we currently have a"
|
||||||
|
+ " dialog open for",
|
||||||
|
);
|
||||||
|
// TODO: update the dialog. For now, we just ignore the
|
||||||
|
// cancellation.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._pendingKeyRequests[userId]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const requests = this._pendingKeyRequests[userId][deviceId];
|
||||||
|
if (!requests) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const idx = requests.findIndex((r) => r.requestId === requestId);
|
||||||
|
if (idx < 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log("Forgetting room key request");
|
||||||
|
requests.splice(idx, 1);
|
||||||
|
}
|
||||||
|
|
||||||
_processNextRequest() {
|
_processNextRequest() {
|
||||||
const userId = Object.keys(this._pendingKeyRequests)[0];
|
const userId = Object.keys(this._pendingKeyRequests)[0];
|
||||||
if (!userId) {
|
if (!userId) {
|
||||||
|
@ -61,7 +102,8 @@ export default class KeyRequestHandler {
|
||||||
console.log(`Starting KeyShareDialog for ${userId}:${deviceId}`);
|
console.log(`Starting KeyShareDialog for ${userId}:${deviceId}`);
|
||||||
|
|
||||||
const finished = (r) => {
|
const finished = (r) => {
|
||||||
this._isDialogOpen = false;
|
this._currentUser = null;
|
||||||
|
this._currentDevice = null;
|
||||||
|
|
||||||
if (r) {
|
if (r) {
|
||||||
for (const req of this._pendingKeyRequests[userId][deviceId]) {
|
for (const req of this._pendingKeyRequests[userId][deviceId]) {
|
||||||
|
@ -83,7 +125,8 @@ export default class KeyRequestHandler {
|
||||||
deviceId: deviceId,
|
deviceId: deviceId,
|
||||||
onFinished: finished,
|
onFinished: finished,
|
||||||
});
|
});
|
||||||
this._isDialogOpen = true;
|
this._currentUser = userId;
|
||||||
|
this._currentDevice = deviceId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -920,6 +920,9 @@ module.exports = React.createClass({
|
||||||
cli.on("crypto.roomKeyRequest", (req) => {
|
cli.on("crypto.roomKeyRequest", (req) => {
|
||||||
krh.handleKeyRequest(req);
|
krh.handleKeyRequest(req);
|
||||||
});
|
});
|
||||||
|
cli.on("crypto.roomKeyRequestCancellation", (req) => {
|
||||||
|
krh.handleKeyRequestCancellation(req);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
showScreen: function(screen, params) {
|
showScreen: function(screen, params) {
|
||||||
|
|
Loading…
Reference in a new issue