From 94d23c815adbaec0bd24adb4809a902f8a7100b3 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Fri, 20 Mar 2020 14:19:47 -0600
Subject: [PATCH 1/2] Improve naming of Jitsi conferences

Fixes https://github.com/vector-im/riot-web/issues/12812
---
 package.json             |  1 +
 src/CallHandler.js       |  7 ++-----
 src/utils/NamingUtils.ts | 29 +++++++++++++++++++++++++++++
 src/utils/WidgetUtils.js |  2 ++
 yarn.lock                | 10 +++++++++-
 5 files changed, 43 insertions(+), 6 deletions(-)
 create mode 100644 src/utils/NamingUtils.ts

diff --git a/package.json b/package.json
index f1dec0195c..1ff0fb6f55 100644
--- a/package.json
+++ b/package.json
@@ -83,6 +83,7 @@
     "minimist": "^1.2.0",
     "pako": "^1.0.5",
     "png-chunks-extract": "^1.0.0",
+    "project-name-generator": "^2.1.7",
     "prop-types": "^15.5.8",
     "qrcode": "^1.4.4",
     "qrcode-react": "^0.1.16",
diff --git a/src/CallHandler.js b/src/CallHandler.js
index 7ec4e7d8bb..b21f07ad4f 100644
--- a/src/CallHandler.js
+++ b/src/CallHandler.js
@@ -65,6 +65,7 @@ import { showUnknownDeviceDialogForCalls } from './cryptodevices';
 import WidgetUtils from './utils/WidgetUtils';
 import WidgetEchoStore from './stores/WidgetEchoStore';
 import SettingsStore, { SettingLevel } from './settings/SettingsStore';
+import {generateHumanReadableId} from "./utils/NamingUtils";
 
 global.mxCalls = {
     //room_id: MatrixCall
@@ -429,16 +430,12 @@ async function _startCallApp(roomId, type) {
         return;
     }
 
-    // This inherits its poor naming from the field of the same name that goes into
-    // the event. It's just a random string to make the Jitsi URLs unique.
-    const widgetSessionId = Math.random().toString(36).substring(2);
-    const confId = room.roomId.replace(/[^A-Za-z0-9]/g, '') + widgetSessionId;
+    const confId = `JitsiConference_${generateHumanReadableId()}`;
     const jitsiDomain = SdkConfig.get()['jitsi']['preferredDomain'];
 
     const widgetUrl = WidgetUtils.getLocalJitsiWrapperUrl();
 
     const widgetData = {
-        widgetSessionId, // TODO: Remove this eventually
         conferenceId: confId,
         isAudioOnly: type === 'voice',
         domain: jitsiDomain,
diff --git a/src/utils/NamingUtils.ts b/src/utils/NamingUtils.ts
new file mode 100644
index 0000000000..44ccb9b030
--- /dev/null
+++ b/src/utils/NamingUtils.ts
@@ -0,0 +1,29 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import * as projectNameGenerator from "project-name-generator";
+
+/**
+ * Generates a human readable identifier. This should not be used for anything
+ * which needs secure/cryptographic random: just a level uniquness that is offered
+ * by something like Date.now().
+ * @returns {string} The randomly generated ID
+ */
+export function generateHumanReadableId(): string {
+    return projectNameGenerator({words: 3}).raw.map(w => {
+        return w[0].toUpperCase() + w.substring(1).toLowerCase();
+    }).join('');
+}
diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js
index 7d6bf5e90d..7823ca2531 100644
--- a/src/utils/WidgetUtils.js
+++ b/src/utils/WidgetUtils.js
@@ -475,6 +475,8 @@ export default class WidgetUtils {
     }
 
     static getLocalJitsiWrapperUrl(opts: {forLocalRender?: boolean}) {
+        if (!opts) opts = {};
+
         // NB. we can't just encodeURIComponent all of these because the $ signs need to be there
         const queryString = [
             'conferenceDomain=$domain',
diff --git a/yarn.lock b/yarn.lock
index d0934ffc31..582d89137e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2444,7 +2444,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^2.12.1, commander@^2.19.0, commander@^2.20.0:
+commander@^2.12.1, commander@^2.15.1, commander@^2.19.0, commander@^2.20.0:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
   integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -6692,6 +6692,14 @@ progress@^2.0.0:
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
+project-name-generator@^2.1.7:
+  version "2.1.7"
+  resolved "https://registry.yarnpkg.com/project-name-generator/-/project-name-generator-2.1.7.tgz#504c68a2a843247aa3af493a226ecf78ce8beceb"
+  integrity sha512-kLGQGiyvkZsWtqhPhUs85UkSgmH5OnZJLNrtlqkK+GZPR0cybe8Nr9jG3bD52w2siH9EE3l/a9y56bn0YX5wYw==
+  dependencies:
+    commander "^2.15.1"
+    lodash "^4.17.10"
+
 promise-inflight@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"

From c17c47d88b6217296ce505ec58cdf68d89adaf43 Mon Sep 17 00:00:00 2001
From: Travis Ralston <travpc@gmail.com>
Date: Sat, 21 Mar 2020 11:35:07 -0600
Subject: [PATCH 2/2] Remove null check that was fixed in another PR

See https://github.com/matrix-org/matrix-react-sdk/pull/4255
---
 src/utils/WidgetUtils.js | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/utils/WidgetUtils.js b/src/utils/WidgetUtils.js
index 7823ca2531..7d6bf5e90d 100644
--- a/src/utils/WidgetUtils.js
+++ b/src/utils/WidgetUtils.js
@@ -475,8 +475,6 @@ export default class WidgetUtils {
     }
 
     static getLocalJitsiWrapperUrl(opts: {forLocalRender?: boolean}) {
-        if (!opts) opts = {};
-
         // NB. we can't just encodeURIComponent all of these because the $ signs need to be there
         const queryString = [
             'conferenceDomain=$domain',