You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ja...@apache.org on 2024/01/26 15:11:14 UTC

(solr) branch branch_9x updated: SOLR-17126 Cut over System.getProperty() to EnvUtils.getProperty() for modules (backport-9x) (#2215)

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

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


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 252688d76fc SOLR-17126 Cut over System.getProperty() to EnvUtils.getProperty() for modules (backport-9x) (#2215)
252688d76fc is described below

commit 252688d76fc1adb5b32a3ea6998dbc71957f613b
Author: Jan Høydahl <ja...@apache.org>
AuthorDate: Fri Jan 26 16:11:07 2024 +0100

    SOLR-17126 Cut over System.getProperty() to EnvUtils.getProperty() for modules (backport-9x) (#2215)
---
 solr/CHANGES.txt                                   |  2 +-
 .../extraction/ExtractingRequestHandlerTest.java   |  3 +-
 .../solr/security/hadoop/HadoopAuthPlugin.java     |  3 +-
 .../solr/security/hadoop/KerberosPlugin.java       | 33 ++++++++++++----------
 .../hadoop/HadoopSSLCredentialProvider.java        |  5 ++--
 .../client/solrj/impl/Krb5HttpClientUtils.java     |  3 +-
 .../solr/security/hadoop/HadoopTestUtil.java       |  3 +-
 .../solr/security/hadoop/ImpersonationUtil.java    |  3 +-
 .../solr/security/hadoop/KerberosTestServices.java |  3 +-
 .../hadoop/TestImpersonationWithHadoopAuth.java    |  3 +-
 .../TestSolrCloudWithSecureImpersonation.java      |  6 ++--
 .../configuration/HadoopSSLConfigurationsTest.java |  5 ++--
 .../org/apache/solr/hdfs/HdfsDirectoryFactory.java |  9 +++---
 .../org/apache/solr/hdfs/index/CheckHdfsIndex.java |  3 +-
 .../org/apache/hadoop/fs/RawLocalFileSystem.java   |  5 ++--
 .../test/org/apache/hadoop/util/PlatformName.java  | 11 ++++----
 .../apache/solr/hdfs/HdfsDirectoryFactoryTest.java |  3 +-
 .../org/apache/solr/hdfs/cloud/HdfsTestUtil.java   | 16 ++++-------
 .../apache/solr/security/jwt/JWTIssuerConfig.java  |  3 +-
 .../solr/security/jwt/JWTAuthPluginTest.java       |  3 +-
 .../algorithms/TeamDraftInterleaving.java          |  3 +-
 .../solr/opentelemetry/OtelTracerConfigurator.java | 17 +++++------
 .../opentelemetry/OtelTracerConfiguratorTest.java  |  3 +-
 .../apache/solr/s3/S3BackupRepositoryConfig.java   | 15 ++++------
 24 files changed, 89 insertions(+), 74 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 6095d152234..7120becc67a 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -28,7 +28,7 @@ Dependency Upgrades
 
 Other Changes
 ---------------------
-(No changes)
+* SOLR-17126: Cut over System.getProperty to EnvUtils.getProperty (janhoy)
 
 ==================  9.5.0 ==================
 New Features
diff --git a/solr/modules/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java b/solr/modules/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
index 8c88447bbc1..ede60a108d3 100644
--- a/solr/modules/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
+++ b/solr/modules/extraction/src/test/org/apache/solr/handler/extraction/ExtractingRequestHandlerTest.java
@@ -24,6 +24,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
@@ -45,7 +46,7 @@ public class ExtractingRequestHandlerTest extends SolrTestCaseJ4 {
     if (!tzDisplayName.matches("[A-Za-z]{3,}([+-]\\d\\d(:\\d\\d)?)?")) {
       assertTrue(
           "Is some other JVM affected?  Or bad regex? TzDisplayName: " + tzDisplayName,
-          System.getProperty("java.version").startsWith("11"));
+          EnvUtils.getProperty("java.version").startsWith("11"));
       assumeTrue(
           "SOLR-12759 JDK 11 (1st release) and Tika 1.x can result in extracting dates in a bad format.",
           false);
diff --git a/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/HadoopAuthPlugin.java b/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/HadoopAuthPlugin.java
index 3e9d904d6f9..f878ef49b2c 100644
--- a/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/HadoopAuthPlugin.java
+++ b/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/HadoopAuthPlugin.java
@@ -40,6 +40,7 @@ import org.apache.solr.client.solrj.impl.Krb5HttpClientBuilder;
 import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.security.AuthenticationPlugin;
 import org.slf4j.Logger;
@@ -161,7 +162,7 @@ public class HadoopAuthPlugin extends AuthenticationPlugin {
     for (String configName : authConfigNames) {
       String systemProperty = sysPropPrefix + configName;
       String defaultConfigVal = authConfigDefaults.get(configName);
-      String configVal = System.getProperty(systemProperty, defaultConfigVal);
+      String configVal = EnvUtils.getProperty(systemProperty, defaultConfigVal);
       if (configVal != null) {
         params.put(configName, configVal);
       }
diff --git a/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java b/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
index 34729db1f1d..673e485667a 100644
--- a/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
+++ b/solr/modules/hadoop-auth/src/java/org/apache/solr/security/hadoop/KerberosPlugin.java
@@ -43,6 +43,7 @@ import org.apache.solr.cloud.ZkController;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.SecurityAwareZkACLProvider;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.request.SolrRequestInfo;
 import org.apache.solr.security.AuthenticationPlugin;
@@ -167,13 +168,13 @@ public class KerberosPlugin extends AuthenticationPlugin implements HttpClientBu
     // Special handling for the "cookie.domain" based on whether port should be
     // appended to the domain. Useful for situations where multiple solr nodes are
     // on the same host.
-    String usePortStr = System.getProperty(COOKIE_PORT_AWARE_PARAM, null);
+    String usePortStr = EnvUtils.getProperty(COOKIE_PORT_AWARE_PARAM, null);
     boolean needPortAwareCookies = (usePortStr == null) ? false : Boolean.parseBoolean(usePortStr);
 
     if (!needPortAwareCookies || !coreContainer.isZooKeeperAware()) {
       putParam(params, "cookie.domain", COOKIE_DOMAIN_PARAM, null);
     } else { // we need port aware cookies and we are in SolrCloud mode.
-      String host = System.getProperty(COOKIE_DOMAIN_PARAM, null);
+      String host = EnvUtils.getProperty(COOKIE_DOMAIN_PARAM, null);
       if (host == null) {
         throw new SolrException(
             ErrorCode.SERVER_ERROR, "Missing required parameter '" + COOKIE_DOMAIN_PARAM + "'.");
@@ -183,17 +184,19 @@ public class KerberosPlugin extends AuthenticationPlugin implements HttpClientBu
     }
 
     // check impersonator config
-    for (Enumeration<?> e = System.getProperties().propertyNames(); e.hasMoreElements(); ) {
-      String key = e.nextElement().toString();
-      if (key.startsWith(IMPERSONATOR_PREFIX)) {
-        if (!delegationTokenEnabled) {
-          throw new SolrException(
-              ErrorCode.SERVER_ERROR,
-              "Impersonator configuration requires delegation tokens to be enabled: " + key);
-        }
-        params.put(key, System.getProperty(key));
-      }
-    }
+    EnvUtils.getProperties()
+        .forEach(
+            (key, value) -> {
+              if (key.startsWith(IMPERSONATOR_PREFIX)) {
+                if (!delegationTokenEnabled) {
+                  throw new SolrException(
+                      ErrorCode.SERVER_ERROR,
+                      "Impersonator configuration requires delegation tokens to be enabled: "
+                          + key);
+                }
+                params.put(key, value);
+              }
+            });
 
     // Needed to work around HADOOP-13346
     params.put(
@@ -245,7 +248,7 @@ public class KerberosPlugin extends AuthenticationPlugin implements HttpClientBu
       String internalParamName,
       String externalParamName,
       String defaultValue) {
-    String value = System.getProperty(externalParamName, defaultValue);
+    String value = EnvUtils.getProperty(externalParamName, defaultValue);
     if (value == null) {
       throw new SolrException(
           ErrorCode.SERVER_ERROR, "Missing required parameter '" + externalParamName + "'.");
@@ -255,7 +258,7 @@ public class KerberosPlugin extends AuthenticationPlugin implements HttpClientBu
 
   private void putParamOptional(
       Map<String, String> params, String internalParamName, String externalParamName) {
-    String value = System.getProperty(externalParamName);
+    String value = EnvUtils.getProperty(externalParamName);
     if (value != null) {
       params.put(internalParamName, value);
     }
diff --git a/solr/modules/hadoop-auth/src/java/org/apache/solr/util/configuration/providers/hadoop/HadoopSSLCredentialProvider.java b/solr/modules/hadoop-auth/src/java/org/apache/solr/util/configuration/providers/hadoop/HadoopSSLCredentialProvider.java
index 481aa4d96c3..b1926dad454 100644
--- a/solr/modules/hadoop-auth/src/java/org/apache/solr/util/configuration/providers/hadoop/HadoopSSLCredentialProvider.java
+++ b/solr/modules/hadoop-auth/src/java/org/apache/solr/util/configuration/providers/hadoop/HadoopSSLCredentialProvider.java
@@ -23,6 +23,7 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.EnumMap;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.util.configuration.providers.AbstractSSLCredentialProvider;
 import org.slf4j.Logger;
@@ -40,7 +41,7 @@ public class HadoopSSLCredentialProvider extends AbstractSSLCredentialProvider {
   }
 
   public HadoopSSLCredentialProvider(Configuration hadoopConfigurationProvider) {
-    if (StrUtils.isNullOrEmpty(System.getProperty(CREDENTIAL_PROVIDER_PATH))) {
+    if (StrUtils.isNullOrEmpty(EnvUtils.getProperty(CREDENTIAL_PROVIDER_PATH))) {
       throw new RuntimeException(
           "Cannot initialize Hadoop configuration provider without credential provider path. Use "
               + CREDENTIAL_PROVIDER_PATH
@@ -48,7 +49,7 @@ public class HadoopSSLCredentialProvider extends AbstractSSLCredentialProvider {
     }
     this.hadoopConfigurationProvider = hadoopConfigurationProvider;
     hadoopConfigurationProvider.set(
-        CREDENTIAL_PROVIDER_PATH, System.getProperty(CREDENTIAL_PROVIDER_PATH));
+        CREDENTIAL_PROVIDER_PATH, EnvUtils.getProperty(CREDENTIAL_PROVIDER_PATH));
   }
 
   @Override
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/client/solrj/impl/Krb5HttpClientUtils.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/client/solrj/impl/Krb5HttpClientUtils.java
index 128400ae954..8f78c5035fb 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/client/solrj/impl/Krb5HttpClientUtils.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/client/solrj/impl/Krb5HttpClientUtils.java
@@ -20,6 +20,7 @@ import java.lang.invoke.MethodHandles;
 import java.net.URI;
 import javax.security.auth.login.AppConfigurationEntry;
 import javax.security.auth.login.Configuration;
+import org.apache.solr.common.util.EnvUtils;
 import org.eclipse.jetty.client.HttpAuthenticationStore;
 import org.eclipse.jetty.client.WWWAuthenticationProtocolHandler;
 import org.eclipse.jetty.client.util.SPNEGOAuthentication;
@@ -51,7 +52,7 @@ public class Krb5HttpClientUtils {
             return this.getType().equals(type);
           }
         };
-    String clientAppName = System.getProperty("solr.kerberos.jaas.appname", "Client");
+    String clientAppName = EnvUtils.getProperty("solr.kerberos.jaas.appname", "Client");
     AppConfigurationEntry[] entries = jaasConfig.getAppConfigurationEntry(clientAppName);
     if (entries == null) {
       log.warn(
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/HadoopTestUtil.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/HadoopTestUtil.java
index 78e0d3f0ffc..2b1955b55f9 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/HadoopTestUtil.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/HadoopTestUtil.java
@@ -21,6 +21,7 @@ import java.lang.invoke.MethodHandles;
 import org.apache.hadoop.io.nativeio.NativeIO;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.SolrTestCase;
+import org.apache.solr.common.util.EnvUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,7 +43,7 @@ public class HadoopTestUtil {
     if (System.getenv("HADOOP_HOME") != null) {
       SolrTestCase.fail("Ensure that HADOOP_HOME environment variable is not set.");
     }
-    if (System.getProperty("hadoop.home.dir") != null) {
+    if (EnvUtils.getProperty("hadoop.home.dir") != null) {
       SolrTestCase.fail("Ensure that \"hadoop.home.dir\" Java property is not set.");
     }
   }
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/ImpersonationUtil.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/ImpersonationUtil.java
index d8cb4c99f7c..d8ef9bd0c24 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/ImpersonationUtil.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/ImpersonationUtil.java
@@ -25,6 +25,7 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.EnvUtils;
 
 /**
  * This class implements utility functions required to test the secure impersonation feature for
@@ -38,7 +39,7 @@ public class ImpersonationUtil {
       org.apache.hadoop.security.Groups hGroups =
           new org.apache.hadoop.security.Groups(new Configuration());
       try {
-        List<String> g = hGroups.getGroups(System.getProperty("user.name"));
+        List<String> g = hGroups.getGroups(EnvUtils.getProperty("user.name"));
         if (g != null && g.size() > 0) {
           group = g.get(0);
         }
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java
index 7f65706600f..d67b13f82fa 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/KerberosTestServices.java
@@ -31,6 +31,7 @@ import org.apache.commons.io.file.PathUtils;
 import org.apache.hadoop.minikdc.MiniKdc;
 import org.apache.solr.client.solrj.impl.Krb5HttpClientBuilder;
 import org.apache.solr.client.solrj.util.Constants;
+import org.apache.solr.common.util.EnvUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -139,7 +140,7 @@ public class KerberosTestServices {
       clientOptions.put("storeKey", "true");
       clientOptions.put("useTicketCache", "false");
       clientOptions.put("refreshKrb5Config", "true");
-      String jaasProp = System.getProperty("solr.jaas.debug");
+      String jaasProp = EnvUtils.getProperty("solr.jaas.debug");
       if (jaasProp != null && "true".equalsIgnoreCase(jaasProp)) {
         clientOptions.put("debug", "true");
       }
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java
index 6a1d484c917..f9172efb9f3 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestImpersonationWithHadoopAuth.java
@@ -33,6 +33,7 @@ import org.apache.solr.client.solrj.impl.HttpSolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.cloud.SolrCloudTestCase;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.embedded.JettySolrRunner;
 import org.apache.solr.servlet.SolrRequestParsers;
@@ -170,7 +171,7 @@ public class TestImpersonationWithHadoopAuth extends SolrCloudTestCase {
   @Test
   public void testProxyValidateGroup() throws Exception {
     try (SolrClient solrClient = newSolrClient()) {
-      solrClient.request(getProxyRequest("anyHostUsersGroup", System.getProperty("user.name")));
+      solrClient.request(getProxyRequest("anyHostUsersGroup", EnvUtils.getProperty("user.name")));
       assertTrue(ImpersonatorCollectionsHandler.called.get());
     }
   }
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java
index 2975410a442..496ae2b9d7d 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/security/hadoop/TestSolrCloudWithSecureImpersonation.java
@@ -37,6 +37,7 @@ import org.apache.solr.client.solrj.response.CollectionAdminResponse;
 import org.apache.solr.cloud.MiniSolrCloudCluster;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.embedded.JettySolrRunner;
@@ -59,7 +60,7 @@ public class TestSolrCloudWithSecureImpersonation extends SolrTestCaseJ4 {
     org.apache.hadoop.security.Groups hGroups =
         new org.apache.hadoop.security.Groups(new Configuration());
     try {
-      List<String> g = hGroups.getGroups(System.getProperty("user.name"));
+      List<String> g = hGroups.getGroups(EnvUtils.getProperty("user.name"));
       if (g != null && g.size() > 0) {
         group = g.get(0);
       }
@@ -279,7 +280,8 @@ public class TestSolrCloudWithSecureImpersonation extends SolrTestCaseJ4 {
 
   @Test
   public void testProxyValidateGroup() throws Exception {
-    solrClient.request(getProxyRequest("anyHostUsersGroup", System.getProperty("user.name"), null));
+    solrClient.request(
+        getProxyRequest("anyHostUsersGroup", EnvUtils.getProperty("user.name"), null));
     assertTrue(ImpersonatorCollectionsHandler.called.get());
   }
 
diff --git a/solr/modules/hadoop-auth/src/test/org/apache/solr/util/configuration/HadoopSSLConfigurationsTest.java b/solr/modules/hadoop-auth/src/test/org/apache/solr/util/configuration/HadoopSSLConfigurationsTest.java
index 65b4ae96fca..72090ebc42e 100644
--- a/solr/modules/hadoop-auth/src/test/org/apache/solr/util/configuration/HadoopSSLConfigurationsTest.java
+++ b/solr/modules/hadoop-auth/src/test/org/apache/solr/util/configuration/HadoopSSLConfigurationsTest.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.lucene.tests.util.TestRuleRestoreSystemProperties;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.util.configuration.providers.EnvSSLCredentialProvider;
 import org.apache.solr.util.configuration.providers.SysPropSSLCredentialProvider;
 import org.apache.solr.util.configuration.providers.hadoop.HadoopSSLCredentialProvider;
@@ -80,7 +81,7 @@ public class HadoopSSLConfigurationsTest extends SolrTestCaseJ4 {
     getSutWithMockedHadoopCredentialProvider(
             SSLConfigurations.SysProps.SSL_KEY_STORE_PASSWORD, SAMPLE_PW1)
         .init();
-    MatcherAssert.assertThat(System.getProperty(CLIENT_KEY_STORE_PASSWORD), is(SAMPLE_PW1));
+    MatcherAssert.assertThat(EnvUtils.getProperty(CLIENT_KEY_STORE_PASSWORD), is(SAMPLE_PW1));
   }
 
   @Test
@@ -89,7 +90,7 @@ public class HadoopSSLConfigurationsTest extends SolrTestCaseJ4 {
     getSutWithMockedHadoopCredentialProvider(
             SSLConfigurations.SysProps.SSL_CLIENT_KEY_STORE_PASSWORD, SAMPLE_PW2)
         .init();
-    MatcherAssert.assertThat(System.getProperty(CLIENT_KEY_STORE_PASSWORD), is(SAMPLE_PW2));
+    MatcherAssert.assertThat(EnvUtils.getProperty(CLIENT_KEY_STORE_PASSWORD), is(SAMPLE_PW2));
   }
 
   @Test
diff --git a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java
index d79aadb1811..39e4e33fa41 100644
--- a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java
+++ b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/HdfsDirectoryFactory.java
@@ -52,6 +52,7 @@ import org.apache.solr.cloud.api.collections.SplitShardCmd;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.StrUtils;
@@ -187,7 +188,7 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory
       initKerberos();
     }
     if (StrUtils.isNullOrEmpty(
-        System.getProperty(SplitShardCmd.SHARDSPLIT_CHECKDISKSPACE_ENABLED))) {
+        EnvUtils.getProperty(SplitShardCmd.SHARDSPLIT_CHECKDISKSPACE_ENABLED))) {
       System.setProperty(SplitShardCmd.SHARDSPLIT_CHECKDISKSPACE_ENABLED, "false");
     }
   }
@@ -294,7 +295,7 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory
   boolean getConfig(String name, boolean defaultValue) {
     Boolean value = params.getBool(name);
     if (value == null) {
-      String sysValue = System.getProperty(name);
+      String sysValue = EnvUtils.getProperty(name);
       if (sysValue != null) {
         value = Boolean.valueOf(sysValue);
       }
@@ -305,7 +306,7 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory
   int getConfig(String name, int defaultValue) {
     Integer value = params.getInt(name);
     if (value == null) {
-      String sysValue = System.getProperty(name);
+      String sysValue = EnvUtils.getProperty(name);
       if (sysValue != null) {
         value = Integer.parseInt(sysValue);
       }
@@ -316,7 +317,7 @@ public class HdfsDirectoryFactory extends CachingDirectoryFactory
   String getConfig(String name, String defaultValue) {
     String value = params.get(name);
     if (value == null) {
-      value = System.getProperty(name);
+      value = EnvUtils.getProperty(name);
     }
     return value == null ? defaultValue : value;
   }
diff --git a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/index/CheckHdfsIndex.java b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/index/CheckHdfsIndex.java
index 5f786193737..7545b1de326 100644
--- a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/index/CheckHdfsIndex.java
+++ b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/index/CheckHdfsIndex.java
@@ -22,6 +22,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.lucene.index.CheckIndex;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.SuppressForbidden;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.hdfs.HdfsDirectoryFactory;
 import org.apache.solr.hdfs.store.HdfsDirectory;
 import org.apache.solr.hdfs.util.HdfsUtil;
@@ -74,7 +75,7 @@ public class CheckHdfsIndex {
 
   private static Configuration getConf(Path path) {
     Configuration conf = new Configuration();
-    String confDir = System.getProperty(HdfsDirectoryFactory.CONFIG_DIRECTORY);
+    String confDir = EnvUtils.getProperty(HdfsDirectoryFactory.CONFIG_DIRECTORY);
     HdfsUtil.addHdfsResources(conf, confDir);
 
     String fsScheme = path.toUri().getScheme();
diff --git a/solr/modules/hdfs/src/test/org/apache/hadoop/fs/RawLocalFileSystem.java b/solr/modules/hdfs/src/test/org/apache/hadoop/fs/RawLocalFileSystem.java
index 46ea42e79ac..ecf56782b37 100644
--- a/solr/modules/hdfs/src/test/org/apache/hadoop/fs/RawLocalFileSystem.java
+++ b/solr/modules/hdfs/src/test/org/apache/hadoop/fs/RawLocalFileSystem.java
@@ -33,6 +33,7 @@ import org.apache.hadoop.thirdparty.com.google.common.annotations.VisibleForTest
 import org.apache.hadoop.util.Progressable;
 import org.apache.hadoop.util.Shell;
 import org.apache.hadoop.util.StringUtils;
+import org.apache.solr.common.util.EnvUtils;
 
 import java.io.BufferedOutputStream;
 import java.io.DataOutput;
@@ -706,7 +707,7 @@ public class RawLocalFileSystem extends FileSystem {
 
   @Override
   public Path getHomeDirectory() {
-    return this.makeQualified(new Path(System.getProperty("user.home")));
+    return this.makeQualified(new Path(EnvUtils.getProperty("user.home")));
   }
 
   /**
@@ -725,7 +726,7 @@ public class RawLocalFileSystem extends FileSystem {
 
   @Override
   protected Path getInitialWorkingDirectory() {
-    return this.makeQualified(new Path(System.getProperty("user.dir")));
+    return this.makeQualified(new Path(EnvUtils.getProperty("user.dir")));
   }
 
   @Override
diff --git a/solr/modules/hdfs/src/test/org/apache/hadoop/util/PlatformName.java b/solr/modules/hdfs/src/test/org/apache/hadoop/util/PlatformName.java
index 945a3e53c0e..d8a8fb39ab9 100644
--- a/solr/modules/hdfs/src/test/org/apache/hadoop/util/PlatformName.java
+++ b/solr/modules/hdfs/src/test/org/apache/hadoop/util/PlatformName.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.util;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.solr.client.solrj.util.Constants;
+import org.apache.solr.common.util.EnvUtils;
 
 /**
  * A helper class for getting build-info of the java-vm.
@@ -32,15 +33,15 @@ public class PlatformName {
    * per the java-vm.
    */
   public static final String PLATFORM_NAME =
-      (System.getProperty("os.name").startsWith("Windows")
-          ? System.getenv("os") : System.getProperty("os.name"))
-          + "-" + System.getProperty("os.arch")
-          + "-" + System.getProperty("sun.arch.data.model");
+      (EnvUtils.getProperty("os.name").startsWith("Windows")
+          ? System.getenv("os") : EnvUtils.getProperty("os.name"))
+          + "-" + EnvUtils.getProperty("os.arch")
+          + "-" + EnvUtils.getProperty("sun.arch.data.model");
 
   /**
    * The java vendor name used in this platform.
    */
-  public static final String JAVA_VENDOR_NAME = System.getProperty("java.vendor");
+  public static final String JAVA_VENDOR_NAME = EnvUtils.getProperty("java.vendor");
 
   /**
    * A public static variable to indicate the current java vendor is
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/HdfsDirectoryFactoryTest.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/HdfsDirectoryFactoryTest.java
index 3c0ff3cb293..cf37d6a8736 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/HdfsDirectoryFactoryTest.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/HdfsDirectoryFactoryTest.java
@@ -39,6 +39,7 @@ import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.cloud.api.collections.SplitShardCmd;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.DirectoryFactory.DirContext;
 import org.apache.solr.handler.SnapShooter;
@@ -97,7 +98,7 @@ public class HdfsDirectoryFactoryTest extends SolrTestCaseJ4 {
       assertTrue(dataHome.endsWith("/solr1/mock/data"));
       assertFalse(
           Boolean.parseBoolean(
-              System.getProperty(SplitShardCmd.SHARDSPLIT_CHECKDISKSPACE_ENABLED)));
+              EnvUtils.getProperty(SplitShardCmd.SHARDSPLIT_CHECKDISKSPACE_ENABLED)));
 
       System.clearProperty(HdfsDirectoryFactory.HDFS_HOME);
 
diff --git a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTestUtil.java b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTestUtil.java
index f2452b7fece..98eea035e1b 100644
--- a/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTestUtil.java
+++ b/solr/modules/hdfs/src/test/org/apache/solr/hdfs/cloud/HdfsTestUtil.java
@@ -21,7 +21,6 @@ import java.lang.invoke.MethodHandles;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -50,6 +49,7 @@ import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.util.DiskChecker;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.hdfs.HdfsDirectoryFactory;
@@ -100,7 +100,7 @@ public class HdfsTestUtil {
     if (System.getenv("HADOOP_HOME") != null) {
       SolrTestCaseJ4.fail("Ensure that HADOOP_HOME environment variable is not set.");
     }
-    if (System.getProperty("hadoop.home.dir") != null) {
+    if (EnvUtils.getProperty("hadoop.home.dir") != null) {
       SolrTestCaseJ4.fail("Ensure that \"hadoop.home.dir\" Java property is not set.");
     }
   }
@@ -193,7 +193,7 @@ public class HdfsTestUtil {
     System.setProperty("socketTimeout", "90000");
 
     String blockcacheGlobal =
-        System.getProperty(
+        EnvUtils.getProperty(
             "solr.hdfs.blockcache.global", Boolean.toString(SolrTestCaseJ4.random().nextBoolean()));
     System.setProperty("solr.hdfs.blockcache.global", blockcacheGlobal);
     // Limit memory usage for HDFS tests
@@ -352,13 +352,9 @@ public class HdfsTestUtil {
       System.clearProperty(SolrTestCaseJ4.UPDATELOG_SYSPROP);
 
       // Clear "solr.hdfs." system properties
-      Enumeration<?> propertyNames = System.getProperties().propertyNames();
-      while (propertyNames.hasMoreElements()) {
-        String propertyName = String.valueOf(propertyNames.nextElement());
-        if (propertyName.startsWith("solr.hdfs.")) {
-          System.clearProperty(propertyName);
-        }
-      }
+      EnvUtils.getProperties().keySet().stream()
+          .filter(key -> key.startsWith("solr.hdfs."))
+          .forEach(System::clearProperty);
     }
   }
 
diff --git a/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java b/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
index b7e650c1401..752bfd60780 100644
--- a/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
+++ b/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
@@ -37,6 +37,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.common.util.Utils;
 import org.jose4j.http.Get;
@@ -78,7 +79,7 @@ public class JWTIssuerConfig {
   private Collection<X509Certificate> trustedCerts;
 
   public static boolean ALLOW_OUTBOUND_HTTP =
-      Boolean.parseBoolean(System.getProperty("solr.auth.jwt.allowOutboundHttp", "false"));
+      Boolean.parseBoolean(EnvUtils.getProperty("solr.auth.jwt.allowOutboundHttp", "false"));
   public static final String ALLOW_OUTBOUND_HTTP_ERR_MSG =
       "HTTPS required for IDP communication. Please use SSL or start your nodes with -Dsolr.auth.jwt.allowOutboundHttp=true to allow HTTP for test purposes.";
   private static final String DEFAULT_AUTHORIZATION_FLOW =
diff --git a/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java b/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java
index 211b75c1b5f..a5642b9f6cd 100644
--- a/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java
+++ b/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java
@@ -43,6 +43,7 @@ import java.util.Map;
 import java.util.Set;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.security.VerifiedUserRoles;
 import org.apache.solr.servlet.LoadAdminUiServlet;
@@ -710,6 +711,6 @@ public class JWTAuthPluginTest extends SolrTestCaseJ4 {
     plugin.init(testConfig);
     assertEquals(
         "http://acmepaymentscorp/oauth/oauth20/token",
-        System.getProperty(LoadAdminUiServlet.SYSPROP_CSP_CONNECT_SRC_URLS));
+        EnvUtils.getProperty(LoadAdminUiServlet.SYSPROP_CSP_CONNECT_SRC_URLS));
   }
 }
diff --git a/solr/modules/ltr/src/java/org/apache/solr/ltr/interleaving/algorithms/TeamDraftInterleaving.java b/solr/modules/ltr/src/java/org/apache/solr/ltr/interleaving/algorithms/TeamDraftInterleaving.java
index af96259660c..b6fa5a252fb 100644
--- a/solr/modules/ltr/src/java/org/apache/solr/ltr/interleaving/algorithms/TeamDraftInterleaving.java
+++ b/solr/modules/ltr/src/java/org/apache/solr/ltr/interleaving/algorithms/TeamDraftInterleaving.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Random;
 import java.util.Set;
 import org.apache.lucene.search.ScoreDoc;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.ltr.interleaving.Interleaving;
 import org.apache.solr.ltr.interleaving.InterleavingResult;
 
@@ -50,7 +51,7 @@ public class TeamDraftInterleaving implements Interleaving {
   static {
     // We try to make things reproducible in the context of our tests by initializing the random
     // instance based on the current seed
-    String seed = System.getProperty("tests.seed");
+    String seed = EnvUtils.getProperty("tests.seed");
     if (seed == null) {
       RANDOM = new Random();
     } else {
diff --git a/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java b/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
index 9f84804a6c6..f9bb5d1cbf0 100644
--- a/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
+++ b/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
@@ -27,6 +27,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.TracerConfigurator;
 import org.slf4j.Logger;
@@ -40,7 +41,7 @@ import org.slf4j.LoggerFactory;
 public class OtelTracerConfigurator extends TracerConfigurator {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
   // Copy of environment. Can be overridden by tests
-  Map<String, String> currentEnv = System.getenv();
+  Map<String, String> currentEnv = EnvUtils.getEnvs();
 
   @Override
   public void init(NamedList<?> args) {
@@ -53,8 +54,8 @@ public class OtelTracerConfigurator extends TracerConfigurator {
     setDefaultIfNotConfigured("OTEL_TRACES_EXPORTER", "otlp");
     setDefaultIfNotConfigured("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc");
     setDefaultIfNotConfigured("OTEL_TRACES_SAMPLER", "parentbased_always_on");
-    if (System.getProperty("host") != null) {
-      addOtelResourceAttributes(Map.of("host.name", System.getProperty("host")));
+    if (EnvUtils.getProperty("host") != null) {
+      addOtelResourceAttributes(Map.of("host.name", EnvUtils.getProperty("host")));
     }
 
     final String currentConfig = getCurrentOtelConfigAsString();
@@ -131,13 +132,13 @@ public class OtelTracerConfigurator extends TracerConfigurator {
     currentEnv.entrySet().stream()
         .filter(e -> e.getKey().startsWith("OTEL_"))
         .forEach(entry -> currentConfig.put(entry.getKey(), entry.getValue()));
-    System.getProperties().entrySet().stream()
-        .filter(e -> e.getKey().toString().startsWith("otel."))
+    EnvUtils.getProperties().entrySet().stream()
+        .filter(e -> e.getKey().startsWith("otel."))
         .forEach(
             entry -> {
-              String key = entry.getKey().toString();
+              String key = entry.getKey();
               String envKey = key.toUpperCase(Locale.ROOT).replace('.', '_');
-              String value = entry.getValue().toString();
+              String value = entry.getValue();
               currentConfig.put(envKey, value);
             });
     return currentConfig;
@@ -163,7 +164,7 @@ public class OtelTracerConfigurator extends TracerConfigurator {
   void setDefaultIfNotConfigured(String envName, String defaultValue) {
     String incomingValue = getEnvOrSysprop(envName);
     if (incomingValue == null) {
-      System.setProperty(envNameToSyspropName(envName), defaultValue);
+      EnvUtils.setProperty(envNameToSyspropName(envName), defaultValue);
       if (log.isDebugEnabled()) {
         log.debug("Using default setting {}={}", envName, getEnvOrSysprop(envName));
       }
diff --git a/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/OtelTracerConfiguratorTest.java b/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/OtelTracerConfiguratorTest.java
index df2692f1066..44a3c1b7347 100644
--- a/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/OtelTracerConfiguratorTest.java
+++ b/solr/modules/opentelemetry/src/test/org/apache/solr/opentelemetry/OtelTracerConfiguratorTest.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.cloud.MiniSolrCloudCluster;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.NamedList;
 import org.junit.After;
@@ -117,7 +118,7 @@ public class OtelTracerConfiguratorTest extends SolrTestCaseJ4 {
           GlobalTracer.get().toString().contains("ClosableTracerShim"));
       assertEquals(
           List.of("host.name=my.solr.host", "foo=bar"),
-          List.of(System.getProperty("otel.resource.attributes").split(",")));
+          List.of(EnvUtils.getProperty("otel.resource.attributes").split(",")));
     } finally {
       cluster.shutdown();
       System.clearProperty("otel.resource.attributes");
diff --git a/solr/modules/s3-repository/src/java/org/apache/solr/s3/S3BackupRepositoryConfig.java b/solr/modules/s3-repository/src/java/org/apache/solr/s3/S3BackupRepositoryConfig.java
index 666fd5f9242..fcc5fc6ba08 100644
--- a/solr/modules/s3-repository/src/java/org/apache/solr/s3/S3BackupRepositoryConfig.java
+++ b/solr/modules/s3-repository/src/java/org/apache/solr/s3/S3BackupRepositoryConfig.java
@@ -16,13 +16,12 @@
  */
 package org.apache.solr.s3;
 
-import java.util.Locale;
+import org.apache.solr.common.util.EnvUtils;
 import org.apache.solr.common.util.NamedList;
 
 /**
  * Class representing the {@code backup} S3 config bundle specified in solr.xml. All user-provided
- * config can be overridden via environment variables (use uppercase, with '_' instead of '.'), see
- * {@link S3BackupRepositoryConfig#toEnvVar}.
+ * config can be overridden via environment variables SOLR_FOO_BAR or system property solr.foo.bar.
  */
 public class S3BackupRepositoryConfig {
 
@@ -59,7 +58,7 @@ public class S3BackupRepositoryConfig {
   }
 
   private static String getStringConfig(NamedList<?> config, String property) {
-    String envProp = System.getenv().get(toEnvVar(property));
+    String envProp = EnvUtils.getProperty(property);
     if (envProp == null) {
       Object configProp = config.get(property);
       return configProp == null ? null : configProp.toString();
@@ -73,7 +72,7 @@ public class S3BackupRepositoryConfig {
   }
 
   private static int getIntConfig(NamedList<?> config, String property, int def) {
-    String envProp = System.getenv().get(toEnvVar(property));
+    String envProp = EnvUtils.getProperty(property);
     if (envProp == null) {
       Object configProp = config.get(property);
       return configProp instanceof Integer ? (int) configProp : def;
@@ -88,7 +87,7 @@ public class S3BackupRepositoryConfig {
   }
 
   private static boolean getBooleanConfig(NamedList<?> config, String property, boolean def) {
-    String envProp = System.getenv().get(toEnvVar(property));
+    String envProp = EnvUtils.getProperty(property);
     if (envProp == null) {
       Boolean configProp = config.getBooleanArg(property);
       return configProp == null ? def : configProp;
@@ -96,8 +95,4 @@ public class S3BackupRepositoryConfig {
       return Boolean.parseBoolean(envProp);
     }
   }
-
-  private static String toEnvVar(String property) {
-    return property.toUpperCase(Locale.ROOT).replace('.', '_');
-  }
 }