From 12a875f2c4e6cecee94931efc9cc4b84868602f5 Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Sun, 26 Feb 2023 23:28:23 +0100 Subject: [PATCH 1/2] added script root paths provider --- .../apm/core/scripts/FileDescriptor.java | 2 +- .../apm/core/scripts/ScriptModel.java | 8 +- .../services/ScriptRootPathsProvider.java | 98 +++++++++++++++++++ .../datasources/ScriptsDatasourceServlet.java | 8 +- 4 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 app/aem/core/src/main/java/com/cognifide/apm/core/services/ScriptRootPathsProvider.java diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/FileDescriptor.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/FileDescriptor.java index 2be8d6fa9..dc61ecc13 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/FileDescriptor.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/FileDescriptor.java @@ -54,7 +54,7 @@ private static String getPathFromOriginalFileName(String savePath, String origin path = savePath + (subPath.startsWith("/") ? "" : "/") + subPath; } } - if (!path.startsWith(SCRIPT_PATH)) { + if (!path.startsWith("/")) { path = SCRIPT_PATH + (path.startsWith("/") ? "" : "/") + path; } return path; diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java index 29a1365a5..70ed43f6c 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java @@ -25,6 +25,7 @@ import com.cognifide.apm.core.Apm; import com.cognifide.apm.core.utils.PathUtils; import com.cognifide.apm.core.utils.ResourceMixinUtil; +import com.cognifide.apm.core.utils.RuntimeUtils; import com.day.cq.commons.jcr.JcrConstants; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -40,6 +41,7 @@ import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.models.annotations.DefaultInjectionStrategy; import org.apache.sling.models.annotations.Model; import org.apache.sling.models.annotations.injectorspecific.Self; @@ -206,12 +208,14 @@ public void setLastExecuted(Date date) throws PersistenceException { } private void setProperty(String name, Object value) throws PersistenceException { - if (!PathUtils.isAppsOrLibsPath(path)) { + ResourceResolver resolver = resource.getResourceResolver(); + boolean compositeNodeStore = RuntimeUtils.determineCompositeNodeStore(resolver); + if (!compositeNodeStore || !PathUtils.isAppsOrLibsPath(path)) { ModifiableValueMap vm = resource.adaptTo(ModifiableValueMap.class); ResourceMixinUtil.addMixin(vm, ScriptNode.APM_SCRIPT); vm.put(name, convertValue(value)); - resource.getResourceResolver().commit(); + resolver.commit(); } } diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/services/ScriptRootPathsProvider.java b/app/aem/core/src/main/java/com/cognifide/apm/core/services/ScriptRootPathsProvider.java new file mode 100644 index 000000000..251f6b8b8 --- /dev/null +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/services/ScriptRootPathsProvider.java @@ -0,0 +1,98 @@ +/*- + * ========================LICENSE_START================================= + * AEM Permission Management + * %% + * Copyright (C) 2013 Wunderman Thompson Technology + * %% + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * =========================LICENSE_END================================== + */ +package com.cognifide.apm.core.services; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; +import org.apache.sling.api.resource.Resource; +import org.apache.sling.api.resource.ResourceDecorator; +import org.apache.sling.api.resource.ResourceWrapper; +import org.apache.sling.api.resource.ValueMap; +import org.apache.sling.api.wrappers.ValueMapDecorator; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.Designate; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; + + +@Component(service = {ScriptRootPathsProvider.class, ResourceDecorator.class}, immediate = true) +@Designate(ocd = ScriptRootPathsProvider.Configuration.class) +public class ScriptRootPathsProvider implements ResourceDecorator { + + private static final String RESOURCE_TYPE = "wcm/commons/ui/shell/datasources/breadcrumbs"; + + private static final String RESOURCE_PATH = "/apps/apm/views/scripts/jcr:content/breadcrumbs"; + + private static final String DEFAULT_SCRIPT_PATH = "/conf/apm/scripts"; + + private Set rootPaths; + + @Activate + public void activate(Configuration config) { + this.rootPaths = new HashSet<>(); + this.rootPaths.add(DEFAULT_SCRIPT_PATH); + this.rootPaths.addAll(Arrays.asList(config.rootPaths())); + } + + @Override + public Resource decorate(Resource resource) { + Resource result = resource; + if (isAllowed(resource)) { + ValueMap valueMap = new ValueMapDecorator(new HashMap<>()); + valueMap.putAll(resource.getValueMap()); + valueMap.put("rootPath", "/"); + result = new ResourceWrapper(resource) { + @Override + public ValueMap getValueMap() { + return valueMap; + } + }; + } + return result; + } + + @Override + public Resource decorate(Resource resource, HttpServletRequest request) { + return decorate(resource); + } + + public boolean isValidPath(String path) { + return rootPaths.stream() + .anyMatch(rootPath -> path.startsWith(rootPath) || rootPath.startsWith(path)); + } + + private boolean isAllowed(Resource resource) { + return StringUtils.equals(resource.getResourceType(), RESOURCE_TYPE) + && StringUtils.equals(resource.getPath(), RESOURCE_PATH) + && rootPaths.size() > 1; + } + + @ObjectClassDefinition(name = "AEM Permission Management - Script Root Paths Provider") + public @interface Configuration { + + @AttributeDefinition(name = "Additional Script Root Paths") + String[] rootPaths(); + } +} diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/ui/datasources/ScriptsDatasourceServlet.java b/app/aem/core/src/main/java/com/cognifide/apm/core/ui/datasources/ScriptsDatasourceServlet.java index 07c540861..7abf19a64 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/ui/datasources/ScriptsDatasourceServlet.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/ui/datasources/ScriptsDatasourceServlet.java @@ -26,6 +26,7 @@ import com.adobe.granite.ui.components.ds.SimpleDataSource; import com.cognifide.apm.core.Property; import com.cognifide.apm.core.scripts.ScriptModel; +import com.cognifide.apm.core.services.ScriptRootPathsProvider; import com.cognifide.apm.core.ui.models.ScriptsRowModel; import java.util.ArrayList; import java.util.List; @@ -36,6 +37,7 @@ import org.apache.sling.api.resource.ResourceWrapper; import org.apache.sling.api.servlets.SlingSafeMethodsServlet; import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; @Component( service = Servlet.class, @@ -48,13 +50,17 @@ ) public class ScriptsDatasourceServlet extends SlingSafeMethodsServlet { + @Reference + private ScriptRootPathsProvider scriptRootPathsProvider; + @Override protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) { String path = request.getRequestPathInfo().getSuffix(); List scripts = new ArrayList<>(); Resource resource = request.getResourceResolver().getResource(path); for (Resource child : resource.getChildren()) { - if (ScriptsRowModel.isFolder(child) || ScriptModel.isScript(child)) { + if ((ScriptsRowModel.isFolder(child) || ScriptModel.isScript(child)) + && scriptRootPathsProvider.isValidPath(child.getPath())) { scripts.add(new ResourceTypeWrapper(child)); } } From c366055fa484b9b2af03f20e59d66798daab0b3e Mon Sep 17 00:00:00 2001 From: Dominik Przybyl Date: Sun, 26 Feb 2023 23:51:28 +0100 Subject: [PATCH 2/2] added script root paths provider --- .../apm/core/scripts/ScriptModel.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java index 70ed43f6c..0ab8d263c 100644 --- a/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java +++ b/app/aem/core/src/main/java/com/cognifide/apm/core/scripts/ScriptModel.java @@ -22,6 +22,8 @@ import com.cognifide.apm.api.scripts.LaunchEnvironment; import com.cognifide.apm.api.scripts.LaunchMode; import com.cognifide.apm.api.scripts.MutableScript; +import com.cognifide.apm.api.services.ExecutionMode; +import com.cognifide.apm.api.services.ScriptManager; import com.cognifide.apm.core.Apm; import com.cognifide.apm.core.utils.PathUtils; import com.cognifide.apm.core.utils.ResourceMixinUtil; @@ -35,8 +37,10 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Named; +import javax.jcr.RepositoryException; import org.apache.commons.lang3.BooleanUtils; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.PersistenceException; @@ -44,6 +48,7 @@ import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.models.annotations.DefaultInjectionStrategy; import org.apache.sling.models.annotations.Model; +import org.apache.sling.models.annotations.injectorspecific.OSGiService; import org.apache.sling.models.annotations.injectorspecific.Self; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -58,6 +63,10 @@ public class ScriptModel implements MutableScript { @Self private Resource resource; + @Inject + @OSGiService + private ScriptManager scriptManager; + @Inject @Named(ScriptNode.APM_LAUNCH_ENABLED) private Boolean launchEnabled; @@ -108,6 +117,17 @@ public ScriptModel(Resource resource) { this.path = resource.getPath(); } + @PostConstruct + private void afterCreated() { + if (verified == null) { + try { + scriptManager.process(this, ExecutionMode.VALIDATION, resource.getResourceResolver()); + } catch (RepositoryException | PersistenceException e) { + LOGGER.error("", e); + } + } + } + @Override public boolean isValid() { return BooleanUtils.toBoolean(verified);