From 51fea44bfa396e0c0abe4696fdd0a0390de24e30 Mon Sep 17 00:00:00 2001 From: serge-rider Date: Sun, 30 Oct 2022 13:54:10 -0400 Subject: [PATCH] CB-2793 Use per-session resource controller --- .../model/app/BaseWebApplication.java | 17 +++++------------ .../cloudbeaver/model/app/WebApplication.java | 2 +- .../cloudbeaver/model/session/WebSession.java | 8 +++++++- .../model/session/WebUserContext.java | 5 ----- .../io/cloudbeaver/server/CBApplication.java | 10 ++-------- 5 files changed, 15 insertions(+), 27 deletions(-) diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java index 9de6f86dcb..bf7ebc726f 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/BaseWebApplication.java @@ -60,14 +60,17 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements private static final Log log = Log.getLog(BaseWebApplication.class); - private RMController rmController; - @NotNull @Override public DBPWorkspace createWorkspace(@NotNull DBPPlatform platform, @NotNull IWorkspace eclipseWorkspace) { return new WebWorkspace(platform, eclipseWorkspace); } + @Override + public RMController createResourceController(@NotNull SMCredentialsProvider credentialsProvider) { + throw new IllegalStateException("Resource controller is not supported by " + getClass().getSimpleName()); + } + @Nullable @Override public Path getDefaultWorkingFolder() { @@ -142,16 +145,6 @@ public abstract class BaseWebApplication extends BaseApplicationImpl implements return new LocalSecretController("user/" + credentialsProvider.getActiveUserCredentials().getUserId()); } - @Override - public synchronized RMController getResourceController() { - if (rmController == null) { - rmController = createResourceController(); - } - return rmController; - } - - protected abstract RMController createResourceController(); - protected Map getServerConfigProps(Map configProps) { return JSONUtils.getObject(configProps, "server"); } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java index a4aebc24a7..a2f57c0edf 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/app/WebApplication.java @@ -59,7 +59,7 @@ public interface WebApplication extends DBPApplication { DBSSecretController getSecretController(@NotNull SMCredentialsProvider credentialsProvider) throws DBException; - RMController getResourceController(); + RMController createResourceController(@NotNull SMCredentialsProvider credentialsProvider); String getServerURL(); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java index 34b0354b2b..09878556fd 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSession.java @@ -127,6 +127,8 @@ public class WebSession extends AbstractSessionPersistent private final WebUserContext userContext; private final List sessionEvents = new ArrayList<>(); + private RMController rmController; + public WebSession( @NotNull HttpSession httpSession, @NotNull WebApplication application, @@ -143,6 +145,7 @@ public class WebSession extends AbstractSessionPersistent this.sessionHandlers = sessionHandlers; this.userContext = new WebUserContext(application); this.maxSessionIdleTime = maxSessionIdleTime; + this.rmController = application.createResourceController(this); } @NotNull @@ -273,7 +276,7 @@ public class WebSession extends AbstractSessionPersistent } public synchronized RMController getRmController() { - return userContext.getRmController(); + return rmController; } public synchronized void refreshUserData() { @@ -472,6 +475,9 @@ public class WebSession extends AbstractSessionPersistent addSessionError(e); log.error("Error reading session permissions", e); } + + // Initialize new resource controller + this.rmController = application.createResourceController(this); } private synchronized void refreshAccessibleConnectionIds() { diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java index 7dfcd0f6ac..7338aa2ba4 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebUserContext.java @@ -28,7 +28,6 @@ import org.jkiss.dbeaver.model.auth.SMAuthStatus; import org.jkiss.dbeaver.model.auth.SMCredentials; import org.jkiss.dbeaver.model.auth.SMCredentialsProvider; import org.jkiss.dbeaver.model.exec.DBCException; -import org.jkiss.dbeaver.model.rm.RMController; import org.jkiss.dbeaver.model.security.SMAdminController; import org.jkiss.dbeaver.model.security.SMController; import org.jkiss.utils.CommonUtils; @@ -155,10 +154,6 @@ public class WebUserContext implements SMCredentialsProvider { return adminSecurityController; } - public synchronized RMController getRmController() { - return application.getResourceController(); - } - public synchronized Set getUserPermissions() { return userPermissions; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java index ee4689f7c9..fb6763f7d4 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java @@ -29,7 +29,6 @@ import io.cloudbeaver.model.app.WebAuthApplication; import io.cloudbeaver.model.app.WebAuthConfiguration; import io.cloudbeaver.model.rm.local.LocalResourceController; import io.cloudbeaver.model.session.WebAuthInfo; -import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.registry.WebDriverRegistry; import io.cloudbeaver.registry.WebServiceRegistry; import io.cloudbeaver.server.jetty.CBJettyServer; @@ -131,13 +130,8 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat protected final CBEventController eventController = new CBEventController(); private WebSessionManager sessionManager; - protected final SMCredentialsProvider webSessionCredentialsProvider; public CBApplication() { - webSessionCredentialsProvider = () -> { - WebSession activeWebSession = getSessionManager().getActiveWebSession(); - return activeWebSession == null ? null : activeWebSession.getActiveUserCredentials(); - }; } public String getServerURL() { @@ -516,8 +510,8 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat } @Override - protected RMController createResourceController() { - return LocalResourceController.builder(webSessionCredentialsProvider, this::getSecurityController).build(); + public RMController createResourceController(@NotNull SMCredentialsProvider credentialsProvider) { + return LocalResourceController.builder(credentialsProvider, this::getSecurityController).build(); } private void parseConfiguration(File configFile) throws DBException {