Skip to content

Commit 7919ec8

Browse files
alexander-skoblikovserge-riderMashaKorax
authored
dbeaver/pro#3943 check that folder cannot be moved inside itself (#3253)
* dbeaver/pro#3943 check that folder cannot be moved inside itself * dbeaver/pro#3943 fix --------- Co-authored-by: Serge Rider <serge@jkiss.org> Co-authored-by: MashaKorax <84867187+MashaKorax@users.noreply.github.com>
1 parent a76dc9c commit 7919ec8

File tree

3 files changed

+25
-28
lines changed

3 files changed

+25
-28
lines changed

server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/WebDataSourceRegistryProxy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* DBeaver - Universal Database Manager
3-
* Copyright (C) 2010-2024 DBeaver Corp and others
3+
* Copyright (C) 2010-2025 DBeaver Corp and others
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -204,7 +204,7 @@ public void removeFolder(@NotNull DBPDataSourceFolder folder, boolean dropConten
204204
}
205205

206206
@Override
207-
public void moveFolder(@NotNull String oldPath, @NotNull String newPath) {
207+
public void moveFolder(@NotNull String oldPath, @NotNull String newPath) throws DBException {
208208
dataSourceRegistry.moveFolder(oldPath, newPath);
209209
}
210210

server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/utils/WebConnectionFolderUtils.java

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* DBeaver - Universal Database Manager
3-
* Copyright (C) 2010-2024 DBeaver Corp and others
3+
* Copyright (C) 2010-2025 DBeaver Corp and others
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -22,10 +22,6 @@
2222
import org.jkiss.code.Nullable;
2323
import org.jkiss.dbeaver.model.DBPDataSourceFolder;
2424
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
25-
import org.jkiss.dbeaver.model.navigator.DBNLocalFolder;
26-
import org.jkiss.dbeaver.model.navigator.DBNNode;
27-
import org.jkiss.dbeaver.model.navigator.DBNProject;
28-
import org.jkiss.dbeaver.model.navigator.DBNRoot;
2925
import org.jkiss.utils.CommonUtils;
3026

3127
public class WebConnectionFolderUtils {
@@ -50,16 +46,6 @@ public static void validateConnectionFolder(String folderName) throws DBWebExcep
5046
}
5147
}
5248

53-
public static DBPDataSourceFolder getParentFolder(DBNNode folderNode) throws DBWebException {
54-
if (folderNode instanceof DBNRoot || folderNode instanceof DBNProject) {
55-
return null;
56-
} else if (folderNode instanceof DBNLocalFolder) {
57-
return ((DBNLocalFolder) folderNode).getFolder();
58-
} else {
59-
throw new DBWebException("Navigator node '" + folderNode.getNodeUri() + "' is not a folder node");
60-
}
61-
}
62-
6349
public static DBPDataSourceFolder createFolder(WebConnectionFolderInfo parentFolder, String newName, DBPDataSourceRegistry registry) throws DBWebException {
6450
DBPDataSourceFolder folder = registry.addFolder(parentFolder == null ? null : parentFolder.getDataSourceFolder(), newName);
6551
return folder;

server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* DBeaver - Universal Database Manager
3-
* Copyright (C) 2010-2024 DBeaver Corp and others
3+
* Copyright (C) 2010-2025 DBeaver Corp and others
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License");
66
* you may not use this file except in compliance with the License.
@@ -600,29 +600,40 @@ public boolean moveNodesToFolder(
600600
) throws DBWebException {
601601
try {
602602
DBRProgressMonitor monitor = session.getProgressMonitor();
603-
DBNNode folderNode;
604603
DBNModel navigatorModel = session.getNavigatorModelOrThrow();
605-
folderNode = navigatorModel.getNodeByPath(monitor, folderNodePath);
604+
DBNNode folderNode = navigatorModel.getNodeByPath(monitor, folderNodePath);
605+
if (folderNode == null) {
606+
throw new DBException("Folder node '" + folderNodePath + "' not found");
607+
}
606608
for (String path : nodePaths) {
607609
DBNNode node = navigatorModel.getNodeByPath(monitor, path);
608610
if (node == null) {
609611
throw new DBWebException("Navigator node '" + path + "' not found");
610612
}
611613
checkProjectEditAccess(node, session);
612-
if (node instanceof DBNDataSource) {
613-
DBPDataSourceFolder folder = WebConnectionFolderUtils.getParentFolder(folderNode);
614-
((DBNDataSource) node).moveToFolder(folderNode.getOwnerProject(), folder);
614+
if (node.getNodeUri().equals(folderNode.getNodeUri())) {
615+
throw new DBWebException("Cannot move node inside itself");
616+
}
617+
if (node instanceof DBNDataSource dataSourceNode) {
618+
DBPDataSourceFolder folder = null;
619+
if (folderNode instanceof DBNLocalFolder localFolderNode) {
620+
folder = localFolderNode.getFolder();
621+
}
622+
dataSourceNode.moveToFolder(folderNode.getOwnerProject(), folder);
615623
node.getOwnerProject().getDataSourceRegistry().updateDataSource(
616-
((DBNDataSource) node).getDataSourceContainer());
624+
dataSourceNode.getDataSourceContainer());
617625
WebEventUtils.addDataSourceUpdatedEvent(
618626
node.getOwnerProject(),
619627
session,
620-
((DBNDataSource) node).getDataSourceContainer().getId(),
628+
dataSourceNode.getDataSourceContainer().getId(),
621629
WSConstants.EventAction.UPDATE,
622630
WSDataSourceProperty.CONFIGURATION
623631
);
624-
} else if (node instanceof DBNLocalFolder) {
625-
DBPDataSourceFolder parentFolder = WebConnectionFolderUtils.getParentFolder(folderNode);
632+
} else if (node instanceof DBNLocalFolder dbnLocalFolder) {
633+
DBPDataSourceFolder parentFolder = null;
634+
if (folderNode instanceof DBNLocalFolder parentFolderNode) {
635+
parentFolder = parentFolderNode.getFolder();
636+
}
626637
if (parentFolder != null) {
627638
List<String> siblings = Arrays.stream(parentFolder.getChildren())
628639
.map(DBPDataSourceFolder::getName)
@@ -631,12 +642,12 @@ public boolean moveNodesToFolder(
631642
throw new DBWebException("Node " + folderNodePath + " contains folder with name '" + node.getName() + "'");
632643
}
633644
}
634-
DBNLocalFolder dbnLocalFolder = ((DBNLocalFolder) node);
635645
var oldNodePath = node.getNodeItemPath();
636646
node.getOwnerProject().getDataSourceRegistry().moveFolder(
637647
dbnLocalFolder.getFolder().getFolderPath(),
638648
dbnLocalFolder.generateNewFolderPath(parentFolder, dbnLocalFolder.getNodeDisplayName())
639649
);
650+
node.getOwnerProject().getDataSourceRegistry().checkForErrors();
640651
var newNodePath = node.getNodeItemPath();
641652
WebServiceUtils.updateConfigAndRefreshDatabases(session, node.getOwnerProject().getId());
642653
addNavigatorNodeMoveEvent(session, node, oldNodePath, newNodePath);

0 commit comments

Comments
 (0)