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"