From 12e363eb92a1cc23f89151822b74e47f8bbb4968 Mon Sep 17 00:00:00 2001 From: Gustavo Trott <gustavo@trott.com.br> Date: Tue, 16 Feb 2021 14:46:30 -0300 Subject: [PATCH] Removes loginTime creation from Meteor and use the registeredOn date created on Akka. Makes Akka send the registeredOn date throught PubSub messages: UserRegisteredRespMsg, GuestsWaitingForApprovalEvtMsg and ValidateAuthTokenRespMsg. --- .../core/apps/users/RegisterUserReqMsgHdlr.scala | 8 ++++---- .../apps/users/ValidateAuthTokenReqMsgHdlr.scala | 8 ++++---- .../bigbluebutton/core/models/GuestsWaiting.scala | 2 +- .../core/models/RegisteredUsers.scala | 14 ++++++++++++-- .../core2/message/senders/MsgBuilder.scala | 8 ++++---- .../senders/ValidateAuthTokenRespMsgSender.scala | 4 ++-- .../core2/testdata/FakeTestData.scala | 4 ++-- .../org/bigbluebutton/core/AppsTestFixtures.scala | 6 ++++-- .../bigbluebutton/core2/testdata/TestDataGen.scala | 4 ++-- .../bigbluebutton/common2/msgs/GuestsMsgs.scala | 2 +- .../org/bigbluebutton/common2/msgs/UsersMgs.scala | 4 ++-- .../server/handlers/guestsWaitingForApproval.js | 2 +- .../api/users/server/handlers/validateAuthToken.js | 4 +++- 13 files changed, 42 insertions(+), 28 deletions(-) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala index 50d27ad645..2b7d63e848 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/RegisterUserReqMsgHdlr.scala @@ -13,11 +13,11 @@ trait RegisterUserReqMsgHdlr { def handleRegisterUserReqMsg(msg: RegisterUserReqMsg): Unit = { - def buildUserRegisteredRespMsg(meetingId: String, userId: String, name: String, role: String): BbbCommonEnvCoreMsg = { + def buildUserRegisteredRespMsg(meetingId: String, userId: String, name: String, role: String, registeredOn: String): BbbCommonEnvCoreMsg = { val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka") val envelope = BbbCoreEnvelope(UserRegisteredRespMsg.NAME, routing) val header = BbbCoreHeaderWithMeetingId(UserRegisteredRespMsg.NAME, meetingId) - val body = UserRegisteredRespMsgBody(meetingId, userId, name, role) + val body = UserRegisteredRespMsgBody(meetingId, userId, name, role, registeredOn) val event = UserRegisteredRespMsg(header, body) BbbCommonEnvCoreMsg(envelope, event) } @@ -33,7 +33,7 @@ trait RegisterUserReqMsgHdlr { log.info("Register user success. meetingId=" + liveMeeting.props.meetingProp.intId + " userId=" + msg.body.extUserId + " user=" + regUser) - val event = buildUserRegisteredRespMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.name, regUser.role) + val event = buildUserRegisteredRespMsg(liveMeeting.props.meetingProp.intId, regUser.id, regUser.name, regUser.role, regUser.getRegisteredOnAsIsoDatetime()) outGW.send(event) def notifyModeratorsOfGuestWaiting(guests: Vector[GuestWaiting], users: Users2x, meetingId: String): Unit = { @@ -56,7 +56,7 @@ trait RegisterUserReqMsgHdlr { val g = GuestApprovedVO(regUser.id, GuestStatus.ALLOW) UsersApp.approveOrRejectGuest(liveMeeting, outGW, g, SystemUser.ID) case GuestStatus.WAIT => - val guest = GuestWaiting(regUser.id, regUser.name, regUser.role, regUser.guest, regUser.avatarURL, regUser.authed) + val guest = GuestWaiting(regUser.id, regUser.name, regUser.role, regUser.guest, regUser.avatarURL, regUser.authed, regUser.getRegisteredOnAsIsoDatetime()) addGuestToWaitingForApproval(guest, liveMeeting.guestsWaiting) notifyModeratorsOfGuestWaiting(Vector(guest), liveMeeting.users2x, liveMeeting.props.meetingProp.intId) case GuestStatus.DENY => diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala index 69614b8835..01b3b704e8 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/users/ValidateAuthTokenReqMsgHdlr.scala @@ -75,7 +75,7 @@ trait ValidateAuthTokenReqMsgHdlr extends HandlerHelpers { reasonCode: String, state: MeetingState2x ): MeetingState2x = { - val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, userId, authToken, valid, waitForApproval) + val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, userId, authToken, valid, waitForApproval, "") outGW.send(event) // send a system message to force disconnection @@ -86,14 +86,14 @@ trait ValidateAuthTokenReqMsgHdlr extends HandlerHelpers { } def sendValidateAuthTokenRespMsg(meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): Unit = { - val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, userId, authToken, valid, waitForApproval) + valid: Boolean, waitForApproval: Boolean, registeredOn: String): Unit = { + val event = MsgBuilder.buildValidateAuthTokenRespMsg(meetingId, userId, authToken, valid, waitForApproval, registeredOn) outGW.send(event) } def userValidated(user: RegisteredUser, state: MeetingState2x): MeetingState2x = { val meetingId = liveMeeting.props.meetingProp.intId - sendValidateAuthTokenRespMsg(meetingId, user.id, user.authToken, valid = true, waitForApproval = false) + sendValidateAuthTokenRespMsg(meetingId, user.id, user.authToken, valid = true, waitForApproval = false, user.getRegisteredOnAsIsoDatetime()) state } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/GuestsWaiting.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/GuestsWaiting.scala index 9454db88c3..7563a7c188 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/GuestsWaiting.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/GuestsWaiting.scala @@ -51,7 +51,7 @@ class GuestsWaiting { def setGuestPolicy(policy: GuestPolicy) = guestPolicy = policy } -case class GuestWaiting(intId: String, name: String, role: String, guest: Boolean, avatar: String, authenticated: Boolean) +case class GuestWaiting(intId: String, name: String, role: String, guest: Boolean, avatar: String, authenticated: Boolean, registeredOn: String) case class GuestPolicy(policy: String, setBy: String) object GuestPolicyType { diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala index 17e7f429ce..2cb96b3218 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/models/RegisteredUsers.scala @@ -2,6 +2,9 @@ package org.bigbluebutton.core.models import com.softwaremill.quicklens._ +import java.time.{Instant, ZoneId, ZonedDateTime} +import java.time.format.DateTimeFormatter + object RegisteredUsers { def create(userId: String, extId: String, name: String, roles: String, token: String, avatar: String, guest: Boolean, authenticated: Boolean, @@ -165,6 +168,13 @@ case class RegisteredUser( registeredOn: Long, joined: Boolean, markAsJoinTimedOut: Boolean, - banned: Boolean -) + banned: Boolean, +) { + def getRegisteredOnAsIsoDatetime(): String = { + val instant = Instant.ofEpochMilli(this.registeredOn) + val zonedDateTimeUtc = ZonedDateTime.ofInstant(instant, ZoneId.of("UTC")) + + DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(zonedDateTimeUtc) + } +} diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala index e02174ffae..de87c15ef5 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/MsgBuilder.scala @@ -44,7 +44,7 @@ object MsgBuilder { val envelope = BbbCoreEnvelope(GetGuestsWaitingApprovalRespMsg.NAME, routing) val header = BbbClientMsgHeader(GetGuestsWaitingApprovalRespMsg.NAME, meetingId, userId) - val guestsWaiting = guests.map(g => GuestWaitingVO(g.intId, g.name, g.role, g.guest, g.avatar, g.authenticated)) + val guestsWaiting = guests.map(g => GuestWaitingVO(g.intId, g.name, g.role, g.guest, g.avatar, g.authenticated, g.registeredOn)) val body = GetGuestsWaitingApprovalRespMsgBody(guestsWaiting) val event = GetGuestsWaitingApprovalRespMsg(header, body) @@ -56,7 +56,7 @@ object MsgBuilder { val envelope = BbbCoreEnvelope(GuestsWaitingForApprovalEvtMsg.NAME, routing) val header = BbbClientMsgHeader(GuestsWaitingForApprovalEvtMsg.NAME, meetingId, userId) - val guestsWaiting = guests.map(g => GuestWaitingVO(g.intId, g.name, g.role, g.guest, g.avatar, g.authenticated)) + val guestsWaiting = guests.map(g => GuestWaitingVO(g.intId, g.name, g.role, g.guest, g.avatar, g.authenticated, g.registeredOn)) val body = GuestsWaitingForApprovalEvtMsgBody(guestsWaiting) val event = GuestsWaitingForApprovalEvtMsg(header, body) @@ -74,11 +74,11 @@ object MsgBuilder { } def buildValidateAuthTokenRespMsg(meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): BbbCommonEnvCoreMsg = { + valid: Boolean, waitForApproval: Boolean, registeredOn: String): BbbCommonEnvCoreMsg = { val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) val envelope = BbbCoreEnvelope(ValidateAuthTokenRespMsg.NAME, routing) val header = BbbClientMsgHeader(ValidateAuthTokenRespMsg.NAME, meetingId, userId) - val body = ValidateAuthTokenRespMsgBody(userId, authToken, valid, waitForApproval) + val body = ValidateAuthTokenRespMsgBody(userId, authToken, valid, waitForApproval, registeredOn) val event = ValidateAuthTokenRespMsg(header, body) BbbCommonEnvCoreMsg(envelope, event) } diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala index ab2ae44a58..162cfe576c 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/message/senders/ValidateAuthTokenRespMsgSender.scala @@ -6,11 +6,11 @@ import org.bigbluebutton.core.running.OutMsgRouter object ValidateAuthTokenRespMsgSender { def send(outGW: OutMsgRouter, meetingId: String, userId: String, authToken: String, - valid: Boolean, waitForApproval: Boolean): Unit = { + valid: Boolean, waitForApproval: Boolean, registeredOn: String): Unit = { val routing = Routing.addMsgToClientRouting(MessageTypes.DIRECT, meetingId, userId) val envelope = BbbCoreEnvelope(ValidateAuthTokenRespMsg.NAME, routing) val header = BbbClientMsgHeader(ValidateAuthTokenRespMsg.NAME, meetingId, userId) - val body = ValidateAuthTokenRespMsgBody(userId, authToken, valid, waitForApproval) + val body = ValidateAuthTokenRespMsgBody(userId, authToken, valid, waitForApproval, registeredOn) val event = ValidateAuthTokenRespMsg(header, body) val msgEvent = BbbCommonEnvCoreMsg(envelope, event) outGW.send(msgEvent) diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala index 7bac20ee8b..37324e32cc 100755 --- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala +++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core2/testdata/FakeTestData.scala @@ -20,13 +20,13 @@ trait FakeTestData { val guest1 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.WEBRTC, muted = false, talking = false, listenOnly = false) Users2x.add(liveMeeting.users2x, guest1) - val guestWait1 = GuestWaiting(guest1.intId, guest1.name, guest1.role, guest1.guest, "", guest1.authed) + val guestWait1 = GuestWaiting(guest1.intId, guest1.name, guest1.role, guest1.guest, "", guest1.authed, "") GuestsWaiting.add(liveMeeting.guestsWaiting, guestWait1) val guest2 = createUserVoiceAndCam(liveMeeting, Roles.VIEWER_ROLE, guest = true, authed = true, CallingWith.FLASH, muted = false, talking = false, listenOnly = false) Users2x.add(liveMeeting.users2x, guest2) - val guestWait2 = GuestWaiting(guest2.intId, guest2.name, guest2.role, guest2.guest, "", guest2.authed) + val guestWait2 = GuestWaiting(guest2.intId, guest2.name, guest2.role, guest2.guest, "", guest2.authed, "") GuestsWaiting.add(liveMeeting.guestsWaiting, guestWait2) val vu1 = FakeUserGenerator.createFakeVoiceOnlyUser(CallingWith.PHONE, muted = false, talking = false, listenOnly = false) diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala index d82f2d8815..d6c6059ebd 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core/AppsTestFixtures.scala @@ -44,7 +44,7 @@ trait AppsTestFixtures { val red5DeskShareAppTestFixtures = "red5App" val metadata: collection.immutable.Map[String, String] = Map("foo" -> "bar", "bar" -> "baz", "baz" -> "foo") val screenshareProps = ScreenshareProps("TODO", "TODO", "TODO") - val breakoutProps = BreakoutProps(parentId = parentMeetingId, sequence = sequence, freeJoin = false, breakoutRooms = Vector()) + val breakoutProps = BreakoutProps(parentId = parentMeetingId, sequence = sequence, freeJoin = false, breakoutRooms = Vector(),enabled = false, record = false, privateChatEnabled = false) val meetingProp = MeetingProp(name = meetingName, extId = externalMeetingId, intId = meetingId, isBreakout = isBreakout.booleanValue()) @@ -62,7 +62,9 @@ trait AppsTestFixtures { val metadataProp = new MetadataProp(metadata) val defaultProps = DefaultProps(meetingProp, breakoutProps, durationProps, password, recordProp, welcomeProp, voiceProp, - usersProp, metadataProp, screenshareProps) + usersProp, metadataProp, screenshareProps, lockSettingsProps = null, systemProps = null) + + val chatModel = new ChatModel() val layouts = new Layouts() diff --git a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala index 907d352379..eb47a891f7 100755 --- a/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala +++ b/akka-bbb-apps/src/test/scala/org/bigbluebutton/core2/testdata/TestDataGen.scala @@ -24,7 +24,7 @@ object TestDataGen { listenOnly: Boolean): VoiceUserState = { val voiceUserId = RandomStringGenerator.randomAlphanumericString(8) VoiceUserState(intId = user.id, voiceUserId = voiceUserId, callingWith, callerName = user.name, - callerNum = user.name, muted, talking, listenOnly) + callerNum = user.name, muted, talking, listenOnly, calledInto = null, lastStatusUpdateOn = 0) } def createFakeVoiceOnlyUser(callingWith: String, muted: Boolean, talking: Boolean, @@ -32,7 +32,7 @@ object TestDataGen { val voiceUserId = RandomStringGenerator.randomAlphanumericString(8) val intId = "v_" + RandomStringGenerator.randomAlphanumericString(16) VoiceUserState(intId, voiceUserId = voiceUserId, callingWith, callerName = name, - callerNum = name, muted, talking, listenOnly) + callerNum = name, muted, talking, listenOnly, calledInto = null, lastStatusUpdateOn = 0) } def createFakeWebcamStreamFor(userId: String, viewers: Set[String]): WebcamStream = { diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala index e51e3d0d14..13bb21954f 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/GuestsMsgs.scala @@ -19,7 +19,7 @@ case class GetGuestsWaitingApprovalRespMsg( body: GetGuestsWaitingApprovalRespMsgBody ) extends BbbCoreMsg case class GetGuestsWaitingApprovalRespMsgBody(guests: Vector[GuestWaitingVO]) -case class GuestWaitingVO(intId: String, name: String, role: String, guest: Boolean, avatar: String, authenticated: Boolean) +case class GuestWaitingVO(intId: String, name: String, role: String, guest: Boolean, avatar: String, authenticated: Boolean, registeredOn: String) /** * Message sent to client for list of guest waiting for approval. This is sent when diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala index 776ae62ea1..a4ab4eb137 100755 --- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala +++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/UsersMgs.scala @@ -22,7 +22,7 @@ case class UserRegisteredRespMsg( header: BbbCoreHeaderWithMeetingId, body: UserRegisteredRespMsgBody ) extends BbbCoreMsg -case class UserRegisteredRespMsgBody(meetingId: String, userId: String, name: String, role: String) +case class UserRegisteredRespMsgBody(meetingId: String, userId: String, name: String, role: String, registeredOn: String) object RegisteredUserJoinTimeoutMsg { val NAME = "RegisteredUserJoinTimeoutMsg" } case class RegisteredUserJoinTimeoutMsg( @@ -59,7 +59,7 @@ case class ValidateAuthTokenRespMsg( header: BbbClientMsgHeader, body: ValidateAuthTokenRespMsgBody ) extends BbbCoreMsg -case class ValidateAuthTokenRespMsgBody(userId: String, authToken: String, valid: Boolean, waitForApproval: Boolean) +case class ValidateAuthTokenRespMsgBody(userId: String, authToken: String, valid: Boolean, waitForApproval: Boolean, registeredOn: String) object UserLeftMeetingEvtMsg { val NAME = "UserLeftMeetingEvtMsg" diff --git a/bigbluebutton-html5/imports/api/guest-users/server/handlers/guestsWaitingForApproval.js b/bigbluebutton-html5/imports/api/guest-users/server/handlers/guestsWaitingForApproval.js index bbd3cfe663..0350470c85 100644 --- a/bigbluebutton-html5/imports/api/guest-users/server/handlers/guestsWaitingForApproval.js +++ b/bigbluebutton-html5/imports/api/guest-users/server/handlers/guestsWaitingForApproval.js @@ -24,7 +24,7 @@ export default function handleGuestsWaitingForApproval({ body }, meetingId) { denied: false, ...guest, meetingId, - loginTime: new Date().getTime(), + loginTime: new Date(guest.registeredOn).getTime(), color: COLOR_LIST[stringHash(guest.intId) % COLOR_LIST.length], }); diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js index c9637bdd74..da8918fe54 100644 --- a/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js +++ b/bigbluebutton-html5/imports/api/users/server/handlers/validateAuthToken.js @@ -23,12 +23,14 @@ export default function handleValidateAuthToken({ body }, meetingId) { valid, authToken, waitForApproval, + registeredOn, } = body; check(userId, String); check(authToken, String); check(valid, Boolean); check(waitForApproval, Boolean); + check(registeredOn, String); const pendingAuths = pendingAuthenticationsStore.take(meetingId, userId, authToken); @@ -105,7 +107,7 @@ export default function handleValidateAuthToken({ body }, meetingId) { $set: { validated: valid, approved: !waitForApproval, - loginTime: Date.now(), + loginTime: new Date(registeredOn).getTime(), inactivityCheck: false, }, }; -- GitLab