From 02b283be78cb37819dbbb89d272dcbe02e4a0ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 27 Mar 2021 09:13:00 +0100 Subject: [PATCH 1/2] Properly terminate screenshare calls if NoUserMedia MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/webrtc/call.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index a5636d1ca..bb7fdad3d 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -381,7 +381,11 @@ export class MatrixCall extends EventEmitter { try { const screenshareConstraints = await getScreenshareContraints(selectDesktopCapturerSource); - if (!screenshareConstraints) return; + if (!screenshareConstraints) { + this.terminate(CallParty.Local, CallErrorCode.NoUserMedia, false); + return; + } + if (window.electron?.getDesktopCapturerSources) { // We are using Electron logger.debug("Getting screen stream using getUserMedia()..."); @@ -402,6 +406,7 @@ export class MatrixCall extends EventEmitter { "Failed to get screen-sharing stream: ", err, ), ); + this.terminate(CallParty.Local, CallErrorCode.NoUserMedia, false); } this.type = CallType.Video; } From 401e89ef784281f65c21e036bf74e1c3e52fcd7e Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 6 Apr 2021 09:45:00 +0100 Subject: [PATCH 2/2] Only try to cache private keys we know exist This tweaks https://github.com/matrix-org/matrix-js-sdk/pull/1649 to only try caching private keys locally once we've confirmed they exist first. This is most likely only an issue in tests, where we sometimes create only some but not all keys. --- src/crypto/index.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/crypto/index.js b/src/crypto/index.js index d2b2bc4bf..802d4660a 100644 --- a/src/crypto/index.js +++ b/src/crypto/index.js @@ -1330,12 +1330,14 @@ Crypto.prototype.checkOwnCrossSigningTrust = async function({ const seenPubkey = newCrossSigning.getId(); const masterChanged = this._crossSigningInfo.getId() !== seenPubkey; + const masterExistsNotLocallyCached = + newCrossSigning.getId() && !crossSigningPrivateKeys.has("master"); if (masterChanged) { logger.info("Got new master public key", seenPubkey); } if ( allowPrivateKeyRequests && - (masterChanged || !crossSigningPrivateKeys.has("master")) + (masterChanged || masterExistsNotLocallyCached) ) { logger.info("Attempting to retrieve cross-signing master private key"); let signing = null; @@ -1362,6 +1364,15 @@ Crypto.prototype.checkOwnCrossSigningTrust = async function({ const selfSigningChanged = oldSelfSigningId !== newCrossSigning.getId("self_signing"); const userSigningChanged = oldUserSigningId !== newCrossSigning.getId("user_signing"); + const selfSigningExistsNotLocallyCached = ( + newCrossSigning.getId("self_signing") && + !crossSigningPrivateKeys.has("self_signing") + ); + const userSigningExistsNotLocallyCached = ( + newCrossSigning.getId("user_signing") && + !crossSigningPrivateKeys.has("user_signing") + ); + const keySignatures = {}; if (selfSigningChanged) { @@ -1369,7 +1380,7 @@ Crypto.prototype.checkOwnCrossSigningTrust = async function({ } if ( allowPrivateKeyRequests && - (selfSigningChanged || !crossSigningPrivateKeys.has("self_signing")) + (selfSigningChanged || selfSigningExistsNotLocallyCached) ) { logger.info("Attempting to retrieve cross-signing self-signing private key"); let signing = null; @@ -1394,7 +1405,7 @@ Crypto.prototype.checkOwnCrossSigningTrust = async function({ } if ( allowPrivateKeyRequests && - (userSigningChanged || !crossSigningPrivateKeys.has("user_signing")) + (userSigningChanged || userSigningExistsNotLocallyCached) ) { logger.info("Attempting to retrieve cross-signing user-signing private key"); let signing = null;