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 95bd6a0 [OPENMEETINGS-2186] initial commit on token
95bd6a0 is described below
commit 95bd6a00c2f75870b4cc7fedaa108e225b2c8c14
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Tue Mar 24 22:35:08 2020 +0700
[OPENMEETINGS-2186] initial commit on token
---
.../db/dao/basic/ConfigurationDao.java | 10 ++++
.../openmeetings/util/OpenmeetingsVariables.java | 9 ++++
.../apache/openmeetings/web/app/ClientManager.java | 57 +++++++++++++++++++---
.../apache/openmeetings/web/app/WebSession.java | 13 ++++-
.../apache/openmeetings/web/common/MainPanel.java | 4 +-
.../openmeetings/web/user/MessageDialog.java | 4 +-
.../web/user/calendar/AppointmentDialog.java | 4 +-
.../openmeetings/web/util/OmUrlFragment.java | 13 ++---
8 files changed, 91 insertions(+), 23 deletions(-)
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
index f912111..70f11e1 100644
---
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ConfigurationDao.java
@@ -50,6 +50,7 @@ import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MIC_RATE
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_BITRATE;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_AUDIO_RATE;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MP4_VIDEO_PRESET;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_PASS_MIN_LENGTH;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_FRONTEND;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_REGISTER_OAUTH;
@@ -87,6 +88,7 @@ import static
org.apache.openmeetings.util.OpenmeetingsVariables.setMinFnameLeng
import static
org.apache.openmeetings.util.OpenmeetingsVariables.setMinLnameLength;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.setMinLoginLength;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.setMinPasswdLength;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.setMyRoomsEnabled;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.setRestAllowOrigin;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.setRoomSettings;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.setSendRegisterEmail;
@@ -393,6 +395,9 @@ public class ConfigurationDao implements
IDataProviderDao<Configuration> {
case CONFIG_DISPLAY_NAME_EDITABLE:
reloadDisplayNameEditable();
break;
+ case CONFIG_MYROOMS_ENABLED:
+ reloadMyRoomsEnabled();
+ break;
}
return entity;
}
@@ -528,6 +533,10 @@ public class ConfigurationDao implements
IDataProviderDao<Configuration> {
setDisplayNameEditable(getBool(CONFIG_DISPLAY_NAME_EDITABLE,
false));
}
+ private void reloadMyRoomsEnabled() {
+ setMyRoomsEnabled(getBool(CONFIG_MYROOMS_ENABLED, true));
+ }
+
public void reinit() {
reloadMaxUpload();
reloadCrypt();
@@ -557,6 +566,7 @@ public class ConfigurationDao implements
IDataProviderDao<Configuration> {
reloadXFrameOptions();
reloadContentSecurityPolicy();
reloadDisplayNameEditable();
+ reloadMyRoomsEnabled();
}
private static JSONObject getHotkey(String value) {
diff --git
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
index d9005ab..2c7f647 100644
---
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
+++
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
@@ -142,6 +142,7 @@ public class OpenmeetingsVariables {
private static String contentSecurityPolicy = HEADER_CSP_SELF;
private static String xFrameOptions = HEADER_XFRAME_SELF;
private static boolean displayNameEditable = false;
+ private static boolean myRoomsEnabled = true;
private OpenmeetingsVariables() {}
@@ -404,4 +405,12 @@ public class OpenmeetingsVariables {
public static void setDisplayNameEditable(boolean editable) {
displayNameEditable = editable;
}
+
+ public static boolean isMyRoomsEnabled() {
+ return myRoomsEnabled;
+ }
+
+ public static void setMyRoomsEnabled(boolean enabled) {
+ myRoomsEnabled = enabled;
+ }
}
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 42f5229..26f2442 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
@@ -19,6 +19,7 @@
package org.apache.openmeetings.web.app;
import static org.apache.openmeetings.core.util.WebSocketHelper.sendRoom;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
import java.io.Serializable;
import java.util.ArrayList;
@@ -29,6 +30,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
+import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -44,6 +46,7 @@ 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.util.collections.ConcurrentHashSet;
+import org.apache.wicket.util.string.StringValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -62,6 +65,7 @@ public class ClientManager implements IClientManager {
private static final String ROOMS_KEY = "ROOMS_KEY";
private static final String ONLINE_USERS_KEY = "ONLINE_USERS_KEY";
private static final String SERVERS_KEY = "SERVERS_KEY";
+ private static final String INSTANT_TOKENS_KEY = "INSTANT_TOKENS_KEY";
private static final String UID_BY_SID_KEY = "UID_BY_SID_KEY";
private final Map<String, Client> onlineClients = new
ConcurrentHashMap<>();
private final Map<Long, Set<String>> onlineRooms = new
ConcurrentHashMap<>();
@@ -90,6 +94,10 @@ public class ClientManager implements IClientManager {
return app.hazelcast.getMap(SERVERS_KEY);
}
+ private IMap<String, InstantToken> tokens() {
+ return app.hazelcast.getMap(INSTANT_TOKENS_KEY);
+ }
+
@PostConstruct
void init() {
map().addEntryListener(new ClientListener(), true);
@@ -220,7 +228,13 @@ public class ClientManager implements IClientManager {
onlineRooms.put(roomId, set);
rooms.unlock(roomId);
String serverId = c.getServerId();
- if (!onlineServers.get(serverId).getRooms().contains(roomId)) {
+ addRoomToServer(serverId, r);
+ update(c);
+ return count;
+ }
+
+ private void addRoomToServer(String serverId, Room r) {
+ if
(!onlineServers.get(serverId).getRooms().contains(r.getId())) {
IMap<String, ServerInfo> servers = servers();
servers.lock(serverId);
ServerInfo si = servers.get(serverId);
@@ -229,8 +243,6 @@ public class ClientManager implements IClientManager {
onlineServers.put(serverId, si);
servers.unlock(serverId);
}
- update(c);
- return count;
}
public Client removeFromRoom(Client c) {
@@ -346,13 +358,13 @@ public class ClientManager implements IClientManager {
}
}
- public String getServerUrl(Long roomId) {
- if (roomId == null || onlineServers.size() == 1) {
+ public String getServerUrl(Room r) {
+ if (onlineServers.size() == 1) {
return null;
}
final String curServerId = app.getServerId();
Optional<Map.Entry<String, ServerInfo>> existing =
onlineServers.entrySet().stream()
- .filter(e ->
e.getValue().getRooms().contains(roomId))
+ .filter(e ->
e.getValue().getRooms().contains(r.getId()))
.findFirst();
if (existing.isPresent()) {
String serverId = existing.get().getKey();
@@ -361,7 +373,17 @@ public class ClientManager implements IClientManager {
Optional<Map.Entry<String, ServerInfo>> min =
onlineServers.entrySet().stream()
.min((e1, e2) -> e1.getValue().getCapacity() -
e2.getValue().getCapacity());
String serverId = min.get().getKey();
- return curServerId.equals(serverId) ? null :
min.get().getValue().getUrl();
+ if (!curServerId.equals(serverId)) {
+ addRoomToServer(serverId, r);
+ String uuid = UUID.randomUUID().toString();
+ tokens().put(uuid, new InstantToken(getUserId(),
r.getId()));
+ return min.get().getValue().getUrl() + "?token=" + uuid;
+ }
+ return null;
+ }
+
+ Optional<InstantToken> getToken(StringValue uuid) {
+ return uuid.isEmpty() ? Optional.empty() :
Optional.ofNullable(tokens().remove(uuid.toString()));
}
public class ClientListener implements
@@ -453,4 +475,25 @@ public class ClientManager implements IClientManager {
return rooms;
}
}
+
+ public static class InstantToken implements Serializable {
+ private static final long serialVersionUID = 1L;
+ private final long userId;
+ private final long roomId;
+ private final long created;
+
+ InstantToken(long userId, long roomId) {
+ this.userId = userId;
+ this.roomId = roomId;
+ created = System.currentTimeMillis();
+ }
+
+ public long getUserId() {
+ return userId;
+ }
+
+ public long getRoomId() {
+ return roomId;
+ }
+ }
}
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 a358507..7bce259 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
@@ -23,8 +23,8 @@ import static
org.apache.openmeetings.db.util.TimezoneUtil.getTimeZone;
import static
org.apache.openmeetings.util.CalendarPatterns.ISO8601_FULL_FORMAT_STRING;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_MYROOMS;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DASHBOARD_SHOW_RSS;
-import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
import static
org.apache.openmeetings.web.app.Application.getAuthenticationStrategy;
import static org.apache.openmeetings.web.app.Application.getDashboardContext;
import static org.apache.openmeetings.web.app.Application.isInvaldSession;
@@ -37,6 +37,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Optional;
import java.util.Set;
import java.util.TimeZone;
@@ -62,6 +63,7 @@ import org.apache.openmeetings.db.util.AuthLevelUtil;
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.user.dashboard.MyRoomsWidget;
import org.apache.openmeetings.web.user.dashboard.MyRoomsWidgetDescriptor;
import org.apache.openmeetings.web.user.dashboard.RssWidget;
@@ -70,6 +72,7 @@ import
org.apache.openmeetings.web.user.dashboard.StartWidgetDescriptor;
import org.apache.openmeetings.web.user.dashboard.WelcomeWidgetDescriptor;
import org.apache.openmeetings.web.user.dashboard.admin.AdminWidget;
import org.apache.openmeetings.web.user.dashboard.admin.AdminWidgetDescriptor;
+import org.apache.openmeetings.web.user.rooms.RoomEnterBehavior;
import org.apache.openmeetings.web.util.ExtendedClientProperties;
import org.apache.openmeetings.web.util.OmUrlFragment;
import org.apache.openmeetings.web.util.UserDashboard;
@@ -78,6 +81,7 @@ import
org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSessio
import org.apache.wicket.authroles.authorization.strategies.role.Roles;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.request.Request;
+import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.string.Strings;
@@ -164,6 +168,11 @@ public class WebSession extends
AbstractAuthenticatedWebSession implements IWebS
@Override
public boolean isSignedIn() {
+ Optional<InstantToken> token =
cm.getToken(RequestCycle.get().getRequest().getQueryParameters().getParameterValue("token"));
+ if (token.isPresent()) {
+ signIn(userDao.get(token.get().getUserId()));
+ area =
RoomEnterBehavior.getRoomUrlFragment(token.get().getRoomId());
+ }
if (userId == null) {
IAuthenticationStrategy strategy =
getAuthenticationStrategy();
// get username and password from persistence store
@@ -459,7 +468,7 @@ public class WebSession extends
AbstractAuthenticatedWebSession implements IWebS
DashboardContext dashboardContext = getDashboardContext();
dashboard =
(UserDashboard)dashboardContext.getDashboardPersister().load();
boolean existMyRoomWidget = false, existRssWidget = false,
existAdminWidget = false;
- boolean showMyRoomConfValue =
cfgDao.getBool(CONFIG_MYROOMS_ENABLED, true) &&
cfgDao.getBool(CONFIG_DASHBOARD_SHOW_MYROOMS, false);
+ boolean showMyRoomConfValue = isMyRoomsEnabled() &&
cfgDao.getBool(CONFIG_DASHBOARD_SHOW_MYROOMS, false);
boolean showRssConfValue =
cfgDao.getBool(CONFIG_DASHBOARD_SHOW_RSS, false);
boolean showAdminWidget =
getRights().contains(User.Right.ADMIN);
boolean save = false;
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
index b4e53dc..cc4b6ee 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/MainPanel.java
@@ -21,8 +21,8 @@ package org.apache.openmeetings.web.common;
import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
import static org.apache.openmeetings.util.OpenmeetingsVariables.ATTR_CLASS;
-import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
import static org.apache.openmeetings.util.OpenmeetingsVariables.PARAM_USER_ID;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
import static
org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder.newOkCancelConfirm;
import static
org.apache.openmeetings.web.util.CallbackFunctionHelper.getNamedFunction;
@@ -334,7 +334,7 @@ public class MainPanel extends Panel {
List<INavbarComponent> l = new ArrayList<>();
l.add(getSubItem("777", "1506",
MenuActions.conferenceModuleRoomList, MenuParams.publicTabButton));
l.add(getSubItem("779", "1507",
MenuActions.conferenceModuleRoomList, MenuParams.privateTabButton));
- if (cfgDao.getBool(CONFIG_MYROOMS_ENABLED, true)) {
+ if (isMyRoomsEnabled()) {
l.add(getSubItem("781", "1508",
MenuActions.conferenceModuleRoomList, MenuParams.myTabButton));
}
List<Room> recent = roomDao.getRecent(getUserId());
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
index 0399af7..b72f77b 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/MessageDialog.java
@@ -20,7 +20,7 @@ package org.apache.openmeetings.web.user;
import static
org.apache.openmeetings.db.entity.user.PrivateMessage.INBOX_FOLDER_ID;
import static
org.apache.openmeetings.db.entity.user.PrivateMessage.SENT_FOLDER_ID;
-import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
import static org.apache.openmeetings.web.app.Application.getContactsLink;
import static org.apache.openmeetings.web.app.Application.getInvitationLink;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
@@ -228,7 +228,7 @@ public class MessageDialog extends Modal<PrivateMessage> {
target.add(bookedRoom, roomParamsBlock);
}
}));
- bookedRoom.setVisible(cfgDao.getBool(CONFIG_MYROOMS_ENABLED,
true));
+ bookedRoom.setVisible(isMyRoomsEnabled());
roomParamsBlock.add(roomParams);
roomParams.add(new RoomTypeDropDown("room.type"));
roomParams.add(start);
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
index b46f0a0..338476d 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/calendar/AppointmentDialog.java
@@ -18,7 +18,7 @@
*/
package org.apache.openmeetings.web.user.calendar;
-import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
import static org.apache.openmeetings.web.app.WebSession.getRights;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
import static
org.apache.openmeetings.web.common.confirmation.ConfirmableAjaxBorder.newOkCancelDangerConfirm;
@@ -309,7 +309,7 @@ public class AppointmentDialog extends Modal<Appointment> {
super(id, model);
setOutputMarkupId(true);
- myRoomsAllowed = cfgDao.getBool(CONFIG_MYROOMS_ENABLED,
true);
+ myRoomsAllowed = isMyRoomsEnabled();
createRoom = myRoomsAllowed;
}
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 e73e3e6..a01f215 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
@@ -19,8 +19,8 @@
package org.apache.openmeetings.web.util;
import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANDING_ZONE;
-import static
org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_MYROOMS_ENABLED;
import static org.apache.openmeetings.util.OpenmeetingsVariables.getBaseUrl;
+import static
org.apache.openmeetings.util.OpenmeetingsVariables.isMyRoomsEnabled;
import static
org.apache.openmeetings.web.user.profile.SettingsPanel.EDIT_PROFILE_TAB_ID;
import static
org.apache.openmeetings.web.user.profile.SettingsPanel.MESSAGES_TAB_ID;
@@ -255,7 +255,7 @@ public class OmUrlFragment implements Serializable {
Long roomId = Long.valueOf(type);
Room r =
Application.get().getBean(RoomDao.class).get(roomId);
if (r != null) {
- moveToServer(roomId);
+ moveToServer(r);
basePanel = new
RoomPanel(CHILD_ID, r);
}
} catch(NumberFormatException ne) {
@@ -269,7 +269,7 @@ public class OmUrlFragment implements Serializable {
MenuParams params = MenuParams.publicTabButton;
if (TYPE_GROUP.equals(type)) {
params = MenuParams.privateTabButton;
- } else if
(Application.get().getBean(ConfigurationDao.class).getBool(CONFIG_MYROOMS_ENABLED,
true) && TYPE_MY.equals(type)) {
+ } else if (isMyRoomsEnabled() &&
TYPE_MY.equals(type)) {
params = MenuParams.myTabButton;
}
basePanel = new RoomsSelectorPanel(CHILD_ID,
params);
@@ -293,11 +293,8 @@ public class OmUrlFragment implements Serializable {
return getBaseUrl() + "#" + getArea().name() + "/" + getType();
}
- private static void moveToServer(Long roomId) {
- if (roomId == null) {
- return;
- }
- String url =
Application.get().getBean(ClientManager.class).getServerUrl(roomId);
+ private static void moveToServer(Room r) {
+ String url =
Application.get().getBean(ClientManager.class).getServerUrl(r);
if (url != null) {
throw new RedirectToUrlException(url);
}