You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by tm...@apache.org on 2021/07/15 12:03:26 UTC

[sling-org-apache-sling-distribution-journal] branch SLING-10617 created (now 14e1e7f)

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

tmaret pushed a change to branch SLING-10617
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-distribution-journal.git.


      at 14e1e7f  SLING-10617 - Allow to configure the package size to reject

This branch includes the following new commits:

     new 14e1e7f  SLING-10617 - Allow to configure the package size to reject

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[sling-org-apache-sling-distribution-journal] 01/01: SLING-10617 - Allow to configure the package size to reject

Posted by tm...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tmaret pushed a commit to branch SLING-10617
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-distribution-journal.git

commit 14e1e7fa9bdb4e1b9c92b2edfe29d7cc4659e741
Author: tmaret <tm...@adobe.com>
AuthorDate: Thu Jul 15 14:02:56 2021 +0200

    SLING-10617 - Allow to configure the package size to reject
---
 .../publisher/PackageFactoryConfiguration.java     | 31 ++++++++++++++
 .../impl/publisher/PackageMessageFactory.java      | 15 ++++---
 .../publisher/DistributionPackageFactoryTest.java  |  7 +++-
 .../impl/publisher/PackageMessageFactoryTest.java  | 49 +++++++++++++++++++++-
 4 files changed, 93 insertions(+), 9 deletions(-)

diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageFactoryConfiguration.java b/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageFactoryConfiguration.java
new file mode 100644
index 0000000..c9179ec
--- /dev/null
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageFactoryConfiguration.java
@@ -0,0 +1,31 @@
+/*
+ * 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.distribution.journal.impl.publisher;
+
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+
+@ObjectClassDefinition(name = "Apache Sling Journal based Distribution - Package Factory Configuration",
+        description = "Apache Sling Content Distribution Package Factory Configuration")
+public @interface PackageFactoryConfiguration {
+
+    @AttributeDefinition(name = "Max Package Size",
+            description = "Max package sizes in Byte to be accepted for distribution. Use a negative value to accept all packages. Default is -1 (disabled)")
+    long maxPackageSize() default -1;
+}
diff --git a/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactory.java b/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactory.java
index 71b1dde..051e037 100644
--- a/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactory.java
+++ b/src/main/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactory.java
@@ -47,17 +47,17 @@ import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.Designate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Component(service = PackageMessageFactory.class)
+@Designate(ocd = PackageFactoryConfiguration.class)
 @ParametersAreNonnullByDefault
 public class PackageMessageFactory {
 
     private static final Logger LOG = LoggerFactory.getLogger(PackageMessageFactory.class);
 
-    static final long MAX_PACKAGE_SIZE = 5242880; // 5MB
-
     @Reference
     private SlingSettingsService slingSettings;
 
@@ -66,12 +66,15 @@ public class PackageMessageFactory {
 
     private String pubSlingId;
 
+    private long maxPackageSize = -1;
+
     public PackageMessageFactory() {}
 
     @Activate
-    public void activate() {
+    public void activate(PackageFactoryConfiguration packageFactoryConfiguration) {
+        maxPackageSize = packageFactoryConfiguration.maxPackageSize();
         pubSlingId = slingSettings.getSlingId();
-        LOG.info("Started package message factory for pubSlingId={}", pubSlingId);
+        LOG.info("Started package message factory for pubSlingId={}, maxPackageSize={}", pubSlingId, maxPackageSize);
     }
 
     @Deactivate
@@ -168,12 +171,12 @@ public class PackageMessageFactory {
     }
 
     private long assertPkgLength(long pkgLength) throws DistributionException {
-        if (pkgLength > MAX_PACKAGE_SIZE) {
+        if (maxPackageSize >= 0 && pkgLength > maxPackageSize) {
             /*
              * To ensure that Apache Oak can import binary-less content packages
              * in an atomic save operation, we limit their supported size.
              */
-            throw new DistributionException(format("Can't distribute package with size greater than %s Byte, actual %s", MAX_PACKAGE_SIZE, pkgLength));
+            throw new DistributionException(format("Can't distribute package with size greater than %s Byte, actual %s", maxPackageSize, pkgLength));
         }
         return pkgLength;
     }
diff --git a/src/test/java/org/apache/sling/distribution/journal/impl/publisher/DistributionPackageFactoryTest.java b/src/test/java/org/apache/sling/distribution/journal/impl/publisher/DistributionPackageFactoryTest.java
index c32e3b3..90f7f5c 100644
--- a/src/test/java/org/apache/sling/distribution/journal/impl/publisher/DistributionPackageFactoryTest.java
+++ b/src/test/java/org/apache/sling/distribution/journal/impl/publisher/DistributionPackageFactoryTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.sling.distribution.journal.impl.publisher;
 
+import static java.util.Collections.emptyMap;
 import static org.hamcrest.CoreMatchers.nullValue;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.equalTo;
@@ -28,6 +29,7 @@ import static org.mockito.Matchers.anyLong;
 import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.osgi.util.converter.Converters.standardConverter;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -76,7 +78,10 @@ public class DistributionPackageFactoryTest {
         when(packageBuilder.getType()).thenReturn("journal");
         when(slingSettings.getSlingId()).thenReturn("pub1sling");
 
-        publisher.activate();
+        PackageFactoryConfiguration config = standardConverter()
+                .convert(emptyMap())
+                .to(PackageFactoryConfiguration.class);
+        publisher.activate(config);
 
         when(resourceResolver.getUserID()).thenReturn("testUser");
     }
diff --git a/src/test/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactoryTest.java b/src/test/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactoryTest.java
index 310ed17..8938eec 100644
--- a/src/test/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactoryTest.java
+++ b/src/test/java/org/apache/sling/distribution/journal/impl/publisher/PackageMessageFactoryTest.java
@@ -19,25 +19,35 @@
 package org.apache.sling.distribution.journal.impl.publisher;
 
 import java.io.ByteArrayInputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
 
 import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.api.resource.ResourceResolverFactory;
 import org.apache.sling.distribution.DistributionRequest;
 import org.apache.sling.distribution.SimpleDistributionRequest;
 import org.apache.sling.distribution.common.DistributionException;
+import org.apache.sling.distribution.journal.BinaryStore;
 import org.apache.sling.distribution.packaging.DistributionPackage;
 import org.apache.sling.distribution.packaging.DistributionPackageBuilder;
+import org.apache.sling.distribution.packaging.DistributionPackageInfo;
+import org.apache.sling.settings.SlingSettingsService;
 import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.runners.MockitoJUnitRunner;
 
+import static java.util.Collections.emptyMap;
+import static java.util.Collections.singletonMap;
 import static org.apache.sling.distribution.DistributionRequestType.ADD;
-import static org.apache.sling.distribution.journal.impl.publisher.PackageMessageFactory.MAX_PACKAGE_SIZE;
+import static org.junit.Assert.assertNotNull;
 import static org.mockito.Mockito.when;
 import static org.mockito.Mockito.any;
+import static org.osgi.util.converter.Converters.standardConverter;
 
 @RunWith(MockitoJUnitRunner.class)
 public class PackageMessageFactoryTest {
@@ -50,8 +60,15 @@ public class PackageMessageFactoryTest {
     @Mock
     private DistributionPackage distributionPackage;
 
+    @Mock
+    private SlingSettingsService slingSettingsService;
+
+    @Mock
+    private BinaryStore binaryStore;
+
     private final ResourceResolverFactory resolverFactory = new MockResourceResolverFactory();
 
+    @InjectMocks
     private final PackageMessageFactory factory = new PackageMessageFactory();
 
 
@@ -59,14 +76,42 @@ public class PackageMessageFactoryTest {
     public void before() throws DistributionException {
         when(packageBuilder.createPackage(any(ResourceResolver.class), any(DistributionRequest.class)))
                 .thenReturn(distributionPackage);
+        when(slingSettingsService.getSlingId())
+                .thenReturn(UUID.randomUUID().toString());
+
+        when(distributionPackage.getInfo())
+                .thenReturn(buildPackageInfo());
     }
 
     @Test(expected = DistributionException.class)
     public void testAddPkgLengthTooLarge() throws Exception {
+        PackageFactoryConfiguration config = standardConverter()
+                .convert(singletonMap("maxPackageSize", 1000))
+                .to(PackageFactoryConfiguration.class);
+        factory.activate(config);
         when(distributionPackage.createInputStream())
-                .thenReturn(new ByteArrayInputStream(new byte[(int)MAX_PACKAGE_SIZE + 1]));
+                .thenReturn(new ByteArrayInputStream(new byte[(int)config.maxPackageSize() + 1]));
         DistributionRequest request = new SimpleDistributionRequest(ADD, "/some/path");
         factory.create(packageBuilder, resolverFactory.getServiceResourceResolver(null), PUB_AGENT_NAME, request);
     }
 
+    @Test
+    public void testAddPkgNoLimit() throws Exception {
+        PackageFactoryConfiguration config = standardConverter()
+                .convert(emptyMap())
+                .to(PackageFactoryConfiguration.class);
+        factory.activate(config);
+        when(distributionPackage.createInputStream())
+                .thenReturn(new ByteArrayInputStream(new byte[10_000_000]));
+        DistributionRequest request = new SimpleDistributionRequest(ADD, "/some/path");
+        assertNotNull(factory.create(packageBuilder, resolverFactory.getServiceResourceResolver(null), PUB_AGENT_NAME, request));
+    }
+
+    private DistributionPackageInfo buildPackageInfo() {
+        Map<String, Object> props = new HashMap<>();
+        props.put(DistributionPackageInfo.PROPERTY_REQUEST_PATHS, "/some/path");
+        props.put(DistributionPackageInfo.PROPERTY_REQUEST_DEEP_PATHS, "/some/path");
+        return new DistributionPackageInfo("packageType", props);
+    }
+
 }
\ No newline at end of file