diff --git a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls index e9fdae4d9d..7ce82d2639 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.navigator.graphqls @@ -131,6 +131,6 @@ extend type Mutation { navDeleteNodes( nodePaths: [ID!]! ): Int # Moves nodes with specified IDs to the connection folder - navMoveNodesToFolder(nodePaths: [ID!]!, folderPath: String): Boolean + navMoveNodesToFolder(nodePaths: [ID!]!, folderPath: ID!): Boolean } \ No newline at end of file diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java index 2be8b04de7..8652863617 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/core/impl/WebServiceCore.java @@ -565,9 +565,7 @@ public class WebServiceCore implements DBWServiceCore { DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry(); DBPDataSourceFolder newFolder = WebServiceUtils.createFolder(parentNode, folderName, sessionRegistry); WebConnectionFolderInfo folderInfo = new WebConnectionFolderInfo(session, newFolder); - if (parentPath == null) { - WebServiceUtils.updateConfigAndRefreshDatabases(session); - } + WebServiceUtils.updateConfigAndRefreshDatabases(session); return folderInfo; } catch (DBException e) { @@ -583,6 +581,7 @@ public class WebServiceCore implements DBWServiceCore { ) throws DBWebException { WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(session, folderPath); folderInfo.getDataSourceFolder().setName(newName); + WebServiceUtils.updateConfigAndRefreshDatabases(session); return folderInfo; } @@ -591,16 +590,13 @@ public class WebServiceCore implements DBWServiceCore { try { WebConnectionFolderInfo folderInfo = WebConnectionFolderUtils.getFolderInfo(session, folderPath); DBPDataSourceFolder folder = folderInfo.getDataSourceFolder(); - boolean rootFolder = folder.getParent() != null; if (folder.getDataSourceRegistry().getProject() != session.getSingletonProject()) { throw new DBWebException("Global folder '" + folderInfo.getId() + "' cannot be deleted"); } session.addInfoMessage("Delete folder"); DBPDataSourceRegistry sessionRegistry = session.getSingletonProject().getDataSourceRegistry(); sessionRegistry.removeFolder(folderInfo.getDataSourceFolder(), false); - if (rootFolder) { - WebServiceUtils.updateConfigAndRefreshDatabases(session); - } + WebServiceUtils.updateConfigAndRefreshDatabases(session); } catch (DBException e) { throw new DBWebException(e.getMessage(), e); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java index a49b0ec69a..bb97c99deb 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/DBWServiceNavigator.java @@ -59,5 +59,5 @@ public interface DBWServiceNavigator extends DBWService { int deleteNodes(@NotNull WebSession session, @NotNull List nodePaths) throws DBWebException; @WebAction - boolean moveNodesToFolder(@NotNull WebSession session, @NotNull List nodePaths, String folderPath) throws DBWebException; + boolean moveNodesToFolder(@NotNull WebSession session, @NotNull List nodePaths, @NotNull String folderPath) throws DBWebException; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java index 3ad8be1f74..ee69da357e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/WebNavigatorNodeInfo.java @@ -139,7 +139,8 @@ public class WebNavigatorNodeInfo { if (node instanceof DBNDatabaseNode) { isShared = !((DBNDatabaseNode) node).getDataSourceContainer().isManageable(); } else if (node instanceof DBNLocalFolder) { - //isShared = ((DBNLocalFolder) node).getDataSourceRegistry().is + String projectName = ((DBNLocalFolder) node).getFolder().getDataSourceRegistry().getProject().getName(); + isShared = !projectName.equals(session.getUserId()); } if (isShared) { features.add("shared"); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java index 178f270ef9..2525e2e040 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java @@ -20,17 +20,16 @@ package io.cloudbeaver.service.navigator.impl; import io.cloudbeaver.DBWebException; import io.cloudbeaver.model.WebCommandContext; import io.cloudbeaver.model.WebConnectionInfo; -import io.cloudbeaver.model.WebConnectionFolderInfo; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.navigator.DBWServiceNavigator; import io.cloudbeaver.service.navigator.WebCatalog; import io.cloudbeaver.service.navigator.WebNavigatorNodeInfo; import io.cloudbeaver.service.navigator.WebStructContainers; -import io.cloudbeaver.utils.WebConnectionFolderUtils; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.DBPDataSource; +import org.jkiss.dbeaver.model.DBPDataSourceFolder; import org.jkiss.dbeaver.model.DBPRefreshableObject; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.edit.DBECommandContext; @@ -175,6 +174,9 @@ public class WebServiceNavigator implements DBWServiceNavigator { ((DBPRefreshableObject) dataSource).refreshObject(monitor); } ((DBNDataSource) node).cleanupNode(); + } else if (node instanceof DBNLocalFolder) { + // Refresh can't be applied to the local folder node + return true; } else { node.refreshNode(monitor, this); } @@ -354,17 +356,32 @@ public class WebServiceNavigator implements DBWServiceNavigator { } @Override - public boolean moveNodesToFolder(@NotNull WebSession session, @NotNull List nodePaths, String folderNodePath) throws DBWebException { + public boolean moveNodesToFolder( + @NotNull WebSession session, + @NotNull List nodePaths, + @NotNull String folderNodePath + ) throws DBWebException { try { DBRProgressMonitor monitor = session.getProgressMonitor(); - WebConnectionFolderInfo folderPath = WebConnectionFolderUtils.getFolderInfo(session, folderNodePath); + DBNNode folderNode; + folderNode = session.getNavigatorModel().getNodeByPath(monitor, folderNodePath); for (String path : nodePaths) { DBNNode node = session.getNavigatorModel().getNodeByPath(monitor, path); if (node == null) { throw new DBWebException("Navigator node '" + path + "' not found"); } if (node instanceof DBNDataSource) { - ((DBNDataSource) node).moveToFolder(null, folderPath.getDataSourceFolder()); + DBPDataSourceFolder folder; + if (folderNode instanceof DBNRoot) { + folder = null; + } else if (folderNode instanceof DBNLocalFolder) { + folder = ((DBNLocalFolder) folderNode).getFolder(); + } else { + throw new DBWebException("Navigator node '" + folderNodePath + "' is not a folder node"); + } + ((DBNDataSource) node).moveToFolder(folderNode.getOwnerProject(), folder); + session.getSingletonProject().getDataSourceRegistry().updateDataSource( + ((DBNDataSource) node).getDataSourceContainer()); } else { throw new DBWebException("Navigator node '" + path + "' is not a data source node"); } diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/CBEmbeddedSecurityController.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/CBEmbeddedSecurityController.java index d243f2ac4a..47d005762c 100644 --- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/CBEmbeddedSecurityController.java +++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/CBEmbeddedSecurityController.java @@ -1111,7 +1111,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen if (authProviderIds.isEmpty()) { throw new SMException("Authorization providers are not defined"); } - String userId = null; + var finishAuthMonitor = new VoidProgressMonitor(); AuthAttemptSessionInfo authAttemptSessionInfo = readAuthAttemptSessionInfo(authId); boolean isMainAuthSession = authAttemptSessionInfo.getSmSessionId() == null; @@ -1123,6 +1123,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen token = findTokenBySmSession(authAttemptSessionInfo.getSmSessionId()); permissions = getTokenPermissions(token); } + String activeUserId = permissions == null ? null : permissions.getUserId(); for (String authProviderId : authProviderIds) { var userCredentials = (Map) authInfo.getAuthData().get(authProviderId); @@ -1131,8 +1132,8 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen authAttemptSessionInfo.getSessionParams(), userCredentials, finishAuthMonitor, - permissions == null ? null : permissions.getUserId(), - isMainAuthSession + activeUserId, + activeUserId == null ); if (userIdFromCreds == null) { @@ -1140,7 +1141,9 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen updateAuthStatus(authId, SMAuthStatus.ERROR, authInfo.getAuthData(), error); return SMAuthInfo.error(authId, error); } - userId = userIdFromCreds; + if (activeUserId == null) { + activeUserId = userIdFromCreds; + } } if (token == null && permissions == null) { @@ -1150,7 +1153,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen if (authAttemptSessionInfo.getSmSessionId() == null) { smSessionId = createSmSession( authAttemptSessionInfo.getAppSessionId(), - userId, + activeUserId, authAttemptSessionInfo.getSessionParams(), authAttemptSessionInfo.getSessionType(), dbCon @@ -1158,8 +1161,8 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen } else { smSessionId = authAttemptSessionInfo.getSmSessionId(); } - token = generateAuthToken(smSessionId, userId, dbCon); - permissions = new SMAuthPermissions(userId, smSessionId, getUserPermissions(userId)); + token = generateAuthToken(smSessionId, activeUserId, dbCon); + permissions = new SMAuthPermissions(activeUserId, smSessionId, getUserPermissions(activeUserId)); txn.commit(); } } catch (SQLException e) { @@ -1203,7 +1206,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen @NotNull Map userCredentials, @NotNull DBRProgressMonitor progressMonitor, @Nullable String activeUserId, - boolean newUserAuthenticationTry + boolean createNewUserIfNotExist ) throws DBException { AuthProviderDescriptor authProvider = getAuthProvider(authProviderId); SMAuthProvider smAuthProviderInstance = authProvider.getInstance(); @@ -1217,7 +1220,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen } catch (DBException e) { return null; } - if (userId == null && newUserAuthenticationTry) { + if (userId == null && createNewUserIfNotExist) { if (!(authProvider.getInstance() instanceof SMAuthProviderExternal)) { return null; }