You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/07/01 13:15:50 UTC

openmeetings git commit: [OPENMEETINGS-1646] mobile client able to connect

Repository: openmeetings
Updated Branches:
  refs/heads/master 85502430e -> 0d32d43df


[OPENMEETINGS-1646] mobile client able to connect


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/0d32d43d
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/0d32d43d
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/0d32d43d

Branch: refs/heads/master
Commit: 0d32d43df98d52707d211e7afb2dd366fc6fd486
Parents: 8550243
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Sat Jul 1 20:15:39 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Sat Jul 1 20:15:39 2017 +0700

----------------------------------------------------------------------
 .../openmeetings/core/remote/MobileService.java | 97 ++++++++++----------
 .../core/remote/ScopeApplicationAdapter.java    | 22 +++--
 .../core/session/store/HashMapStore.java        |  8 +-
 .../openmeetings/service/user/UserManager.java  | 14 ++-
 .../openmeetings/web/app/Application.java       | 19 +++-
 .../webapp/WEB-INF/classes/logback-config.xml   |  4 +-
 6 files changed, 91 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/0d32d43d/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
index fd67e32..668526b 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
@@ -22,7 +22,6 @@ import static org.apache.openmeetings.db.util.LocaleHelper.getCountryName;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_GROUP_ID;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_FRONTEND_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_OAUTH_REGISTER_KEY;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_SOAP_REGISTER_KEY;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import static org.apache.openmeetings.util.Version.getVersion;
 
@@ -112,7 +111,6 @@ public class MobileService {
 	public Map<String, Object> checkServer() {
 		Map<String, Object> result = new HashMap<>();
 		result.put("allowSelfRegister",  "1".equals(cfgDao.getConfValue(CONFIG_FRONTEND_REGISTER_KEY, String.class, "0")));
-		result.put("allowSoapRegister",  "1".equals(cfgDao.getConfValue(CONFIG_SOAP_REGISTER_KEY, String.class, "0")));
 		result.put("allowOauthRegister",  "1".equals(cfgDao.getConfValue(CONFIG_OAUTH_REGISTER_KEY, String.class, "0")));
 		return result;
 	}
@@ -213,52 +211,47 @@ public class MobileService {
 		return result;
 	}
 
+	public StreamClient create(User u, Sessiondata sd) {
+		StreamClient c = new StreamClient();
+		c.setMobile(true);
+		c.setOwnerSid(sd.getSessionId());
+		c.setUid(UUID.randomUUID().toString());
+		return create(c, u);
+	}
+
+	public StreamClient create(StreamClient c, User u) {
+		c.setUserId(u.getId());
+		c.setFirstname(u.getFirstname());
+		c.setLastname(u.getLastname());
+		if (c.getUserId() != null) {
+			c.setUsername(u.getLogin());
+			c.setFirstname(u.getFirstname());
+			c.setLastname(u.getLastname());
+			c.setEmail(u.getAddress() == null ? null : u.getAddress().getEmail());
+		}
+		c.setBroadCastId(UUID.randomUUID().toString());
+		return c;
+	}
+
 	private Map<String, Object> login(User u, Map<String, Object> result) {
 		if (u != null) {
 			IConnection conn = Red5.getConnectionLocal();
-			StreamClient c = sessionManager.get(IClientUtil.getId(conn.getClient()));
-			if (c == null) {
-				// Failed to create client
-				result.put("status", -1);
-			} else {
-				Sessiondata sd = sessionDao.check(c.getOwnerSid());
-				sd.setUserId(u.getId());
-				sd.setLanguageId(u.getLanguageId());
-				sessionDao.update(sd);
-				c.setUserId(u.getId());
-				c.setFirstname(u.getFirstname());
-				c.setLastname(u.getLastname());
-				/*TODO check this
-				rcm.setMobile(true);
-				rcm.setUserId(sd.getUserId());
-				if (rcm.getUserId() != null) {
-					User u = userDao.get(rcm.getUserId());
-					if (u == null) {
-						_log.error("Attempt of unauthorized room enter: USER not found, client is rejected");
-						return rejectClient();
-					}
-					rcm.setUsername(u.getLogin());
-					rcm.setFirstname(u.getFirstname());
-					rcm.setLastname(u.getLastname());
-					rcm.setEmail(u.getAddress() == null ? null : u.getAddress().getEmail());
-				}
-				rcm.setSecurityCode(sd.getSessionId());
-				rcm.setPublicSID(UUID.randomUUID().toString());
-				*/
-				sessionManager.update(c);
-				IClientUtil.init(conn.getClient(), c.getId(), false);
-
-				add(result, "sid", sd.getSessionId());
-				add(result, "uid", c.getUid());
-				add(result, "status", 0);
-				add(result, "userId", u.getId());
-				add(result, "firstname", u.getFirstname());
-				add(result, "lastname", u.getLastname());
-				add(result, "login", u.getLogin());
-				add(result, "email", u.getAddress() == null ? "" : u.getAddress().getEmail());
-				add(result, "language", u.getLanguageId());
-				add(result, "version", getVersion());
-			}
+			Sessiondata sd = sessionDao.create(u.getId(), u.getLanguageId());
+			StreamClient c = create(u, sd);
+			c.setScope(conn.getScope().getName());
+			sessionManager.add(c, null);
+			IClientUtil.init(conn.getClient(), c.getId(), false);
+
+			add(result, "sid", sd.getSessionId());
+			add(result, "publicSid", c.getUid());
+			add(result, "status", 0);
+			add(result, "userId", u.getId());
+			add(result, "firstname", u.getFirstname());
+			add(result, "lastname", u.getLastname());
+			add(result, "login", u.getLogin());
+			add(result, "email", u.getAddress() == null ? "" : u.getAddress().getEmail());
+			add(result, "language", u.getLanguageId());
+			add(result, "version", getVersion());
 		}
 		return result;
 	}
@@ -273,12 +266,12 @@ public class MobileService {
 				if (!Strings.isEmpty(c.getAvsettings()) && !c.isSharing()) {
 					//TODO duplicates !!!!!!!!!!!!!!
 					Map<String, Object> map = new HashMap<>();
-					add(map, "id", c.getId());
+					add(map, "streamId", c.getId());
 					add(map, "broadCastId", c.getBroadCastId());
 					add(map, "userId", c.getUserId());
 					add(map, "firstname", c.getFirstname());
 					add(map, "lastname", c.getLastname());
-					add(map, "uid", c.getUid());
+					add(map, "publicSid", c.getUid());
 					add(map, "login", c.getUsername());
 					add(map, "email", c.getEmail());
 					add(map, "avsettings", c.getAvsettings());
@@ -351,7 +344,8 @@ public class MobileService {
 		IConnection current = Red5.getConnectionLocal();
 		StreamClient c = sessionManager.get(IClientUtil.getId(current.getClient()));
 		Map<String, Object> result = new HashMap<>();
-		//FIXME TODO result.put("publicSid", c.getPublicSID());
+		result.put("publicSid", c.getUid());
+		result.put("broadCastId", c.getBroadCastId());
 		return result;
 	}
 
@@ -360,6 +354,7 @@ public class MobileService {
 		StreamClient c = sessionManager.get(IClientUtil.getId(current.getClient()));
 		c.setAvsettings(avMode);
 		if (!"n".equals(avMode)) {
+			c.setBroadCastId(UUID.randomUUID().toString());
 			c.setBroadcasting(true);
 		}
 		c.setWidth(Double.valueOf(width).intValue());
@@ -371,9 +366,13 @@ public class MobileService {
 		Map<String, Object> hsm = new HashMap<>();
 		hsm.put("client", c);
 		hsm.put("message", new String[]{"avsettings", "0", avMode});
+		Map<String, Object> result = new HashMap<>();
+		if (!"n".equals(avMode)) {
+			result.put("broadcastId", c.getBroadCastId());
+		}
 
 		scopeAdapter.sendMessageToCurrentScope("sendVarsToMessageWithClient", hsm, true, false);
-		return new HashMap<>();
+		return result;
 	}
 
 	public void sendChatMessage(String msg) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/0d32d43d/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
index b7a5755..80975c1 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
@@ -53,7 +53,6 @@ import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.room.SipDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.ServerDao;
-import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.entity.room.Room;
@@ -86,8 +85,11 @@ import com.github.openjson.JSONObject;
 public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter implements IPendingServiceCallback {
 	private static final Logger _log = Red5LoggerFactory.getLogger(ScopeApplicationAdapter.class, webAppRootKey);
 	private static final String OWNER_SID_PARAM = "ownerSid";
+	private static final String PARENT_SID_PARAM = "parentSid"; //mobile
+	private static final String MOBILE_PARAM = "mobileClient";
 	private static final String WIDTH_PARAM = "width";
 	private static final String HEIGHT_PARAM = "height";
+	public static final String HIBERNATE_SCOPE = "hibernate";
 	public static final String FLASH_SECURE = "secure";
 	public static final String FLASH_NATIVE_SSL = "native";
 	public static final String FLASH_PORT = "rtmpPort";
@@ -103,8 +105,6 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 	@Autowired
 	private ConfigurationDao cfgDao;
 	@Autowired
-	private SessiondataDao sessiondataDao;
-	@Autowired
 	private ConferenceLogDao conferenceLogDao;
 	@Autowired
 	private UserDao userDao;
@@ -198,15 +198,25 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 		}
 		String ownerSid = (String)connParams.get(OWNER_SID_PARAM);
 		if (Strings.isEmpty(ownerSid)) {
+			ownerSid = (String)connParams.get(PARENT_SID_PARAM);
+		}
+		if (Strings.isEmpty(ownerSid)) {
 			_log.warn("No Owner SID is provided, client is rejected");
 			return rejectClient();
 		}
 		StreamClient rcm = new StreamClient();
 		rcm.setScope(conn.getScope().getName());
-		if (rcm.getRoomId() == null && !"hibernate".equals(rcm.getScope())) {
+		boolean hibernate = HIBERNATE_SCOPE.equals(rcm.getScope());
+		if (hibernate) {
+			return true; //mobile initial connect
+		}
+		if (rcm.getRoomId() == null && !hibernate) {
 			_log.warn("Bad room specified, client is rejected");
 			return rejectClient();
 		}
+		if (Boolean.TRUE.equals(connParams.get(MOBILE_PARAM))) {
+			rcm.setMobile(true);
+		}
 		rcm.setUid(Strings.isEmpty(uid) ? UUID.randomUUID().toString() : uid);
 		rcm.setOwnerSid(ownerSid);
 		rcm.setUserport(conn.getRemotePort());
@@ -581,14 +591,14 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 		}
 	}
 
-	private void sendSharingStoped(StreamClient rcl) {
+	private static void sendSharingStoped(StreamClient rcl) {
 		JSONObject obj = new JSONObject()
 				.put("ownerSid", rcl.getOwnerSid())
 				.put("uid", rcl.getUid());
 		WebSocketHelper.sendRoom(new TextRoomMessage(rcl.getRoomId(), rcl.getUserId(), RoomMessage.Type.sharingStoped, obj.toString()));
 	}
 
-	private void sendStreamClosed(StreamClient rcl) {
+	private static void sendStreamClosed(StreamClient rcl) {
 		JSONObject obj = new JSONObject()
 				.put("uid", rcl.getUid())
 				.put("ownerSid", rcl.getOwnerSid())

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/0d32d43d/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
index 0ab5c10..f62e3fd 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/session/store/HashMapStore.java
@@ -63,15 +63,11 @@ public class HashMapStore implements IClientPersistenceStore {
 
 	@Override
 	public StreamClient put(StreamClient rcl) {
-		if (rcl.getId() != null) {
-			log.error("Tried to add Client with not NULL ID {}", rcl.getId());
-			return null;
-		} else {
+		if (rcl.getId() == null) {
 			rcl.setId(nextId.getAndIncrement());
 		}
 		if (clientsById.containsKey(rcl.getId())) {
-			log.error("Tried to add an existing Client {}", rcl.getId());
-			return null;
+			log.debug("Updating Client {}", rcl.getId());
 		}
 		clientsById.put(rcl.getId(), rcl);
 		return rcl;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/0d32d43d/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
----------------------------------------------------------------------
diff --git a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
index d8e604d..8d2a829 100644
--- a/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
+++ b/openmeetings-service/src/main/java/org/apache/openmeetings/service/user/UserManager.java
@@ -445,16 +445,20 @@ public class UserManager implements IUserManager {
 			}
 
 			String scopeName = "hibernate";
-			if (rcl.getRoomId() != null) {
-				scopeName = rcl.getRoomId().toString();
+			if (rcl.getScope() != null) {
+				scopeName = rcl.getScope();
+			}
+			IScope scope = scopeApplicationAdapter.getRoomScope(scopeName);
+			if (scope == null) {
+				log.warn("### kickById ### The scope is NULL");
+				return false;
 			}
-			IScope currentScope = scopeApplicationAdapter.getRoomScope(scopeName);
 
 			Map<Integer, String> messageObj = new HashMap<>();
 			messageObj.put(0, "kick");
-			scopeApplicationAdapter.sendMessageById(messageObj, rcl.getId(), currentScope);
+			scopeApplicationAdapter.sendMessageById(messageObj, rcl.getId(), scope);
 
-			scopeApplicationAdapter.roomLeaveByScope(rcl, currentScope);
+			scopeApplicationAdapter.roomLeaveByScope(rcl, scope);
 
 			return true;
 		} catch (Exception err) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/0d32d43d/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
index 3c861e1..d4b2148 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.java
@@ -44,11 +44,13 @@ import java.util.function.Predicate;
 import org.apache.directory.api.util.Strings;
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.remote.MainService;
+import org.apache.openmeetings.core.remote.MobileService;
 import org.apache.openmeetings.core.remote.ScopeApplicationAdapter;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.log.ConferenceLogDao;
+import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
@@ -59,6 +61,7 @@ import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.StreamClient;
+import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Type;
 import org.apache.openmeetings.util.InitializationContainer;
@@ -308,8 +311,12 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		Client client = getClientBySid(rcl.getOwnerSid());
 		if (client == null) {
 			if (rcl.isMobile()) {
+				Sessiondata sd = getBean(SessiondataDao.class).check(rcl.getOwnerSid());
+				UserDao udao = getBean(UserDao.class);
+				User u = udao.get(sd.getUserId());
+				rcl = getBean(MobileService.class).create(rcl, u);
 				//Mobile client enters the room
-				client = new Client(rcl, getBean(UserDao.class));
+				client = new Client(rcl, udao);
 				addOnlineUser(client);
 				if (rcl.getRoomId() != null) {
 					client.setCam(0);
@@ -327,10 +334,12 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 			//TODO mobile
 			return null;
 		}
-		rcl.setUserId(client.getUser().getId());
-		rcl.setUsername(client.getUser().getLogin());
-		rcl.setFirstname(client.getUser().getFirstname());
-		rcl.setLastname(client.getUser().getLastname());
+		User u = client.getUser();
+		rcl.setUserId(u.getId());
+		rcl.setUsername(u.getLogin());
+		rcl.setFirstname(u.getFirstname());
+		rcl.setLastname(u.getLastname());
+		rcl.setEmail(u.getAddress() == null ? null : u.getAddress().getEmail());
 		rcl.setSuperMod(client.hasRight(Right.superModerator));
 		rcl.setMod(client.hasRight(Right.moderator));
 		rcl.setCanVideo(client.hasRight(Right.video) && client.isCamEnabled() && client.hasActivity(Activity.broadcastV));

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/0d32d43d/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
----------------------------------------------------------------------
diff --git a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
index 1009f39..2106686 100644
--- a/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
+++ b/openmeetings-web/src/main/webapp/WEB-INF/classes/logback-config.xml
@@ -32,7 +32,7 @@
 		<ImmediateFlush>true</ImmediateFlush>
 		<layout class="ch.qos.logback.classic.PatternLayout">
 			<Pattern>
-				%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%t] - %m%n
+				%5p %d{MM-dd HH:mm:ss.SSS } %c{15}:%L [%.15thread] - %m%n
 			</Pattern>
 		</layout>
 		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
@@ -48,7 +48,7 @@
 	</appender>
 	<appender name="CONSOLE2" class="ch.qos.logback.core.ConsoleAppender">
 		<layout class="ch.qos.logback.classic.PatternLayout">
-			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %r %L %c{15} [%t] - %m%n</pattern>
+			<pattern>%5p %d{MM-dd HH:mm:ss.SSS } %r %L %c{15} [%.15thread] - %m%n</pattern>
 		</layout>
 	</appender>
 	<logger name="com.mchange.v2" level="ERROR" />