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");