From 439b7d05709d2b9f3f45a503a64f1e1f154a42fb Mon Sep 17 00:00:00 2001 From: Wroud Date: Tue, 27 Sep 2022 16:48:00 +0300 Subject: [PATCH 1/3] CB-2643 chore(plugin-sql-editor): lock button --- .../src/ResourceSqlDataSource.ts | 1 - webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx | 1 - 2 files changed, 2 deletions(-) diff --git a/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceSqlDataSource.ts b/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceSqlDataSource.ts index 753a0b5193..7d31cbdea6 100644 --- a/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceSqlDataSource.ts +++ b/webapp/packages/plugin-sql-editor-navigation-tab-resource/src/ResourceSqlDataSource.ts @@ -82,7 +82,6 @@ export class ResourceSqlDataSource extends BaseSqlDataSource { this.saved = true; this.loading = false; this.loaded = false; - this.editing = false; this.debouncedWrite = debounce(this.debouncedWrite.bind(this), VALUE_SYNC_DELAY); makeObservable(this, { diff --git a/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx b/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx index 46527cc915..502defb4f1 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx +++ b/webapp/packages/plugin-sql-editor/src/SqlEditor/SqlEditor.tsx @@ -224,7 +224,6 @@ export const SqlEditor = observer(function SqlEditor({ state, c )} + */} From 3c1b6b6f74fc64c5e9cbb67008fe528ef82da71a Mon Sep 17 00:00:00 2001 From: Aleksandr Skoblikov Date: Tue, 27 Sep 2022 19:58:24 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=A1B-2635=20fix=20navigator=20node=20per?= =?UTF-8?q?ms?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloudbeaver/model/session/WebSession.java | 3 +- .../service/core/impl/WebServiceCore.java | 8 ++++-- .../navigator/WebNavigatorNodeInfo.java | 28 +++++++++++++------ .../service/rm/RMNavigatorModelExtender.java | 6 ++-- 4 files changed, 31 insertions(+), 14 deletions(-) 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 4cf51b3044..be7ff0e61d 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 @@ -329,7 +329,7 @@ public class WebSession extends AbstractSessionPersistent implements SMSession, refreshAccessibleConnectionIds(); try { RMController controller = application.getResourceController(this, getSecurityController()); - RMProject[] rmProjects = controller.listAccessibleProjects(); + RMProject[] rmProjects = controller.listAccessibleProjects(); for (RMProject project : rmProjects) { VirtualProjectImpl virtualProject = createVirtualProject(project); if (!virtualProject.getRmProject().getProjectPermissions().contains(RMProjectPermission.DATA_SOURCES_EDIT.getPermissionId())) { @@ -993,6 +993,7 @@ public class WebSession extends AbstractSessionPersistent implements SMSession, userContext.refreshSMSession(); } + @Nullable public VirtualProjectImpl getProjectById(@Nullable String projectId) { if (projectId == null) { return defaultProject; 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 d4618abe45..0558b64677 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 @@ -48,6 +48,7 @@ import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration; import org.jkiss.dbeaver.model.net.DBWNetworkHandler; import org.jkiss.dbeaver.model.net.DBWTunnel; import org.jkiss.dbeaver.model.net.ssh.SSHImplementation; +import org.jkiss.dbeaver.model.rm.RMProjectType; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceProviderRegistry; @@ -345,8 +346,11 @@ public class WebServiceCore implements DBWServiceCore { @Nullable String projectId, @NotNull WebConnectionConfig connectionConfig ) throws DBWebException { - if (!webSession.hasPermission(DBWConstants.PERMISSION_ADMIN) && - !CBApplication.getInstance().getAppConfiguration().isSupportsCustomConnections() + var project = webSession.getProjectById(projectId); + var rmProject = project.getRmProject(); + if (rmProject.getType() == RMProjectType.USER + && !webSession.hasPermission(DBWConstants.PERMISSION_ADMIN) + && !CBApplication.getInstance().getAppConfiguration().isSupportsCustomConnections() ) { throw new DBWebException("New connection create is restricted by server configuration"); } 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 84ce2db650..fb3761ba94 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 @@ -20,11 +20,13 @@ import io.cloudbeaver.DBWebException; import io.cloudbeaver.VirtualProjectImpl; import io.cloudbeaver.WebServiceUtils; import io.cloudbeaver.model.WebPropertyInfo; +import io.cloudbeaver.model.rm.DBNAbstractResourceManagerNode; import io.cloudbeaver.model.rm.DBNResourceManagerResource; import io.cloudbeaver.model.session.WebSession; import io.cloudbeaver.service.security.SMUtils; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.model.*; +import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.edit.DBEObjectMaker; import org.jkiss.dbeaver.model.edit.DBEObjectRenamer; import org.jkiss.dbeaver.model.meta.Association; @@ -160,17 +162,20 @@ public class WebNavigatorNodeInfo { isShared = !((DBNDatabaseNode) node).getOwnerProject().getName().equals(session.getUserId()); } else if (node instanceof DBNLocalFolder) { DataSourceFolder folder = (DataSourceFolder) ((DBNLocalFolder) node).getFolder(); - String projectName = folder.getDataSourceRegistry().getProject().getName(); + DBPProject project = folder.getDataSourceRegistry().getProject(); + String projectName = project.getName(); Set tempFolders = folder.getDataSourceRegistry().getTemporaryFolders(); isShared = !projectName.equals(session.getUserId()) || tempFolders.contains(folder); + if (hasNodePermission(RMProjectPermission.DATA_SOURCES_EDIT)) { + features.add(NODE_FEATURE_CAN_RENAME); + features.add(NODE_FEATURE_CAN_DELETE); + } } if (isShared) { features.add(NODE_FEATURE_SHARED); } if (node instanceof DBNDatabaseNode) { - VirtualProjectImpl project = session.getProjectById(node.getOwnerProject().getId()); - RMProject rmProject = project.getRmProject(); - boolean canEditDatasources = SMUtils.hasProjectPermission(session, rmProject, RMProjectPermission.DATA_SOURCES_EDIT); + boolean canEditDatasources = hasNodePermission(RMProjectPermission.DATA_SOURCES_EDIT); DBSObject object = ((DBNDatabaseNode) node).getObject(); if (object != null && canEditDatasources) { DBEObjectMaker objectManager = DBWorkbench.getPlatform().getEditorsRegistry().getObjectManager( @@ -188,10 +193,8 @@ public class WebNavigatorNodeInfo { if (node instanceof DBNRoot) { return features.toArray(new String[0]); } - if (node instanceof DBNLocalFolder || node instanceof DBNResourceManagerResource) { - VirtualProjectImpl project = session.getProjectById(node.getOwnerProject().getId()); - RMProject rmProject = project.getRmProject(); - if (SMUtils.hasProjectPermission(session, rmProject, RMProjectPermission.RESOURCE_EDIT)) { + if (node instanceof DBNAbstractResourceManagerNode) { + if (hasNodePermission(RMProjectPermission.RESOURCE_EDIT)) { features.add(NODE_FEATURE_CAN_RENAME); features.add(NODE_FEATURE_CAN_DELETE); } @@ -199,6 +202,15 @@ public class WebNavigatorNodeInfo { return features.toArray(new String[0]); } + private boolean hasNodePermission(RMProjectPermission permission) { + VirtualProjectImpl project = session.getProjectById(getProjectId()); + if (project == null) { + return false; + } + RMProject rmProject = project.getRmProject(); + return SMUtils.hasProjectPermission(session, rmProject, permission); + } + /////////////////////////////////// // Details /////////////////////////////////// diff --git a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java index cf8ec16768..4dcca12128 100644 --- a/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java +++ b/server/bundles/io.cloudbeaver.service.rm/src/io/cloudbeaver/service/rm/RMNavigatorModelExtender.java @@ -31,14 +31,14 @@ public class RMNavigatorModelExtender implements DBNModelExtender { if (parentNode instanceof DBNProject && WebAppUtils.getWebApplication().getAppConfiguration().isResourceManagerEnabled()) { // We need project to get access to data source registry. // In order to register cloud connections there. - return createCloudNodes((DBNProject) parentNode); + return createRMNodes((DBNProject) parentNode); } else { return null; } } - private DBNNode[] createCloudNodes(DBNProject root) { - return new DBNNode[] { + private DBNNode[] createRMNodes(DBNProject root) { + return new DBNNode[]{ new DBNResourceManagerRoot(root) }; }