SLING-11254 Make additional authorization on HTTP scan endpoint mandatory
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java
index 6b4b5e6..7fb2c35 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServlet.java
@@ -123,17 +123,15 @@
     @SuppressWarnings({"checkstyle:IllegalCatch", "checkstyle:ReturnCount", "checkstyle:ExecutableStatementCount"})
     protected void doPost(@NotNull final SlingHttpServletRequest request, @NotNull final SlingHttpServletResponse response) throws ServletException, IOException {
         final List<String> groups = Arrays.asList(configuration.scan_authorized_groups());
-        if (!groups.isEmpty()) {
-            boolean isAuthorized = false;
-            try {
-                isAuthorized = isAuthorized(request, groups);
-            } catch (Exception e) {
-                logger.error(e.getMessage(), e);
-            }
-            if (!isAuthorized) {
-                handleError(response, HttpServletResponse.SC_FORBIDDEN, null);
-                return;
-            }
+        boolean isAuthorized = false;
+        try {
+            isAuthorized = isAuthorized(request, groups);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+        if (!isAuthorized) {
+            handleError(response, HttpServletResponse.SC_FORBIDDEN, null);
+            return;
         }
 
         final String path;
diff --git a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java
index 4eadf0a..be42e58 100644
--- a/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java
+++ b/src/main/java/org/apache/sling/clam/http/internal/ClamJcrScanServletConfiguration.java
@@ -45,7 +45,7 @@
         name = "scan authorized groups",
         description = "User groups authorized for scanning"
     )
-    String[] scan_authorized_groups() default {};
+    String[] scan_authorized_groups() default {"sling-clam-scan"};
 
     @AttributeDefinition(
         name = "default property types",
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java b/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
index 38f3942..99377fa 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamJcrScanServletIT.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 
 import javax.inject.Inject;
+import javax.servlet.http.HttpServletResponse;
 
 import org.apache.sling.clam.it.support.RecordingJcrPropertyScanResultHandler;
 import org.apache.sling.clam.result.JcrPropertyScanResultHandler;
@@ -73,7 +74,33 @@
             .when()
             .post(url)
             .then()
-            .statusCode(401);
+            .statusCode(HttpServletResponse.SC_UNAUTHORIZED);
+    }
+
+    @Test
+    public void testNonAuthorized() throws Exception {
+        final String url = String.format(URL_TEMPLATE, httpPort());
+        given()
+            .auth()
+            .basic(ADMIN_USERNAME, ADMIN_PASSWORD)
+            .param("path", "/content/starter")
+            .when()
+            .post(url)
+            .then()
+            .statusCode(HttpServletResponse.SC_FORBIDDEN);
+    }
+
+    @Test
+    public void testAuthorized() throws Exception {
+        final String url = String.format(URL_TEMPLATE, httpPort());
+        given()
+            .auth()
+            .basic(USER_USERNAME, USER_PASSWORD)
+            .param("path", "/content/starter")
+            .when()
+            .post(url)
+            .then()
+            .statusCode(HttpServletResponse.SC_OK);
     }
 
     @Test
@@ -84,12 +111,12 @@
         final String url = String.format(URL_TEMPLATE, httpPort());
         given()
             .auth()
-            .basic(ADMIN_USERNAME, ADMIN_PASSWORD)
+            .basic(USER_USERNAME, USER_PASSWORD)
             .param("path", "/content/starter")
             .when()
             .post(url)
             .then()
-            .statusCode(200);
+            .statusCode(HttpServletResponse.SC_OK);
 
         with()
             .pollInterval(10, SECONDS)
diff --git a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
index f9e3a8f..b7b5bd0 100644
--- a/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
+++ b/src/test/java/org/apache/sling/clam/it/tests/ClamTestSupport.java
@@ -74,6 +74,10 @@
 
     static final String ADMIN_PASSWORD = "admin";
 
+    static final String USER_USERNAME = "bob";
+
+    static final String USER_PASSWORD = "foo";
+
     protected ModifiableCompositeOption baseConfiguration() {
         SlingOptions.versionResolver.setVersionFromProject(SLING_GROUP_ID, "org.apache.sling.commons.threads");
         return composite(
@@ -89,6 +93,9 @@
             factoryConfiguration("org.apache.sling.jcr.repoinit.RepositoryInitializer")
                 .put("scripts", new String[]{"create service user sling-clam\ncreate path (sling:Folder) /var/clam/results\nset ACL for sling-clam\nallow jcr:all on /var/clam\nend"})
                 .asOption(),
+            factoryConfiguration("org.apache.sling.jcr.repoinit.RepositoryInitializer")
+                .put("scripts", new String[]{"create user bob with password foo\ncreate group sling-clam-scan\nadd bob to group sling-clam-scan"})
+                .asOption(),
             factoryConfiguration("org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended")
                 .put("user.mapping", new String[]{"org.apache.sling.clam=sling-clam", "org.apache.sling.clam:result-writer=sling-clam"})
                 .asOption(),