From 3d1575e635b75c8f5974b7a3773c9c7df7461e49 Mon Sep 17 00:00:00 2001
From: Gustavo Trott <gustavo@trott.com.br>
Date: Thu, 8 Apr 2021 14:18:15 -0300
Subject: [PATCH] Send pubSub FileTooLarge Error Msg from bbb-web when file is
 too large, (and makes Akka send meetingId with presentation token msg)

---
 .../PresentationUploadTokenReqMsgHdlr.scala   |  2 +-
 .../common2/msgs/PresentationPodsMsgs.scala   | 18 ++++++++++++-
 .../org/bigbluebutton/api/MeetingService.java | 19 +++++++++++++
 .../messages/PresentationUploadToken.java     |  4 ++-
 .../ConversionMessageConstants.java           |  1 +
 .../SwfSlidesGenerationProgressNotifier.java  | 17 +++++++++---
 .../messages/UploadFileTooLargeMessage.java   | 27 +++++++++++++++++++
 .../bigbluebutton/api2/BbbWebApiGWApp.scala   |  3 +++
 .../org/bigbluebutton/api2/MsgBuilder.scala   | 13 +++++++++
 .../api2/meeting/OldMeetingMsgHdlrActor.scala |  2 +-
 .../grails-app/conf/spring/resources.xml      |  1 +
 .../controllers/PresentationController.groovy |  6 +++++
 12 files changed, 105 insertions(+), 8 deletions(-)
 create mode 100644 bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/UploadFileTooLargeMessage.java

diff --git a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationUploadTokenReqMsgHdlr.scala b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationUploadTokenReqMsgHdlr.scala
index 2894b415c9..9ced41b323 100755
--- a/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationUploadTokenReqMsgHdlr.scala
+++ b/akka-bbb-apps/src/main/scala/org/bigbluebutton/core/apps/presentationpod/PresentationUploadTokenReqMsgHdlr.scala
@@ -43,7 +43,7 @@ trait PresentationUploadTokenReqMsgHdlr extends RightsManagementTrait {
       val envelope = BbbCoreEnvelope(PresentationUploadTokenSysPubMsg.NAME, routing)
       val header = BbbClientMsgHeader(PresentationUploadTokenSysPubMsg.NAME, liveMeeting.props.meetingProp.intId, msg.header.userId)
 
-      val body = PresentationUploadTokenSysPubMsgBody(msg.body.podId, token, msg.body.filename)
+      val body = PresentationUploadTokenSysPubMsgBody(msg.body.podId, token, msg.body.filename, liveMeeting.props.meetingProp.intId)
       val event = PresentationUploadTokenSysPubMsg(header, body)
       val msgEvent = BbbCommonEnvCoreMsg(envelope, event)
 
diff --git a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala
index 75623c81b3..4031748888 100755
--- a/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala
+++ b/bbb-common-message/src/main/scala/org/bigbluebutton/common2/msgs/PresentationPodsMsgs.scala
@@ -147,6 +147,22 @@ case class PresentationConversionEndedSysMsgBody(
     presName:       String
 )
 
+object PresentationUploadedFileTooLargeErrorSysPubMsg { val NAME = "PresentationUploadedFileTooLargeErrorSysPubMsg" }
+case class PresentationUploadedFileTooLargeErrorSysPubMsg(
+    header: BbbClientMsgHeader,
+    body:   PresentationUploadedFileTooLargeErrorSysPubMsgBody
+) extends StandardMsg
+case class PresentationUploadedFileTooLargeErrorSysPubMsgBody(
+    podId:             String,
+    messageKey:        String,
+    code:              String,
+    meetingId:         String,
+    presentationName:  String,
+    presentationToken: String,
+    fileSize:          Int,
+    maxFileSize:       Int
+)
+
 // ------------ bbb-common-web to akka-apps ------------
 
 // ------------ akka-apps to client ------------
@@ -281,5 +297,5 @@ case class SyncGetPresentationPodsRespMsgBody(pods: Vector[PresentationPodVO])
 // ------------ akka-apps to bbb-common-web ------------
 object PresentationUploadTokenSysPubMsg { val NAME = "PresentationUploadTokenSysPubMsg" }
 case class PresentationUploadTokenSysPubMsg(header: BbbClientMsgHeader, body: PresentationUploadTokenSysPubMsgBody) extends BbbCoreMsg
-case class PresentationUploadTokenSysPubMsgBody(podId: String, authzToken: String, filename: String)
+case class PresentationUploadTokenSysPubMsgBody(podId: String, authzToken: String, filename: String, meetingId: String)
 // ------------ akka-apps to bbb-common-web ------------
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
index bf495f2b8d..3adb52b1ad 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/MeetingService.java
@@ -86,6 +86,7 @@ import org.bigbluebutton.api2.IBbbWebApiGWApp;
 import org.bigbluebutton.api2.domain.UploadedTrack;
 import org.bigbluebutton.common2.redis.RedisStorageService;
 import org.bigbluebutton.presentation.PresentationUrlDownloadService;
+import org.bigbluebutton.presentation.imp.SwfSlidesGenerationProgressNotifier;
 import org.bigbluebutton.web.services.WaitingGuestCleanupTimerTask;
 import org.bigbluebutton.web.services.UserCleanupTimerTask;
 import org.bigbluebutton.web.services.EnteredUserCleanupTimerTask;
@@ -120,6 +121,7 @@ public class MeetingService implements MessageListener {
   private RedisStorageService storeService;
   private CallbackUrlService callbackUrlService;
   private HTML5LoadBalancingService html5LoadBalancingService;
+  private SwfSlidesGenerationProgressNotifier notifier;
 
   private long usersTimeout;
   private long enteredUsersTimeout;
@@ -314,6 +316,18 @@ public class MeetingService implements MessageListener {
     return valid;
   }
 
+  public PresentationUploadToken getPresentationUploadToken(String authzToken) {
+    if(uploadAuthzTokens.containsKey(authzToken)) {
+      return uploadAuthzTokens.get(authzToken);
+    } else {
+      return null;
+    }
+  }
+
+  public void sendPresentationUploadMaxFilesizeMessage(PresentationUploadToken presUploadToken, int uploadedFileSize, int maxUploadFileSize) {
+    notifier.sendUploadFileTooLargeMessage(presUploadToken, uploadedFileSize, maxUploadFileSize);
+  }
+
   private void removeUserSessions(String meetingId) {
     Iterator<Map.Entry<String, UserSession>> iterator = sessions.entrySet().iterator();
     while (iterator.hasNext()) {
@@ -1241,4 +1255,9 @@ public class MeetingService implements MessageListener {
   public void setEnteredUsersTimeout(long value) {
     enteredUsersTimeout = value;
   }
+
+  public void setSwfSlidesGenerationProgressNotifier(SwfSlidesGenerationProgressNotifier notifier) {
+    this.notifier = notifier;
+  }
+
 }
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/PresentationUploadToken.java b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/PresentationUploadToken.java
index 02113e7f5d..c88c291b4c 100644
--- a/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/PresentationUploadToken.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/api/messaging/messages/PresentationUploadToken.java
@@ -4,10 +4,12 @@ public class PresentationUploadToken implements IMessage  {
     public final String podId;
     public final String authzToken;
     public final String filename;
+    public final String meetingId;
 
-    public PresentationUploadToken(String podId, String authzToken, String filename) {
+    public PresentationUploadToken(String podId, String authzToken, String filename, String meetingId) {
         this.podId = podId;
         this.authzToken = authzToken;
         this.filename = filename;
+        this.meetingId = meetingId;
     }
 }
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/ConversionMessageConstants.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/ConversionMessageConstants.java
index 5c4618a982..de348d4a70 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/ConversionMessageConstants.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/ConversionMessageConstants.java
@@ -23,6 +23,7 @@ public class ConversionMessageConstants {
     public static final String OFFICE_DOC_CONVERSION_SUCCESS_KEY = "OFFICE_DOC_CONVERSION_SUCCESS";
     public static final String OFFICE_DOC_CONVERSION_FAILED_KEY = "OFFICE_DOC_CONVERSION_FAILED";
     public static final String OFFICE_DOC_CONVERSION_INVALID_KEY = "OFFICE_DOC_CONVERSION_INVALID";
+    public static final String FILE_TOO_LARGE = "FILE_TOO_LARGE";
     public static final String SUPPORTED_DOCUMENT_KEY = "SUPPORTED_DOCUMENT";
     public static final String UNSUPPORTED_DOCUMENT_KEY = "UNSUPPORTED_DOCUMENT";
     public static final String PAGE_COUNT_FAILED_KEY = "PAGE_COUNT_FAILED";
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java
index 00206efb12..ad0852c0bb 100755
--- a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/imp/SwfSlidesGenerationProgressNotifier.java
@@ -18,14 +18,12 @@
 
 package org.bigbluebutton.presentation.imp;
 
+import org.bigbluebutton.api.messaging.messages.PresentationUploadToken;
 import org.bigbluebutton.api2.IBbbWebApiGWApp;
 import org.bigbluebutton.presentation.ConversionMessageConstants;
 import org.bigbluebutton.presentation.GeneratedSlidesInfoHelper;
 import org.bigbluebutton.presentation.UploadedPresentation;
-import org.bigbluebutton.presentation.messages.DocPageCompletedProgress;
-import org.bigbluebutton.presentation.messages.DocPageGeneratedProgress;
-import org.bigbluebutton.presentation.messages.IDocConversionMsg;
-import org.bigbluebutton.presentation.messages.OfficeDocConversionProgress;
+import org.bigbluebutton.presentation.messages.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,6 +39,17 @@ public class SwfSlidesGenerationProgressNotifier {
     messagingService.sendDocConversionMsg(msg);
   }
 
+  public void sendUploadFileTooLargeMessage(PresentationUploadToken pres, int uploadedFileSize, int maxUploadFileSize) {
+    UploadFileTooLargeMessage progress = new UploadFileTooLargeMessage(
+            pres.podId,
+            pres.meetingId,
+            pres.filename,
+            pres.authzToken,
+            ConversionMessageConstants.FILE_TOO_LARGE,
+            uploadedFileSize,
+            maxUploadFileSize);
+    messagingService.sendDocConversionMsg(progress);
+  }
 
   public void sendConversionUpdateMessage(int slidesCompleted, UploadedPresentation pres, int pageGenerated) {
     DocPageGeneratedProgress progress = new DocPageGeneratedProgress(pres.getPodId(),
diff --git a/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/UploadFileTooLargeMessage.java b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/UploadFileTooLargeMessage.java
new file mode 100644
index 0000000000..b6af2fd0eb
--- /dev/null
+++ b/bbb-common-web/src/main/java/org/bigbluebutton/presentation/messages/UploadFileTooLargeMessage.java
@@ -0,0 +1,27 @@
+package org.bigbluebutton.presentation.messages;
+
+public class UploadFileTooLargeMessage implements IDocConversionMsg {
+  public final String podId;
+  public final String meetingId;
+  public final String filename;
+  public final String authzToken;
+  public final String key;
+  public final Integer uploadedFileSize;
+  public final Integer maxUploadFileSize;
+
+  public UploadFileTooLargeMessage(String podId,
+                                   String meetingId,
+                                   String filename,
+                                   String authzToken,
+                                   String key,
+                                   Integer uploadedFileSize,
+                                   Integer maxUploadFileSize) {
+    this.podId = podId;
+    this.meetingId = meetingId;
+    this.filename = filename;
+    this.authzToken = authzToken;
+    this.key = key;
+    this.uploadedFileSize = uploadedFileSize;
+    this.maxUploadFileSize = maxUploadFileSize;
+  }
+}
diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala
index 56056a58c3..8d720d60dd 100755
--- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/BbbWebApiGWApp.scala
@@ -312,6 +312,9 @@ class BbbWebApiGWApp(
     } else if (msg.isInstanceOf[DocPageConversionStarted]) {
       val event = MsgBuilder.buildPresentationPageConversionStartedSysMsg(msg.asInstanceOf[DocPageConversionStarted])
       msgToAkkaAppsEventBus.publish(MsgToAkkaApps(toAkkaAppsChannel, event))
+    } else if (msg.isInstanceOf[UploadFileTooLargeMessage]) {
+      val event = MsgBuilder.buildPresentationUploadedFileTooLargeErrorSysMsg(msg.asInstanceOf[UploadFileTooLargeMessage])
+      msgToAkkaAppsEventBus.publish(MsgToAkkaApps(toAkkaAppsChannel, event))
     }
   }
 
diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala
index 945cce0b8a..d124391db9 100755
--- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/MsgBuilder.scala
@@ -280,4 +280,17 @@ object MsgBuilder {
     val req = DeletedRecordingSysMsg(header, body)
     BbbCommonEnvCoreMsg(envelope, req)
   }
+
+  def buildPresentationUploadedFileTooLargeErrorSysMsg(msg: UploadFileTooLargeMessage): BbbCommonEnvCoreMsg = {
+    val routing = collection.immutable.HashMap("sender" -> "bbb-web")
+    val envelope = BbbCoreEnvelope(PresentationUploadedFileTooLargeErrorSysPubMsg.NAME, routing)
+    val header = BbbClientMsgHeader(PresentationUploadedFileTooLargeErrorSysPubMsg.NAME, msg.meetingId, msg.authzToken)
+
+    val body = PresentationUploadedFileTooLargeErrorSysPubMsgBody(podId = msg.podId, messageKey = msg.key,
+      code = msg.key, meetingId = msg.meetingId, presentationName = msg.filename, presentationToken = msg.authzToken, fileSize = msg.uploadedFileSize.intValue(), maxFileSize = msg.maxUploadFileSize)
+
+    val req = PresentationUploadedFileTooLargeErrorSysPubMsg(header, body)
+    BbbCommonEnvCoreMsg(envelope, req)
+  }
+
 }
diff --git a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala
index ac25f7610c..d42b2e82a7 100755
--- a/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala
+++ b/bbb-common-web/src/main/scala/org/bigbluebutton/api2/meeting/OldMeetingMsgHdlrActor.scala
@@ -159,7 +159,7 @@ class OldMeetingMsgHdlrActor(val olgMsgGW: OldMessageReceivedGW)
   }
 
   def handlePresentationUploadTokenSysPubMsg(msg: PresentationUploadTokenSysPubMsg): Unit = {
-    olgMsgGW.handle(new PresentationUploadToken(msg.body.podId, msg.body.authzToken, msg.body.filename))
+    olgMsgGW.handle(new PresentationUploadToken(msg.body.podId, msg.body.authzToken, msg.body.filename, msg.body.meetingId))
   }
 
   def handleGuestsWaitingApprovedEvtMsg(msg: GuestsWaitingApprovedEvtMsg): Unit = {
diff --git a/bigbluebutton-web/grails-app/conf/spring/resources.xml b/bigbluebutton-web/grails-app/conf/spring/resources.xml
index f0af467295..e8986bdc91 100755
--- a/bigbluebutton-web/grails-app/conf/spring/resources.xml
+++ b/bigbluebutton-web/grails-app/conf/spring/resources.xml
@@ -56,6 +56,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
         <property name="callbackUrlService" ref="callbackUrlService"/>
         <property name="usersTimeout" value="${usersTimeout}"/>
         <property name="enteredUsersTimeout" value="${enteredUsersTimeout}"/>
+        <property name="swfSlidesGenerationProgressNotifier" ref="swfSlidesGenerationProgressNotifier"/>
     </bean>
 
     <bean id="oldMessageReceivedGW" class="org.bigbluebutton.api2.bus.OldMessageReceivedGW">
diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy
index a65a6b3ce2..2fe2022578 100755
--- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy
+++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy
@@ -19,6 +19,7 @@
 package org.bigbluebutton.web.controllers
 
 import grails.converters.*
+import org.bigbluebutton.api.messaging.messages.PresentationUploadToken
 import org.grails.web.mime.DefaultMimeUtility
 import org.bigbluebutton.api.ParamsProcessorUtil;
 
@@ -62,6 +63,11 @@ class PresentationController {
         response.outputStream << 'upload-success';
       } else {
         log.debug "NO SUCCESS \n"
+
+        //Send upload error message
+        PresentationUploadToken presUploadToken = meetingService.getPresentationUploadToken(presentationToken);
+        meetingService.sendPresentationUploadMaxFilesizeMessage(presUploadToken, originalContentLength, maxUploadFileSize as int);
+
         response.setStatus(404);
         response.addHeader("Cache-Control", "no-cache")
         response.contentType = 'plain/text'
-- 
GitLab