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

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new fee2cbbb845 SOLR-17739: ConfigSet API should return error when 
forbidden file types are in the upload (#3351)
fee2cbbb845 is described below

commit fee2cbbb845cca8a0e235b7726eec25c9bb79d72
Author: Abhishek Umarjikar <[email protected]>
AuthorDate: Wed May 21 19:57:57 2025 +0530

    SOLR-17739: ConfigSet API should return error when forbidden file types are 
in the upload (#3351)
    
    ---------
    
    Co-authored-by: Eric Pugh <[email protected]>
---
 solr/CHANGES.txt                                       |  2 ++
 .../java/org/apache/solr/cloud/ZkConfigSetService.java |  6 +++++-
 .../apache/solr/core/FileSystemConfigSetService.java   |  7 +++++--
 .../test/org/apache/solr/cloud/TestConfigSetsAPI.java  |  3 ++-
 .../apache/solr/common/cloud/ZkMaintenanceUtils.java   | 11 ++++++-----
 .../solr/common/cloud/TestZkConfigSetService.java      | 18 ++++++++++++++++--
 6 files changed, 36 insertions(+), 11 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index d3d7f82d142..539543cb257 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -47,6 +47,8 @@ Improvements
 
 * SOLR-17043: "LB" and "Cloud" clients no longer use brittle URL 
pattern-matching when routing requests. (Jude Muriithi via David Smiley, Jason 
Gerlowski)
 
+* SOLR-17739: Uploading a config sets with forbidden file types will produces 
a Exception. Previously it was just ignoring those files and logging a WARN. 
(Abhishek Umarjikar via Eric Pugh)
+
 Optimizations
 ---------------------
 * SOLR-17568: The CLI bin/solr export tool now contacts the appropriate nodes 
directly for data instead of proxying through one.
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java 
b/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java
index 44638776bf3..9766c6df42d 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkConfigSetService.java
@@ -179,7 +179,11 @@ public class ZkConfigSetService extends ConfigSetService {
     String filePath = CONFIGS_ZKNODE + "/" + configName + "/" + fileName;
     try {
       if (ZkMaintenanceUtils.isFileForbiddenInConfigSets(fileName)) {
-        log.warn("Not including uploading file to config, as it is a forbidden 
type: {}", fileName);
+        throw new SolrException(
+            SolrException.ErrorCode.BAD_REQUEST,
+            "The file type provided for upload, '"
+                + fileName
+                + "', is forbidden for use in uploading configsets.");
       } else if (FileTypeMagicUtil.isFileForbiddenInConfigset(data)) {
         String mimeType = FileTypeMagicUtil.INSTANCE.guessMimeType(data);
         throw new SolrException(
diff --git 
a/solr/core/src/java/org/apache/solr/core/FileSystemConfigSetService.java 
b/solr/core/src/java/org/apache/solr/core/FileSystemConfigSetService.java
index c904035983a..1b7cc819fbe 100644
--- a/solr/core/src/java/org/apache/solr/core/FileSystemConfigSetService.java
+++ b/solr/core/src/java/org/apache/solr/core/FileSystemConfigSetService.java
@@ -150,8 +150,11 @@ public class FileSystemConfigSetService extends 
ConfigSetService {
       String configName, String fileName, byte[] data, boolean 
overwriteOnExists)
       throws IOException {
     if (ZkMaintenanceUtils.isFileForbiddenInConfigSets(fileName)) {
-      log.warn("Not including uploading file to config, as it is a forbidden 
type: {}", fileName);
-      return;
+      throw new SolrException(
+          SolrException.ErrorCode.BAD_REQUEST,
+          "The file type provided for upload, '"
+              + fileName
+              + "', is forbidden for use in uploading configsets.");
     }
     if (FileTypeMagicUtil.isFileForbiddenInConfigset(data)) {
       String mimeType = FileTypeMagicUtil.INSTANCE.guessMimeType(data);
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java 
b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
index cc0644364bf..7be45b2daac 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestConfigSetsAPI.java
@@ -594,7 +594,8 @@ public class TestConfigSetsAPI extends SolrCloudTestCase {
             .build()) {
       String configPath = "/configs/" + configsetName + configsetSuffix;
       assertEquals(
-          0, uploadConfigSet(configsetName, configsetSuffix, null, true, 
false, v2, true, false));
+          400, uploadConfigSet(configsetName, configsetSuffix, null, true, 
false, v2, true, false));
+
       for (String fileEnding : 
ZkMaintenanceUtils.DEFAULT_FORBIDDEN_FILE_TYPES) {
         String f = configPath + "/test." + fileEnding;
         assertFalse(
diff --git 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
index 6e18e0d3e54..f4eee0e78da 100644
--- 
a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
+++ 
b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkMaintenanceUtils.java
@@ -33,6 +33,7 @@ import java.util.Set;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
 import org.apache.solr.client.solrj.SolrServerException;
+import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
@@ -344,11 +345,11 @@ public class ZkMaintenanceUtils {
               return FileVisitResult.CONTINUE;
             }
             if (isFileForbiddenInConfigSets(filename)) {
-              log.info(
-                  "uploadToZK skipping '{}' due to forbidden file types '{}'",
-                  filename,
-                  USE_FORBIDDEN_FILE_TYPES);
-              return FileVisitResult.CONTINUE;
+              throw new SolrException(
+                  SolrException.ErrorCode.BAD_REQUEST,
+                  "The file type provided for upload, '"
+                      + filename
+                      + "', is forbidden for use in uploading configsets.");
             }
             // TODO: Cannot check MAGIC header for file since FileTypeGuesser 
is in core
             String zkNode = createZkNodeName(zkPath, rootPath, file);
diff --git 
a/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestZkConfigSetService.java
 
b/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestZkConfigSetService.java
index ed23cb863a1..7d083d330a3 100644
--- 
a/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestZkConfigSetService.java
+++ 
b/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/TestZkConfigSetService.java
@@ -31,6 +31,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.cloud.AbstractZkTestCase;
 import org.apache.solr.cloud.ZkConfigSetService;
 import org.apache.solr.cloud.ZkTestServer;
+import org.apache.solr.common.SolrException;
 import org.apache.solr.core.ConfigSetService;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.util.LogLevel;
@@ -102,6 +103,19 @@ public class TestZkConfigSetService extends SolrTestCaseJ4 
{
       assertEquals("testconfig", configs.get(0));
       assertTrue(configSetService.checkConfigExists("testconfig"));
 
+      Path tempConfigForbidden = createTempDir("config");
+      Files.createFile(tempConfigForbidden.resolve("Test.java"));
+      Files.createFile(tempConfigForbidden.resolve("file1"));
+      Files.createDirectory(tempConfigForbidden.resolve("dir"));
+
+      Exception ex =
+          assertThrows(
+              SolrException.class,
+              () -> {
+                configSetService.uploadConfig("_testconf", 
tempConfigForbidden);
+              });
+      assertTrue(ex.getMessage().contains("is forbidden for use in uploading 
configsets."));
+
       // check downloading
       Path downloadPath = createTempDir("download");
       configSetService.downloadConfig("testconfig", downloadPath);
@@ -120,7 +134,7 @@ public class TestZkConfigSetService extends SolrTestCaseJ4 {
       Files.write(tempConfig.resolve("file1"), overwritten);
       configSetService.uploadConfig("testconfig", tempConfig);
 
-      assertEquals(1, configSetService.listConfigs().size());
+      assertEquals(2, configSetService.listConfigs().size());
       Path download2 = createTempDir("download2");
       configSetService.downloadConfig("testconfig", download2);
       byte[] checkdata2 = Files.readAllBytes(download2.resolve("file1"));
@@ -128,7 +142,7 @@ public class TestZkConfigSetService extends SolrTestCaseJ4 {
 
       // uploading same files to a new name creates a new config
       configSetService.uploadConfig("config2", tempConfig);
-      assertEquals(2, configSetService.listConfigs().size());
+      assertEquals(3, configSetService.listConfigs().size());
 
       // Test copying a config works in both flavors
       configSetService.copyConfig("config2", "config2copy");

Reply via email to