mirror of
https://github.com/dbeaver/cloudbeaver.git
synced 2026-09-24 16:04:36 +08:00
dbeaver/dbeaver-ee#1907 supports shared tasks configurations; (#1173)
* dbeaver/dbeaver-ee#1907 supports shared tasks configurations; * dbeaver/dbeaver-ee#1907 typo fixed * dbeaver/dbeaver-ee#1907 code style fix
This commit is contained in:
@@ -5,6 +5,7 @@ import io.cloudbeaver.model.app.BaseWebApplication;
|
||||
import org.jkiss.code.NotNull;
|
||||
import org.jkiss.dbeaver.model.rm.RMProject;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectPermission;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectType;
|
||||
import org.jkiss.dbeaver.runtime.DBWorkbench;
|
||||
|
||||
import java.nio.file.Path;
|
||||
@@ -38,6 +39,28 @@ public class RMUtils {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Different types of project have different location on the workspace. Method returns path to the project.
|
||||
*
|
||||
* @param projectId project name or other identifier
|
||||
* @return path to the project based on the name of projects and prefixes that it contains
|
||||
*/
|
||||
@NotNull
|
||||
public static Path getProjectPathByName(@NotNull String projectId) {
|
||||
if (!projectId.contains("_") || projectId.startsWith("_")) {
|
||||
return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName());
|
||||
}
|
||||
String prefix = projectId.substring(0, projectId.indexOf("_"));
|
||||
switch (RMProjectType.getByPrefix(prefix)) {
|
||||
case GLOBAL:
|
||||
return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName());
|
||||
case SHARED:
|
||||
return getSharedProjectsPath().resolve(projectId);
|
||||
default:
|
||||
return getUserProjectsPath().resolve(projectId);
|
||||
}
|
||||
}
|
||||
|
||||
public static Set<String> parseProjectPermissions(Set<String> permissions) {
|
||||
return permissions.stream()
|
||||
.map(RMProjectPermission::fromPermission).filter(Objects::nonNull)
|
||||
@@ -48,7 +71,7 @@ public class RMUtils {
|
||||
public static RMProject createAnonymousProject() {
|
||||
RMProject project = new RMProject("anonymous");
|
||||
project.setId("anonymous");
|
||||
project.setType(RMProject.Type.USER);
|
||||
project.setType(RMProjectType.USER);
|
||||
project.setProjectPermissions(RMProjectPermission.DATA_SOURCES_EDIT.getAllPermissions());
|
||||
return project;
|
||||
}
|
||||
|
||||
+18
-22
@@ -133,16 +133,16 @@ public class LocalResourceController implements RMController {
|
||||
//FIXME: remove legacy global project support
|
||||
//admin has all edit access
|
||||
//user has only read access
|
||||
var globalProjectPermissions = getProjectPermissions(globalProjectName, RMProject.Type.GLOBAL);
|
||||
var globalProjectPermissions = getProjectPermissions(globalProjectName, RMProjectType.GLOBAL);
|
||||
|
||||
RMProject globalProject = makeProjectFromPath(getGlobalProjectPath(), globalProjectPermissions, RMProject.Type.GLOBAL, true);
|
||||
RMProject globalProject = makeProjectFromPath(getGlobalProjectPath(), globalProjectPermissions, RMProjectType.GLOBAL, true);
|
||||
if (globalProject != null) {
|
||||
projects.add(globalProject);
|
||||
}
|
||||
|
||||
//user has full access to his private project
|
||||
var userProjectPermission = getProjectPermissions(null, RMProject.Type.USER);
|
||||
RMProject userProject = makeProjectFromPath(getPrivateProjectPath(), userProjectPermission, RMProject.Type.USER, false);
|
||||
var userProjectPermission = getProjectPermissions(null, RMProjectType.USER);
|
||||
RMProject userProject = makeProjectFromPath(getPrivateProjectPath(), userProjectPermission, RMProjectType.USER, false);
|
||||
if (userProject != null) {
|
||||
projects.add(0, userProject);
|
||||
}
|
||||
@@ -163,13 +163,13 @@ public class LocalResourceController implements RMController {
|
||||
.map(projectPermission -> makeProjectFromPath(
|
||||
sharedProjectsPath.resolve(parseProjectName(projectPermission.getObjectId()).getName()),
|
||||
projectPermission.getPermissions().stream().map(RMProjectPermission::fromPermission).collect(Collectors.toSet()),
|
||||
RMProject.Type.SHARED, true)
|
||||
RMProjectType.SHARED, true)
|
||||
)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
private Set<RMProjectPermission> getProjectPermissions(@Nullable String projectId, RMProject.Type projectType) throws DBException {
|
||||
private Set<RMProjectPermission> getProjectPermissions(@Nullable String projectId, RMProjectType projectType) throws DBException {
|
||||
var activeUserCreds = credentialsProvider.getActiveUserCredentials();
|
||||
|
||||
switch (projectType) {
|
||||
@@ -209,10 +209,10 @@ public class LocalResourceController implements RMController {
|
||||
var allPaths = Files.list(sharedProjectsPath).collect(Collectors.toList());
|
||||
for (Path path : allPaths) {
|
||||
var projectPerms = getProjectPermissions(
|
||||
makeProjectIdFromPath(path, RMProject.Type.SHARED),
|
||||
RMProject.Type.SHARED
|
||||
makeProjectIdFromPath(path, RMProjectType.SHARED),
|
||||
RMProjectType.SHARED
|
||||
);
|
||||
var rmProject = makeProjectFromPath(path, projectPerms, RMProject.Type.SHARED, false);
|
||||
var rmProject = makeProjectFromPath(path, projectPerms, RMProjectType.SHARED, false);
|
||||
projects.add(rmProject);
|
||||
}
|
||||
return projects.stream()
|
||||
@@ -238,7 +238,7 @@ public class LocalResourceController implements RMController {
|
||||
if (Files.exists(projectPath)) {
|
||||
throw new DBException("Project '" + name + "' already exists");
|
||||
}
|
||||
project = makeProjectFromPath(projectPath, Set.of(), RMProject.Type.SHARED, false);
|
||||
project = makeProjectFromPath(projectPath, Set.of(), RMProjectType.SHARED, false);
|
||||
if (project == null) {
|
||||
throw new DBException("Project '" + name + "' not created");
|
||||
}
|
||||
@@ -546,7 +546,7 @@ public class LocalResourceController implements RMController {
|
||||
}
|
||||
|
||||
|
||||
private String makeProjectIdFromPath(Path path, RMProject.Type type) {
|
||||
private String makeProjectIdFromPath(Path path, RMProjectType type) {
|
||||
String projectName = path.getFileName().toString();
|
||||
return type.getPrefix() + "_" + projectName;
|
||||
}
|
||||
@@ -561,7 +561,7 @@ public class LocalResourceController implements RMController {
|
||||
return makeProjectFromPath(projectPath, permissions, projectName.getType(), false);
|
||||
}
|
||||
|
||||
private RMProject makeProjectFromPath(Path path, Set<RMProjectPermission> permissions, RMProject.Type type, boolean checkExistence) {
|
||||
private RMProject makeProjectFromPath(Path path, Set<RMProjectPermission> permissions, RMProjectType type, boolean checkExistence) {
|
||||
if (path == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -599,7 +599,7 @@ public class LocalResourceController implements RMController {
|
||||
|
||||
private Path getProjectPath(String projectId) throws DBException {
|
||||
RMProjectName project = parseProjectName(projectId);
|
||||
RMProject.Type type = project.getType();
|
||||
RMProjectType type = project.getType();
|
||||
String projectName = project.getName();
|
||||
switch (type) {
|
||||
case GLOBAL:
|
||||
@@ -754,12 +754,8 @@ public class LocalResourceController implements RMController {
|
||||
return name;
|
||||
}
|
||||
|
||||
public RMProject.Type getType() {
|
||||
switch (prefix) {
|
||||
case RMProject.PREFIX_GLOBAL: return RMProject.Type.GLOBAL;
|
||||
case RMProject.PREFIX_SHARED: return RMProject.Type.SHARED;
|
||||
default: return RMProject.Type.USER;
|
||||
}
|
||||
public RMProjectType getType() {
|
||||
return RMProjectType.getByPrefix(prefix);
|
||||
}
|
||||
}
|
||||
public static RMProjectName parseProjectName(String projectId) {
|
||||
@@ -767,7 +763,7 @@ public class LocalResourceController implements RMController {
|
||||
String name;
|
||||
int divPos = projectId.indexOf("_");
|
||||
if (divPos < 0) {
|
||||
prefix = RMProject.Type.USER.getPrefix();
|
||||
prefix = RMProjectType.USER.getPrefix();
|
||||
name = projectId;
|
||||
} else {
|
||||
prefix = projectId.substring(0, divPos);
|
||||
@@ -778,12 +774,12 @@ public class LocalResourceController implements RMController {
|
||||
|
||||
public static boolean isGlobalProject(String projectId) {
|
||||
RMProjectName rmProjectName = parseProjectName(projectId);
|
||||
return RMProject.Type.GLOBAL.getPrefix().equals(rmProjectName.getPrefix());
|
||||
return RMProjectType.GLOBAL.getPrefix().equals(rmProjectName.getPrefix());
|
||||
}
|
||||
|
||||
public static boolean isPrivateProject(String projectId, String userId) {
|
||||
RMProjectName rmProjectName = parseProjectName(projectId);
|
||||
return RMProject.Type.USER.getPrefix().equals(rmProjectName.getPrefix()) &&
|
||||
return RMProjectType.USER.getPrefix().equals(rmProjectName.getPrefix()) &&
|
||||
rmProjectName.name.equals(userId);
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -54,6 +54,7 @@ import org.jkiss.dbeaver.model.navigator.DBNModel;
|
||||
import org.jkiss.dbeaver.model.rm.RMController;
|
||||
import org.jkiss.dbeaver.model.rm.RMProject;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectPermission;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectType;
|
||||
import org.jkiss.dbeaver.model.runtime.AbstractJob;
|
||||
import org.jkiss.dbeaver.model.runtime.BaseProgressMonitor;
|
||||
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
|
||||
@@ -348,7 +349,7 @@ public class WebSession extends AbstractSessionPersistent implements SMSession,
|
||||
|
||||
public VirtualProjectImpl createVirtualProject(RMProject project) {
|
||||
// Do not filter data sources from user project
|
||||
DataSourceFilter filter = project.getType() == RMProject.Type.GLOBAL
|
||||
DataSourceFilter filter = project.getType() == RMProjectType.GLOBAL
|
||||
? this::isDataSourceAccessible
|
||||
: x -> true;
|
||||
VirtualProjectImpl sessionProject = application.createProjectImpl(
|
||||
|
||||
@@ -25,7 +25,7 @@ import org.jkiss.dbeaver.DBException;
|
||||
import org.jkiss.dbeaver.Log;
|
||||
import org.jkiss.dbeaver.model.app.DBPProject;
|
||||
import org.jkiss.dbeaver.model.auth.SMAuthenticationManager;
|
||||
import org.jkiss.dbeaver.model.rm.RMProject;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectType;
|
||||
import org.jkiss.dbeaver.runtime.DBWorkbench;
|
||||
import org.jkiss.utils.CommonUtils;
|
||||
|
||||
@@ -161,6 +161,6 @@ public class WebAppUtils {
|
||||
|
||||
public static String getGlobalProjectId() {
|
||||
String globalConfigurationName = getWebApplication().getDefaultProjectName();
|
||||
return RMProject.Type.GLOBAL.getPrefix() + "_" + globalConfigurationName;
|
||||
return RMProjectType.GLOBAL.getPrefix() + "_" + globalConfigurationName;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,7 @@ import org.jkiss.dbeaver.model.navigator.DBNProject;
|
||||
import org.jkiss.dbeaver.model.net.DBWHandlerConfiguration;
|
||||
import org.jkiss.dbeaver.model.net.ssh.SSHConstants;
|
||||
import org.jkiss.dbeaver.model.rm.RMProject;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectType;
|
||||
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
|
||||
import org.jkiss.dbeaver.registry.DataSourceNavigatorSettings;
|
||||
import org.jkiss.dbeaver.registry.DataSourceProviderDescriptor;
|
||||
@@ -335,7 +336,7 @@ public class WebServiceUtils extends WebCommonUtils {
|
||||
}
|
||||
|
||||
public static boolean isGlobalProject(DBPProject project) {
|
||||
return project.getId().equals(RMProject.PREFIX_GLOBAL + "_" + CBApplication.getInstance().getDefaultProjectName());
|
||||
return project.getId().equals(RMProjectType.GLOBAL.getPrefix() + "_" + CBApplication.getInstance().getDefaultProjectName());
|
||||
}
|
||||
|
||||
|
||||
|
||||
+2
-3
@@ -29,7 +29,6 @@ import io.cloudbeaver.model.user.WebAuthProviderConfiguration;
|
||||
import io.cloudbeaver.model.user.WebUser;
|
||||
import io.cloudbeaver.registry.WebFeatureRegistry;
|
||||
import io.cloudbeaver.registry.WebPermissionDescriptor;
|
||||
import io.cloudbeaver.registry.WebServiceDescriptor;
|
||||
import io.cloudbeaver.registry.WebServiceRegistry;
|
||||
import io.cloudbeaver.server.CBAppConfig;
|
||||
import io.cloudbeaver.server.CBApplication;
|
||||
@@ -49,7 +48,7 @@ import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
|
||||
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
|
||||
import org.jkiss.dbeaver.model.navigator.DBNModel;
|
||||
import org.jkiss.dbeaver.model.navigator.DBNNode;
|
||||
import org.jkiss.dbeaver.model.rm.RMProject;
|
||||
import org.jkiss.dbeaver.model.rm.RMProjectType;
|
||||
import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration;
|
||||
import org.jkiss.dbeaver.model.security.SMConstants;
|
||||
import org.jkiss.dbeaver.model.security.SMDataSourceGrant;
|
||||
@@ -767,7 +766,7 @@ public class WebServiceAdmin implements DBWServiceAdmin {
|
||||
|
||||
private DBPDataSourceRegistry getGlobalRegistry(WebSession session) {
|
||||
String globalConfigurationName = CBApplication.getInstance().getDefaultProjectName();
|
||||
return session.getProjectById(RMProject.Type.GLOBAL.getPrefix() + "_" + globalConfigurationName).getDataSourceRegistry();
|
||||
return session.getProjectById(RMProjectType.GLOBAL.getPrefix() + "_" + globalConfigurationName).getDataSourceRegistry();
|
||||
}
|
||||
|
||||
private void validatePermissions(@NotNull String expectedScope, @NotNull Collection<String> permissions) throws DBWebException {
|
||||
|
||||
Reference in New Issue
Block a user