From 5ea482d01fd1c10e0dc39da493728446f2d85d75 Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 12 May 2020 19:04:41 +0200 Subject: [PATCH 01/11] Moderator: disable screen sharing --- app/src/RoomClient.js | 36 ++++++++++++++++++- app/src/actions/peerActions.js | 7 ++++ .../MeetingDrawer/ParticipantList/ListPeer.js | 27 ++++++++++++++ app/src/reducers/peers.js | 6 ++++ app/src/translations/en.json | 3 +- server/lib/Room.js | 19 ++++++++++ 6 files changed, 96 insertions(+), 2 deletions(-) diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 2217d65..71c530b 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1432,6 +1432,26 @@ export default class RoomClient peerActions.setStopPeerVideoInProgress(peerId, false)); } + async stopPeerScreenSharing(peerId) + { + logger.debug('stopPeerScreenSharing() [peerId:"%s"]', peerId); + + store.dispatch( + peerActions.setStopPeerScreenSharingInProgress(peerId, true)); + + try + { + await this.sendRequest('moderator:stopScreenSharing', { peerId }); + } + catch (error) + { + logger.error('stopPeerScreenSharing() failed: %o', error); + } + + store.dispatch( + peerActions.setStopPeerScreenSharingInProgress(peerId, false)); + } + async muteAllPeers() { logger.debug('muteAllPeers()'); @@ -2592,7 +2612,6 @@ export default class RoomClient case 'moderator:stopVideo': { this.disableWebcam(); - this.disableScreenSharing(); store.dispatch(requestActions.notify( { @@ -2605,6 +2624,21 @@ export default class RoomClient break; } + case 'moderator:stopScreenSharing': + { + this.disableScreenSharing(); + + store.dispatch(requestActions.notify( + { + text : intl.formatMessage({ + id : 'moderator.muteScreenSharingModerator', + defaultMessage : 'Moderator stopped your screen sharing' + }) + })); + + break; + } + case 'moderator:kick': { // Need some feedback diff --git a/app/src/actions/peerActions.js b/app/src/actions/peerActions.js index 5672b47..8a67371 100644 --- a/app/src/actions/peerActions.js +++ b/app/src/actions/peerActions.js @@ -86,3 +86,10 @@ export const setStopPeerVideoInProgress = (peerId, flag) => type : 'STOP_PEER_VIDEO_IN_PROGRESS', payload : { peerId, flag } }); + +export const setStopPeerScreenSharingInProgress = (peerId, flag) => +({ + type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', + payload : { peerId, flag } +}); + diff --git a/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js b/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js index 7aa5181..b375c6f 100644 --- a/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js +++ b/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js @@ -306,6 +306,33 @@ const ListPeer = (props) => } + { isModerator && screenConsumer && + + + { + e.stopPropagation(); + + roomClient.stopPeerScreenSharing(peer.id); + }} + > + { !screenConsumer.remotelyPaused ? + + : + + } + + + } {children} ); diff --git a/app/src/reducers/peers.js b/app/src/reducers/peers.js index 32d6fef..8e6a7f7 100644 --- a/app/src/reducers/peers.js +++ b/app/src/reducers/peers.js @@ -82,6 +82,11 @@ const peer = (state = initialState, action) => stopPeerVideoInProgress : action.payload.flag }; + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': + return { + ...state, + stopPeerScreenSharingInProgress : action.payload.flag + }; default: return state; } @@ -118,6 +123,7 @@ const peers = (state = initialState, action) => case 'REMOVE_PEER_ROLE': case 'STOP_PEER_AUDIO_IN_PROGRESS': case 'STOP_PEER_VIDEO_IN_PROGRESS': + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': { const oldPeer = state[action.payload.peerId]; diff --git a/app/src/translations/en.json b/app/src/translations/en.json index 344d660..d667fa4 100644 --- a/app/src/translations/en.json +++ b/app/src/translations/en.json @@ -183,5 +183,6 @@ "moderator.clearChat": "Moderator cleared the chat", "moderator.clearFiles": "Moderator cleared the files", "moderator.muteAudio": "Moderator muted your audio", - "moderator.muteVideo": "Moderator muted your video" + "moderator.muteVideo": "Moderator muted your video", + "moderator.muteScreenSharing": "Moderator muted your screen sharing" } \ No newline at end of file diff --git a/server/lib/Room.js b/server/lib/Room.js index 74accc4..0610ffe 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -1441,6 +1441,25 @@ class Room extends EventEmitter break; } + case 'moderator:stopScreenSharing': + { + if (!this._hasPermission(peer, MODERATE_ROOM)) + throw new Error('peer not authorized'); + + const { peerId } = request.data; + + const stopVideoPeer = this._peers[peerId]; + + if (!stopVideoPeer) + throw new Error(`peer with id "${peerId}" not found`); + + this._notification(stopVideoPeer.socket, 'moderator:stopScreenSharing'); + + cb(); + + break; + } + case 'moderator:closeMeeting': { if (!this._hasPermission(peer, MODERATE_ROOM)) From b8c0a8450d5b6baedb656248fc9d72087c26f855 Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 12 May 2020 19:31:51 +0200 Subject: [PATCH 02/11] Lint fix --- app/src/actions/peerActions.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/actions/peerActions.js b/app/src/actions/peerActions.js index 8a67371..b40d486 100644 --- a/app/src/actions/peerActions.js +++ b/app/src/actions/peerActions.js @@ -88,8 +88,8 @@ export const setStopPeerVideoInProgress = (peerId, flag) => }); export const setStopPeerScreenSharingInProgress = (peerId, flag) => -({ - type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', - payload : { peerId, flag } -}); + ({ + type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', + payload : { peerId, flag } + }); From cbbfd1b26fb671c59bfe5c31a80cc8c9130be84c Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 12 May 2020 19:04:41 +0200 Subject: [PATCH 03/11] Moderator: disable screen sharing --- app/src/RoomClient.js | 36 ++++++++++++++++++- app/src/actions/peerActions.js | 7 ++++ .../MeetingDrawer/ParticipantList/ListPeer.js | 27 ++++++++++++++ app/src/reducers/peers.js | 6 ++++ app/src/translations/en.json | 3 +- server/lib/Room.js | 19 ++++++++++ 6 files changed, 96 insertions(+), 2 deletions(-) diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 3d63d26..bb16d82 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1442,6 +1442,26 @@ export default class RoomClient peerActions.setStopPeerVideoInProgress(peerId, false)); } + async stopPeerScreenSharing(peerId) + { + logger.debug('stopPeerScreenSharing() [peerId:"%s"]', peerId); + + store.dispatch( + peerActions.setStopPeerScreenSharingInProgress(peerId, true)); + + try + { + await this.sendRequest('moderator:stopScreenSharing', { peerId }); + } + catch (error) + { + logger.error('stopPeerScreenSharing() failed: %o', error); + } + + store.dispatch( + peerActions.setStopPeerScreenSharingInProgress(peerId, false)); + } + async muteAllPeers() { logger.debug('muteAllPeers()'); @@ -2602,7 +2622,6 @@ export default class RoomClient case 'moderator:stopVideo': { this.disableWebcam(); - this.disableScreenSharing(); store.dispatch(requestActions.notify( { @@ -2615,6 +2634,21 @@ export default class RoomClient break; } + case 'moderator:stopScreenSharing': + { + this.disableScreenSharing(); + + store.dispatch(requestActions.notify( + { + text : intl.formatMessage({ + id : 'moderator.muteScreenSharingModerator', + defaultMessage : 'Moderator stopped your screen sharing' + }) + })); + + break; + } + case 'moderator:kick': { // Need some feedback diff --git a/app/src/actions/peerActions.js b/app/src/actions/peerActions.js index 5672b47..8a67371 100644 --- a/app/src/actions/peerActions.js +++ b/app/src/actions/peerActions.js @@ -86,3 +86,10 @@ export const setStopPeerVideoInProgress = (peerId, flag) => type : 'STOP_PEER_VIDEO_IN_PROGRESS', payload : { peerId, flag } }); + +export const setStopPeerScreenSharingInProgress = (peerId, flag) => +({ + type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', + payload : { peerId, flag } +}); + diff --git a/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js b/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js index 0ca5d89..5d11998 100644 --- a/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js +++ b/app/src/components/MeetingDrawer/ParticipantList/ListPeer.js @@ -306,6 +306,33 @@ const ListPeer = (props) => } + { isModerator && screenConsumer && + + + { + e.stopPropagation(); + + roomClient.stopPeerScreenSharing(peer.id); + }} + > + { !screenConsumer.remotelyPaused ? + + : + + } + + + } {children} ); diff --git a/app/src/reducers/peers.js b/app/src/reducers/peers.js index 32d6fef..8e6a7f7 100644 --- a/app/src/reducers/peers.js +++ b/app/src/reducers/peers.js @@ -82,6 +82,11 @@ const peer = (state = initialState, action) => stopPeerVideoInProgress : action.payload.flag }; + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': + return { + ...state, + stopPeerScreenSharingInProgress : action.payload.flag + }; default: return state; } @@ -118,6 +123,7 @@ const peers = (state = initialState, action) => case 'REMOVE_PEER_ROLE': case 'STOP_PEER_AUDIO_IN_PROGRESS': case 'STOP_PEER_VIDEO_IN_PROGRESS': + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': { const oldPeer = state[action.payload.peerId]; diff --git a/app/src/translations/en.json b/app/src/translations/en.json index 6237516..e56fc8f 100644 --- a/app/src/translations/en.json +++ b/app/src/translations/en.json @@ -187,5 +187,6 @@ "moderator.clearChat": "Moderator cleared the chat", "moderator.clearFiles": "Moderator cleared the files", "moderator.muteAudio": "Moderator muted your audio", - "moderator.muteVideo": "Moderator muted your video" + "moderator.muteVideo": "Moderator muted your video", + "moderator.muteScreenSharing": "Moderator muted your screen sharing" } \ No newline at end of file diff --git a/server/lib/Room.js b/server/lib/Room.js index 74accc4..0610ffe 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -1441,6 +1441,25 @@ class Room extends EventEmitter break; } + case 'moderator:stopScreenSharing': + { + if (!this._hasPermission(peer, MODERATE_ROOM)) + throw new Error('peer not authorized'); + + const { peerId } = request.data; + + const stopVideoPeer = this._peers[peerId]; + + if (!stopVideoPeer) + throw new Error(`peer with id "${peerId}" not found`); + + this._notification(stopVideoPeer.socket, 'moderator:stopScreenSharing'); + + cb(); + + break; + } + case 'moderator:closeMeeting': { if (!this._hasPermission(peer, MODERATE_ROOM)) From 69244bdf1263b4b6e547b09a36356b110d3b3527 Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 12 May 2020 19:31:51 +0200 Subject: [PATCH 04/11] Lint fix --- app/src/actions/peerActions.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/actions/peerActions.js b/app/src/actions/peerActions.js index 8a67371..b40d486 100644 --- a/app/src/actions/peerActions.js +++ b/app/src/actions/peerActions.js @@ -88,8 +88,8 @@ export const setStopPeerVideoInProgress = (peerId, flag) => }); export const setStopPeerScreenSharingInProgress = (peerId, flag) => -({ - type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', - payload : { peerId, flag } -}); + ({ + type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', + payload : { peerId, flag } + }); From f54ed84edb3080c3d941c6ef1092bc7e49bf0621 Mon Sep 17 00:00:00 2001 From: Luca Date: Wed, 13 May 2020 10:42:03 +0200 Subject: [PATCH 05/11] Moderator: Mute all screen sharing --- app/src/RoomClient.js | 20 +++++++++++++++++++ app/src/actions/roomActions.js | 6 ++++++ .../ParticipantList/ListModerator.js | 16 +++++++++++++++ .../MeetingDrawer/ParticipantList/ListPeer.js | 2 +- app/src/reducers/room.js | 3 +++ server/lib/Room.js | 13 ++++++++++++ 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index bb16d82..4883595 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1502,6 +1502,26 @@ export default class RoomClient roomActions.setStopAllVideoInProgress(false)); } + async stopAllPeerScreenSharing() + { + logger.debug('stopAllPeerScreenSharing()'); + + store.dispatch( + roomActions.setStopAllScreenSharingInProgress(true)); + + try + { + await this.sendRequest('moderator:stopAllScreenSharing'); + } + catch (error) + { + logger.error('stopAllPeerScreenSharing() failed: %o', error); + } + + store.dispatch( + roomActions.setStopAllScreenSharingInProgress(false)); + } + async closeMeeting() { logger.debug('closeMeeting()'); diff --git a/app/src/actions/roomActions.js b/app/src/actions/roomActions.js index 5ae45e3..a73e18a 100644 --- a/app/src/actions/roomActions.js +++ b/app/src/actions/roomActions.js @@ -164,6 +164,12 @@ export const setStopAllVideoInProgress = (flag) => payload : { flag } }); +export const setStopAllScreenSharingInProgress = (flag) => + ({ + type : 'STOP_ALL_SCREEN_SHARING_IN_PROGRESS', + payload : { flag } + }); + export const setCloseMeetingInProgress = (flag) => ({ type : 'CLOSE_MEETING_IN_PROGRESS', diff --git a/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js b/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js index c10506a..2fff283 100644 --- a/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js +++ b/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js @@ -63,6 +63,22 @@ const ListModerator = (props) => />
+ +
); diff --git a/app/src/reducers/peers.js b/app/src/reducers/peers.js index 32d6fef..8e6a7f7 100644 --- a/app/src/reducers/peers.js +++ b/app/src/reducers/peers.js @@ -82,6 +82,11 @@ const peer = (state = initialState, action) => stopPeerVideoInProgress : action.payload.flag }; + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': + return { + ...state, + stopPeerScreenSharingInProgress : action.payload.flag + }; default: return state; } @@ -118,6 +123,7 @@ const peers = (state = initialState, action) => case 'REMOVE_PEER_ROLE': case 'STOP_PEER_AUDIO_IN_PROGRESS': case 'STOP_PEER_VIDEO_IN_PROGRESS': + case 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS': { const oldPeer = state[action.payload.peerId]; diff --git a/app/src/translations/en.json b/app/src/translations/en.json index ec6c612..1c9fdb2 100644 --- a/app/src/translations/en.json +++ b/app/src/translations/en.json @@ -187,5 +187,6 @@ "moderator.clearChat": "Moderator cleared the chat", "moderator.clearFiles": "Moderator cleared the files", "moderator.muteAudio": "Moderator muted your audio", - "moderator.muteVideo": "Moderator muted your video" + "moderator.muteVideo": "Moderator muted your video", + "moderator.muteScreenSharing": "Moderator muted your screen sharing" } diff --git a/server/lib/Room.js b/server/lib/Room.js index 74accc4..0610ffe 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -1441,6 +1441,25 @@ class Room extends EventEmitter break; } + case 'moderator:stopScreenSharing': + { + if (!this._hasPermission(peer, MODERATE_ROOM)) + throw new Error('peer not authorized'); + + const { peerId } = request.data; + + const stopVideoPeer = this._peers[peerId]; + + if (!stopVideoPeer) + throw new Error(`peer with id "${peerId}" not found`); + + this._notification(stopVideoPeer.socket, 'moderator:stopScreenSharing'); + + cb(); + + break; + } + case 'moderator:closeMeeting': { if (!this._hasPermission(peer, MODERATE_ROOM)) From e1f5f804b0882dc3c46556ca736f007186baa964 Mon Sep 17 00:00:00 2001 From: Luca Date: Tue, 12 May 2020 19:31:51 +0200 Subject: [PATCH 07/11] Lint fix --- app/src/actions/peerActions.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/actions/peerActions.js b/app/src/actions/peerActions.js index 8a67371..b40d486 100644 --- a/app/src/actions/peerActions.js +++ b/app/src/actions/peerActions.js @@ -88,8 +88,8 @@ export const setStopPeerVideoInProgress = (peerId, flag) => }); export const setStopPeerScreenSharingInProgress = (peerId, flag) => -({ - type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', - payload : { peerId, flag } -}); + ({ + type : 'STOP_PEER_SCREEN_SHARING_IN_PROGRESS', + payload : { peerId, flag } + }); From 13c38cecfd569a0d113b09d762659f0a45973043 Mon Sep 17 00:00:00 2001 From: Luca Date: Wed, 13 May 2020 10:42:03 +0200 Subject: [PATCH 08/11] Moderator: Mute all screen sharing --- app/src/RoomClient.js | 20 +++++++++++++++++++ app/src/actions/roomActions.js | 6 ++++++ .../ParticipantList/ListModerator.js | 16 +++++++++++++++ .../MeetingDrawer/ParticipantList/ListPeer.js | 2 +- app/src/reducers/room.js | 3 +++ server/lib/Room.js | 13 ++++++++++++ 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index ccd9d6e..a936a14 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1508,6 +1508,26 @@ export default class RoomClient roomActions.setStopAllVideoInProgress(false)); } + async stopAllPeerScreenSharing() + { + logger.debug('stopAllPeerScreenSharing()'); + + store.dispatch( + roomActions.setStopAllScreenSharingInProgress(true)); + + try + { + await this.sendRequest('moderator:stopAllScreenSharing'); + } + catch (error) + { + logger.error('stopAllPeerScreenSharing() failed: %o', error); + } + + store.dispatch( + roomActions.setStopAllScreenSharingInProgress(false)); + } + async closeMeeting() { logger.debug('closeMeeting()'); diff --git a/app/src/actions/roomActions.js b/app/src/actions/roomActions.js index 5ae45e3..a73e18a 100644 --- a/app/src/actions/roomActions.js +++ b/app/src/actions/roomActions.js @@ -164,6 +164,12 @@ export const setStopAllVideoInProgress = (flag) => payload : { flag } }); +export const setStopAllScreenSharingInProgress = (flag) => + ({ + type : 'STOP_ALL_SCREEN_SHARING_IN_PROGRESS', + payload : { flag } + }); + export const setCloseMeetingInProgress = (flag) => ({ type : 'CLOSE_MEETING_IN_PROGRESS', diff --git a/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js b/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js index c10506a..2fff283 100644 --- a/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js +++ b/app/src/components/MeetingDrawer/ParticipantList/ListModerator.js @@ -63,6 +63,22 @@ const ListModerator = (props) => />
+ +