From d740e364357e198313418d60e40b7f790af55a57 Mon Sep 17 00:00:00 2001
From: Richard Alam <ritzalam@gmail.com>
Date: Wed, 25 Apr 2018 16:00:06 -0700
Subject: [PATCH]  - add client connId to client logs so we can correlate
 client conn logs with red5 side conn logs

---
 .../app/screenshare/red5/Red5AppAdapter.java  |  3 +-
 .../app/screenshare/red5/Red5AppService.java  | 10 ++++-
 .../app/video/VideoApplication.java           | 21 +++++++--
 .../voiceconf/red5/Application.java           |  7 ++-
 .../red5/BigBlueButtonApplication.java        | 11 +++--
 .../src/org/bigbluebutton/core/UsersUtil.as   |  5 +++
 .../core/managers/ConnectionManager.as        | 43 ++++++++++++++++++-
 .../org/bigbluebutton/main/model/PortTest.as  |  2 +-
 .../main/model/users/NetConnectionDelegate.as |  4 +-
 .../phone/managers/ConnectionManager.as       |  6 ++-
 .../screenshare/services/red5/Connection.as   | 12 ++++--
 .../modules/videoconf/business/VideoProxy.as  |  5 ++-
 .../src/org/bigbluebutton/util/ConnUtil.as    | 16 +++++++
 13 files changed, 128 insertions(+), 17 deletions(-)

diff --git a/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppAdapter.java b/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppAdapter.java
index 47c47a5756..e24d862c57 100755
--- a/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppAdapter.java
+++ b/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppAdapter.java
@@ -107,7 +107,7 @@ public class Red5AppAdapter extends MultiThreadedApplicationAdapter {
 
     String connType = getConnectionType(Red5.getConnectionLocal().getType());
     String connId = Red5.getConnectionLocal().getSessionId();
-
+    String clientConnId = (String) conn.getAttribute("CLIENT_CONN_ID");
     String meetingId = conn.getScope().getName();
     String userId = getUserId();
 
@@ -118,6 +118,7 @@ public class Red5AppAdapter extends MultiThreadedApplicationAdapter {
     logData.put("userId", userId);
     logData.put("connType", connType);
     logData.put("connId", connId);
+    logData.put("clientConnId", clientConnId);
     logData.put("event", "user_leaving_bbb_screenshare");
     logData.put("description", "User leaving BBB Screenshare.");
 
diff --git a/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppService.java b/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppService.java
index 445078b1f5..a0c51de58a 100755
--- a/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppService.java
+++ b/bbb-screenshare/app/src/main/java/org/bigbluebutton/app/screenshare/red5/Red5AppService.java
@@ -27,6 +27,7 @@ public class Red5AppService {
   public void setUserId(Map<String, Object> msg) {
     String meetingId = Red5.getConnectionLocal().getScope().getName();
     String userId = (String) msg.get("userId");
+    String clientConnId = (String) msg.get("clientConnId");
 
     String connType = getConnectionType(Red5.getConnectionLocal().getType());
     String sessionId = Red5.getConnectionLocal().getSessionId();
@@ -39,13 +40,18 @@ public class Red5AppService {
     Set<IConnection> conns = Red5.getConnectionLocal().getScope().getClientConnections();
     for (IConnection conn : conns) {
       String connUserId = (String) conn.getAttribute("USERID");
+      String oldClientConnId = (String) conn.getAttribute("CLIENT_CONN_ID");
       String connSessionId = conn.getSessionId();
-      if (connUserId != null && connUserId.equals(userId) && !connSessionId.equals(sessionId)) {
+      if (oldClientConnId != null && connUserId != null && connUserId.equals(userId) && !connSessionId.equals(sessionId)) {
         conn.removeAttribute("USERID");
+        conn.removeAttribute("CLIENT_CONN_ID");
+
         Map<String, Object> logData = new HashMap<String, Object>();
         logData.put("meetingId", meetingId);
         logData.put("userId", userId);
         logData.put("oldConnId", connSessionId);
+          logData.put("oldClientConnId", oldClientConnId);
+          logData.put("newClientConnId", clientConnId);
         logData.put("newConnId", sessionId);
         logData.put("event", "removing_defunct_connection");
         logData.put("description", "Removing defunct connection BBB Screenshare.");
@@ -60,6 +66,7 @@ public class Red5AppService {
 
     Red5.getConnectionLocal().setAttribute("MEETING_ID", meetingId);
     Red5.getConnectionLocal().setAttribute("USERID", userId);
+      Red5.getConnectionLocal().setAttribute("CLIENT_CONN_ID", clientConnId);
 
     handler.userConnected(meetingId, userId);
 
@@ -68,6 +75,7 @@ public class Red5AppService {
     logData.put("userId", userId);
     logData.put("connType", connType);
     logData.put("connId", sessionId);
+      logData.put("clientConnId", clientConnId);
     logData.put("event", "user_joining_bbb_screenshare");
     logData.put("description", "User joining BBB Screenshare.");
 
diff --git a/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java b/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java
index 60c3050a0e..9afb11972c 100755
--- a/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java
+++ b/bbb-video/src/main/java/org/bigbluebutton/app/video/VideoApplication.java
@@ -121,7 +121,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
 	public boolean roomConnect(IConnection connection, Object[] params) {
 		log.info("BBB Video roomConnect");
 
-		if(params.length != 3) {
+		if(params.length != 4) {
 			log.error("Invalid number of parameters. param length=" + params.length);
 			return false;
 		}
@@ -129,7 +129,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
 		String meetingId = ((String) params[0]).toString();
 		String userId = ((String) params[1]).toString();
 		String authToken = ((String) params[2]).toString();
-
+      String clientConnId = ((String) params[3]).toString();
 
       if (StringUtils.isEmpty(meetingId)) {
           log.error("Invalid meetingId parameter.");
@@ -149,6 +149,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
 		Red5.getConnectionLocal().setAttribute("MEETING_ID", meetingId);
 		Red5.getConnectionLocal().setAttribute("USERID", userId);
 	  	Red5.getConnectionLocal().setAttribute("AUTH_TOKEN", authToken);
+      Red5.getConnectionLocal().setAttribute("CLIENT_CONN_ID", clientConnId);
 
 		String connType = getConnectionType(Red5.getConnectionLocal().getType());
 		String sessionId = Red5.getConnectionLocal().getSessionId();
@@ -165,6 +166,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
             logData.put("userId", userId);
             logData.put("connType", connType);
             logData.put("connId", sessionId);
+            logData.put("clientConnId", clientConnId);
             logData.put("clientId", clientId);
             logData.put("remoteAddress", remoteHost + ":" + remotePort);
             logData.put("event", "port_test_connection_bbb_video");
@@ -186,18 +188,21 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
             Set<IConnection> conns = Red5.getConnectionLocal().getScope().getClientConnections();
             for (IConnection conn : conns) {
                 String connUserId = (String) conn.getAttribute("USERID");
+                String oldClientConnId = (String) conn.getAttribute("CLIENT_CONN_ID");
                 String connSessionId = conn.getSessionId();
                 String clientId = conn.getClient().getId();
                 String remoteHost = conn.getRemoteAddress();
                 int remotePort = conn.getRemotePort();
-                if (connUserId != null && connUserId.equals(userId) && !connSessionId.equals(sessionId)) {
+                if (oldClientConnId != null && connUserId != null && connUserId.equals(userId) && !connSessionId.equals(sessionId)) {
                     conn.removeAttribute("USERID");
+                    conn.removeAttribute("CLIENT_CONN_ID");
                     Map<String, Object> logData = new HashMap<String, Object>();
                     logData.put("meetingId", meetingId);
                     logData.put("userId", userId);
                     logData.put("oldConnId", connSessionId);
                     logData.put("newConnId", sessionId);
                     logData.put("clientId", clientId);
+                    logData.put("oldClientConnId", oldClientConnId);
                     logData.put("remoteAddress", remoteHost + ":" + remotePort);
                     logData.put("event", "removing_defunct_connection");
                     logData.put("description", "Removing defunct connection BBB Video.");
@@ -218,6 +223,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
             logData.put("userId", userId);
             logData.put("connType", connType);
             logData.put("connId", sessionId);
+            logData.put("clientConnId", clientConnId);
             logData.put("clientId", clientId);
             logData.put("remoteAddress", remoteHost + ":" + remotePort);
             logData.put("event", "user_joining_bbb_video");
@@ -253,6 +259,12 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
 		if ((meetingId == null) || ("".equals(meetingId))) meetingId = "unknown-meetingid";
 		return meetingId;
 	}
+
+    private String getClientConnId() {
+        String clientConnId = (String) Red5.getConnectionLocal().getAttribute("CLIENT_CONN_ID");
+        if ((clientConnId == null) || ("".equals(clientConnId))) clientConnId = "unknown-clientConnId";
+        return clientConnId;
+    }
 	
   @Override
 	public void appDisconnect(IConnection conn) {
@@ -266,6 +278,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
 		
 		String connType = getConnectionType(Red5.getConnectionLocal().getType());
 		String connId = Red5.getConnectionLocal().getSessionId();
+		String clientConnId = getClientConnId();
 
       UserConnectionMapper.UserConnection uconn = userConnections.userDisconnected(connId);
       if (uconn != null) {
@@ -274,6 +287,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
           logData.put("userId", getUserId());
           logData.put("connType", connType);
           logData.put("connId", connId);
+          logData.put("clientConnId", clientConnId);
           logData.put("event", "removing_port_test_conn_bbb_video");
           logData.put("description", "Removing port test connection BBB Video.");
 
@@ -287,6 +301,7 @@ public class VideoApplication extends MultiThreadedApplicationAdapter {
           logData.put("userId", getUserId());
           logData.put("connType", connType);
           logData.put("connId", connId);
+          logData.put("clientConnId", clientConnId);
           logData.put("event", "user_leaving_bbb_video");
           logData.put("description", "User leaving BBB Video.");
 
diff --git a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/Application.java b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/Application.java
index f7c16faf58..7521484f37 100755
--- a/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/Application.java
+++ b/bbb-voice/src/main/java/org/bigbluebutton/voiceconf/red5/Application.java
@@ -85,7 +85,7 @@ public class Application extends MultiThreadedApplicationAdapter {
 	@Override
 	public boolean appConnect(IConnection conn, Object[] params) {
 
-		if(params.length != 4) {
+		if(params.length != 5) {
 			log.error("Invalid number of parameters. param length=" + params.length);
 			return false;
 		}
@@ -94,6 +94,7 @@ public class Application extends MultiThreadedApplicationAdapter {
 		String userId = ((String) params[1]).toString();
 		String username = ((String) params[2]).toString();
 		String authToken = ((String) params[3]).toString();
+		String clientConnId = ((String) params[4]).toString();
 
 		if (StringUtils.isEmpty(meetingId)) {
 			log.error("Invalid meetingId parameter.");
@@ -122,6 +123,7 @@ public class Application extends MultiThreadedApplicationAdapter {
 		Red5.getConnectionLocal().setAttribute("MEETING_ID", meetingId);
 		Red5.getConnectionLocal().setAttribute("USERID", userId);
 		Red5.getConnectionLocal().setAttribute("USERNAME", username);
+        Red5.getConnectionLocal().setAttribute("CLIENT_CONN_ID", clientConnId);
 
 		log.info("{} [clientid={}] has connected to the voice conf app.", username + "[uid=" + userId + "]", clientId);
 		log.info("[clientid={}] connected from {}.", clientId, remoteHost + ":" + remotePort);
@@ -137,6 +139,7 @@ public class Application extends MultiThreadedApplicationAdapter {
 		logData.put("meetingId", meetingId);
 		logData.put("connType", connType);
 		logData.put("connId", connId);
+        logData.put("clientConnId", clientConnId);
 		logData.put("userId", userId);
 		logData.put("username", userFullname);
 		logData.put("event", "user_joining_bbb_voice");
@@ -175,11 +178,13 @@ public class Application extends MultiThreadedApplicationAdapter {
 		String connType = getConnectionType(Red5.getConnectionLocal().getType());
 		String userFullname = username;
 		String connId = Red5.getConnectionLocal().getSessionId();
+		String clientConnId = conn.getAttribute("CLIENT_CONN_ID").toString();
 
 		Map<String, Object> logData = new HashMap<String, Object>();
 		logData.put("meetingId", getMeetingId());
 		logData.put("connType", connType);
 		logData.put("connId", connId);
+        logData.put("clientConnId", clientConnId);
 		logData.put("userId", userId);
 		logData.put("username", userFullname);
 		logData.put("event", "user_leaving_bbb_voice");
diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java
index bc65276935..f484d6fc96 100755
--- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java
+++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/red5/BigBlueButtonApplication.java
@@ -139,7 +139,7 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
 	@Override
 	public boolean roomConnect(IConnection connection, Object[] params) {
 
-		if(params.length != 10) {
+		if(params.length != 11) {
 			log.error("Invalid number of parameters. param length=" + params.length);
 			return false;
 		}
@@ -167,6 +167,7 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
 		}
 
 		String authToken = ((String) params[9]).toString();
+		String clientConnId = ((String) params[10]).toString();
 
 		String userId = internalUserID;
 		String sessionId = Red5.getConnectionLocal().getSessionId();
@@ -178,7 +179,8 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
 		connection.setAttribute("INTERNAL_USER_ID", internalUserID);
 		connection.setAttribute("USER_SESSION_ID", sessionId);
 		connection.setAttribute("TIMESTAMP", System.currentTimeMillis());
-        
+        connection.setAttribute("CLIENT_CONN_ID", clientConnId);
+
 	    String meetingId = bbbSession.getRoom();
 
 	    String userFullname = bbbSession.getUsername();
@@ -192,6 +194,7 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
 		logData.put("meetingId", meetingId);
 		logData.put("connType", connType);
 		logData.put("connId", connId);
+		logData.put("clientConnId", clientConnId);
 		logData.put("clientId", clientId);
 		logData.put("remoteAddress", remoteHost + ":" + remotePort);
 		logData.put("userId", userId);
@@ -242,11 +245,13 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter {
 	    String connId = Red5.getConnectionLocal().getSessionId();
 		String clientId = Red5.getConnectionLocal().getClient().getId();
         String sessionId =  CONN + userId;
-	    	    
+	    String clientConnId = conn.getAttribute("CLIENT_CONN_ID").toString();
+
 	    Map<String, Object> logData = new HashMap<String, Object>();
 	    logData.put("meetingId", meetingId);
 	    logData.put("connType", connType);
 	    logData.put("connId", connId);
+        logData.put("clientConnId", clientConnId);
 		logData.put("clientId", clientId);
 		logData.put("remoteAddress", remoteHost + ":" + remotePort);
 	    logData.put("sessionId", sessionId);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
index 702c192a37..e1444beb7a 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/UsersUtil.as
@@ -308,6 +308,11 @@ package org.bigbluebutton.core
             logData.user = UsersUtil.getUserData();
         }
         logData.sessionToken = getUserSession();
+				logData.connections = BBB.initConnectionManager().getConnectionIds();
+				
+				var now:Date = new Date();
+				logData.clientTimeUTC = now.getTime();
+				logData.clientTZOffsetInMin = now.getTimezoneOffset();
         return logData;
     }
     
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConnectionManager.as b/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConnectionManager.as
index aede051109..4517eb6a32 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConnectionManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConnectionManager.as
@@ -18,6 +18,7 @@
  */
 package org.bigbluebutton.core.managers {
     import flash.net.NetConnection;
+    
     import org.bigbluebutton.core.Options;
     import org.bigbluebutton.main.model.options.PortTestOptions;
     import org.bigbluebutton.main.model.users.IMessageListener;
@@ -25,6 +26,11 @@ package org.bigbluebutton.core.managers {
 
     public class ConnectionManager {
         private var connDelegate:NetConnectionDelegate;
+				
+				private var _videoConnId:String = "";
+				private var _voiceConnId:String = "";
+				private var _screenshareConnId:String = "";
+				private var _appsConnId:String = "";
 
         private var _isTunnelling:Boolean = false;
 
@@ -34,11 +40,46 @@ package org.bigbluebutton.core.managers {
             connDelegate = new NetConnectionDelegate();
         }
 
+				public function getConnectionIds():Array {
+					return new Array(_appsConnId, _videoConnId, _screenshareConnId, _voiceConnId);
+				}
+				
+				public function set appsConnId(id:String):void {
+					_appsConnId = "app_" + id;
+				}
 
+				public function get appsConnId():String {
+					return _appsConnId;
+				}
+				
+				public function set videoConnId(id:String):void {
+					_videoConnId = "vid_" + id;
+				}
+				
+				public function get videoConnId():String {
+					return _videoConnId;
+				}
+				
+				public function set screenshareConnId(id:String):void {
+					_screenshareConnId = "scr_" + id;
+				}
+				
+				public function get screenshareConnId():String {
+					return _screenshareConnId;
+				}
+				
+				public function set voiceConnId(id:String):void {
+					_voiceConnId = "voi_" + id;
+				}
+				
+				public function get voiceConnId():String {
+					return _voiceConnId;
+				}
+				
         public function get connection():NetConnection {
             return connDelegate.connection;
         }
-
+				
         public function connect():void {
             connDelegate.connect();
         }
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/PortTest.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/PortTest.as
index 394535646c..a75c08345e 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/PortTest.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/PortTest.as
@@ -179,7 +179,7 @@ package org.bigbluebutton.main.model
 				LOGGER.debug("Connecting PORT TEST = " + this.baseURI);
 				// Create connection with the server.
 				nc.connect( this.baseURI, "portTestMeetingId-" + curTime, 
-					"portTestDummyUserId-" + curTime, "portTestDummyAuthToken");
+					"portTestDummyUserId-" + curTime, "portTestDummyAuthToken", "portTest-" + curTime);
 							
 				status = "Connecting...";
 			} catch( e : ArgumentError ) {
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as
index a5c2f1a6f1..8ce2bdf956 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as
@@ -398,6 +398,8 @@ package org.bigbluebutton.main.model.users
 
         public function connect():void {
             var intMeetingId: String = LiveMeeting.inst().meeting.internalId;
+						var connId:String = ConnUtil.generateConnId();
+						BBB.initConnectionManager().appsConnId = connId;
                 
             try {
                 var appURL:String = _applicationOptions.uri;
@@ -454,7 +456,7 @@ package org.bigbluebutton.main.model.users
                                         intMeetingId, voiceConf, 
                                         recorded, extUserId,
                                         intUserId, muteOnStart,
-                                        guest, authToken);
+                                        guest, authToken, BBB.initConnectionManager().appsConnId);
                    
             } catch(e:ArgumentError) {
                 // Invalid parameters.
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/ConnectionManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/ConnectionManager.as
index 08ccd6620a..5dd8ac271b 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/ConnectionManager.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/ConnectionManager.as
@@ -124,8 +124,12 @@ package org.bigbluebutton.modules.phone.managers {
 				netConnection.addEventListener( NetStatusEvent.NET_STATUS , netStatus );
 				netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
 				
+				var connId:String = ConnUtil.generateConnId();
+				BBB.initConnectionManager().voiceConnId = connId;
+				
 				var authToken: String = LiveMeeting.inst().me.authToken;
-				netConnection.connect(uri, meetingId, externUserId, username, authToken);
+				netConnection.connect(uri, meetingId, externUserId, username, authToken, 
+					BBB.initConnectionManager().voiceConnId);
 			}
 			if (reconnecting && !amIListenOnly) {
 				handleConnectionSuccess();
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/Connection.as b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/Connection.as
index 4612e26a07..476900de66 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/Connection.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/screenshare/services/red5/Connection.as
@@ -19,22 +19,24 @@
 
 package org.bigbluebutton.modules.screenshare.services.red5 {
     import com.asfusion.mate.events.Dispatcher;
+    
     import flash.events.NetStatusEvent;
     import flash.events.SecurityErrorEvent;
     import flash.net.NetConnection;
     import flash.net.ObjectEncoding;
     import flash.net.Responder;
+    
     import org.as3commons.logging.api.ILogger;
     import org.as3commons.logging.api.getClassLogger;
     import org.bigbluebutton.core.BBB;
-		import org.bigbluebutton.core.Options;
+    import org.bigbluebutton.core.Options;
     import org.bigbluebutton.core.UsersUtil;
     import org.bigbluebutton.core.managers.ReconnectionManager;
     import org.bigbluebutton.main.events.BBBEvent;
     import org.bigbluebutton.modules.screenshare.events.ViewStreamEvent;
     import org.bigbluebutton.modules.screenshare.model.ScreenshareModel;
-		import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions;
-		import org.bigbluebutton.util.ConnUtil;
+    import org.bigbluebutton.modules.screenshare.model.ScreenshareOptions;
+    import org.bigbluebutton.util.ConnUtil;
 		
     public class Connection {
         private static const LOGGER:ILogger = getClassLogger(Connection);
@@ -84,6 +86,9 @@ package org.bigbluebutton.modules.screenshare.services.red5 {
 					LOGGER.debug("SCREENSHARE CONNECT tunnel = FALSE " + "url=" +  ssAppUrl);
 				}
 				
+				var connId:String = ConnUtil.generateConnId();
+				BBB.initConnectionManager().screenshareConnId = connId;
+				
 				netConnection.client = this;
 				netConnection.addEventListener( NetStatusEvent.NET_STATUS , netStatusHandler);
 				netConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
@@ -245,6 +250,7 @@ package org.bigbluebutton.modules.screenshare.services.red5 {
             var message:Object = new Object();
             message["meetingId"] = UsersUtil.getInternalMeetingID();
             message["userId"] = UsersUtil.getMyUserID();
+						message["clientConnId"] = BBB.initConnectionManager().screenshareConnId;
             
             sendMessage("screenshare.setUserId", function(result:String):void { // On successful result
                 LOGGER.debug(result);
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoProxy.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoProxy.as
index 26a92a28ec..404aa54876 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoProxy.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/business/VideoProxy.as
@@ -108,12 +108,15 @@ package org.bigbluebutton.modules.videoconf.business
 					LOGGER.debug("VIDEO CONNECT tunnel = FALSE " + "url=" +  videoConnUrl);
 				}
 				
+				var connId:String = ConnUtil.generateConnId();
+				BBB.initConnectionManager().videoConnId = connId;
+				
 				videoConnUrl = videoConnUrl + "/" + UsersUtil.getInternalMeetingID();
 				var authToken: String = LiveMeeting.inst().me.authToken;
 
 				nc.objectEncoding = flash.net.ObjectEncoding.AMF3;
 				nc.connect(videoConnUrl, UsersUtil.getInternalMeetingID(), 
-						UsersUtil.getMyUserID(), authToken);
+						UsersUtil.getMyUserID(), authToken, BBB.initConnectionManager().videoConnId);
 		}
 	    
 		private function onAsyncError(event:AsyncErrorEvent):void{
diff --git a/bigbluebutton-client/src/org/bigbluebutton/util/ConnUtil.as b/bigbluebutton-client/src/org/bigbluebutton/util/ConnUtil.as
index c79aea4c97..65bd3ce17b 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/util/ConnUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/util/ConnUtil.as
@@ -14,5 +14,21 @@ package org.bigbluebutton.util
 				var result:Array = pattern.exec(appURL);
 				return result;
 			}
+			
+			private static function generateRandomString(strlen:Number):String{
+				var chars:String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+				var num_chars:Number = chars.length - 1;
+				var randomChar:String = "";
+				
+				for (var i:Number = 0; i < strlen; i++){
+					randomChar += chars.charAt(Math.floor(Math.random() * num_chars));
+				}
+				return randomChar;
+			}
+			
+			public static function generateConnId():String {
+				return generateRandomString(15);
+			}
+			
 	}
 }
\ No newline at end of file
-- 
GitLab