From 574a86e3ec727003da67b8c9852b8af72ffbf96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5var=20Aamb=C3=B8=20Fosstveit?= Date: Fri, 1 May 2020 00:23:38 +0200 Subject: [PATCH] Don't show lobby, and don't provide events for lobby for peers that don't have PROMOTE_PEER permission, fixes #208 --- app/src/components/Controls/TopBar.js | 8 +++- server/lib/Room.js | 64 ++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/app/src/components/Controls/TopBar.js b/app/src/components/Controls/TopBar.js index 23cddec..45d16f7 100644 --- a/app/src/components/Controls/TopBar.js +++ b/app/src/components/Controls/TopBar.js @@ -136,6 +136,7 @@ const TopBar = (props) => openUsersTab, unread, canLock, + canPromote, classes } = props; @@ -305,6 +306,7 @@ const TopBar = (props) => defaultMessage : 'Show lobby' })} color='inherit' + disabled={!canPromote} onClick={() => setLockDialogOpen(!room.lockDialogOpen)} > state.toolarea.unreadFiles, canLock : state.me.roles.some((role) => - state.room.permissionsFromRoles.CHANGE_ROOM_LOCK.includes(role)) + state.room.permissionsFromRoles.CHANGE_ROOM_LOCK.includes(role)), + canPromote : + state.me.roles.some((role) => + state.room.permissionsFromRoles.PROMOTE_PEER.includes(role)) }); const mapDispatchToProps = (dispatch) => diff --git a/server/lib/Room.js b/server/lib/Room.js index acb2a10..888c69e 100644 --- a/server/lib/Room.js +++ b/server/lib/Room.js @@ -9,6 +9,27 @@ const config = require('../config/config'); const logger = new Logger('Room'); +// In case they are not configured properly +const accessFromRoles = +{ + BYPASS_ROOM_LOCK : [ userRoles.ADMIN ], + BYPASS_LOBBY : [ userRoles.NORMAL ], + ...config.accessFromRoles +}; + +const permissionsFromRoles = +{ + CHANGE_ROOM_LOCK : [ userRoles.NORMAL ], + PROMOTE_PEER : [ userRoles.NORMAL ], + SEND_CHAT : [ userRoles.NORMAL ], + MODERATE_CHAT : [ userRoles.MODERATOR ], + SHARE_SCREEN : [ userRoles.NORMAL ], + SHARE_FILE : [ userRoles.NORMAL ], + MODERATE_FILES : [ userRoles.MODERATOR ], + MODERATE_ROOM : [ userRoles.MODERATOR ], + ...config.permissionsFromRoles +}; + class Room extends EventEmitter { /** @@ -187,7 +208,11 @@ class Room extends EventEmitter this._peerJoining(promotedPeer); - for (const peer of this._getJoinedPeers()) + for ( + const peer of this._getPeersWithPermission({ + permission : permissionsFromRoles.PROMOTE_PEER + }) + ) { this._notification(peer.socket, 'lobby:promotedPeer', { peerId: id }); } @@ -219,7 +244,11 @@ class Room extends EventEmitter { const { id, displayName } = changedPeer; - for (const peer of this._getJoinedPeers()) + for ( + const peer of this._getPeersWithPermission({ + permission : permissionsFromRoles.PROMOTE_PEER + }) + ) { this._notification(peer.socket, 'lobby:changeDisplayName', { peerId: id, displayName }); } @@ -229,7 +258,11 @@ class Room extends EventEmitter { const { id, picture } = changedPeer; - for (const peer of this._getJoinedPeers()) + for ( + const peer of this._getPeersWithPermission({ + permission : permissionsFromRoles.PROMOTE_PEER + }) + ) { this._notification(peer.socket, 'lobby:changePicture', { peerId: id, picture }); } @@ -241,7 +274,11 @@ class Room extends EventEmitter const { id } = closedPeer; - for (const peer of this._getJoinedPeers()) + for ( + const peer of this._getPeersWithPermission({ + permission : permissionsFromRoles.PROMOTE_PEER + }) + ) { this._notification(peer.socket, 'lobby:peerClosed', { peerId: id }); } @@ -344,7 +381,11 @@ class Room extends EventEmitter { this._lobby.parkPeer(parkPeer); - for (const peer of this._getJoinedPeers()) + for ( + const peer of this._getPeersWithPermission({ + permission : permissionsFromRoles.PROMOTE_PEER + }) + ) { this._notification(peer.socket, 'parkedPeer', { peerId: parkPeer.id }); } @@ -1452,6 +1493,19 @@ class Room extends EventEmitter .filter((peer) => peer.joined && peer !== excludePeer); } + _getPeersWithPermission({ permission = null, excludePeer = undefined, joined = true }) + { + return Object.values(this._peers) + .filter( + (peer) => + peer.joined === joined && + peer !== excludePeer && + peer.roles.some( + (role) => permission.includes(role) + ) + ); + } + _timeoutCallback(callback) { let called = false;