Merge pull request #1186 from dbeaver/CB-2635-shared-project-bugs-in-de

CB-2635 fix navigator node perms
This commit is contained in:
Alexander Skoblikov
2022-09-28 18:29:44 +03:00
committed by GitHub
6 changed files with 33 additions and 18 deletions
@@ -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;
@@ -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,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
///////////////////////////////////
@@ -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 />