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 <[email protected]>
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");

Reply via email to