diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala index 4c178865146d21d621cfbdb587d20631e048b046..baa7c116c894e0aa69cbb18414c05d389ef63417 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/PermisssionCheck.scala @@ -24,7 +24,7 @@ object PermisssionCheck { } private def roleToLevel(user: UserState): Int = { - if (user.role == Roles.PRESENTER_ROLE) PRESENTER_LEVEL else VIEWER_LEVEL + if (user.presenter) PRESENTER_LEVEL else VIEWER_LEVEL } /** @@ -39,8 +39,16 @@ object PermisssionCheck { */ def isAllowed(permissionLevel: Int, roleLevel: Int, users: Users2x, userId: String): Boolean = { Users2x.findWithIntId(users, userId) match { - case Some(user) => (permissionToLevel(user) >= permissionLevel && roleToLevel(user) >= roleLevel) - case None => false + case Some(user) => + println("permissionToLevel = " + permissionToLevel(user) + " permissionLevel=" + permissionLevel) + val permLevelCheck = permissionToLevel(user) >= permissionLevel + println("roleToLevel = " + roleToLevel(user) + " roleLevel=" + roleLevel) + val roleLevelCheck = roleToLevel(user) >= roleLevel + println("PERMLEVELCHECK = " + permissionToLevel(user) + " ROLELEVELCHECK=" + permissionLevel) + + println("PERMLEVELCHECK = " + permLevelCheck + " ROLELEVELCHECK=" + roleLevelCheck) + permLevelCheck && roleLevelCheck + case None => false } } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala index 2c6673797b8c578b457ad98c95702d3cbab817e3..3f1709c6ca62b667e907073ce21998500ca8f2ec 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/MuteUserCmdMsgHdlr.scala @@ -1,23 +1,61 @@ package org.bigbluebutton.core.apps.users +import org.bigbluebutton.SystemConfiguration import org.bigbluebutton.common2.msgs.MuteUserCmdMsg +import org.bigbluebutton.core.apps.PermisssionCheck import org.bigbluebutton.core.models.VoiceUsers -import org.bigbluebutton.core.running.{ MeetingActor, OutMsgRouter } +import org.bigbluebutton.core.running.{ LiveMeeting, OutMsgRouter } import org.bigbluebutton.core2.message.senders.MsgBuilder -trait MuteUserCmdMsgHdlr { - this: MeetingActor => +trait MuteUserCmdMsgHdlrDefault { + def handleMuteUserCmdMsg(msg: MuteUserCmdMsg): Unit = { + println("**************** MuteUserCmdMsgHdlrDefault ") + } +} + +trait MuteUserCmdMsgHdlrPermCheck extends MuteUserCmdMsgHdlrDefault with SystemConfiguration { + this: UsersApp => + + val liveMeeting: LiveMeeting + val outGW: OutMsgRouter + + override def handleMuteUserCmdMsg(msg: MuteUserCmdMsg): Unit = { + println("**************** MuteUserCmdMsgHdlrPermCheck ") + + val isAllowed = PermisssionCheck.isAllowed( + PermisssionCheck.MOD_LEVEL, + PermisssionCheck.PRESENTER_LEVEL, liveMeeting.users2x, msg.body.mutedBy + ) + if (applyPermissionCheck && !isAllowed) { + val meetingId = liveMeeting.props.meetingProp.intId + val reason = "No permission to mute user in meeting." + PermisssionCheck.ejectUserForFailedPermission(meetingId, msg.body.mutedBy, reason, outGW) + } else { + super.handleMuteUserCmdMsg(msg) + } + } +} + +trait MuteUserCmdMsgHdlr extends MuteUserCmdMsgHdlrDefault { + this: UsersApp => + + val liveMeeting: LiveMeeting val outGW: OutMsgRouter - def handleMuteUserCmdMsg(msg: MuteUserCmdMsg) { - log.info("Received mute user request. meetingId=" + props.meetingProp.intId + " userId=" + override def handleMuteUserCmdMsg(msg: MuteUserCmdMsg) { + println("**************** MuteUserCmdMsgHdlr ") + + val meetingId = liveMeeting.props.meetingProp.intId + val voiceConf = liveMeeting.props.voiceProp.voiceConf + + log.info("Received mute user request. meetingId=" + meetingId + " userId=" + msg.body.userId) for { u <- VoiceUsers.findWithIntId(liveMeeting.voiceUsers, msg.body.userId) } yield { - log.info("Send mute user request. meetingId=" + props.meetingProp.intId + " userId=" + u.intId + " user=" + u) - val event = MsgBuilder.buildMuteUserInVoiceConfSysMsg(props.meetingProp.intId, props.voiceProp.voiceConf, + log.info("Send mute user request. meetingId=" + meetingId + " userId=" + u.intId + " user=" + u) + val event = MsgBuilder.buildMuteUserInVoiceConfSysMsg(meetingId, voiceConf, u.voiceUserId, !u.muted) outGW.send(event) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala index 8bb0e15f5354ceabc6d1e035300c7938bcdfb430..fe8843c61eb1a96dc5e2ed26dc1f8a4b10aef40f 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/UsersApp.scala @@ -21,7 +21,9 @@ class UsersApp( with SetRecordingStatusCmdMsgHdlr with GetRecordingStatusReqMsgHdlr with AssignPresenterReqMsgHdlr - with EjectUserFromMeetingCmdMsgHdlr { + with EjectUserFromMeetingCmdMsgHdlr + with MuteUserCmdMsgHdlr + with MuteUserCmdMsgHdlrPermCheck { val log = Logging(context.system, getClass) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala index e0ef5cb74966038f024d7755121f1bf33a9b883d..7ca1345e8aa50e5d94a2af8ae50825f3dc55b516 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/running/MeetingActor.scala @@ -70,8 +70,9 @@ class MeetingActor( with UserDisconnectedFromGlobalAudioMsgHdlr with MuteAllExceptPresentersCmdMsgHdlr with MuteMeetingCmdMsgHdlr + with MuteMeetingCmdMsgHdlrCheckPerm with IsMeetingMutedReqMsgHdlr - with MuteUserCmdMsgHdlr + with EjectUserFromVoiceCmdMsgHdlr with EndMeetingSysCmdMsgHdlr with DestroyMeetingSysCmdMsgHdlr @@ -264,7 +265,7 @@ class MeetingActor( case m: UserMutedInVoiceConfEvtMsg => handleUserMutedInVoiceConfEvtMsg(m) case m: UserTalkingInVoiceConfEvtMsg => handleUserTalkingInVoiceConfEvtMsg(m) case m: RecordingStartedVoiceConfEvtMsg => handleRecordingStartedVoiceConfEvtMsg(m) - case m: MuteUserCmdMsg => handleMuteUserCmdMsg(m) + case m: MuteUserCmdMsg => usersApp.handleMuteUserCmdMsg(m) case m: MuteAllExceptPresentersCmdMsg => handleMuteAllExceptPresentersCmdMsg(m) case m: EjectUserFromVoiceCmdMsg => handleEjectUserFromVoiceCmdMsg(m) case m: IsMeetingMutedReqMsg => handleIsMeetingMutedReqMsg(m) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala index f7608d844790a1347ba8815f85be5b536fdf3503..493cb562942eb1a8639a5a280d944b0238fc3488 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/handlers/MuteMeetingCmdMsgHdlr.scala @@ -24,7 +24,7 @@ trait MuteMeetingCmdMsgHdlrCheckPerm extends MuteMeetingCmdMsgHdlrDefault with S if (applyPermissionCheck && !isAllowed) { val meetingId = liveMeeting.props.meetingProp.intId - val reason = "No permission to change lock settings" + val reason = "No permission to mute meeting." PermisssionCheck.ejectUserForFailedPermission(meetingId, msg.body.mutedBy, reason, outGW) } else { super.handleMuteMeetingCmdMsg(msg) @@ -32,7 +32,7 @@ trait MuteMeetingCmdMsgHdlrCheckPerm extends MuteMeetingCmdMsgHdlrDefault with S } } -trait MuteMeetingCmdMsgHdlr extends MuteMeetingCmdMsgHdlrCheckPerm { +trait MuteMeetingCmdMsgHdlr extends MuteMeetingCmdMsgHdlrDefault { this: MeetingActor => val outGW: OutMsgRouter