mirror of
https://github.com/dbeaver/cloudbeaver.git
synced 2026-09-24 16:04:36 +08:00
Merge pull request #1186 from dbeaver/CB-2635-shared-project-bugs-in-de
CB-2635 fix navigator node perms
This commit is contained in:
+2
-1
@@ -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;
|
||||
|
||||
+6
-2
@@ -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");
|
||||
}
|
||||
|
||||
+20
-8
@@ -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<DBPDataSourceFolder> 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
|
||||
///////////////////////////////////
|
||||
|
||||
+3
-3
@@ -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)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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, '_script' | 'lastAction' | 'loading' | 'loaded'>(this, {
|
||||
|
||||
@@ -223,14 +223,13 @@ export const SqlEditor = observer<ISqlEditorProps>(function SqlEditor({ state, c
|
||||
</upload>
|
||||
</UploadArea>
|
||||
)}
|
||||
<button
|
||||
disabled={data.isDisabled}
|
||||
{/*<button
|
||||
title={translate('sql_editor_sql_execution_script_lock_tooltip')}
|
||||
hidden={data.dataSource?.isReadonly() ?? true}
|
||||
onClick={data.switchEditing}
|
||||
>
|
||||
<StaticImage icon={data.editing ? '/icons/sql_unlock_sm.svg' : '/icons/sql_lock_sm.svg'} />
|
||||
</button>
|
||||
</button>*/}
|
||||
</tools>
|
||||
</container>
|
||||
<TabPanelList />
|
||||
|
||||
Reference in New Issue
Block a user