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 2020/04/04 07:11:40 UTC

[openmeetings] branch master updated: [OPENMEETINGS-2203] hashes are redirected to the correct node

This is an automated email from the ASF dual-hosted git repository.

solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git


The following commit(s) were added to refs/heads/master by this push:
     new 9f2e12c  [OPENMEETINGS-2203] hashes are redirected to the correct node
9f2e12c is described below

commit 9f2e12c704455994526eeb1509d332c0067ba149
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Sat Apr 4 14:11:21 2020 +0700

    [OPENMEETINGS-2203] hashes are redirected to the correct node
---
 .../openmeetings/db/dao/room/InvitationDao.java    | 16 ++++---
 .../apache/openmeetings/web/app/Application.java   |  3 ++
 .../apache/openmeetings/web/app/ClientManager.java | 19 +++++----
 .../apache/openmeetings/web/app/WebSession.java    | 49 +++++++++++++++++++---
 .../openmeetings/web/util/OmUrlFragment.java       |  2 +-
 .../webservice/TestCalendarService.java            |  2 +-
 6 files changed, 71 insertions(+), 20 deletions(-)

diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java
index 331d13a..df76dcc 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/room/InvitationDao.java
@@ -40,6 +40,7 @@ import javax.persistence.PersistenceContext;
 
 import org.apache.openmeetings.db.dao.IDataProviderDao;
 import org.apache.openmeetings.db.entity.room.Invitation;
+import org.apache.openmeetings.db.entity.room.Invitation.Valid;
 import org.apache.openmeetings.util.CalendarHelper;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
@@ -138,7 +139,15 @@ public class InvitationDao implements IDataProviderDao<Invitation> {
 		update(entity, userId);
 	}
 
-	public Invitation getByHash(String hash, boolean hidePass, boolean markUsed) {
+	public void markUsed(Invitation i) {
+		if (Valid.ONE_TIME == i.getValid()) {
+			i.setUsed(true);
+			update(i);
+			em.flush(); // flash is required to eliminate 'detach' effect
+		}
+	}
+
+	public Invitation getByHash(String hash, boolean hidePass) {
 		List<Invitation> list = em.createNamedQuery("getInvitationByHashCode", Invitation.class)
 				.setParameter("hashCode", hash).getResultList();
 		Invitation i = list != null && list.size() == 1 ? list.get(0) : null;
@@ -147,11 +156,6 @@ public class InvitationDao implements IDataProviderDao<Invitation> {
 				case ONE_TIME:
 					// one-time invitation
 					i.setAllowEntry(!i.isUsed());
-					if (markUsed) {
-						i.setUsed(true);
-						update(i);
-						em.flush(); // flash is required to eliminate 'detach' effect
-					}
 					break;
 				case PERIOD:
 					String tzId = i.getInvitee().getTimeZoneId();
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 9253c2e..ab47770 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
@@ -602,6 +602,9 @@ public class Application extends AuthenticatedWebApplication implements IApplica
 		RequestCycle rc = RequestCycle.get();
 		String baseUrl = isUrlValid(inBaseUrl) ? inBaseUrl
 				: (isUrlValid(getBaseUrl()) ? getBaseUrl() : "");
+		if (!Strings.isEmpty(baseUrl) && !baseUrl.endsWith("/")) {
+			baseUrl += "/";
+		}
 		return rc.getUrlRenderer().renderFullUrl(Url.parse(baseUrl + rc.mapUrlFor(clazz, pp)));
 	}
 
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
index 6a5239e..8ecf8ce 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/ClientManager.java
@@ -32,6 +32,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -45,6 +46,7 @@ import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.util.collections.ConcurrentHashSet;
 import org.apache.wicket.util.string.StringValue;
 import org.slf4j.Logger;
@@ -358,31 +360,34 @@ public class ClientManager implements IClientManager {
 		}
 	}
 
-	private String getServerUrl(Map.Entry<String, ServerInfo> e, Room r) {
+	private String getServerUrl(Map.Entry<String, ServerInfo> e, Room r, Function<String, String> generator) {
 		final String curServerId = app.getServerId();
 		String serverId = e.getKey();
 		if (!curServerId.equals(serverId)) {
 			addRoomToServer(serverId, r);
-			String uuid = UUID.randomUUID().toString();
-			tokens().put(uuid, new InstantToken(getUserId(), r.getId()));
-			return e.getValue().getUrl() + "?token=" + uuid;
+			return generator.apply(e.getValue().getUrl());
 		}
 		return null;
 	}
 
-	public String getServerUrl(Room r) {
+	public String getServerUrl(Room r, Function<String, String> inGenerator) {
 		if (onlineServers.size() == 1) {
 			return null;
 		}
+		Function<String, String> generator = inGenerator == null ? baseUrl -> {
+			String uuid = UUID.randomUUID().toString();
+			tokens().put(uuid, new InstantToken(getUserId(), r.getId()));
+			return Application.urlForPage(Application.get().getHomePage(), new PageParameters().add("token", uuid), baseUrl);
+		} : inGenerator;
 		Optional<Map.Entry<String, ServerInfo>> existing = onlineServers.entrySet().stream()
 				.filter(e -> e.getValue().getRooms().contains(r.getId()))
 				.findFirst();
 		if (existing.isPresent()) {
-			return getServerUrl(existing.get(), r);
+			return getServerUrl(existing.get(), r, generator);
 		}
 		Optional<Map.Entry<String, ServerInfo>> min = onlineServers.entrySet().stream()
 				.min((e1, e2) -> e1.getValue().getCapacity() - e2.getValue().getCapacity());
-		return getServerUrl(min.get(), r);
+		return getServerUrl(min.get(), r, generator);
 	}
 
 	Optional<InstantToken> getToken(StringValue uuid) {
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
index 7bce259..4725e28 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WebSession.java
@@ -47,11 +47,13 @@ import org.apache.openmeetings.core.ldap.LdapLoginManager;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.dao.room.InvitationDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.SOAPLoginDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.room.Invitation;
+import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.server.RemoteSessionObject;
 import org.apache.openmeetings.db.entity.server.SOAPLogin;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
@@ -64,6 +66,7 @@ import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.openmeetings.db.util.LocaleHelper;
 import org.apache.openmeetings.util.OmException;
 import org.apache.openmeetings.web.app.ClientManager.InstantToken;
+import org.apache.openmeetings.web.pages.HashPage;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidget;
 import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor;
 import org.apache.openmeetings.web.user.dashboard.RssWidget;
@@ -80,8 +83,11 @@ import org.apache.wicket.authentication.IAuthenticationStrategy;
 import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession;
 import org.apache.wicket.authroles.authorization.strategies.role.Roles;
 import org.apache.wicket.injection.Injector;
+import org.apache.wicket.request.IRequestParameters;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.flow.RedirectToUrlException;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
 import org.apache.wicket.spring.injection.annot.SpringBean;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
@@ -130,6 +136,8 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 	private LdapLoginManager ldapManager;
 	@SpringBean
 	private ConfigurationDao cfgDao;
+	@SpringBean
+	private RoomDao roomDao;
 
 	public WebSession(Request request) {
 		super(request);
@@ -198,6 +206,26 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 		return userId != null && userId.longValue() > 0;
 	}
 
+	private void redirectHash(Room r, Runnable nullAction) {
+		if (r != null) {
+			String url = cm.getServerUrl(r, baseUrl -> {
+				PageParameters params = new PageParameters();
+				IRequestParameters reqParams = RequestCycle.get().getRequest().getQueryParameters();
+				reqParams.getParameterNames().forEach(name -> {
+					params.add(name, reqParams.getParameterValue(name));
+				});
+				return Application.urlForPage(HashPage.class
+						, params
+						, baseUrl);
+			});
+			if (url == null) {
+				nullAction.run();
+			} else {
+				throw new RedirectToUrlException(url);
+			}
+		}
+	}
+
 	public void checkHashes(StringValue secure, StringValue invitation) {
 		try {
 			if (!secure.isEmpty() && (soap == null || !soap.getHash().equals(secure.toString()))) {
@@ -212,21 +240,27 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 				if (isSignedIn()) {
 					invalidateNow();
 				}
-				i = inviteDao.getByHash(invitation.toString(), false, true);
+				i = inviteDao.getByHash(invitation.toString(), false);
+				Room r = null;
 				if (i != null && i.isAllowEntry()) {
 					Set<Right> hrights = new HashSet<>();
 					if (i.getRoom() != null) {
-						hrights.add(Right.ROOM);
-						roomId = i.getRoom().getId();
+						r = i.getRoom();
 					} else if (i.getAppointment() != null && i.getAppointment().getRoom() != null) {
-						hrights.add(Right.ROOM);
-						roomId = i.getAppointment().getRoom().getId();
+						r = i.getAppointment().getRoom();
 					} else if (i.getRecording() != null) {
 						recordingId = i.getRecording().getId();
 					}
+					if (r != null) {
+						redirectHash(r, () -> inviteDao.markUsed(i));
+						hrights.add(Right.ROOM);
+						roomId = r.getId();
+					}
 					setUser(i.getInvitee(), hrights);
 				}
 			}
+		} catch (RedirectToUrlException e) {
+			throw e;
 		} catch (Exception e) {
 			log.error("Unexpected exception while checking hashes", e);
 		}
@@ -242,6 +276,11 @@ public class WebSession extends AbstractAuthenticatedWebSession implements IWebS
 			if (sd.getXml() != null) {
 				RemoteSessionObject remoteUser = RemoteSessionObject.fromString(sd.getXml());
 				if (remoteUser != null && !Strings.isEmpty(remoteUser.getExternalId())) {
+					Room r = roomDao.get(soapLogin.getRoomId());
+					if (r == null) {
+						return false;
+					}
+					redirectHash(r, () -> {});
 					User user = userDao.getExternalUser(remoteUser.getExternalId(), remoteUser.getExternalType());
 					if (user == null) {
 						user = getNewUserInstance(null);
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
index a01f215..a92c8cc 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/util/OmUrlFragment.java
@@ -294,7 +294,7 @@ public class OmUrlFragment implements Serializable {
 	}
 
 	private static void moveToServer(Room r) {
-		String url = Application.get().getBean(ClientManager.class).getServerUrl(r);
+		String url = Application.get().getBean(ClientManager.class).getServerUrl(r, null);
 		if (url != null) {
 			throw new RedirectToUrlException(url);
 		}
diff --git a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
index ab00b0d..e50f5ff 100644
--- a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
+++ b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestCalendarService.java
@@ -268,7 +268,7 @@ public class TestCalendarService extends AbstractWebServiceTest {
 		assertEquals(1, dto.getMeetingMembers().size(), "DTO should have 1 attendees");
 
 		assertNull(mmDao.get(mmId), "Meeting member should deleted");
-		assertNull(getBean(InvitationDao.class).getByHash(hash, true, false), "Invitation should deleted");
+		assertNull(getBean(InvitationDao.class).getByHash(hash, true), "Invitation should deleted");
 		User uc = getBean(UserDao.class).get(mmUserId);
 		assertNotNull(uc, "Meeting member user should not be deleted");
 		assertFalse(uc.isDeleted(), "Meeting member user should not be deleted");