diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java index 5b53c616e9..faa3d83135 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java @@ -81,7 +81,7 @@ public class RMUtils { RMProject project = new RMProject("anonymous"); project.setId("anonymous"); project.setType(RMProjectType.USER); - project.setProjectPermissions(RMProjectPermission.DATA_SOURCES_EDIT.getAllPermissions()); + project.setProjectPermissions(RMProjectPermission.DATA_SOURCES_EDIT.getAllPermissions().toArray(new String[0])); return project; } } diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java index 823215be5d..0d0c967a89 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java @@ -169,7 +169,7 @@ public class LocalResourceController implements RMController { .stream() .map(projectPermission -> makeProjectFromPath( sharedProjectsPath.resolve(parseProjectName(projectPermission.getObjectId()).getName()), - projectPermission.getPermissions().stream().map(RMProjectPermission::fromPermission).collect(Collectors.toSet()), + Arrays.stream(projectPermission.getPermissions()).map(RMProjectPermission::fromPermission).collect(Collectors.toSet()), RMProjectType.SHARED, true) ) .filter(Objects::nonNull) @@ -193,9 +193,9 @@ public class LocalResourceController implements RMController { throw new DBException("Project id required"); } - return getSecurityController().getObjectPermissions(activeUserCreds.getUserId(), projectId, SMObjects.PROJECT) - .getPermissions() - .stream() + String[] permissions = getSecurityController().getObjectPermissions(activeUserCreds.getUserId(), projectId, SMObjects.PROJECT) + .getPermissions(); + return Arrays.stream(permissions) .map(RMProjectPermission::fromPermission) .collect(Collectors.toSet()); case USER: @@ -635,9 +635,9 @@ public class LocalResourceController implements RMController { return null; } - Set allProjectPermissions = permissions.stream() + String[] allProjectPermissions = permissions.stream() .flatMap(rmProjectPermission -> rmProjectPermission.getAllPermissions().stream()) - .collect(Collectors.toSet()); + .toArray(String[]::new); RMProject project = new RMProject(); String projectName = path.getFileName().toString(); @@ -653,11 +653,16 @@ public class LocalResourceController implements RMController { log.error(e); } } + // Resource types + project.setResourceTypes(ResourceTypeRegistry.getInstance().getResourceTypes() + .stream() + .filter(ResourceTypeDescriptor::isManagable) + .map(RMResourceType::new) + .toArray(RMResourceType[]::new)); return project; } - private Path getProjectPath(String projectId) throws DBException { RMProjectName project = parseProjectName(projectId); RMProjectType type = project.getType(); diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java index 6fbcd831d7..253da6abc0 100644 --- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java +++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/service/security/SMUtils.java @@ -30,7 +30,7 @@ public class SMUtils { RMProject project, RMProjectPermission projectPermission ) { - return isRMAdmin(credentialsProvider) || project.getProjectPermissions().contains(projectPermission.getPermissionId()); + return isRMAdmin(credentialsProvider) || project.hasProjectPermission(projectPermission.getPermissionId()); } public static List findPermissions(@NotNull String permissionsScope) { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java index fff7c64eff..adc3741c98 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBApplication.java @@ -62,6 +62,7 @@ import org.jkiss.dbeaver.utils.ContentUtils; import org.jkiss.dbeaver.utils.GeneralUtils; import org.jkiss.dbeaver.utils.PrefUtils; import org.jkiss.dbeaver.utils.SystemVariablesResolver; +import org.jkiss.utils.ArrayUtils; import org.jkiss.utils.CommonUtils; import org.jkiss.utils.StandardConstants; @@ -863,7 +864,7 @@ public class CBApplication extends BaseWebApplication implements WebAuthApplicat var securityController = getSecurityController(); for (DBPDataSourceContainer ds : WebServiceUtils.getGlobalDataSourceRegistry().getDataSources()) { var datasourcePermissions = securityController.getObjectPermissions(anonymousTeamId, ds.getId(), SMObjects.DATASOURCE); - if (CommonUtils.isEmpty(datasourcePermissions.getPermissions())) { + if (ArrayUtils.isEmpty(datasourcePermissions.getPermissions())) { securityController.setObjectPermissions( Set.of(ds.getId()), SMObjects.DATASOURCE, diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java index 6d3b754074..a19e59f30c 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java @@ -223,7 +223,7 @@ public abstract class WebServiceBindingBase impleme RMProject rmProject = project.getRmProject(); for (String reqProjectPermission : requireProjectPermissions) { - if (!rmProject.getProjectPermissions().contains(reqProjectPermission)) { + if (!rmProject.hasProjectPermission(reqProjectPermission)) { throw new DBWebExceptionAccessDenied("Access denied"); } } diff --git a/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls b/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls index 2ba2120ab9..d9e98a47cc 100644 --- a/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls +++ b/server/bundles/io.cloudbeaver.service.rm/schema/service.rm.graphqls @@ -10,6 +10,7 @@ type RMProject { createTime: DateTime! creator: String! projectPermissions: [String!]! + resourceTypes: [RMResourceType!]! } type RMResource { @@ -20,6 +21,14 @@ type RMResource { properties: Object } +type RMResourceType { + id: String! + displayName: String! + icon: String + fileExtensions: String + rootFolder: String +} + input RMSubjectProjectPermissions { subjectId: String! permissions: [String!]!