diff --git a/core/src/org/labkey/core/CoreController.java b/core/src/org/labkey/core/CoreController.java index 92473c28462..477b9f8811d 100644 --- a/core/src/org/labkey/core/CoreController.java +++ b/core/src/org/labkey/core/CoreController.java @@ -191,11 +191,13 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; import static org.labkey.api.view.template.WarningService.SESSION_WARNINGS_BANNER_KEY; @@ -747,18 +749,36 @@ public ApiResponse execute(SimpleApiJsonForm form, BindException errors) { folderType = FolderTypeManager.get().getFolderType(folderTypeName); } + if (folderType == null) + { + folderType = FolderType.NONE; + } - if (null != folderType && Container.hasRestrictedModule(folderType) && !getContainer().hasEnableRestrictedModules(getUser())) + if (Container.hasRestrictedModule(folderType) && !getContainer().hasEnableRestrictedModules(getUser())) { throw new UnauthorizedException("The folder type requires a restricted module for which you do not have permission."); } - Container newContainer = ContainerManager.createContainer(getContainer(), name, title, description, typeName, getUser()); - if (folderType != null) + Set ensureModules = new HashSet<>(); + if (json.has("ensureModules")) { - newContainer.setFolderType(folderType, getUser()); + List requestedModules = Arrays.stream(json.getJSONArray("ensureModules") + .toArray()).map(Object::toString).collect(Collectors.toList()); + for (String moduleName : requestedModules) + { + Module module = ModuleLoader.getInstance().getModule(moduleName); + if (module == null) + throw new NotFoundException("'" + moduleName + "' was not found."); + else if (module.getRequireSitePermission() && !getContainer().hasEnableRestrictedModules(getUser())) + throw new UnauthorizedException("'" + moduleName + "' is a restricted module for which you do not have permission."); + else + ensureModules.add(module); + } } + Container newContainer = ContainerManager.createContainer(getContainer(), name, title, description, typeName, getUser()); + newContainer.setFolderType(folderType, ensureModules, getUser()); + return new ApiSimpleResponse(newContainer.toJSON(getUser())); } catch (IllegalArgumentException e) diff --git a/core/src/org/labkey/core/admin/AdminController.java b/core/src/org/labkey/core/admin/AdminController.java index 78594f1b8ff..27a2b501cd4 100644 --- a/core/src/org/labkey/core/admin/AdminController.java +++ b/core/src/org/labkey/core/admin/AdminController.java @@ -6913,7 +6913,14 @@ public boolean handlePost(SetFolderPermissionsForm form, BindException errors) return false; } Container source = ContainerManager.getForId(targetProject); - assert source != null; + if (source == null) + { + source = ContainerManager.getForPath(targetProject); + } + if (source == null) + { + throw new NotFoundException("An unknown project was specified to copy permissions from: " + targetProject); + } Map groupMap = GroupManager.copyGroupsToContainer(source, c);