You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by si...@apache.org on 2019/03/20 15:11:48 UTC

[sling-whiteboard] branch master updated: [cp2fm] added a user regexp-based rejecting path engine

This is an automated email from the ASF dual-hosted git repository.

simonetripodi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-whiteboard.git


The following commit(s) were added to refs/heads/master by this push:
     new 8cf9ba1  [cp2fm] added a user regexp-based rejecting path engine
8cf9ba1 is described below

commit 8cf9ba107868331f683681e19fbb6007c07abb45
Author: Simo Tripodi <st...@adobe.com>
AuthorDate: Wed Mar 20 16:11:41 2019 +0100

    [cp2fm] added a user regexp-based rejecting path engine
---
 .../ContentPackage2FeatureModelConverter.java      |  25 +++++++-
 ...ntentPackage2FeatureModelConverterLauncher.java |  22 +++++--
 .../sling/cp2fm/RegexBasedResourceFilter.java      |  54 ++++++++++++++++
 .../cp2fm/handlers/ContentPackageEntryHandler.java |  16 +++--
 .../ContentPackage2FeatureModelConverterTest.java  |  12 ++++
 .../sling/cp2fm/RegexBasedResourceFilterTest.java  |  69 +++++++++++++++++++++
 .../cp2fm/test-content-package-unacceptable.zip    | Bin 0 -> 15017 bytes
 7 files changed, 185 insertions(+), 13 deletions(-)

diff --git a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverter.java b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverter.java
index 2d7914f..d4aa7de 100644
--- a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverter.java
+++ b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverter.java
@@ -107,6 +107,8 @@ public class ContentPackage2FeatureModelConverter {
 
     private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SZ");
 
+    private final RegexBasedResourceFilter filter = new RegexBasedResourceFilter();
+
     private boolean strictValidation = false;
 
     private boolean mergeConfigurations = false;
@@ -153,6 +155,15 @@ public class ContentPackage2FeatureModelConverter {
         return targetFeature;
     }
 
+    public void addFilteringPattern(String filteringPattern) {
+        Objects.requireNonNull(filteringPattern, "Null pattern to filter resources out is not a valid filtering pattern");
+        if (filteringPattern.isEmpty()) {
+            throw new IllegalArgumentException("Empty pattern to filter resources out is not a valid filtering pattern");
+        }
+
+        filter.addFilteringPattern(filteringPattern);
+    }
+
     public Feature getRunMode(String runMode) {
         if (getTargetFeature() == null) {
             throw new IllegalStateException("Target Feature not initialized yet, please make sure convert() method was invoked first.");
@@ -171,6 +182,10 @@ public class ContentPackage2FeatureModelConverter {
                                                                                  id.getType())));
     }
 
+    public VaultPackage openContentPackage(File contentPackage) throws Exception {
+        return packageManager.open(contentPackage, strictValidation);
+    }
+
     public void convert(File contentPackage) throws Exception {
         Objects.requireNonNull(contentPackage , "Null content-package can not be converted.");
 
@@ -198,7 +213,7 @@ public class ContentPackage2FeatureModelConverter {
 
         VaultPackage vaultPackage = null;
         try {
-            vaultPackage = packageManager.open(contentPackage, strictValidation);
+            vaultPackage = openContentPackage(contentPackage);
 
             logger.info("content-package '{}' successfully read!", contentPackage);
 
@@ -415,6 +430,14 @@ public class ContentPackage2FeatureModelConverter {
 
         logger.info("Processing entry {}...", entryPath);
 
+        if (filter.isFilteredOut(entryPath)) {
+            throw new IllegalArgumentException("Path '"
+                                               + entryPath
+                                               + "' in archive "
+                                               + archive.getMetaInf().getProperties()
+                                               + " not allowed by user configuration, please check configured filtering patterns");
+        }
+
         getEntryHandlerByEntryPath(entryPath).handle(entryPath, archive, entry, this);
 
         logger.info("Entry {} successfully processed.", entryPath);
diff --git a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterLauncher.java b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterLauncher.java
index 4928cf9..ba6b42e 100644
--- a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterLauncher.java
+++ b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterLauncher.java
@@ -57,6 +57,9 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna
     @Option(names = { "-b", "--bundles-start-order" }, description = "The order to start detected bundles.", required = false)
     private int bundlesStartOrder = 0;
 
+    @Option(names = { "-f", "--filtering-patterns" }, description = "Regex based pattern(s) to reject content-package archive entries.", required = false, defaultValue = "")
+    private String[] filteringPatterns;
+
     @Option(names = { "-o", "--output-directory" }, description = "The output directory where the Feature File and the bundles will be deployed.", required = true)
     private File outputDirectory;
 
@@ -88,12 +91,19 @@ public final class ContentPackage2FeatureModelConverterLauncher implements Runna
         logger.info("");
 
         try {
-            new ContentPackage2FeatureModelConverter()
-            .setStrictValidation(strictValidation)
-            .setMergeConfigurations(mergeConfigurations)
-            .setBundlesStartOrder(bundlesStartOrder)
-            .setOutputDirectory(outputDirectory)
-            .convert(contentPackage);
+            ContentPackage2FeatureModelConverter converter = new ContentPackage2FeatureModelConverter()
+                                                             .setStrictValidation(strictValidation)
+                                                             .setMergeConfigurations(mergeConfigurations)
+                                                             .setBundlesStartOrder(bundlesStartOrder)
+                                                             .setOutputDirectory(outputDirectory);
+
+            if (filteringPatterns != null && filteringPatterns.length > 0) {
+                for (String filteringPattern : filteringPatterns) {
+                    converter.addFilteringPattern(filteringPattern);
+                }
+            }
+
+            converter.convert(contentPackage);
 
             logger.info( "+-----------------------------------------------------+" );
             logger.info("{} SUCCESS", appName);
diff --git a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/RegexBasedResourceFilter.java b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/RegexBasedResourceFilter.java
new file mode 100644
index 0000000..4bf36ac
--- /dev/null
+++ b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/RegexBasedResourceFilter.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You 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.
+ */
+package org.apache.sling.cp2fm;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class RegexBasedResourceFilter {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private final List<Pattern> patterns = new LinkedList<>();
+
+    public void addFilteringPattern(String filteringPattern) {
+        patterns.add(Pattern.compile(filteringPattern));
+    }
+
+    public boolean isFilteredOut(String path) {
+        for (Pattern pattern : patterns) {
+            logger.debug("Checking if path '{}' matches against '{}' pattern...", path, pattern);
+
+            if (pattern.matcher(path).matches()) {
+                logger.debug("Path '{}' matches against '{}' pattern.", path, pattern);
+
+                return true;
+            } else {
+                logger.debug("Path '{}' does not matches against '{}' pattern.", path, pattern);
+            }
+        }
+
+        logger.debug("Path '{}' does not match against any configured pattern.", path);
+
+        return false;
+    }
+
+}
diff --git a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/handlers/ContentPackageEntryHandler.java b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/handlers/ContentPackageEntryHandler.java
index 235ed25..e4da04e 100644
--- a/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/handlers/ContentPackageEntryHandler.java
+++ b/content-package-2-feature-model/src/main/java/org/apache/sling/cp2fm/handlers/ContentPackageEntryHandler.java
@@ -24,14 +24,11 @@ import java.io.OutputStream;
 import org.apache.commons.io.IOUtils;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.Archive.Entry;
-import org.apache.jackrabbit.vault.packaging.PackageManager;
-import org.apache.jackrabbit.vault.packaging.impl.PackageManagerImpl;
+import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.sling.cp2fm.ContentPackage2FeatureModelConverter;
 
 public final class ContentPackageEntryHandler extends AbstractRegexEntryHandler {
 
-    private final PackageManager packageManager = new PackageManagerImpl();
-
     public ContentPackageEntryHandler() {
         super("(?:jcr_root)?/etc/packages/.+\\.zip");
     }
@@ -44,11 +41,18 @@ public final class ContentPackageEntryHandler extends AbstractRegexEntryHandler
 
         try (InputStream input = archive.openInputStream(entry);
                 OutputStream output = new FileOutputStream(temporaryContentPackage)) {
-
             IOUtils.copy(input, output);
         }
 
-        converter.process(packageManager.open(temporaryContentPackage));
+        VaultPackage subPackage = null;
+        try {
+            subPackage = converter.openContentPackage(temporaryContentPackage);
+            converter.process(subPackage);
+        } finally {
+            if (subPackage != null) {
+                subPackage.close();
+            }
+        }
     }
 
 }
diff --git a/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterTest.java b/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterTest.java
index f4fd73b..f29d7f4 100644
--- a/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterTest.java
+++ b/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/ContentPackage2FeatureModelConverterTest.java
@@ -219,4 +219,16 @@ public class ContentPackage2FeatureModelConverterTest {
         assertTrue("POM file " + pomFile + " does not exist", pomFile.exists());
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void verifyFilteringOutUndesiredPackages() throws Exception {
+        converter.addFilteringPattern(".*\\/install(?!(\\.runMode1\\/|\\.runMode2\\/|\\/))(.*)(?=\\.zip$).*");
+
+        URL packageUrl = getClass().getResource("test-content-package-unacceptable.zip");
+        File packageFile = FileUtils.toFile(packageUrl);
+
+        File outputDirectory = new File(System.getProperty("testDirectory"), getClass().getName() + '_' + System.currentTimeMillis());
+
+        converter.setBundlesStartOrder(5).setOutputDirectory(outputDirectory).convert(packageFile);
+    }
+
 }
diff --git a/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/RegexBasedResourceFilterTest.java b/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/RegexBasedResourceFilterTest.java
new file mode 100644
index 0000000..477079a
--- /dev/null
+++ b/content-package-2-feature-model/src/test/java/org/apache/sling/cp2fm/RegexBasedResourceFilterTest.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You 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.
+ */
+package org.apache.sling.cp2fm;
+
+import static org.junit.Assert.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class RegexBasedResourceFilterTest {
+
+    private RegexBasedResourceFilter filter;
+
+    @Before
+    public void setUp() {
+        filter = new RegexBasedResourceFilter();
+    }
+
+    @After
+    public void tearDown() {
+        filter = null;
+    }
+
+    @Test
+    public void packagesFilteredIn() {
+        filter.addFilteringPattern(".*\\/myEnvironment(?!(\\.runMode1\\/|\\.runMode2\\/|\\/))(.*)(?=\\.zip$).*");
+
+        assertFalse(filter.isFilteredOut("/apps/myapp/myEnvironment/something.zip"));
+        assertFalse(filter.isFilteredOut("/apps/myapp/myEnvironment.runMode1/something.zip"));
+        assertFalse(filter.isFilteredOut("/apps/myapp/myEnvironment.runMode2/something.zip"));
+
+        assertFalse(filter.isFilteredOut("/apps/myEnvironment/asd.zip"));
+    }
+
+    @Test
+    public void configFilteredOut() {
+        filter.addFilteringPattern(".*\\/myEnvironment(?!(\\.runMode1\\/|\\.runMode2\\/|\\/))(.*)(?=\\.config$).*");
+
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.subRunMode/something.config"));
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.runMode1.subRunMode/something.config"));
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.subRunMode.runMode1/something.config"));
+    }
+
+    @Test
+    public void packagesFilteredOut() {
+        filter.addFilteringPattern(".*\\/myEnvironment(?!(\\.runMode1\\/|\\.runMode2\\/|\\/))(.*)(?=\\.zip$).*");
+
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.subRunMode/something.zip"));
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.runMode1.subRunMode/something.zip"));
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.subRunMode.runMode1/something.zip"));
+        assertTrue(filter.isFilteredOut("/apps/myapp/myEnvironment.xyz/something.zip"));
+    }
+
+}
diff --git a/content-package-2-feature-model/src/test/resources/org/apache/sling/cp2fm/test-content-package-unacceptable.zip b/content-package-2-feature-model/src/test/resources/org/apache/sling/cp2fm/test-content-package-unacceptable.zip
new file mode 100644
index 0000000..840ee6d
Binary files /dev/null and b/content-package-2-feature-model/src/test/resources/org/apache/sling/cp2fm/test-content-package-unacceptable.zip differ