From 26dea6076a9cdd4b8b1e052992e07a6d397578b9 Mon Sep 17 00:00:00 2001 From: danielpetri1 Date: Tue, 4 Jul 2023 21:37:20 +0000 Subject: [PATCH 01/11] Fix permission issue with Etherpad 1.9.1 A zero-width-space is used to work around an issue with Etherpad 1.9.1 where empty pads are not being created. --- bbb-etherpad.placeholder.sh | 2 +- build/packages-template/bbb-etherpad/settings.json | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/bbb-etherpad.placeholder.sh b/bbb-etherpad.placeholder.sh index 34ab1048ea63..3ef5b11ccd1b 100755 --- a/bbb-etherpad.placeholder.sh +++ b/bbb-etherpad.placeholder.sh @@ -1,2 +1,2 @@ -git clone --branch 1.8.17 --depth 1 https://github.com/ether/etherpad-lite bbb-etherpad +git clone --branch 1.9.1 --depth 1 https://github.com/ether/etherpad-lite bbb-etherpad diff --git a/build/packages-template/bbb-etherpad/settings.json b/build/packages-template/bbb-etherpad/settings.json index 95ae330926e3..a82ecfc0f2bc 100644 --- a/build/packages-template/bbb-etherpad/settings.json +++ b/build/packages-template/bbb-etherpad/settings.json @@ -220,9 +220,10 @@ */ /* - * The default text of a pad - */ - "defaultPadText" : "", + * The default text of a pad: A zero-width-space is used to work around an issue with Etherpad 1.9.1 where empty pads are not being created. + * See: https://github.com/ether/etherpad-lite/issues/5787 + */ + "defaultPadText" : "\u200b", /* * Default Pad behavior. From 3c19c2573dc257150ffba2618dd523efe5b7a3b8 Mon Sep 17 00:00:00 2001 From: Calvin Walton Date: Mon, 17 Jul 2023 12:01:12 -0400 Subject: [PATCH 02/11] bbb-presentation-video: Update to 4.0.3 * Fix crashes in ellipse rendering --- bbb-presentation-video.placeholder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bbb-presentation-video.placeholder.sh b/bbb-presentation-video.placeholder.sh index 397447cf31e4..4d5d35056f99 100755 --- a/bbb-presentation-video.placeholder.sh +++ b/bbb-presentation-video.placeholder.sh @@ -1,6 +1,6 @@ #!/bin/sh set -ex -RELEASE=4.0.2 +RELEASE=4.0.3 cat < Date: Tue, 18 Jul 2023 22:55:35 +0000 Subject: [PATCH 03/11] restore messages tab stop and arrow key navigation --- .../ui/components/user-list/chat-list-item/component.jsx | 2 +- .../user-list/user-list-content/user-messages/component.jsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/component.jsx index 647aea0aef5a..a3e0a2c51eaa 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/chat-list-item/component.jsx @@ -51,7 +51,7 @@ const propTypes = { const defaultProps = { shortcuts: '', - tabIndex: 0, + tabIndex: -1, }; const ChatListItem = (props) => { diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-messages/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-messages/component.jsx index 4dfb300ef38c..c722e43f70d4 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-messages/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-messages/component.jsx @@ -47,13 +47,13 @@ class UserMessages extends PureComponent { this._msgsList.addEventListener( 'keydown', this.rove, + true, ); } } componentDidUpdate(prevProps, prevState) { const { selectedChat } = this.state; - if (selectedChat && selectedChat !== prevState.selectedChat) { const { firstChild } = selectedChat; if (firstChild) firstChild.focus(); @@ -97,6 +97,7 @@ class UserMessages extends PureComponent { const { selectedChat } = this.state; const msgItemsRef = findDOMNode(this._msgItems); roving(event, this.changeState, msgItemsRef, selectedChat); + event.stopPropagation(); } render() { @@ -120,7 +121,7 @@ class UserMessages extends PureComponent { { this._msgsList = ref; }} > From 0c934c72f49b8cd9b907b510cada0c61f8118041 Mon Sep 17 00:00:00 2001 From: KDSBrowne Date: Wed, 19 Jul 2023 00:23:21 +0000 Subject: [PATCH 04/11] restore captions list keyboard access --- .../user-captions/component.jsx | 58 ++++++++++++++++++- .../user-captions/container.jsx | 5 +- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/component.jsx index 039eebcc5c63..ca517720815e 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/component.jsx @@ -3,12 +3,15 @@ import PropTypes from 'prop-types'; import { TransitionGroup, CSSTransition } from 'react-transition-group'; import CaptionsListItem from '/imports/ui/components/user-list/captions-list-item/component'; import { defineMessages, injectIntl } from 'react-intl'; +import KEY_CODES from '/imports/utils/keyCodes'; import Styled from './styles'; +import { findDOMNode } from 'react-dom'; const propTypes = { ownedLocales: PropTypes.arrayOf(PropTypes.object).isRequired, sidebarContentPanel: PropTypes.string.isRequired, layoutContextDispatch: PropTypes.func.isRequired, + roving: PropTypes.func.isRequired, }; const intlMessages = defineMessages({ @@ -19,6 +22,53 @@ const intlMessages = defineMessages({ }); class UserCaptions extends Component { + constructor() { + super(); + + this.state = { + selectedCaption: null, + }; + + this.activeCaptionRefs = []; + + this.changeState = this.changeState.bind(this); + this.rove = this.rove.bind(this); + } + + componentDidMount() { + if (this._captionsList) { + this._captionsList.addEventListener( + 'keydown', + this.rove, + true, + ); + } + } + + componentDidUpdate(prevProps, prevState) { + const { selectedCaption } = this.state; + if (selectedCaption && selectedCaption !== prevState.selectedCaption) { + const { firstChild } = selectedCaption; + if (firstChild) firstChild.focus(); + } + } + + changeState(ref) { + this.setState({ selectedCaption: ref }); + } + + rove(event) { + const { roving } = this.props; + const { selectedCaption } = this.state; + const captionItemsRef = findDOMNode(this._captionItems); + if ([KEY_CODES.SPACE, KEY_CODES.ENTER].includes(event?.which)) { + selectedCaption?.firstChild?.click(); + } else { + roving(event, this.changeState, captionItemsRef, selectedCaption); + } + event.stopPropagation(); + } + renderCaptions() { const { ownedLocales, @@ -26,6 +76,8 @@ class UserCaptions extends Component { layoutContextDispatch, } = this.props; + let index = -1; + return ownedLocales.map((ownedLocale) => ( - + { this.activeCaptionRefs[index += 1] = node; }}> { this._msgsList = ref; }} + ref={(ref) => { this._captionsList = ref; }} > - { this._msgItems = ref; }}> + { this._captionItems = ref; }}> {this.renderCaptions()} diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/container.jsx index 7417a90340d1..a9d79e4980e6 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-captions/container.jsx @@ -1,6 +1,7 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import UserCaptionsItem from './component'; +import Service from '/imports/ui/components/user-list/service'; import CaptionsService from '/imports/ui/components/captions/service'; import { layoutSelectInput, layoutDispatch } from '../../../layout/context'; @@ -8,8 +9,8 @@ const Container = (props) => { const sidebarContent = layoutSelectInput((i) => i.sidebarContent); const { sidebarContentPanel } = sidebarContent; const layoutContextDispatch = layoutDispatch(); - - return ; + const { roving } = Service; + return ; }; export default withTracker(() => ({ From 42557eee208edb1ca2e17607947e05509ad6c1ff Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Mon, 24 Jul 2023 13:29:24 -0400 Subject: [PATCH 05/11] chore: Bump bbb-pads to 1.5.0 --- bbb-pads.placeholder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bbb-pads.placeholder.sh b/bbb-pads.placeholder.sh index 72972e1a12e8..7e7e5dae333e 100755 --- a/bbb-pads.placeholder.sh +++ b/bbb-pads.placeholder.sh @@ -1 +1 @@ -git clone --branch v1.4.1 --depth 1 https://github.com/bigbluebutton/bbb-pads bbb-pads +git clone --branch v1.5.0 --depth 1 https://github.com/bigbluebutton/bbb-pads bbb-pads From 0bd5e96ac87b41e558da862090871754f14336f5 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Tue, 25 Jul 2023 11:05:27 -0400 Subject: [PATCH 06/11] chore: Bump bbb-pads to 1.5.1 --- bbb-pads.placeholder.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bbb-pads.placeholder.sh b/bbb-pads.placeholder.sh index 7e7e5dae333e..6a7066e2d0cb 100755 --- a/bbb-pads.placeholder.sh +++ b/bbb-pads.placeholder.sh @@ -1 +1 @@ -git clone --branch v1.5.0 --depth 1 https://github.com/bigbluebutton/bbb-pads bbb-pads +git clone --branch v1.5.1 --depth 1 https://github.com/bigbluebutton/bbb-pads bbb-pads From abf4a0a2b4d6f68a8c4792f0eeb0690f94c4d316 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Tue, 25 Jul 2023 12:59:12 -0400 Subject: [PATCH 07/11] chore: Bump BBB version to 2.6.11 --- bigbluebutton-config/bigbluebutton-release | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 4ce8f7d96ddc..948f2e996f06 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1 +1 @@ -BIGBLUEBUTTON_RELEASE=2.6.10 +BIGBLUEBUTTON_RELEASE=2.6.11 From 842cfb4fab85d2494921fe19d91a4926eda9b223 Mon Sep 17 00:00:00 2001 From: Anton B Date: Tue, 25 Jul 2023 11:23:21 -0300 Subject: [PATCH 08/11] ci: fix new bbb-imdt url --- .github/workflows/automated-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automated-tests.yml b/.github/workflows/automated-tests.yml index 0821a7c0bd37..973062fbfbbe 100644 --- a/.github/workflows/automated-tests.yml +++ b/.github/workflows/automated-tests.yml @@ -56,7 +56,7 @@ jobs: # sudo sh -c ' # echo "Faking a package build (to speed up installation test)" # cd / - # wget -q "http://ci.bbbvm.imdt.com.br/artifacts.tar" + # wget -q "http://ci.bbb.imdt.dev/artifacts.tar" # tar xf artifacts.tar # ' - name: Generate CA @@ -106,7 +106,7 @@ jobs: run: | sudo sh -c ' apt install -yq dpkg-dev - cd /root && wget -q http://ci.bbbvm.imdt.com.br/cache-3rd-part-packages.tar + cd /root && wget -q http://ci.bbb.imdt.dev/cache-3rd-part-packages.tar cp -r /home/runner/work/bigbluebutton/bigbluebutton/artifacts/ /artifacts/ cd /artifacts && tar xf /root/cache-3rd-part-packages.tar cd /artifacts && dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz From b31ba3fbc06daaae471743aee3a49290d0b003d6 Mon Sep 17 00:00:00 2001 From: Anton B Date: Mon, 24 Jul 2023 16:44:31 -0300 Subject: [PATCH 09/11] test: fix connection status element selector --- bigbluebutton-tests/playwright/core/elements.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bigbluebutton-tests/playwright/core/elements.js b/bigbluebutton-tests/playwright/core/elements.js index 7ef93badef6b..16ebf756193a 100644 --- a/bigbluebutton-tests/playwright/core/elements.js +++ b/bigbluebutton-tests/playwright/core/elements.js @@ -339,7 +339,7 @@ exports.dataSavingScreenshare = 'input[data-test="dataSavingScreenshare"]'; exports.screenshareLocked = 'button[data-test="screenshareLocked"]'; exports.connectionStatusItemEmpty = 'li[data-test="connectionStatusItemEmpty"]'; exports.connectionStatusTab2 = 'li[id="react-tabs-2"]'; -exports.connectionStatusItemUser = 'div[data-test="connectionStatusItemUser"]'; +exports.connectionStatusItemUser = 'li[data-test="connectionStatusItemUser"]'; exports.connectionStatusLinkToSettings = `${networkDataContainer} span[role="button"]`; exports.dataSavingWebcams = 'input[data-test="dataSavingWebcams"]'; exports.connectionStatusOfflineUser = 'div[data-test="offlineUser"]'; From 838accf0158f1ecf0fdf60c6319d200a98ab9106 Mon Sep 17 00:00:00 2001 From: Tainan Felipe Date: Wed, 26 Jul 2023 10:38:10 -0300 Subject: [PATCH 10/11] Improve text sanitizing of lobby messages --- .../imports/api/common/server/helpers.js | 25 +++++++++++++++++ .../server/methods/sendGroupChatMsg.js | 27 ++----------------- .../server/modifiers/addBulkGroupChatMsgs.js | 2 +- .../server/methods/setGuestLobbyMessage.js | 5 ++-- .../methods/setPrivateGuestLobbyMessage.js | 5 ++-- 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/bigbluebutton-html5/imports/api/common/server/helpers.js b/bigbluebutton-html5/imports/api/common/server/helpers.js index 9cb8f66dc26d..56a414231422 100755 --- a/bigbluebutton-html5/imports/api/common/server/helpers.js +++ b/bigbluebutton-html5/imports/api/common/server/helpers.js @@ -1,9 +1,34 @@ import Users from '/imports/api/users'; import Logger from '/imports/startup/server/logger'; +import RegexWebUrl from '/imports/utils/regex-weburl'; const MSG_DIRECT_TYPE = 'DIRECT'; const NODE_USER = 'nodeJSapp'; +const HTML_SAFE_MAP = { + '<': '<', + '>': '>', + '"': '"', + "'": ''', +}; + +export const parseMessage = (message) => { + let parsedMessage = message || ''; + parsedMessage = parsedMessage.trim(); + + // Replace
with \n\r + parsedMessage = parsedMessage.replace(//gi, '\n\r'); + + // Sanitize. See: http://shebang.brandonmintern.com/foolproof-html-escaping-in-javascript/ + parsedMessage = parsedMessage.replace(/[<>'"]/g, (c) => HTML_SAFE_MAP[c]); + + // Replace flash links to flash valid ones + parsedMessage = parsedMessage.replace(RegexWebUrl, "$&"); + + return parsedMessage; +}; + + export const spokeTimeoutHandles = {}; export const clearSpokeTimeout = (meetingId, userId) => { if (spokeTimeoutHandles[`${meetingId}-${userId}`]) { diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js index 28593f602ffe..f4caf78df677 100644 --- a/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js +++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/methods/sendGroupChatMsg.js @@ -1,32 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import RedisPubSub from '/imports/startup/server/redis'; -import RegexWebUrl from '/imports/utils/regex-weburl'; -import { extractCredentials } from '/imports/api/common/server/helpers'; -import Logger from '/imports/startup/server/logger'; - -const HTML_SAFE_MAP = { - '<': '<', - '>': '>', - '"': '"', - "'": ''', -}; - -const parseMessage = (message) => { - let parsedMessage = message || ''; - parsedMessage = parsedMessage.trim(); - - // Replace
with \n\r - parsedMessage = parsedMessage.replace(//gi, '\n\r'); - // Sanitize. See: http://shebang.brandonmintern.com/foolproof-html-escaping-in-javascript/ - parsedMessage = parsedMessage.replace(/[<>'"]/g, (c) => HTML_SAFE_MAP[c]); - - // Replace flash links to flash valid ones - parsedMessage = parsedMessage.replace(RegexWebUrl, "$&"); - - return parsedMessage; -}; +import { extractCredentials, parseMessage } from '/imports/api/common/server/helpers'; +import Logger from '/imports/startup/server/logger'; export default function sendGroupChatMsg(chatId, message) { const REDIS_CONFIG = Meteor.settings.private.redis; diff --git a/bigbluebutton-html5/imports/api/group-chat-msg/server/modifiers/addBulkGroupChatMsgs.js b/bigbluebutton-html5/imports/api/group-chat-msg/server/modifiers/addBulkGroupChatMsgs.js index 372bfa003469..262e3a3f7b80 100644 --- a/bigbluebutton-html5/imports/api/group-chat-msg/server/modifiers/addBulkGroupChatMsgs.js +++ b/bigbluebutton-html5/imports/api/group-chat-msg/server/modifiers/addBulkGroupChatMsgs.js @@ -2,7 +2,7 @@ import { GroupChatMsg } from '/imports/api/group-chat-msg'; import GroupChat from '/imports/api/group-chat'; import Logger from '/imports/startup/server/logger'; import flat from 'flat'; -import { parseMessage } from './addGroupChatMsg'; +import { parseMessage } from '/imports/api/common/server/helpers'; export default async function addBulkGroupChatMsgs(msgs) { if (!msgs.length) return; diff --git a/bigbluebutton-html5/imports/api/guest-users/server/methods/setGuestLobbyMessage.js b/bigbluebutton-html5/imports/api/guest-users/server/methods/setGuestLobbyMessage.js index d3c8f6b0e6d4..544de8c85cca 100644 --- a/bigbluebutton-html5/imports/api/guest-users/server/methods/setGuestLobbyMessage.js +++ b/bigbluebutton-html5/imports/api/guest-users/server/methods/setGuestLobbyMessage.js @@ -2,7 +2,7 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import RedisPubSub from '/imports/startup/server/redis'; import Logger from '/imports/startup/server/logger'; -import { extractCredentials } from '/imports/api/common/server/helpers'; +import { extractCredentials, parseMessage } from '/imports/api/common/server/helpers'; const REDIS_CONFIG = Meteor.settings.private.redis; const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; @@ -16,8 +16,7 @@ export default function setGuestLobbyMessage(message) { check(meetingId, String); check(requesterUserId, String); - - const payload = { message }; + const payload = { message: parseMessage(message) }; Logger.info(`User=${requesterUserId} set guest lobby message to ${message}`); diff --git a/bigbluebutton-html5/imports/api/guest-users/server/methods/setPrivateGuestLobbyMessage.js b/bigbluebutton-html5/imports/api/guest-users/server/methods/setPrivateGuestLobbyMessage.js index 425c8c62549b..72aad7014395 100644 --- a/bigbluebutton-html5/imports/api/guest-users/server/methods/setPrivateGuestLobbyMessage.js +++ b/bigbluebutton-html5/imports/api/guest-users/server/methods/setPrivateGuestLobbyMessage.js @@ -2,7 +2,8 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import RedisPubSub from '/imports/startup/server/redis'; import Logger from '/imports/startup/server/logger'; -import { extractCredentials } from '/imports/api/common/server/helpers'; +import { extractCredentials, parseMessage } from '/imports/api/common/server/helpers'; + const REDIS_CONFIG = Meteor.settings.private.redis; const CHANNEL = REDIS_CONFIG.channels.toAkkaApps; @@ -17,7 +18,7 @@ export default function setPrivateGuestLobbyMessage(message, guestId) { check(meetingId, String); check(requesterUserId, String); - const payload = { guestId, message }; + const payload = { guestId, message: parseMessage(message) }; Logger.info(`User=${requesterUserId} sent a private guest lobby message to guest user=${guestId}`); From 94252fcdb818d66b546d0c50de6bbbbee77aef98 Mon Sep 17 00:00:00 2001 From: Anton Georgiev Date: Wed, 26 Jul 2023 22:24:49 -0400 Subject: [PATCH 11/11] docs: Added link for 2.6.11 --- docs/docs/new-features.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/new-features.md b/docs/docs/new-features.md index 0b489d5b35b3..28638e956de5 100644 --- a/docs/docs/new-features.md +++ b/docs/docs/new-features.md @@ -187,6 +187,7 @@ For full details on what is new in BigBlueButton 2.6, see the release notes. ### Recent releases: +- [2.6.11](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v2.6.11) - [2.6.10](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v2.6.10) - [2.6.9](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v2.6.9) - [2.6.8](https://github.com/bigbluebutton/bigbluebutton/releases/tag/v2.6.8)